X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTransforms%2FScalar%2FDCE.cpp;h=1f5def63e487e404b40d8f65b479df14dcb7a800;hb=7e70829632f82de15db187845666aaca6e04b792;hp=793b3abb6a3adf30d6446f9055f6c5bbb0830d31;hpb=022103b3f33febb7e54b8fdf2c9bc461eea78cba;p=oota-llvm.git diff --git a/lib/Transforms/Scalar/DCE.cpp b/lib/Transforms/Scalar/DCE.cpp index 793b3abb6a3..1f5def63e48 100644 --- a/lib/Transforms/Scalar/DCE.cpp +++ b/lib/Transforms/Scalar/DCE.cpp @@ -14,8 +14,12 @@ #include "llvm/Instruction.h" #include "llvm/Pass.h" #include "llvm/Support/InstIterator.h" +#include "Support/StatisticReporter.h" #include +static Statistic<> DIEEliminated("die\t\t- Number of insts removed"); +static Statistic<> DCEEliminated("dce\t\t- Number of insts removed"); + //===----------------------------------------------------------------------===// // DeadInstElimination pass implementation // @@ -24,13 +28,13 @@ namespace { struct DeadInstElimination : public BasicBlockPass { const char *getPassName() const { return "Dead Instruction Elimination"; } - virtual bool runOnBasicBlock(BasicBlock *BB) { - BasicBlock::InstListType &Vals = BB->getInstList(); + virtual bool runOnBasicBlock(BasicBlock &BB) { bool Changed = false; - for (BasicBlock::iterator DI = Vals.begin(); DI != Vals.end(); ) - if (dceInstruction(Vals, DI)) + for (BasicBlock::iterator DI = BB.begin(); DI != BB.end(); ) + if (dceInstruction(DI)) { Changed = true; - else + ++DIEEliminated; + } else ++DI; return Changed; } @@ -55,7 +59,7 @@ namespace { struct DCE : public FunctionPass { const char *getPassName() const { return "Dead Code Elimination"; } - virtual bool runOnFunction(Function *F); + virtual bool runOnFunction(Function &F); virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.preservesCFG(); @@ -63,7 +67,7 @@ namespace { }; } -bool DCE::runOnFunction(Function *F) { +bool DCE::runOnFunction(Function &F) { // Start out with all of the instructions in the worklist... std::vector WorkList(inst_begin(F), inst_end(F)); std::set DeadInsts; @@ -98,15 +102,14 @@ bool DCE::runOnFunction(Function *F) { if (DeadInsts.empty()) return false; // Otherwise, loop over the program, removing and deleting the instructions... - for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) { - BasicBlock::InstListType &BBIL = (*I)->getInstList(); - for (BasicBlock::iterator BI = BBIL.begin(); BI != BBIL.end(); ) - if (DeadInsts.count(*BI)) { // Is this instruction dead? - delete BBIL.remove(BI); // Yup, remove and delete inst + for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) + for (BasicBlock::iterator BI = I->begin(); BI != I->end(); ) + if (DeadInsts.count(BI)) { // Is this instruction dead? + BI = I->getInstList().erase(BI); // Yup, remove and delete inst + ++DCEEliminated; } else { // This instruction is not dead ++BI; // Continue on to the next one... } - } return true; }