X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTransforms%2FScalar%2FConstantProp.cpp;h=664c3f6a222f7df19f6ddd74bb03da8780059abf;hb=827454e6e28cfed93db990b03b720ef7c23e6917;hp=7085ef98006e21a54625886c02415c6e6a355d1e;hpb=2ed01d8f0bdb8aa73d893a8beb23b1838422fa32;p=oota-llvm.git diff --git a/lib/Transforms/Scalar/ConstantProp.cpp b/lib/Transforms/Scalar/ConstantProp.cpp index 7085ef98006..664c3f6a222 100644 --- a/lib/Transforms/Scalar/ConstantProp.cpp +++ b/lib/Transforms/Scalar/ConstantProp.cpp @@ -1,44 +1,66 @@ -//===- ConstantProp.cpp - Code to perform Simple Constant Propogation -----===// +//===- ConstantProp.cpp - Code to perform Simple Constant Propagation -----===// // -// This file implements constant propogation and merging: +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements constant propagation and merging: // // Specifically, this: // * Converts instructions like "add int 1, 2" into 3 // // Notice that: // * This pass has a habit of making definitions be dead. It is a good idea -// to to run a DIE pass sometime after running this pass. +// to run a DIE pass sometime after running this pass. // //===----------------------------------------------------------------------===// -#include "llvm/Transforms/Scalar/ConstantProp.h" -#include "llvm/Transforms/Utils/Local.h" -#include "llvm/ConstantHandling.h" +#define DEBUG_TYPE "constprop" +#include "llvm/Transforms/Scalar.h" +#include "llvm/Analysis/ConstantFolding.h" +#include "llvm/Constant.h" #include "llvm/Instruction.h" #include "llvm/Pass.h" #include "llvm/Support/InstIterator.h" +#include "llvm/ADT/Statistic.h" #include +using namespace llvm; + +STATISTIC(NumInstKilled, "Number of instructions killed"); namespace { - struct ConstantPropogation : public FunctionPass { - const char *getPassName() const { return "Simple Constant Propogation"; } + struct ConstantPropagation : public FunctionPass { + static char ID; // Pass identification, replacement for typeid + ConstantPropagation() : FunctionPass(ID) { + initializeConstantPropagationPass(*PassRegistry::getPassRegistry()); + } - inline bool runOnFunction(Function *F); + bool runOnFunction(Function &F); virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.preservesCFG(); + AU.setPreservesCFG(); } }; } -Pass *createConstantPropogationPass() { - return new ConstantPropogation(); +char ConstantPropagation::ID = 0; +INITIALIZE_PASS(ConstantPropagation, "constprop", + "Simple constant propagation", false, false) + +FunctionPass *llvm::createConstantPropagationPass() { + return new ConstantPropagation(); } -bool ConstantPropogation::runOnFunction(Function *F) { +bool ConstantPropagation::runOnFunction(Function &F) { // Initialize the worklist to all of the instructions ready to process... - std::set WorkList(inst_begin(F), inst_end(F)); + std::set WorkList; + for(inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i) { + WorkList.insert(&*i); + } bool Changed = false; while (!WorkList.empty()) { @@ -48,16 +70,21 @@ bool ConstantPropogation::runOnFunction(Function *F) { if (!I->use_empty()) // Don't muck with dead instructions... if (Constant *C = ConstantFoldInstruction(I)) { // Add all of the users of this instruction to the worklist, they might - // be constant propogatable now... + // be constant propagatable now... for (Value::use_iterator UI = I->use_begin(), UE = I->use_end(); UI != UE; ++UI) WorkList.insert(cast(*UI)); - + // Replace all of the uses of a variable with uses of the constant. I->replaceAllUsesWith(C); - + + // Remove the dead instruction. + WorkList.erase(I); + I->eraseFromParent(); + // We made a change to the function... Changed = true; + ++NumInstKilled; } } return Changed;