mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-27 16:17:17 +00:00
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
This commit is contained in:
@@ -22,6 +22,7 @@
|
|||||||
#include "llvm/Support/InstIterator.h"
|
#include "llvm/Support/InstIterator.h"
|
||||||
#include "llvm/ADT/Statistic.h"
|
#include "llvm/ADT/Statistic.h"
|
||||||
#include "llvm/ADT/SmallPtrSet.h"
|
#include "llvm/ADT/SmallPtrSet.h"
|
||||||
|
#include "llvm/ADT/SmallVector.h"
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
@@ -32,6 +33,9 @@ namespace {
|
|||||||
static char ID; // Pass identification, replacement for typeid
|
static char ID; // Pass identification, replacement for typeid
|
||||||
ADCE() : FunctionPass((intptr_t)&ID) {}
|
ADCE() : FunctionPass((intptr_t)&ID) {}
|
||||||
|
|
||||||
|
SmallPtrSet<Instruction*, 1024> alive;
|
||||||
|
SmallVector<Instruction*, 1024> worklist;
|
||||||
|
|
||||||
virtual bool runOnFunction(Function& F);
|
virtual bool runOnFunction(Function& F);
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage& AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage& AU) const {
|
||||||
@@ -45,8 +49,8 @@ char ADCE::ID = 0;
|
|||||||
static RegisterPass<ADCE> X("adce", "Aggressive Dead Code Elimination");
|
static RegisterPass<ADCE> X("adce", "Aggressive Dead Code Elimination");
|
||||||
|
|
||||||
bool ADCE::runOnFunction(Function& F) {
|
bool ADCE::runOnFunction(Function& F) {
|
||||||
SmallPtrSet<Instruction*, 32> alive;
|
alive.clear();
|
||||||
std::vector<Instruction*> worklist;
|
worklist.clear();
|
||||||
|
|
||||||
// Collect the set of "root" instructions that are known live.
|
// Collect the set of "root" instructions that are known live.
|
||||||
for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I)
|
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
|
// 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
|
// which have no side effects and do not influence the control flow or return
|
||||||
// value of the function, and may therefore be deleted safely.
|
// 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)
|
for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I)
|
||||||
if (!alive.count(I.getInstructionIterator())) {
|
if (!alive.count(I.getInstructionIterator())) {
|
||||||
dead.insert(I.getInstructionIterator());
|
worklist.push_back(I.getInstructionIterator());
|
||||||
I->dropAllReferences();
|
I->dropAllReferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (SmallPtrSet<Instruction*, 32>::iterator I = dead.begin(),
|
for (SmallVector<Instruction*, 1024>::iterator I = worklist.begin(),
|
||||||
E = dead.end(); I != E; ++I) {
|
E = worklist.end(); I != E; ++I) {
|
||||||
NumRemoved++;
|
NumRemoved++;
|
||||||
(*I)->eraseFromParent();
|
(*I)->eraseFromParent();
|
||||||
}
|
}
|
||||||
|
|
||||||
return !dead.empty();
|
return !worklist.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
FunctionPass *llvm::createAggressiveDCEPass() {
|
FunctionPass *llvm::createAggressiveDCEPass() {
|
||||||
|
Reference in New Issue
Block a user