diff options
author | Owen Anderson <resistor@mac.com> | 2008-06-23 06:13:12 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-06-23 06:13:12 +0000 |
commit | ae18bd4246da4d2ac9494bbaeadd40abfa533c83 (patch) | |
tree | 60df1502563b2c99aa6d3998fc210947c375d49f /lib/Transforms | |
parent | cbfe5bbe88f5f2ee03a388585112f7609c8151ad (diff) |
At Chris' suggestion, move the liveness and worklist datastructures into
instance variables so they can be allocated just once, and reuse the worklist
as the dead list as well.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52618 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/ADCE.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/lib/Transforms/Scalar/ADCE.cpp b/lib/Transforms/Scalar/ADCE.cpp index c698829f5b..960ce8f5e9 100644 --- a/lib/Transforms/Scalar/ADCE.cpp +++ b/lib/Transforms/Scalar/ADCE.cpp @@ -22,6 +22,7 @@ #include "llvm/Support/InstIterator.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/SmallVector.h" using namespace llvm; @@ -32,6 +33,9 @@ namespace { static char ID; // Pass identification, replacement for typeid ADCE() : FunctionPass((intptr_t)&ID) {} + SmallPtrSet<Instruction*, 1024> alive; + SmallVector<Instruction*, 1024> worklist; + virtual bool runOnFunction(Function& F); virtual void getAnalysisUsage(AnalysisUsage& AU) const { @@ -45,8 +49,8 @@ char ADCE::ID = 0; static RegisterPass<ADCE> X("adce", "Aggressive Dead Code Elimination"); bool ADCE::runOnFunction(Function& F) { - SmallPtrSet<Instruction*, 32> alive; - std::vector<Instruction*> worklist; + alive.clear(); + worklist.clear(); // Collect the set of "root" instructions that are known live. for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) @@ -71,20 +75,20 @@ bool ADCE::runOnFunction(Function& F) { // The inverse of the live set is the dead set. These are those instructions // which have no side effects and do not influence the control flow or return // value of the function, and may therefore be deleted safely. - SmallPtrSet<Instruction*, 32> dead; + // NOTE: We reuse the worklist vector here for memory efficiency. for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) if (!alive.count(I.getInstructionIterator())) { - dead.insert(I.getInstructionIterator()); + worklist.push_back(I.getInstructionIterator()); I->dropAllReferences(); } - for (SmallPtrSet<Instruction*, 32>::iterator I = dead.begin(), - E = dead.end(); I != E; ++I) { + for (SmallVector<Instruction*, 1024>::iterator I = worklist.begin(), + E = worklist.end(); I != E; ++I) { NumRemoved++; (*I)->eraseFromParent(); } - return !dead.empty(); + return !worklist.empty(); } FunctionPass *llvm::createAggressiveDCEPass() { |