From: Chris Lattner Date: Mon, 1 Dec 2008 06:11:32 +0000 (+0000) Subject: simplify DeleteTriviallyDeadInstructions again, unlike my previous X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=bfcee36cd747bf9f791ba7aa3e9e8ac3671c6822;p=oota-llvm.git 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60329 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index c2f3209f059..7d4a1041dac 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -244,28 +244,21 @@ DeleteTriviallyDeadInstructions(SetVector &Insts) { Instruction *I = Insts.back(); Insts.pop_back(); - 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)) + 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(*i)) + for (User::op_iterator i = I->op_begin(), e = I->op_end(); i != e; ++i) { + if (Instruction *U = dyn_cast(*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(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