X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTransforms%2FScalar%2FDCE.cpp;h=e8a090af40c316f1d3d09b53d00b926f67b633aa;hb=0b8c9a80f20772c3793201ab5b251d3520b9cea3;hp=a4a1104e92428ca5d877e4f9dd8d596a9a1e3932;hpb=7f8897f22e88271cfa114998a4d6088e7c8e8e11;p=oota-llvm.git diff --git a/lib/Transforms/Scalar/DCE.cpp b/lib/Transforms/Scalar/DCE.cpp index a4a1104e924..e8a090af40c 100644 --- a/lib/Transforms/Scalar/DCE.cpp +++ b/lib/Transforms/Scalar/DCE.cpp @@ -2,8 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -16,32 +16,39 @@ // //===----------------------------------------------------------------------===// +#define DEBUG_TYPE "dce" #include "llvm/Transforms/Scalar.h" -#include "llvm/Transforms/Utils/Local.h" -#include "llvm/Instruction.h" +#include "llvm/ADT/Statistic.h" +#include "llvm/IR/Instruction.h" #include "llvm/Pass.h" #include "llvm/Support/InstIterator.h" -#include "llvm/ADT/Statistic.h" -#include +#include "llvm/Target/TargetLibraryInfo.h" +#include "llvm/Transforms/Utils/Local.h" using namespace llvm; -namespace { - Statistic<> DIEEliminated("die", "Number of insts removed"); - Statistic<> DCEEliminated("dce", "Number of insts removed"); +STATISTIC(DIEEliminated, "Number of insts removed by DIE pass"); +STATISTIC(DCEEliminated, "Number of insts removed"); +namespace { //===--------------------------------------------------------------------===// // DeadInstElimination pass implementation // - struct DeadInstElimination : public BasicBlockPass { + static char ID; // Pass identification, replacement for typeid + DeadInstElimination() : BasicBlockPass(ID) { + initializeDeadInstEliminationPass(*PassRegistry::getPassRegistry()); + } virtual bool runOnBasicBlock(BasicBlock &BB) { + TargetLibraryInfo *TLI = getAnalysisIfAvailable(); 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, TLI)) { + Inst->eraseFromParent(); Changed = true; ++DIEEliminated; - } else - ++DI; + } + } return Changed; } @@ -49,32 +56,41 @@ namespace { AU.setPreservesCFG(); } }; - - RegisterPass X("die", "Dead Instruction Elimination"); } -FunctionPass *llvm::createDeadInstEliminationPass() { +char DeadInstElimination::ID = 0; +INITIALIZE_PASS(DeadInstElimination, "die", + "Dead Instruction Elimination", false, false) + +Pass *llvm::createDeadInstEliminationPass() { return new DeadInstElimination(); } -//===----------------------------------------------------------------------===// -// DeadCodeElimination pass implementation -// - namespace { + //===--------------------------------------------------------------------===// + // DeadCodeElimination pass implementation + // struct DCE : public FunctionPass { + static char ID; // Pass identification, replacement for typeid + DCE() : FunctionPass(ID) { + initializeDCEPass(*PassRegistry::getPassRegistry()); + } + virtual bool runOnFunction(Function &F); virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesCFG(); } }; - - RegisterPass Y("dce", "Dead Code Elimination"); } +char DCE::ID = 0; +INITIALIZE_PASS(DCE, "dce", "Dead Code Elimination", false, false) + bool DCE::runOnFunction(Function &F) { + TargetLibraryInfo *TLI = getAnalysisIfAvailable(); + // Start out with all of the instructions in the worklist... std::vector WorkList; for (inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i) @@ -89,7 +105,7 @@ bool DCE::runOnFunction(Function &F) { Instruction *I = WorkList.back(); WorkList.pop_back(); - if (isInstructionTriviallyDead(I)) { // If the instruction is dead. + if (isInstructionTriviallyDead(I, TLI)) { // If the instruction is dead. // Loop over all of the values that the instruction uses, if there are // instructions being used, add them to the worklist, because they might // go dead after this one is removed. @@ -102,13 +118,8 @@ bool DCE::runOnFunction(Function &F) { I->eraseFromParent(); // Remove the instruction from the worklist if it still exists in it. - for (std::vector::iterator WI = WorkList.begin(), - E = WorkList.end(); WI != E; ++WI) - if (*WI == I) { - WorkList.erase(WI); - --E; - --WI; - } + WorkList.erase(std::remove(WorkList.begin(), WorkList.end(), I), + WorkList.end()); MadeChange = true; ++DCEEliminated;