summaryrefslogtreecommitdiff
path: root/lib/Transforms/Scalar/SCCP.cpp
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2011-09-01 21:28:33 +0000
committerBill Wendling <isanbard@gmail.com>2011-09-01 21:28:33 +0000
commitc8c0fd39931491146efd08d7ac835f2839e41b1e (patch)
treebbe3e544348ade8f0d02432d4fd85d89ccfc8640 /lib/Transforms/Scalar/SCCP.cpp
parent770e16fe17f54ca118c2d0302be387e836d9b101 (diff)
downloadllvm-c8c0fd39931491146efd08d7ac835f2839e41b1e.tar.gz
llvm-c8c0fd39931491146efd08d7ac835f2839e41b1e.tar.bz2
llvm-c8c0fd39931491146efd08d7ac835f2839e41b1e.tar.xz
Change worklist driven deletion to be an iterative process.
Duncan noticed this! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138967 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/SCCP.cpp')
-rw-r--r--lib/Transforms/Scalar/SCCP.cpp23
1 files changed, 7 insertions, 16 deletions
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp
index 3d52afa2e1..4ac5b2f910 100644
--- a/lib/Transforms/Scalar/SCCP.cpp
+++ b/lib/Transforms/Scalar/SCCP.cpp
@@ -1688,24 +1688,15 @@ static void DeleteInstructionInBlock(BasicBlock *BB) {
// Delete the instructions backwards, as it has a reduced likelihood of
// having to update as many def-use and use-def chains.
- std::vector<Instruction*> WorkList;
- WorkList.reserve(BB->size());
- BasicBlock::iterator I = --BasicBlock::iterator(BB->getTerminator());
-
- while (true) {
- if (!I->use_empty())
- I->replaceAllUsesWith(UndefValue::get(I->getType()));
- WorkList.push_back(I);
- if (I == BB->begin())
+ for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) {
+ Instruction *Inst = &*I++;
+ if (isa<TerminatorInst>(Inst))
break;
- --I;
- }
-
- for (std::vector<Instruction*>::iterator
- II = WorkList.begin(), IE = WorkList.end(); II != IE; ++II) {
- if (isa<LandingPadInst>(*II))
+ if (!Inst->use_empty())
+ Inst->replaceAllUsesWith(UndefValue::get(Inst->getType()));
+ if (isa<LandingPadInst>(Inst))
continue;
- BB->getInstList().erase(*II);
+ BB->getInstList().erase(Inst);
++NumInstRemoved;
}
}