simplify DeleteTriviallyDeadInstructions again, unlike my previous
authorChris Lattner <sabre@nondot.org>
Mon, 1 Dec 2008 06:11:32 +0000 (06:11 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 1 Dec 2008 06:11:32 +0000 (06:11 +0000)
buggy rewrite, this notifies ScalarEvolution of a pending instruction
about to be removed and then erases it, instead of erasing it then
notifying.

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

lib/Transforms/Scalar/LoopStrengthReduce.cpp

index c2f3209f05953adac18b4f9ab25e4e6dd506910b..7d4a1041dac70632fbed23cdbec90b84183ceb16 100644 (file)
@@ -244,28 +244,21 @@ DeleteTriviallyDeadInstructions(SetVector<Instruction*> &Insts) {
     Instruction *I = Insts.back();
     Insts.pop_back();
 
-    if (PHINode *PN = dyn_cast<PHINode>(I)) {
-      // If all incoming values to the Phi are the same, we can replace the Phi
-      // with that value.
-      if (Value *PNV = PN->hasConstantValue()) {
-        if (Instruction *U = dyn_cast<Instruction>(PNV))
-          Insts.insert(U);
-        SE->deleteValueFromRecords(PN);
-        PN->replaceAllUsesWith(PNV);
-        PN->eraseFromParent();
-        Changed = true;
-        continue;
-      }
-    }
+    if (!isInstructionTriviallyDead(I))
+      continue;
+
+    SE->deleteValueFromRecords(I);
 
-    if (isInstructionTriviallyDead(I)) {
-      for (User::op_iterator i = I->op_begin(), e = I->op_end(); i != e; ++i)
-        if (Instruction *U = dyn_cast<Instruction>(*i))
+    for (User::op_iterator i = I->op_begin(), e = I->op_end(); i != e; ++i) {
+      if (Instruction *U = dyn_cast<Instruction>(*i)) {
+        *i = 0;
+        if (U->use_empty())
           Insts.insert(U);
-      SE->deleteValueFromRecords(I);
-      I->eraseFromParent();
-      Changed = true;
+      }
     }
+    
+    I->eraseFromParent();
+    Changed = true;
   }
 }
 
@@ -2067,7 +2060,7 @@ bool LoopStrengthReduce::runOnLoop(Loop *L, LPPassManager &LPM) {
     BasicBlock::iterator I = L->getHeader()->begin();
     while (PHINode *PN = dyn_cast<PHINode>(I++)) {
       // At this point, we know that we have killed one or more IV users.
-      // It is worth checking to see if the cann indvar is also
+      // It is worth checking to see if the cannonical indvar is also
       // dead, so that we can remove it as well.
       //
       // We can remove a PHI if it is on a cycle in the def-use graph