aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2008-06-23 06:13:12 +0000
committerOwen Anderson <resistor@mac.com>2008-06-23 06:13:12 +0000
commitae18bd4246da4d2ac9494bbaeadd40abfa533c83 (patch)
tree60df1502563b2c99aa6d3998fc210947c375d49f /lib/Transforms
parentcbfe5bbe88f5f2ee03a388585112f7609c8151ad (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.cpp18
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() {