From: Chris Lattner Date: Thu, 27 Nov 2008 23:23:35 +0000 (+0000) Subject: Simplify LoopStrengthReduce::DeleteTriviallyDeadInstructions by X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1363949380374636974558813a19e79d01e63b7c;p=oota-llvm.git Simplify LoopStrengthReduce::DeleteTriviallyDeadInstructions by making it use RecursivelyDeleteTriviallyDeadInstructions to do the heavy lifting. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60195 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index c2f3209f059..5fad309b0dd 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -240,31 +240,30 @@ Value *LoopStrengthReduce::getCastedVersionOf(Instruction::CastOps opcode, /// their operands subsequently dead. void LoopStrengthReduce:: DeleteTriviallyDeadInstructions(SetVector &Insts) { + SmallVector DeadInsts; + while (!Insts.empty()) { Instruction *I = Insts.back(); Insts.pop_back(); + + // If I is dead, delete it and all the things that it recursively uses + // that become dead. + RecursivelyDeleteTriviallyDeadInstructions(I, &DeadInsts); + + if (DeadInsts.empty()) continue; + Changed = true; - if (PHINode *PN = dyn_cast(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(PNV)) - Insts.insert(U); - SE->deleteValueFromRecords(PN); - PN->replaceAllUsesWith(PNV); - PN->eraseFromParent(); - Changed = true; - continue; - } - } - - if (isInstructionTriviallyDead(I)) { - for (User::op_iterator i = I->op_begin(), e = I->op_end(); i != e; ++i) - if (Instruction *U = dyn_cast(*i)) - Insts.insert(U); - SE->deleteValueFromRecords(I); - I->eraseFromParent(); - Changed = true; + while (!DeadInsts.empty()) { + Instruction *DeadInst = DeadInsts.back(); + DeadInsts.pop_back(); + + // Make sure ScalarEvolutions knows this instruction is gone. + SE->deleteValueFromRecords(DeadInst); + + // Make sure that this instruction is removed from DeadInsts if it was + // recursively removed. + if (DeadInst != I) + Insts.remove(DeadInst); } } }