Chris Lattner | 89df1b5 | 2002-05-06 18:21:31 +0000 | [diff] [blame] | 1 | //===- ConstantProp.cpp - Code to perform Simple Constant Propogation -----===// |
Chris Lattner | 0095054 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 2 | // |
| 3 | // This file implements constant propogation and merging: |
| 4 | // |
| 5 | // Specifically, this: |
Chris Lattner | 89df1b5 | 2002-05-06 18:21:31 +0000 | [diff] [blame] | 6 | // * Converts instructions like "add int 1, 2" into 3 |
Chris Lattner | 0095054 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 7 | // |
| 8 | // Notice that: |
| 9 | // * This pass has a habit of making definitions be dead. It is a good idea |
Chris Lattner | 89df1b5 | 2002-05-06 18:21:31 +0000 | [diff] [blame] | 10 | // to to run a DIE pass sometime after running this pass. |
Chris Lattner | 0095054 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
Chris Lattner | 022103b | 2002-05-07 20:03:00 +0000 | [diff] [blame] | 14 | #include "llvm/Transforms/Scalar.h" |
Chris Lattner | 2ed01d8 | 2002-05-07 18:10:55 +0000 | [diff] [blame] | 15 | #include "llvm/Transforms/Utils/Local.h" |
Chris Lattner | 968ddc9 | 2002-04-08 20:18:09 +0000 | [diff] [blame] | 16 | #include "llvm/ConstantHandling.h" |
Chris Lattner | 2ed01d8 | 2002-05-07 18:10:55 +0000 | [diff] [blame] | 17 | #include "llvm/Instruction.h" |
Chris Lattner | bd0ef77 | 2002-02-26 21:46:54 +0000 | [diff] [blame] | 18 | #include "llvm/Pass.h" |
Chris Lattner | 89df1b5 | 2002-05-06 18:21:31 +0000 | [diff] [blame] | 19 | #include "llvm/Support/InstIterator.h" |
Chris Lattner | 2172db0 | 2002-05-13 22:04:46 +0000 | [diff] [blame] | 20 | #include "Support/StatisticReporter.h" |
Chris Lattner | 89df1b5 | 2002-05-06 18:21:31 +0000 | [diff] [blame] | 21 | #include <set> |
Chris Lattner | 0095054 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 22 | |
Chris Lattner | 3dec1f2 | 2002-05-10 15:38:35 +0000 | [diff] [blame] | 23 | static Statistic<> NumInstKilled("constprop - Number of instructions killed"); |
| 24 | |
Chris Lattner | bd0ef77 | 2002-02-26 21:46:54 +0000 | [diff] [blame] | 25 | namespace { |
Chris Lattner | f57b845 | 2002-04-27 06:56:12 +0000 | [diff] [blame] | 26 | struct ConstantPropogation : public FunctionPass { |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 27 | bool runOnFunction(Function &F); |
Chris Lattner | 97e52e4 | 2002-04-28 21:27:06 +0000 | [diff] [blame] | 28 | |
| 29 | virtual void getAnalysisUsage(AnalysisUsage &AU) const { |
Chris Lattner | 89df1b5 | 2002-05-06 18:21:31 +0000 | [diff] [blame] | 30 | AU.preservesCFG(); |
Chris Lattner | 97e52e4 | 2002-04-28 21:27:06 +0000 | [diff] [blame] | 31 | } |
Chris Lattner | bd0ef77 | 2002-02-26 21:46:54 +0000 | [diff] [blame] | 32 | }; |
Chris Lattner | f629309 | 2002-07-23 18:06:35 +0000 | [diff] [blame] | 33 | |
Chris Lattner | a6275cc | 2002-07-26 21:12:46 +0000 | [diff] [blame^] | 34 | RegisterOpt<ConstantPropogation> X("constprop","Simple constant propogation"); |
Chris Lattner | 0095054 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 35 | } |
Chris Lattner | bd0ef77 | 2002-02-26 21:46:54 +0000 | [diff] [blame] | 36 | |
| 37 | Pass *createConstantPropogationPass() { |
| 38 | return new ConstantPropogation(); |
| 39 | } |
| 40 | |
Chris Lattner | 89df1b5 | 2002-05-06 18:21:31 +0000 | [diff] [blame] | 41 | |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 42 | bool ConstantPropogation::runOnFunction(Function &F) { |
Chris Lattner | 89df1b5 | 2002-05-06 18:21:31 +0000 | [diff] [blame] | 43 | // Initialize the worklist to all of the instructions ready to process... |
| 44 | std::set<Instruction*> WorkList(inst_begin(F), inst_end(F)); |
| 45 | bool Changed = false; |
| 46 | |
| 47 | while (!WorkList.empty()) { |
| 48 | Instruction *I = *WorkList.begin(); |
| 49 | WorkList.erase(WorkList.begin()); // Get an element from the worklist... |
| 50 | |
| 51 | if (!I->use_empty()) // Don't muck with dead instructions... |
| 52 | if (Constant *C = ConstantFoldInstruction(I)) { |
| 53 | // Add all of the users of this instruction to the worklist, they might |
| 54 | // be constant propogatable now... |
| 55 | for (Value::use_iterator UI = I->use_begin(), UE = I->use_end(); |
| 56 | UI != UE; ++UI) |
| 57 | WorkList.insert(cast<Instruction>(*UI)); |
| 58 | |
| 59 | // Replace all of the uses of a variable with uses of the constant. |
| 60 | I->replaceAllUsesWith(C); |
Chris Lattner | 3dec1f2 | 2002-05-10 15:38:35 +0000 | [diff] [blame] | 61 | |
Chris Lattner | 89df1b5 | 2002-05-06 18:21:31 +0000 | [diff] [blame] | 62 | // We made a change to the function... |
| 63 | Changed = true; |
Chris Lattner | 3dec1f2 | 2002-05-10 15:38:35 +0000 | [diff] [blame] | 64 | ++NumInstKilled; |
Chris Lattner | 89df1b5 | 2002-05-06 18:21:31 +0000 | [diff] [blame] | 65 | } |
| 66 | } |
| 67 | return Changed; |
| 68 | } |