From: Owen Anderson Date: Mon, 23 Jun 2008 06:13:12 +0000 (+0000) Subject: At Chris' suggestion, move the liveness and worklist datastructures into X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=ae18bd4246da4d2ac9494bbaeadd40abfa533c83;p=oota-llvm.git 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 --- diff --git a/lib/Transforms/Scalar/ADCE.cpp b/lib/Transforms/Scalar/ADCE.cpp index c698829f5b4..960ce8f5e91 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 alive; + SmallVector worklist; + virtual bool runOnFunction(Function& F); virtual void getAnalysisUsage(AnalysisUsage& AU) const { @@ -45,8 +49,8 @@ char ADCE::ID = 0; static RegisterPass X("adce", "Aggressive Dead Code Elimination"); bool ADCE::runOnFunction(Function& F) { - SmallPtrSet alive; - std::vector 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 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::iterator I = dead.begin(), - E = dead.end(); I != E; ++I) { + for (SmallVector::iterator I = worklist.begin(), + E = worklist.end(); I != E; ++I) { NumRemoved++; (*I)->eraseFromParent(); } - return !dead.empty(); + return !worklist.empty(); } FunctionPass *llvm::createAggressiveDCEPass() {