Handle single-entry PHI nodes correctly. This fixes PR877 and
authorChris Lattner <sabre@nondot.org>
Mon, 14 Aug 2006 21:38:05 +0000 (21:38 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 14 Aug 2006 21:38:05 +0000 (21:38 +0000)
Transforms/CondProp/2006-08-14-SingleEntryPhiCrash.ll

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29673 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/CondPropagate.cpp

index 101acef6dcb479d1eca8f4cc1c42380f2fbec990..49c87fd02f069eb8b6ad64b90f629febbdf29299 100644 (file)
@@ -87,8 +87,18 @@ void CondProp::SimplifyBlock(BasicBlock *BB) {
   // If this block ends with an unconditional branch and the only successor has
   // only this block as a predecessor, merge the two blocks together.
   if (BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator()))
-    if (BI->isUnconditional() && BI->getSuccessor(0)->getSinglePredecessor()) {
+    if (BI->isUnconditional() && BI->getSuccessor(0)->getSinglePredecessor() &&
+        BB != BI->getSuccessor(0)) {
       BasicBlock *Succ = BI->getSuccessor(0);
+      
+      // If Succ has any PHI nodes, they are all single-entry PHI's.
+      while (PHINode *PN = dyn_cast<PHINode>(Succ->begin())) {
+        assert(PN->getNumIncomingValues() == 1 &&
+               "PHI doesn't match parent block");
+        PN->replaceAllUsesWith(PN->getIncomingValue(0));
+        PN->eraseFromParent();
+      }
+      
       // Remove BI.
       BI->eraseFromParent();