Chris Lattner | c8e6654 | 2002-04-27 06:56:12 +0000 | [diff] [blame^] | 1 | /* Title: FunctionLiveVarInfo.h -*- C++ -*- |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 2 | Author: Ruchira Sasanka |
| 3 | Date: Jun 30, 01 |
| 4 | Purpose: |
| 5 | |
Chris Lattner | c8e6654 | 2002-04-27 06:56:12 +0000 | [diff] [blame^] | 6 | This is the interface for live variable info of a function that is required |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 7 | by any other part of the compiler |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 8 | |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 9 | It must be called like: |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 10 | |
Chris Lattner | c8e6654 | 2002-04-27 06:56:12 +0000 | [diff] [blame^] | 11 | FunctionLiveVarInfo FLVI(Function *); // initializes data structures |
| 12 | FLVI.analyze(); // do the actural live variable anal |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 13 | |
| 14 | After the analysis, getInSetOfBB or getOutSetofBB can be called to get |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 15 | live var info of a BB. |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 16 | |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 17 | The live var set before an instruction can be obtained in 2 ways: |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 18 | |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 19 | 1. Use the method getLiveVarSetAfterInst(Instruction *) to get the LV Info |
| 20 | just after an instruction. (also exists getLiveVarSetBeforeInst(..)) |
| 21 | |
| 22 | This function caluclates the LV info for a BB only once and caches that |
| 23 | info. If the cache does not contain the LV info of the instruction, it |
| 24 | calculates the LV info for the whole BB and caches them. |
| 25 | |
| 26 | Getting liveVar info this way uses more memory since, LV info should be |
| 27 | cached. However, if you need LV info of nearly all the instructions of a |
| 28 | BB, this is the best and simplest interfrace. |
| 29 | |
| 30 | |
| 31 | 2. Use the OutSet and applyTranferFuncForInst(const Instruction *const Inst) |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 32 | declared in LiveVarSet and traverse the instructions of a basic block in |
| 33 | reverse (using const_reverse_iterator in the BB class). |
| 34 | |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 35 | This is the most memory efficient method if you need LV info for |
| 36 | only several instructions in a BasicBlock. An example is given below: |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 37 | |
| 38 | |
| 39 | LiveVarSet LVSet; // this will be the set used to traverse through each BB |
| 40 | |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 41 | // Initialize LVSet so that it is the same as OutSet of the BB |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 42 | LVSet.setUnion( LVI->getOutSetOfBB( *BBI ) ); |
| 43 | |
| 44 | BasicBlock::InstListType::const_reverse_iterator |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 45 | InstIterator = InstListInBB.rbegin(); // get the rev iter for inst in BB |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 46 | |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 47 | // iterate over all the instructions in BB in reverse |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 48 | for( ; InstIterator != InstListInBB.rend(); InstIterator++) { |
| 49 | |
| 50 | //...... all code here which uses LVSet ........ |
| 51 | |
| 52 | LVSet.applyTranferFuncForInst(*InstIterator); |
| 53 | |
| 54 | // Now LVSet contains live vars ABOVE the current instrution |
| 55 | } |
| 56 | |
| 57 | See buildInterferenceGraph() for the above example. |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 58 | */ |
| 59 | |
| 60 | |
| 61 | #ifndef METH_LIVE_VAR_INFO_H |
| 62 | #define METH_LIVE_VAR_INFO_H |
| 63 | |
Chris Lattner | 494266e | 2002-02-04 20:00:08 +0000 | [diff] [blame] | 64 | #include "llvm/Pass.h" |
Chris Lattner | b1def73 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 65 | #include "llvm/Analysis/LiveVar/ValueSet.h" |
Vikram S. Adve | 7e51201 | 2002-03-19 00:59:08 +0000 | [diff] [blame] | 66 | #include "Support/CommandLine.h" |
| 67 | |
Chris Lattner | 94b8baf | 2002-02-05 00:33:19 +0000 | [diff] [blame] | 68 | class BBLiveVar; |
| 69 | class MachineInstr; |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 70 | |
Vikram S. Adve | 7e51201 | 2002-03-19 00:59:08 +0000 | [diff] [blame] | 71 | |
| 72 | enum LiveVarDebugLevel_t { |
| 73 | LV_DEBUG_None, |
| 74 | LV_DEBUG_Normal, |
| 75 | LV_DEBUG_Instr, |
| 76 | LV_DEBUG_Verbose |
| 77 | }; |
| 78 | |
| 79 | extern cl::Enum<LiveVarDebugLevel_t> DEBUG_LV; |
| 80 | |
| 81 | |
Chris Lattner | c8e6654 | 2002-04-27 06:56:12 +0000 | [diff] [blame^] | 82 | class MethodLiveVarInfo : public FunctionPass { |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 83 | // Machine Instr to LiveVarSet Map for providing LVset BEFORE each inst |
Chris Lattner | b1def73 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 84 | std::map<const MachineInstr *, const ValueSet *> MInst2LVSetBI; |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 85 | |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 86 | // Machine Instr to LiveVarSet Map for providing LVset AFTER each inst |
Chris Lattner | b1def73 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 87 | std::map<const MachineInstr *, const ValueSet *> MInst2LVSetAI; |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 88 | |
Chris Lattner | 4e8c487 | 2002-03-23 22:51:58 +0000 | [diff] [blame] | 89 | // Stored Function that the data is computed with respect to |
| 90 | const Function *M; |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 91 | |
| 92 | // --------- private methods ----------------------------------------- |
| 93 | |
| 94 | // constructs BBLiveVars and init Def and In sets |
Chris Lattner | 4e8c487 | 2002-03-23 22:51:58 +0000 | [diff] [blame] | 95 | void constructBBs(const Function *F); |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 96 | |
| 97 | // do one backward pass over the CFG |
Chris Lattner | 4e8c487 | 2002-03-23 22:51:58 +0000 | [diff] [blame] | 98 | bool doSingleBackwardPass(const Function *F, unsigned int iter); |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 99 | |
| 100 | // calculates live var sets for instructions in a BB |
Chris Lattner | 339a3f6 | 2002-02-04 16:32:40 +0000 | [diff] [blame] | 101 | void calcLiveVarSetsForBB(const BasicBlock *BB); |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 102 | |
Chris Lattner | 494266e | 2002-02-04 20:00:08 +0000 | [diff] [blame] | 103 | public: |
| 104 | static AnalysisID ID; // We are an analysis, we must have an ID |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 105 | |
Chris Lattner | 439d0e5 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 106 | MethodLiveVarInfo(AnalysisID id = ID) { assert(id == ID); } |
Chris Lattner | 494266e | 2002-02-04 20:00:08 +0000 | [diff] [blame] | 107 | |
Chris Lattner | c8e6654 | 2002-04-27 06:56:12 +0000 | [diff] [blame^] | 108 | // --------- Implement the FunctionPass interface ---------------------- |
Chris Lattner | 494266e | 2002-02-04 20:00:08 +0000 | [diff] [blame] | 109 | |
Chris Lattner | c8e6654 | 2002-04-27 06:56:12 +0000 | [diff] [blame^] | 110 | // runOnFunction - Perform analysis, update internal data structures. |
| 111 | virtual bool runOnFunction(Function *F); |
Chris Lattner | 494266e | 2002-02-04 20:00:08 +0000 | [diff] [blame] | 112 | |
| 113 | // releaseMemory - After LiveVariable analysis has been used, forget! |
| 114 | virtual void releaseMemory(); |
| 115 | |
Chris Lattner | c8e6654 | 2002-04-27 06:56:12 +0000 | [diff] [blame^] | 116 | // getAnalysisUsage - Provide self! |
| 117 | virtual void getAnalysisUsage(AnalysisUsage &AU) const { |
| 118 | AU.setPreservesAll(); |
| 119 | AU.addProvided(ID); |
Chris Lattner | 494266e | 2002-02-04 20:00:08 +0000 | [diff] [blame] | 120 | } |
| 121 | |
| 122 | // --------- Functions to access analysis results ------------------- |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 123 | |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 124 | // gets OutSet of a BB |
Chris Lattner | 7e5ee42 | 2002-02-05 04:20:12 +0000 | [diff] [blame] | 125 | const ValueSet &getOutSetOfBB(const BasicBlock *BB) const; |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 126 | |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 127 | // gets InSet of a BB |
Chris Lattner | 7e5ee42 | 2002-02-05 04:20:12 +0000 | [diff] [blame] | 128 | const ValueSet &getInSetOfBB(const BasicBlock *BB) const; |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 129 | |
| 130 | // gets the Live var set BEFORE an instruction |
Chris Lattner | 7e5ee42 | 2002-02-05 04:20:12 +0000 | [diff] [blame] | 131 | const ValueSet &getLiveVarSetBeforeMInst(const MachineInstr *MI, |
Chris Lattner | b1def73 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 132 | const BasicBlock *BB); |
Ruchira Sasanka | ec1a541 | 2001-08-20 21:11:01 +0000 | [diff] [blame] | 133 | |
| 134 | // gets the Live var set AFTER an instruction |
Chris Lattner | 7e5ee42 | 2002-02-05 04:20:12 +0000 | [diff] [blame] | 135 | const ValueSet &getLiveVarSetAfterMInst(const MachineInstr *MI, |
Chris Lattner | b1def73 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 136 | const BasicBlock *BB); |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 137 | }; |
| 138 | |
Ruchira Sasanka | 9f18119 | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 139 | #endif |