diff options
author | Chris Lattner <sabre@nondot.org> | 2008-12-01 06:11:32 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-12-01 06:11:32 +0000 |
commit | a68a5a4784865b1969740ff626e715ddf3c73986 (patch) | |
tree | a9215d3421b301c6a8b12407faa37a4c928ea254 /llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp | |
parent | 9e6b24342874a84186c38ba1ea98dc772921b92e (diff) | |
download | bcm5719-llvm-a68a5a4784865b1969740ff626e715ddf3c73986.tar.gz bcm5719-llvm-a68a5a4784865b1969740ff626e715ddf3c73986.zip |
simplify DeleteTriviallyDeadInstructions again, unlike my previous
buggy rewrite, this notifies ScalarEvolution of a pending instruction
about to be removed and then erases it, instead of erasing it then
notifying.
llvm-svn: 60329
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp index c2f3209f059..7d4a1041dac 100644 --- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -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 |