From ae18bd4246da4d2ac9494bbaeadd40abfa533c83 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Mon, 23 Jun 2008 06:13:12 +0000 Subject: [PATCH] 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 --- lib/Transforms/Scalar/ADCE.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) 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() { -- 2.34.1