forked from OSchip/llvm-project
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. llvm-svn: 52618
This commit is contained in:
parent
5ca5e02480
commit
00fdbd01e5
|
@ -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() {
|
||||
|
|
Loading…
Reference in New Issue