blob: de66f33cb098ac62815371d31f31d73cad19b807 [file] [log] [blame]
Ruchira Sasankae27c3442001-08-20 21:12:49 +00001/* Title: MethodLiveVarInfo.cpp
Ruchira Sasanka683847f2001-07-24 17:14:13 +00002 Author: Ruchira Sasanka
3 Date: Jun 30, 01
4 Purpose:
5
Ruchira Sasankae27c3442001-08-20 21:12:49 +00006 This is the interface for live variable info of a method that is required
7 by any other part of the compiler.
Ruchira Sasanka683847f2001-07-24 17:14:13 +00008
9*/
10
11
12#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
Chris Lattnerab584112002-02-05 00:34:50 +000013#include "llvm/Analysis/LiveVar/BBLiveVar.h"
Ruchira Sasankae27c3442001-08-20 21:12:49 +000014#include "llvm/CodeGen/MachineInstr.h"
Chris Lattner11646322002-02-04 16:35:12 +000015#include "llvm/BasicBlock.h"
Chris Lattnercee8f9a2001-11-27 00:03:19 +000016#include "Support/PostOrderIterator.h"
Chris Lattner697954c2002-01-20 22:54:45 +000017#include <iostream>
Ruchira Sasanka683847f2001-07-24 17:14:13 +000018
Chris Lattner4fd2dbb2002-02-04 20:00:08 +000019AnalysisID MethodLiveVarInfo::ID(AnalysisID::create<MethodLiveVarInfo>());
Ruchira Sasanka683847f2001-07-24 17:14:13 +000020
Chris Lattnerab584112002-02-05 00:34:50 +000021//-----------------------------------------------------------------------------
22// Accessor Functions
23//-----------------------------------------------------------------------------
24
25// gets OutSet of a BB
26const LiveVarSet *MethodLiveVarInfo::getOutSetOfBB(const BasicBlock *BB) const {
27 return BB2BBLVMap.find(BB)->second->getOutSet();
28}
29
30// gets InSet of a BB
31const LiveVarSet *MethodLiveVarInfo::getInSetOfBB(const BasicBlock *BB) const {
32 return BB2BBLVMap.find(BB)->second->getInSet();
33}
34
Chris Lattnerbdfd3282002-02-04 20:49:04 +000035
36//-----------------------------------------------------------------------------
37// Performs live var analysis for a method
38//-----------------------------------------------------------------------------
39
40bool MethodLiveVarInfo::runOnMethod(Method *M) {
Chris Lattnera51c7a82002-02-04 23:31:16 +000041 if (DEBUG_LV) std::cerr << "Analysing live variables ...\n";
Chris Lattnerbdfd3282002-02-04 20:49:04 +000042
43 // create and initialize all the BBLiveVars of the CFG
44 constructBBs(M);
45
46 while (doSingleBackwardPass(M))
47 ; // Iterate until we are done.
48
Chris Lattnera51c7a82002-02-04 23:31:16 +000049 if (DEBUG_LV) std::cerr << "Live Variable Analysis complete!\n";
Chris Lattnerbdfd3282002-02-04 20:49:04 +000050 return false;
51}
52
53
54//-----------------------------------------------------------------------------
55// constructs BBLiveVars and init Def and In sets
56//-----------------------------------------------------------------------------
57
58void MethodLiveVarInfo::constructBBs(const Method *M) {
59 unsigned int POId = 0; // Reverse Depth-first Order ID
60
61 for(po_iterator<const Method*> BBI = po_begin(M), BBE = po_end(M);
62 BBI != BBE; ++BBI, ++POId) {
63 const BasicBlock *BB = *BBI; // get the current BB
64
Chris Lattnera51c7a82002-02-04 23:31:16 +000065 if (DEBUG_LV) { std::cerr << " For BB "; printValue(BB); cerr << ":\n"; }
Chris Lattnerbdfd3282002-02-04 20:49:04 +000066
67 // create a new BBLiveVar
68 BBLiveVar *LVBB = new BBLiveVar(BB, POId);
69 BB2BBLVMap[BB] = LVBB; // insert the pair to Map
70
71 LVBB->calcDefUseSets(); // calculates the def and in set
72
Chris Lattnera51c7a82002-02-04 23:31:16 +000073 if (DEBUG_LV)
Chris Lattnerbdfd3282002-02-04 20:49:04 +000074 LVBB->printAllSets();
75 }
76
77 // Since the PO iterator does not discover unreachable blocks,
78 // go over the random iterator and init those blocks as well.
79 // However, LV info is not correct for those blocks (they are not
80 // analyzed)
81 //
82 for (Method::const_iterator BBRI = M->begin(), BBRE = M->end();
83 BBRI != BBRE; ++BBRI, ++POId)
Chris Lattnera51c7a82002-02-04 23:31:16 +000084 if (!BB2BBLVMap[*BBRI]) // Not yet processed?
Chris Lattnerbdfd3282002-02-04 20:49:04 +000085 BB2BBLVMap[*BBRI] = new BBLiveVar(*BBRI, POId);
86}
87
88
89//-----------------------------------------------------------------------------
90// do one backward pass over the CFG (for iterative analysis)
91//-----------------------------------------------------------------------------
Chris Lattnera51c7a82002-02-04 23:31:16 +000092
Chris Lattnerbdfd3282002-02-04 20:49:04 +000093bool MethodLiveVarInfo::doSingleBackwardPass(const Method *M) {
Chris Lattnera51c7a82002-02-04 23:31:16 +000094 if (DEBUG_LV) std::cerr << "\n After Backward Pass ...\n";
Chris Lattnerbdfd3282002-02-04 20:49:04 +000095
Chris Lattnera51c7a82002-02-04 23:31:16 +000096 bool NeedAnotherIteration = false;
97 for (po_iterator<const Method*> BBI = po_begin(M); BBI != po_end(M) ; ++BBI) {
Chris Lattnerbdfd3282002-02-04 20:49:04 +000098 BBLiveVar *LVBB = BB2BBLVMap[*BBI];
Chris Lattnera51c7a82002-02-04 23:31:16 +000099 assert(LVBB && "BasicBlock information not set for block!");
Chris Lattnerbdfd3282002-02-04 20:49:04 +0000100
Chris Lattnera51c7a82002-02-04 23:31:16 +0000101 if (DEBUG_LV) std::cerr << " For BB " << (*BBI)->getName() << ":\n";
Chris Lattnerbdfd3282002-02-04 20:49:04 +0000102
103 if(LVBB->isOutSetChanged())
104 LVBB->applyTransferFunc(); // apply the Tran Func to calc InSet
105
106 if (LVBB->isInSetChanged()) // to calc Outsets of preds
107 NeedAnotherIteration |= LVBB->applyFlowFunc(BB2BBLVMap);
108
Chris Lattnera51c7a82002-02-04 23:31:16 +0000109 if (DEBUG_LV) LVBB->printInOutSets();
Chris Lattnerbdfd3282002-02-04 20:49:04 +0000110 }
111
112 // true if we need to reiterate over the CFG
113 return NeedAnotherIteration;
114}
115
116
Chris Lattner4fd2dbb2002-02-04 20:00:08 +0000117void MethodLiveVarInfo::releaseMemory() {
Ruchira Sasanka789cebb2001-12-08 21:05:27 +0000118 // First delete all BBLiveVar objects created in constructBBs(). A new object
Chris Lattnera51c7a82002-02-04 23:31:16 +0000119 // of type BBLiveVar is created for every BasicBlock in the method
Ruchira Sasanka789cebb2001-12-08 21:05:27 +0000120 //
Chris Lattnerab584112002-02-05 00:34:50 +0000121 for (std::map<const BasicBlock *, BBLiveVar *>::iterator
122 HMI = BB2BBLVMap.begin(),
Chris Lattnera51c7a82002-02-04 23:31:16 +0000123 HME = BB2BBLVMap.end(); HMI != HME; ++HMI)
Chris Lattner4fd2dbb2002-02-04 20:00:08 +0000124 delete HMI->second; // delete all BBLiveVar in BB2BBLVMap
Ruchira Sasanka789cebb2001-12-08 21:05:27 +0000125
Chris Lattner4fd2dbb2002-02-04 20:00:08 +0000126 BB2BBLVMap.clear();
Ruchira Sasanka789cebb2001-12-08 21:05:27 +0000127
128 // Then delete all objects of type LiveVarSet created in calcLiveVarSetsForBB
129 // and entered into MInst2LVSetBI and MInst2LVSetAI (these are caches
130 // to return LiveVarSet's before/after a machine instruction quickly). It
131 // is sufficient to free up all LiveVarSet using only one cache since
132 // both caches refer to the same sets
Ruchira Sasanka789cebb2001-12-08 21:05:27 +0000133 //
Chris Lattnerab584112002-02-05 00:34:50 +0000134 for (std::map<const MachineInstr*, const LiveVarSet*>::iterator
135 MI = MInst2LVSetBI.begin(),
Chris Lattnera51c7a82002-02-04 23:31:16 +0000136 ME = MInst2LVSetBI.end(); MI != ME; ++MI)
Chris Lattner4fd2dbb2002-02-04 20:00:08 +0000137 delete MI->second; // delete all LiveVarSets in MInst2LVSetBI
138
139 MInst2LVSetBI.clear();
140 MInst2LVSetAI.clear();
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000141}
142
143
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000144
145
Ruchira Sasanka789cebb2001-12-08 21:05:27 +0000146//-----------------------------------------------------------------------------
Chris Lattnera51c7a82002-02-04 23:31:16 +0000147// Following functions will give the LiveVar info for any machine instr in
148// a method. It should be called after a call to analyze().
149//
150// Thsese functions calucluates live var info for all the machine instrs in a
151// BB when LVInfo for one inst is requested. Hence, this function is useful
152// when live var info is required for many (or all) instructions in a basic
153// block. Also, the arguments to this method does not require specific
154// iterators.
Ruchira Sasanka789cebb2001-12-08 21:05:27 +0000155//-----------------------------------------------------------------------------
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000156
Ruchira Sasanka789cebb2001-12-08 21:05:27 +0000157//-----------------------------------------------------------------------------
158// Gives live variable information before a machine instruction
159//-----------------------------------------------------------------------------
Chris Lattnera51c7a82002-02-04 23:31:16 +0000160
Chris Lattnerbdfd3282002-02-04 20:49:04 +0000161const LiveVarSet *
162MethodLiveVarInfo::getLiveVarSetBeforeMInst(const MachineInstr *MInst,
Chris Lattnera51c7a82002-02-04 23:31:16 +0000163 const BasicBlock *BB) {
164 if (const LiveVarSet *LVSet = MInst2LVSetBI[MInst]) {
165 return LVSet; // if found, just return the set
Chris Lattnerbdfd3282002-02-04 20:49:04 +0000166 } else {
Chris Lattnera51c7a82002-02-04 23:31:16 +0000167 calcLiveVarSetsForBB(BB); // else, calc for all instrs in BB
Chris Lattnerbdfd3282002-02-04 20:49:04 +0000168 return MInst2LVSetBI[MInst];
Ruchira Sasankae27c3442001-08-20 21:12:49 +0000169 }
170}
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000171
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000172
Ruchira Sasanka789cebb2001-12-08 21:05:27 +0000173//-----------------------------------------------------------------------------
174// Gives live variable information after a machine instruction
175//-----------------------------------------------------------------------------
Ruchira Sasankae27c3442001-08-20 21:12:49 +0000176const LiveVarSet *
Chris Lattnera51c7a82002-02-04 23:31:16 +0000177MethodLiveVarInfo::getLiveVarSetAfterMInst(const MachineInstr *MI,
178 const BasicBlock *BB) {
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000179
Chris Lattnera51c7a82002-02-04 23:31:16 +0000180 if (const LiveVarSet *LVSet = MInst2LVSetAI[MI]) {
Chris Lattnerbdfd3282002-02-04 20:49:04 +0000181 return LVSet; // if found, just return the set
182 } else {
Chris Lattnera51c7a82002-02-04 23:31:16 +0000183 calcLiveVarSetsForBB(BB); // else, calc for all instrs in BB
184 return MInst2LVSetAI[MI];
Ruchira Sasankae27c3442001-08-20 21:12:49 +0000185 }
186}
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000187
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000188
Ruchira Sasanka789cebb2001-12-08 21:05:27 +0000189
190//-----------------------------------------------------------------------------
191// This method calculates the live variable information for all the
192// instructions in a basic block and enter the newly constructed live
Chris Lattnera51c7a82002-02-04 23:31:16 +0000193// variable sets into a the caches (MInst2LVSetAI, MInst2LVSetBI)
Ruchira Sasanka789cebb2001-12-08 21:05:27 +0000194//-----------------------------------------------------------------------------
Chris Lattnera51c7a82002-02-04 23:31:16 +0000195
196void MethodLiveVarInfo::calcLiveVarSetsForBB(const BasicBlock *BB) {
197 const MachineCodeForBasicBlock &MIVec = BB->getMachineInstrVec();
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000198
199 LiveVarSet *CurSet = new LiveVarSet();
Ruchira Sasankae27c3442001-08-20 21:12:49 +0000200 const LiveVarSet *SetAI = getOutSetOfBB(BB); // init SetAI with OutSet
201 CurSet->setUnion(SetAI); // CurSet now contains OutSet
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000202
Ruchira Sasankae27c3442001-08-20 21:12:49 +0000203 // iterate over all the machine instructions in BB
Chris Lattnera51c7a82002-02-04 23:31:16 +0000204 for (MachineCodeForBasicBlock::const_reverse_iterator MII = MIVec.rbegin(),
205 MIE = MIVec.rend(); MII != MIE; ++MII) {
206 // MI is cur machine inst
207 const MachineInstr *MI = *MII;
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000208
Chris Lattnera51c7a82002-02-04 23:31:16 +0000209 MInst2LVSetAI[MI] = SetAI; // record in After Inst map
Ruchira Sasankae27c3442001-08-20 21:12:49 +0000210
Chris Lattnera51c7a82002-02-04 23:31:16 +0000211 CurSet->applyTranferFuncForMInst(MI); // apply the transfer Func
Ruchira Sasankae27c3442001-08-20 21:12:49 +0000212 LiveVarSet *NewSet = new LiveVarSet(); // create a new set and
Chris Lattnera51c7a82002-02-04 23:31:16 +0000213 NewSet->setUnion(CurSet); // copy the set after T/F to it
Ruchira Sasankae27c3442001-08-20 21:12:49 +0000214
Chris Lattnera51c7a82002-02-04 23:31:16 +0000215 MInst2LVSetBI[MI] = NewSet; // record in Before Inst map
Ruchira Sasankae27c3442001-08-20 21:12:49 +0000216
217 // SetAI will be used in the next iteration
218 SetAI = NewSet;
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000219 }
Ruchira Sasanka683847f2001-07-24 17:14:13 +0000220}