X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTransforms%2FScalar%2FDCE.cpp;h=8dbcc23d7ec85677a75d2863323f85488f08bb41;hb=827454e6e28cfed93db990b03b720ef7c23e6917;hp=a63fcb6589f7ae2e9b10ebd67693797d269ccdac;hpb=844731a7f1909f55935e3514c9e713a62d67662e;p=oota-llvm.git diff --git a/lib/Transforms/Scalar/DCE.cpp b/lib/Transforms/Scalar/DCE.cpp index a63fcb6589f..8dbcc23d7ec 100644 --- a/lib/Transforms/Scalar/DCE.cpp +++ b/lib/Transforms/Scalar/DCE.cpp @@ -21,10 +21,8 @@ #include "llvm/Transforms/Utils/Local.h" #include "llvm/Instruction.h" #include "llvm/Pass.h" -#include "llvm/Support/Compiler.h" #include "llvm/Support/InstIterator.h" #include "llvm/ADT/Statistic.h" -#include using namespace llvm; STATISTIC(DIEEliminated, "Number of insts removed by DIE pass"); @@ -34,17 +32,21 @@ namespace { //===--------------------------------------------------------------------===// // DeadInstElimination pass implementation // - struct VISIBILITY_HIDDEN DeadInstElimination : public BasicBlockPass { + struct DeadInstElimination : public BasicBlockPass { static char ID; // Pass identification, replacement for typeid - DeadInstElimination() : BasicBlockPass(intptr_t(&ID)) {} + DeadInstElimination() : BasicBlockPass(ID) { + initializeDeadInstEliminationPass(*PassRegistry::getPassRegistry()); + } virtual bool runOnBasicBlock(BasicBlock &BB) { bool Changed = false; - for (BasicBlock::iterator DI = BB.begin(); DI != BB.end(); ) - if (dceInstruction(DI)) { + for (BasicBlock::iterator DI = BB.begin(); DI != BB.end(); ) { + Instruction *Inst = DI++; + if (isInstructionTriviallyDead(Inst)) { + Inst->eraseFromParent(); Changed = true; ++DIEEliminated; - } else - ++DI; + } + } return Changed; } @@ -55,8 +57,8 @@ namespace { } char DeadInstElimination::ID = 0; -static RegisterPass -X("die", "Dead Instruction Elimination"); +INITIALIZE_PASS(DeadInstElimination, "die", + "Dead Instruction Elimination", false, false) Pass *llvm::createDeadInstEliminationPass() { return new DeadInstElimination(); @@ -69,7 +71,9 @@ namespace { // struct DCE : public FunctionPass { static char ID; // Pass identification, replacement for typeid - DCE() : FunctionPass((intptr_t)&ID) {} + DCE() : FunctionPass(ID) { + initializeDCEPass(*PassRegistry::getPassRegistry()); + } virtual bool runOnFunction(Function &F); @@ -80,7 +84,7 @@ namespace { } char DCE::ID = 0; -static RegisterPass Y("dce", "Dead Code Elimination"); +INITIALIZE_PASS(DCE, "dce", "Dead Code Elimination", false, false) bool DCE::runOnFunction(Function &F) { // Start out with all of the instructions in the worklist... @@ -111,11 +115,12 @@ bool DCE::runOnFunction(Function &F) { // Remove the instruction from the worklist if it still exists in it. for (std::vector::iterator WI = WorkList.begin(); - WI != WorkList.end(); ++WI) - if (*WI == I) { + WI != WorkList.end(); ) { + if (*WI == I) WI = WorkList.erase(WI); - --WI; - } + else + ++WI; + } MadeChange = true; ++DCEEliminated;