Make sure to reprocess instructions used by deleted instructions to avoid
authorChris Lattner <sabre@nondot.org>
Sat, 1 May 2004 23:27:23 +0000 (23:27 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 1 May 2004 23:27:23 +0000 (23:27 +0000)
missing opportunities for combination.

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

lib/Transforms/Scalar/InstructionCombining.cpp

index 03be9cd2393b14021d955cac5d659a55bcfe8c40..138dc9625326aca626d5988fb4d725d2fa4f82e0 100644 (file)
@@ -2997,6 +2997,8 @@ bool InstCombiner::runOnFunction(Function &F) {
         BasicBlock *InstParent = I->getParent();
         InstParent->getInstList().insert(I, Result);
 
+        // Make sure that we reprocess all operands now that we reduced their
+        // use counts.
         for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
           if (Instruction *OpI = dyn_cast<Instruction>(I->getOperand(i)))
             WorkList.push_back(OpI);
@@ -3009,14 +3011,19 @@ bool InstCombiner::runOnFunction(Function &F) {
       } else {
         DEBUG(std::cerr << "IC: MOD = " << *I);
 
-        BasicBlock::iterator II = I;
-
         // If the instruction was modified, it's possible that it is now dead.
         // if so, remove it.
-        if (dceInstruction(II)) {
-          // Instructions may end up in the worklist more than once.  Erase them
-          // all.
+        if (isInstructionTriviallyDead(I)) {
+          // Make sure we process all operands now that we are reducing their
+          // use counts.
+          for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
+            if (Instruction *OpI = dyn_cast<Instruction>(I->getOperand(i)))
+              WorkList.push_back(OpI);
+          
+          // Instructions may end up in the worklist more than once.  Erase all
+          // occurrances of this instruction.
           removeFromWorkList(I);
+          I->getParent()->getInstList().erase(I);
           Result = 0;
         }
       }