aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-05-01 23:27:23 +0000
committerChris Lattner <sabre@nondot.org>2004-05-01 23:27:23 +0000
commit00d513182d75f90d0b4b367fce5e650b5c5fe5aa (patch)
tree571fd918be2a706a024b29ee2acf2f378675e055 /lib/Transforms
parent216d4d85fd8d5fdc4caafb7250fad75b015c8e6c (diff)
Make sure to reprocess instructions used by deleted instructions to avoid
missing opportunities for combination. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13309 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Scalar/InstructionCombining.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index 03be9cd239..138dc96253 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -2997,6 +2997,8 @@ bool InstCombiner::runOnFunction(Function &F) {
BasicBlock *InstParent = I->getParent();
InstParent->getInstList().insert(I, Result);
+ // Make sure that we reprocess all operands now that we reduced their
+ // use counts.
for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
if (Instruction *OpI = dyn_cast<Instruction>(I->getOperand(i)))
WorkList.push_back(OpI);
@@ -3009,14 +3011,19 @@ bool InstCombiner::runOnFunction(Function &F) {
} else {
DEBUG(std::cerr << "IC: MOD = " << *I);
- BasicBlock::iterator II = I;
-
// If the instruction was modified, it's possible that it is now dead.
// if so, remove it.
- if (dceInstruction(II)) {
- // Instructions may end up in the worklist more than once. Erase them
- // all.
+ if (isInstructionTriviallyDead(I)) {
+ // Make sure we process all operands now that we are reducing their
+ // use counts.
+ for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
+ if (Instruction *OpI = dyn_cast<Instruction>(I->getOperand(i)))
+ WorkList.push_back(OpI);
+
+ // Instructions may end up in the worklist more than once. Erase all
+ // occurrances of this instruction.
removeFromWorkList(I);
+ I->getParent()->getInstList().erase(I);
Result = 0;
}
}