Add code to ensure that no PHI nodes are left laying around with their
authorChris Lattner <sabre@nondot.org>
Mon, 29 Jul 2002 23:40:46 +0000 (23:40 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 29 Jul 2002 23:40:46 +0000 (23:40 +0000)
arguments dropped.  This fixes bug:
   test/Regression/Transforms/ADCE/2002-07-17-PHIAssertion.ll

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

lib/Transforms/Scalar/ADCE.cpp

index bba30a123a15c4f692df5c9d651177ff138b274c..56b219a585777ba3fe1a7d6349179f8cc41e1022 100644 (file)
@@ -284,9 +284,23 @@ bool ADCE::doADCE() {
         // sweep over the program can safely delete dead instructions without
         // other dead instructions still refering to them.
         //
-        for (BasicBlock::iterator I = BB->begin(), E = --BB->end(); I != E; ++I)
-          if (!LiveSet.count(I))                // Is this instruction alive?
+        for (BasicBlock::iterator I = BB->begin(), E = --BB->end(); I != E; )
+          if (!LiveSet.count(I)) {              // Is this instruction alive?
             I->dropAllReferences();             // Nope, drop references... 
+            if (PHINode *PN = dyn_cast<PHINode>(&*I)) {
+              // We don't want to leave PHI nodes in the program that have
+              // #arguments != #predecessors, so we remove them now.
+              //
+              PN->replaceAllUsesWith(Constant::getNullValue(PN->getType()));
+
+              // Delete the instruction...
+              I = BB->getInstList().erase(I);
+            } else {
+              ++I;
+            }
+          } else {
+            ++I;
+          }
       }
   }