Fix PR867 (and maybe 868) and testcsae:
authorChris Lattner <sabre@nondot.org>
Thu, 3 Aug 2006 21:40:24 +0000 (21:40 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 3 Aug 2006 21:40:24 +0000 (21:40 +0000)
Transforms/SimplifyCFG/2006-08-03-Crash.ll

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

lib/Transforms/Utils/SimplifyCFG.cpp

index 8f7a154cf48390f65700f070f667072716a0b10f..7ac944446e2f0ba9cda11fa13229b5aa06e776ed 100644 (file)
@@ -459,12 +459,31 @@ static bool GatherValueComparisons(Instruction *Cond, Value *&CompVal,
 /// has no side effects, nuke it.  If it uses any instructions that become dead
 /// because the instruction is now gone, nuke them too.
 static void ErasePossiblyDeadInstructionTree(Instruction *I) {
-  if (isInstructionTriviallyDead(I)) {
-    std::vector<Value*> Operands(I->op_begin(), I->op_end());
-    I->getParent()->getInstList().erase(I);
-    for (unsigned i = 0, e = Operands.size(); i != e; ++i)
-      if (Instruction *OpI = dyn_cast<Instruction>(Operands[i]))
-        ErasePossiblyDeadInstructionTree(OpI);
+  if (!isInstructionTriviallyDead(I)) return;
+  
+  std::vector<Instruction*> InstrsToInspect;
+  InstrsToInspect.push_back(I);
+
+  while (!InstrsToInspect.empty()) {
+    I = InstrsToInspect.back();
+    InstrsToInspect.pop_back();
+
+    if (!isInstructionTriviallyDead(I)) continue;
+
+    // If I is in the work list multiple times, remove previous instances.
+    for (unsigned i = 0, e = InstrsToInspect.size(); i != e; ++i)
+      if (InstrsToInspect[i] == I) {
+        InstrsToInspect.erase(InstrsToInspect.begin()+i);
+        --i, --e;
+      }
+
+    // Add operands of dead instruction to worklist.
+    for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
+      if (Instruction *OpI = dyn_cast<Instruction>(I->getOperand(i)))
+        InstrsToInspect.push_back(OpI);
+
+    // Remove dead instruction.
+    I->eraseFromParent();
   }
 }