diff options
author | Chris Lattner <sabre@nondot.org> | 2004-12-12 18:23:20 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-12-12 18:23:20 +0000 |
commit | fb851ab2817f1e113502ab1a45b597485322944b (patch) | |
tree | 1b3ce7a0d811124c85291f725a2d58a4899d95ed /lib/Transforms/Scalar/GCSE.cpp | |
parent | 3ea78c4276dfbf5a078292ad8fd8dc952c4ff8b9 (diff) |
Simplify code and do not invalidate iterators.
This fixes a crash compiling TimberWolfMC that was exposed due to recent
optimizer changes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18831 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/GCSE.cpp')
-rw-r--r-- | lib/Transforms/Scalar/GCSE.cpp | 55 |
1 files changed, 9 insertions, 46 deletions
diff --git a/lib/Transforms/Scalar/GCSE.cpp b/lib/Transforms/Scalar/GCSE.cpp index 776ff6603a..533a9e8b23 100644 --- a/lib/Transforms/Scalar/GCSE.cpp +++ b/lib/Transforms/Scalar/GCSE.cpp @@ -100,10 +100,12 @@ bool GCSE::runOnFunction(Function &F) { for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) { Instruction *Inst = I++; - // If this instruction computes a value, try to fold together common - // instructions that compute it. - // - if (Inst->getType() != Type::VoidTy) { + if (Constant *C = ConstantFoldInstruction(Inst)) { + ReplaceInstructionWith(Inst, C); + } else if (Inst->getType() != Type::VoidTy) { + // If this instruction computes a value, try to fold together common + // instructions that compute it. + // VN.getEqualNumberNodes(Inst, EqualValues); // If this instruction computes a value that is already computed @@ -183,54 +185,15 @@ void GCSE::ReplaceInstructionWith(Instruction *I, Value *V) { // Update value numbering getAnalysis<ValueNumbering>().deleteValue(I); - // If we are not replacing the instruction with a constant, we cannot do - // anything special. - if (!isa<Constant>(V)) { - I->replaceAllUsesWith(V); - - if (InvokeInst *II = dyn_cast<InvokeInst>(I)) { - // Removing an invoke instruction requires adding a branch to the normal - // destination and removing PHI node entries in the exception destination. - new BranchInst(II->getNormalDest(), II); - II->getUnwindDest()->removePredecessor(II->getParent()); - } - - // Erase the instruction from the program. - I->getParent()->getInstList().erase(I); - return; - } - - Constant *C = cast<Constant>(V); - std::vector<User*> Users(I->use_begin(), I->use_end()); - - // Perform the replacement. - I->replaceAllUsesWith(C); - + I->replaceAllUsesWith(V); + if (InvokeInst *II = dyn_cast<InvokeInst>(I)) { // Removing an invoke instruction requires adding a branch to the normal // destination and removing PHI node entries in the exception destination. new BranchInst(II->getNormalDest(), II); II->getUnwindDest()->removePredecessor(II->getParent()); } - + // Erase the instruction from the program. I->getParent()->getInstList().erase(I); - - // Check each user to see if we can constant fold it. - while (!Users.empty()) { - Instruction *U = cast<Instruction>(Users.back()); - Users.pop_back(); - - if (Constant *C = ConstantFoldInstruction(U)) { - ReplaceInstructionWith(U, C); - - // If the instruction used I more than once, it could be on the user list - // multiple times. Make sure we don't reprocess it. - std::vector<User*>::iterator It = std::find(Users.begin(), Users.end(),U); - while (It != Users.end()) { - Users.erase(It); - It = std::find(Users.begin(), Users.end(), U); - } - } - } } |