ConstantProp.cpp revision b6ac8bc586f7d7a2c07e3d3141a77c8e0cc1bb5d
1//===- ConstantProp.cpp - Code to perform Simple Constant Propagation -----===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by the LLVM research group and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements constant propagation and merging: 11// 12// Specifically, this: 13// * Converts instructions like "add int 1, 2" into 3 14// 15// Notice that: 16// * This pass has a habit of making definitions be dead. It is a good idea 17// to to run a DIE pass sometime after running this pass. 18// 19//===----------------------------------------------------------------------===// 20 21#include "llvm/Transforms/Scalar.h" 22#include "llvm/Transforms/Utils/Local.h" 23#include "llvm/Constant.h" 24#include "llvm/Instruction.h" 25#include "llvm/Pass.h" 26#include "llvm/Support/InstIterator.h" 27#include "Support/Statistic.h" 28#include <set> 29using namespace llvm; 30 31namespace { 32 Statistic<> NumInstKilled("constprop", "Number of instructions killed"); 33 34 struct ConstantPropagation : public FunctionPass { 35 bool runOnFunction(Function &F); 36 37 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 38 AU.setPreservesCFG(); 39 } 40 }; 41 42 RegisterOpt<ConstantPropagation> X("constprop","Simple constant propagation"); 43} 44 45Pass *llvm::createConstantPropagationPass() { 46 return new ConstantPropagation(); 47} 48 49 50bool ConstantPropagation::runOnFunction(Function &F) { 51 // Initialize the worklist to all of the instructions ready to process... 52 std::set<Instruction*> WorkList(inst_begin(F), inst_end(F)); 53 bool Changed = false; 54 55 while (!WorkList.empty()) { 56 Instruction *I = *WorkList.begin(); 57 WorkList.erase(WorkList.begin()); // Get an element from the worklist... 58 59 if (!I->use_empty()) // Don't muck with dead instructions... 60 if (Constant *C = ConstantFoldInstruction(I)) { 61 // Add all of the users of this instruction to the worklist, they might 62 // be constant propagatable now... 63 for (Value::use_iterator UI = I->use_begin(), UE = I->use_end(); 64 UI != UE; ++UI) 65 WorkList.insert(cast<Instruction>(*UI)); 66 67 // Replace all of the uses of a variable with uses of the constant. 68 I->replaceAllUsesWith(C); 69 70 // We made a change to the function... 71 Changed = true; 72 ++NumInstKilled; 73 } 74 } 75 return Changed; 76} 77