| Chris Lattner | f57b845 | 2002-04-27 06:56:12 +0000 | [diff] [blame] | 1 | //===-- FunctionLiveVarInfo.cpp - Live Variable Analysis for a Function ---===// | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 2 | // | 
| Chris Lattner | f57b845 | 2002-04-27 06:56:12 +0000 | [diff] [blame] | 3 | // This is the interface to function level live variable information that is | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 4 | // provided by live variable analysis. | 
|  | 5 | // | 
|  | 6 | //===----------------------------------------------------------------------===// | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 7 |  | 
| Chris Lattner | 483e14e | 2002-04-27 07:27:19 +0000 | [diff] [blame] | 8 | #include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h" | 
| Chris Lattner | f39f379 | 2002-02-05 00:43:37 +0000 | [diff] [blame] | 9 | #include "BBLiveVar.h" | 
| Ruchira Sasanka | e27c344 | 2001-08-20 21:12:49 +0000 | [diff] [blame] | 10 | #include "llvm/CodeGen/MachineInstr.h" | 
| Vikram S. Adve | 9afa88c | 2002-07-08 22:56:34 +0000 | [diff] [blame] | 11 | #include "llvm/CodeGen/MachineCodeForBasicBlock.h" | 
| Chris Lattner | 221d688 | 2002-02-12 21:07:25 +0000 | [diff] [blame] | 12 | #include "llvm/Support/CFG.h" | 
| Chris Lattner | cee8f9a | 2001-11-27 00:03:19 +0000 | [diff] [blame] | 13 | #include "Support/PostOrderIterator.h" | 
| Chris Lattner | 7471a7b | 2002-02-05 03:35:53 +0000 | [diff] [blame] | 14 | #include "Support/SetOperations.h" | 
| Chris Lattner | 70e60cb | 2002-05-22 17:08:27 +0000 | [diff] [blame] | 15 | #include "Support/CommandLine.h" | 
| Chris Lattner | 697954c | 2002-01-20 22:54:45 +0000 | [diff] [blame] | 16 | #include <iostream> | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 17 |  | 
| Chris Lattner | 1e43516 | 2002-07-26 21:12:44 +0000 | [diff] [blame^] | 18 | static RegisterAnalysis<FunctionLiveVarInfo> | 
|  | 19 | X("livevar", "Live Variable Analysis"); | 
| Chris Lattner | 483e14e | 2002-04-27 07:27:19 +0000 | [diff] [blame] | 20 | AnalysisID FunctionLiveVarInfo::ID(AnalysisID::create<FunctionLiveVarInfo>()); | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 21 |  | 
| Chris Lattner | 70e60cb | 2002-05-22 17:08:27 +0000 | [diff] [blame] | 22 | LiveVarDebugLevel_t DEBUG_LV; | 
|  | 23 |  | 
| Chris Lattner | 5ff62e9 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 24 | static cl::opt<LiveVarDebugLevel_t, true> | 
|  | 25 | DEBUG_LV_opt("dlivevar", cl::Hidden, cl::location(DEBUG_LV), | 
|  | 26 | cl::desc("enable live-variable debugging information"), | 
|  | 27 | cl::values( | 
|  | 28 | clEnumValN(LV_DEBUG_None   , "n", "disable debug output"), | 
|  | 29 | clEnumValN(LV_DEBUG_Normal , "y", "enable debug output"), | 
|  | 30 | clEnumValN(LV_DEBUG_Instr,   "i", "print live-var sets before/after " | 
|  | 31 | "every machine instrn"), | 
|  | 32 | clEnumValN(LV_DEBUG_Verbose, "v", "print def, use sets for every instrn also"), | 
|  | 33 | 0)); | 
| Vikram S. Adve | 9cf85a7 | 2002-03-18 03:45:41 +0000 | [diff] [blame] | 34 |  | 
| Chris Lattner | 70e60cb | 2002-05-22 17:08:27 +0000 | [diff] [blame] | 35 |  | 
|  | 36 |  | 
| Chris Lattner | ab58411 | 2002-02-05 00:34:50 +0000 | [diff] [blame] | 37 | //----------------------------------------------------------------------------- | 
|  | 38 | // Accessor Functions | 
|  | 39 | //----------------------------------------------------------------------------- | 
|  | 40 |  | 
|  | 41 | // gets OutSet of a BB | 
| Chris Lattner | 483e14e | 2002-04-27 07:27:19 +0000 | [diff] [blame] | 42 | const ValueSet &FunctionLiveVarInfo::getOutSetOfBB(const BasicBlock *BB) const { | 
| Chris Lattner | 1896150 | 2002-06-25 16:12:52 +0000 | [diff] [blame] | 43 | return BBLiveVar::GetFromBB(*BB)->getOutSet(); | 
| Chris Lattner | ab58411 | 2002-02-05 00:34:50 +0000 | [diff] [blame] | 44 | } | 
|  | 45 |  | 
|  | 46 | // gets InSet of a BB | 
| Chris Lattner | 483e14e | 2002-04-27 07:27:19 +0000 | [diff] [blame] | 47 | const ValueSet &FunctionLiveVarInfo::getInSetOfBB(const BasicBlock *BB) const { | 
| Chris Lattner | 1896150 | 2002-06-25 16:12:52 +0000 | [diff] [blame] | 48 | return BBLiveVar::GetFromBB(*BB)->getInSet(); | 
| Chris Lattner | ab58411 | 2002-02-05 00:34:50 +0000 | [diff] [blame] | 49 | } | 
|  | 50 |  | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 51 |  | 
|  | 52 | //----------------------------------------------------------------------------- | 
| Chris Lattner | f57b845 | 2002-04-27 06:56:12 +0000 | [diff] [blame] | 53 | // Performs live var analysis for a function | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 54 | //----------------------------------------------------------------------------- | 
|  | 55 |  | 
| Chris Lattner | 1896150 | 2002-06-25 16:12:52 +0000 | [diff] [blame] | 56 | bool FunctionLiveVarInfo::runOnFunction(Function &F) { | 
|  | 57 | M = &F; | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 58 | if (DEBUG_LV) std::cerr << "Analysing live variables ...\n"; | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 59 |  | 
|  | 60 | // create and initialize all the BBLiveVars of the CFG | 
| Chris Lattner | 1896150 | 2002-06-25 16:12:52 +0000 | [diff] [blame] | 61 | constructBBs(M); | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 62 |  | 
| Vikram S. Adve | 9cf85a7 | 2002-03-18 03:45:41 +0000 | [diff] [blame] | 63 | unsigned int iter=0; | 
| Chris Lattner | 1896150 | 2002-06-25 16:12:52 +0000 | [diff] [blame] | 64 | while (doSingleBackwardPass(M, iter++)) | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 65 | ; // Iterate until we are done. | 
|  | 66 |  | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 67 | if (DEBUG_LV) std::cerr << "Live Variable Analysis complete!\n"; | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 68 | return false; | 
|  | 69 | } | 
|  | 70 |  | 
|  | 71 |  | 
|  | 72 | //----------------------------------------------------------------------------- | 
|  | 73 | // constructs BBLiveVars and init Def and In sets | 
|  | 74 | //----------------------------------------------------------------------------- | 
|  | 75 |  | 
| Chris Lattner | 483e14e | 2002-04-27 07:27:19 +0000 | [diff] [blame] | 76 | void FunctionLiveVarInfo::constructBBs(const Function *M) { | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 77 | unsigned int POId = 0;                // Reverse Depth-first Order ID | 
|  | 78 |  | 
| Chris Lattner | b7653df | 2002-04-08 22:03:57 +0000 | [diff] [blame] | 79 | for(po_iterator<const Function*> BBI = po_begin(M), BBE = po_end(M); | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 80 | BBI != BBE; ++BBI, ++POId) { | 
| Chris Lattner | 1896150 | 2002-06-25 16:12:52 +0000 | [diff] [blame] | 81 | const BasicBlock &BB = **BBI;        // get the current BB | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 82 |  | 
| Chris Lattner | 0665a5f | 2002-02-05 01:43:49 +0000 | [diff] [blame] | 83 | if (DEBUG_LV) std::cerr << " For BB " << RAV(BB) << ":\n"; | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 84 |  | 
|  | 85 | // create a new BBLiveVar | 
| Chris Lattner | 6357a3f | 2002-02-05 06:52:25 +0000 | [diff] [blame] | 86 | BBLiveVar *LVBB = BBLiveVar::CreateOnBB(BB, POId); | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 87 |  | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 88 | if (DEBUG_LV) | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 89 | LVBB->printAllSets(); | 
|  | 90 | } | 
|  | 91 |  | 
|  | 92 | // Since the PO iterator does not discover unreachable blocks, | 
|  | 93 | // go over the random iterator and init those blocks as well. | 
|  | 94 | // However, LV info is not correct for those blocks (they are not | 
|  | 95 | // analyzed) | 
|  | 96 | // | 
| Chris Lattner | b7653df | 2002-04-08 22:03:57 +0000 | [diff] [blame] | 97 | for (Function::const_iterator BBRI = M->begin(), BBRE = M->end(); | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 98 | BBRI != BBRE; ++BBRI, ++POId) | 
| Chris Lattner | 6357a3f | 2002-02-05 06:52:25 +0000 | [diff] [blame] | 99 | if (!BBLiveVar::GetFromBB(*BBRI))                 // Not yet processed? | 
|  | 100 | BBLiveVar::CreateOnBB(*BBRI, POId); | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 101 | } | 
|  | 102 |  | 
|  | 103 |  | 
|  | 104 | //----------------------------------------------------------------------------- | 
|  | 105 | // do one backward pass over the CFG (for iterative analysis) | 
|  | 106 | //----------------------------------------------------------------------------- | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 107 |  | 
| Chris Lattner | 483e14e | 2002-04-27 07:27:19 +0000 | [diff] [blame] | 108 | bool FunctionLiveVarInfo::doSingleBackwardPass(const Function *M, | 
|  | 109 | unsigned iter) { | 
| Vikram S. Adve | 9cf85a7 | 2002-03-18 03:45:41 +0000 | [diff] [blame] | 110 | if (DEBUG_LV) std::cerr << "\n After Backward Pass " << iter << "...\n"; | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 111 |  | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 112 | bool NeedAnotherIteration = false; | 
| Chris Lattner | fb005fe | 2002-04-09 05:14:14 +0000 | [diff] [blame] | 113 | for (po_iterator<const Function*> BBI = po_begin(M), BBE = po_end(M); | 
|  | 114 | BBI != BBE; ++BBI) { | 
| Chris Lattner | 1896150 | 2002-06-25 16:12:52 +0000 | [diff] [blame] | 115 | BBLiveVar *LVBB = BBLiveVar::GetFromBB(**BBI); | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 116 | assert(LVBB && "BasicBlock information not set for block!"); | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 117 |  | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 118 | if (DEBUG_LV) std::cerr << " For BB " << (*BBI)->getName() << ":\n"; | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 119 |  | 
| Vikram S. Adve | 9cf85a7 | 2002-03-18 03:45:41 +0000 | [diff] [blame] | 120 | // InSets are initialized to "GenSet". Recompute only if OutSet changed. | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 121 | if(LVBB->isOutSetChanged()) | 
|  | 122 | LVBB->applyTransferFunc();        // apply the Tran Func to calc InSet | 
| Vikram S. Adve | 9cf85a7 | 2002-03-18 03:45:41 +0000 | [diff] [blame] | 123 |  | 
| Chris Lattner | fb005fe | 2002-04-09 05:14:14 +0000 | [diff] [blame] | 124 | // OutSets are initialized to EMPTY.  Recompute on first iter or if InSet | 
|  | 125 | // changed. | 
| Vikram S. Adve | 9cf85a7 | 2002-03-18 03:45:41 +0000 | [diff] [blame] | 126 | if (iter == 0 || LVBB->isInSetChanged())        // to calc Outsets of preds | 
| Chris Lattner | fb005fe | 2002-04-09 05:14:14 +0000 | [diff] [blame] | 127 | NeedAnotherIteration |= LVBB->applyFlowFunc(); | 
| Vikram S. Adve | 9cf85a7 | 2002-03-18 03:45:41 +0000 | [diff] [blame] | 128 |  | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 129 | if (DEBUG_LV) LVBB->printInOutSets(); | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 130 | } | 
|  | 131 |  | 
|  | 132 | // true if we need to reiterate over the CFG | 
|  | 133 | return NeedAnotherIteration; | 
|  | 134 | } | 
|  | 135 |  | 
|  | 136 |  | 
| Chris Lattner | 483e14e | 2002-04-27 07:27:19 +0000 | [diff] [blame] | 137 | void FunctionLiveVarInfo::releaseMemory() { | 
| Chris Lattner | 6357a3f | 2002-02-05 06:52:25 +0000 | [diff] [blame] | 138 | // First remove all BBLiveVar annotations created in constructBBs(). | 
|  | 139 | if (M) | 
| Chris Lattner | b7653df | 2002-04-08 22:03:57 +0000 | [diff] [blame] | 140 | for (Function::const_iterator I = M->begin(), E = M->end(); I != E; ++I) | 
| Chris Lattner | 6357a3f | 2002-02-05 06:52:25 +0000 | [diff] [blame] | 141 | BBLiveVar::RemoveFromBB(*I); | 
|  | 142 | M = 0; | 
| Ruchira Sasanka | 789cebb | 2001-12-08 21:05:27 +0000 | [diff] [blame] | 143 |  | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 144 | // Then delete all objects of type ValueSet created in calcLiveVarSetsForBB | 
| Ruchira Sasanka | 789cebb | 2001-12-08 21:05:27 +0000 | [diff] [blame] | 145 | // and entered into  MInst2LVSetBI and  MInst2LVSetAI (these are caches | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 146 | // to return ValueSet's before/after a machine instruction quickly). It | 
|  | 147 | // is sufficient to free up all ValueSet using only one cache since | 
| Ruchira Sasanka | 789cebb | 2001-12-08 21:05:27 +0000 | [diff] [blame] | 148 | // both caches refer to the same sets | 
| Ruchira Sasanka | 789cebb | 2001-12-08 21:05:27 +0000 | [diff] [blame] | 149 | // | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 150 | for (std::map<const MachineInstr*, const ValueSet*>::iterator | 
| Chris Lattner | ab58411 | 2002-02-05 00:34:50 +0000 | [diff] [blame] | 151 | MI = MInst2LVSetBI.begin(), | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 152 | ME = MInst2LVSetBI.end(); MI != ME; ++MI) | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 153 | delete MI->second;           // delete all ValueSets in  MInst2LVSetBI | 
| Chris Lattner | 4fd2dbb | 2002-02-04 20:00:08 +0000 | [diff] [blame] | 154 |  | 
|  | 155 | MInst2LVSetBI.clear(); | 
|  | 156 | MInst2LVSetAI.clear(); | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 157 | } | 
|  | 158 |  | 
|  | 159 |  | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 160 |  | 
|  | 161 |  | 
| Ruchira Sasanka | 789cebb | 2001-12-08 21:05:27 +0000 | [diff] [blame] | 162 | //----------------------------------------------------------------------------- | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 163 | // Following functions will give the LiveVar info for any machine instr in | 
| Chris Lattner | f57b845 | 2002-04-27 06:56:12 +0000 | [diff] [blame] | 164 | // a function. It should be called after a call to analyze(). | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 165 | // | 
|  | 166 | // Thsese functions calucluates live var info for all the machine instrs in a | 
|  | 167 | // BB when LVInfo for one inst is requested. Hence, this function is useful | 
|  | 168 | // when live var info is required for many (or all) instructions in a basic | 
| Chris Lattner | f57b845 | 2002-04-27 06:56:12 +0000 | [diff] [blame] | 169 | // block. Also, the arguments to this function does not require specific | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 170 | // iterators. | 
| Ruchira Sasanka | 789cebb | 2001-12-08 21:05:27 +0000 | [diff] [blame] | 171 | //----------------------------------------------------------------------------- | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 172 |  | 
| Ruchira Sasanka | 789cebb | 2001-12-08 21:05:27 +0000 | [diff] [blame] | 173 | //----------------------------------------------------------------------------- | 
|  | 174 | // Gives live variable information before a machine instruction | 
|  | 175 | //----------------------------------------------------------------------------- | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 176 |  | 
| Chris Lattner | 748697d | 2002-02-05 04:20:12 +0000 | [diff] [blame] | 177 | const ValueSet & | 
| Chris Lattner | 483e14e | 2002-04-27 07:27:19 +0000 | [diff] [blame] | 178 | FunctionLiveVarInfo::getLiveVarSetBeforeMInst(const MachineInstr *MInst, | 
|  | 179 | const BasicBlock *BB) { | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 180 | if (const ValueSet *LVSet = MInst2LVSetBI[MInst]) { | 
| Chris Lattner | 748697d | 2002-02-05 04:20:12 +0000 | [diff] [blame] | 181 | return *LVSet;                      // if found, just return the set | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 182 | } else { | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 183 | calcLiveVarSetsForBB(BB);          // else, calc for all instrs in BB | 
| Chris Lattner | 748697d | 2002-02-05 04:20:12 +0000 | [diff] [blame] | 184 | return *MInst2LVSetBI[MInst]; | 
| Ruchira Sasanka | e27c344 | 2001-08-20 21:12:49 +0000 | [diff] [blame] | 185 | } | 
|  | 186 | } | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 187 |  | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 188 |  | 
| Ruchira Sasanka | 789cebb | 2001-12-08 21:05:27 +0000 | [diff] [blame] | 189 | //----------------------------------------------------------------------------- | 
|  | 190 | // Gives live variable information after a machine instruction | 
|  | 191 | //----------------------------------------------------------------------------- | 
| Chris Lattner | 748697d | 2002-02-05 04:20:12 +0000 | [diff] [blame] | 192 | const ValueSet & | 
| Chris Lattner | 483e14e | 2002-04-27 07:27:19 +0000 | [diff] [blame] | 193 | FunctionLiveVarInfo::getLiveVarSetAfterMInst(const MachineInstr *MI, | 
|  | 194 | const BasicBlock *BB) { | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 195 |  | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 196 | if (const ValueSet *LVSet = MInst2LVSetAI[MI]) { | 
| Chris Lattner | 748697d | 2002-02-05 04:20:12 +0000 | [diff] [blame] | 197 | return *LVSet;                      // if found, just return the set | 
| Chris Lattner | bdfd328 | 2002-02-04 20:49:04 +0000 | [diff] [blame] | 198 | } else { | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 199 | calcLiveVarSetsForBB(BB);           // else, calc for all instrs in BB | 
| Chris Lattner | 748697d | 2002-02-05 04:20:12 +0000 | [diff] [blame] | 200 | return *MInst2LVSetAI[MI]; | 
| Ruchira Sasanka | e27c344 | 2001-08-20 21:12:49 +0000 | [diff] [blame] | 201 | } | 
|  | 202 | } | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 203 |  | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 204 | // This function applies a machine instr to a live var set (accepts OutSet) and | 
|  | 205 | // makes necessary changes to it (produces InSet). Note that two for loops are | 
|  | 206 | // used to first kill all defs and then to add all uses. This is because there | 
|  | 207 | // can be instructions like Val = Val + 1 since we allow multipe defs to a | 
|  | 208 | // machine instruction operand. | 
|  | 209 | // | 
|  | 210 | static void applyTranferFuncForMInst(ValueSet &LVS, const MachineInstr *MInst) { | 
| Chris Lattner | 2f898d2 | 2002-02-05 06:02:59 +0000 | [diff] [blame] | 211 | for (MachineInstr::const_val_op_iterator OpI = MInst->begin(), | 
|  | 212 | OpE = MInst->end(); OpI != OpE; ++OpI) { | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 213 | if (OpI.isDef())           // kill only if this operand is a def | 
| Vikram S. Adve | 9cf85a7 | 2002-03-18 03:45:41 +0000 | [diff] [blame] | 214 | LVS.erase(*OpI);         // this definition kills any uses | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 215 | } | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 216 |  | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 217 | // do for implicit operands as well | 
|  | 218 | for (unsigned i=0; i < MInst->getNumImplicitRefs(); ++i) { | 
|  | 219 | if (MInst->implicitRefIsDefined(i)) | 
|  | 220 | LVS.erase(MInst->getImplicitRef(i)); | 
|  | 221 | } | 
|  | 222 |  | 
| Chris Lattner | 2f898d2 | 2002-02-05 06:02:59 +0000 | [diff] [blame] | 223 | for (MachineInstr::const_val_op_iterator OpI = MInst->begin(), | 
|  | 224 | OpE = MInst->end(); OpI != OpE; ++OpI) { | 
| Chris Lattner | fb005fe | 2002-04-09 05:14:14 +0000 | [diff] [blame] | 225 | if (!isa<BasicBlock>(*OpI))      // don't process labels | 
| Vikram S. Adve | 9afa88c | 2002-07-08 22:56:34 +0000 | [diff] [blame] | 226 | // add only if this operand is a use | 
|  | 227 | if (!OpI.isDef() || OpI.isDefAndUse() ) | 
| Chris Lattner | fb005fe | 2002-04-09 05:14:14 +0000 | [diff] [blame] | 228 | LVS.insert(*OpI);            // An operand is a use - so add to use set | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 229 | } | 
|  | 230 |  | 
|  | 231 | // do for implicit operands as well | 
| Chris Lattner | fb005fe | 2002-04-09 05:14:14 +0000 | [diff] [blame] | 232 | for (unsigned i = 0, e = MInst->getNumImplicitRefs(); i != e; ++i) | 
| Vikram S. Adve | 9afa88c | 2002-07-08 22:56:34 +0000 | [diff] [blame] | 233 | if (!MInst->implicitRefIsDefined(i) || | 
|  | 234 | MInst->implicitRefIsDefinedAndUsed(i)) | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 235 | LVS.insert(MInst->getImplicitRef(i)); | 
| Chris Lattner | 5e5dfa3 | 2002-02-05 02:51:01 +0000 | [diff] [blame] | 236 | } | 
| Ruchira Sasanka | 789cebb | 2001-12-08 21:05:27 +0000 | [diff] [blame] | 237 |  | 
|  | 238 | //----------------------------------------------------------------------------- | 
|  | 239 | // This method calculates the live variable information for all the | 
|  | 240 | // instructions in a basic block and enter the newly constructed live | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 241 | // variable sets into a the caches (MInst2LVSetAI, MInst2LVSetBI) | 
| Ruchira Sasanka | 789cebb | 2001-12-08 21:05:27 +0000 | [diff] [blame] | 242 | //----------------------------------------------------------------------------- | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 243 |  | 
| Chris Lattner | 483e14e | 2002-04-27 07:27:19 +0000 | [diff] [blame] | 244 | void FunctionLiveVarInfo::calcLiveVarSetsForBB(const BasicBlock *BB) { | 
| Vikram S. Adve | 9afa88c | 2002-07-08 22:56:34 +0000 | [diff] [blame] | 245 | const MachineCodeForBasicBlock &MIVec = MachineCodeForBasicBlock::get(BB); | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 246 |  | 
| Chris Lattner | fb005fe | 2002-04-09 05:14:14 +0000 | [diff] [blame] | 247 | if (DEBUG_LV >= LV_DEBUG_Instr) | 
|  | 248 | std::cerr << "\n======For BB " << BB->getName() | 
|  | 249 | << ": Live var sets for instructions======\n"; | 
| Vikram S. Adve | 9cf85a7 | 2002-03-18 03:45:41 +0000 | [diff] [blame] | 250 |  | 
| Chris Lattner | fb005fe | 2002-04-09 05:14:14 +0000 | [diff] [blame] | 251 | ValueSet CurSet; | 
| Chris Lattner | 748697d | 2002-02-05 04:20:12 +0000 | [diff] [blame] | 252 | const ValueSet *SetAI = &getOutSetOfBB(BB);  // init SetAI with OutSet | 
| Chris Lattner | fb005fe | 2002-04-09 05:14:14 +0000 | [diff] [blame] | 253 | set_union(CurSet, *SetAI);                   // CurSet now contains OutSet | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 254 |  | 
| Ruchira Sasanka | e27c344 | 2001-08-20 21:12:49 +0000 | [diff] [blame] | 255 | // iterate over all the machine instructions in BB | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 256 | for (MachineCodeForBasicBlock::const_reverse_iterator MII = MIVec.rbegin(), | 
|  | 257 | MIE = MIVec.rend(); MII != MIE; ++MII) { | 
|  | 258 | // MI is cur machine inst | 
|  | 259 | const MachineInstr *MI = *MII; | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 260 |  | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 261 | MInst2LVSetAI[MI] = SetAI;                 // record in After Inst map | 
| Ruchira Sasanka | e27c344 | 2001-08-20 21:12:49 +0000 | [diff] [blame] | 262 |  | 
| Chris Lattner | fb005fe | 2002-04-09 05:14:14 +0000 | [diff] [blame] | 263 | applyTranferFuncForMInst(CurSet, MI);      // apply the transfer Func | 
|  | 264 | ValueSet *NewSet = new ValueSet();         // create a new set and | 
|  | 265 | set_union(*NewSet, CurSet);                // copy the set after T/F to it | 
| Ruchira Sasanka | e27c344 | 2001-08-20 21:12:49 +0000 | [diff] [blame] | 266 |  | 
| Chris Lattner | a51c7a8 | 2002-02-04 23:31:16 +0000 | [diff] [blame] | 267 | MInst2LVSetBI[MI] = NewSet;                // record in Before Inst map | 
| Ruchira Sasanka | e27c344 | 2001-08-20 21:12:49 +0000 | [diff] [blame] | 268 |  | 
| Vikram S. Adve | 9cf85a7 | 2002-03-18 03:45:41 +0000 | [diff] [blame] | 269 | if (DEBUG_LV >= LV_DEBUG_Instr) { | 
| Chris Lattner | fb005fe | 2002-04-09 05:14:14 +0000 | [diff] [blame] | 270 | std::cerr << "\nLive var sets before/after instruction " << *MI; | 
| Anand Shukla | a928403 | 2002-06-25 20:35:19 +0000 | [diff] [blame] | 271 | std::cerr << "  Before: ";   printSet(*NewSet);  std::cerr << "\n"; | 
|  | 272 | std::cerr << "  After : ";   printSet(*SetAI);   std::cerr << "\n"; | 
| Vikram S. Adve | 9cf85a7 | 2002-03-18 03:45:41 +0000 | [diff] [blame] | 273 | } | 
|  | 274 |  | 
| Ruchira Sasanka | e27c344 | 2001-08-20 21:12:49 +0000 | [diff] [blame] | 275 | // SetAI will be used in the next iteration | 
|  | 276 | SetAI = NewSet; | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 277 | } | 
| Ruchira Sasanka | 683847f | 2001-07-24 17:14:13 +0000 | [diff] [blame] | 278 | } |