LiveIntervalAnalysis.h revision 5c7e326585f3a543388ba871c3425f7664cd9143
1//===-- LiveIntervalAnalysis.h - Live Interval Analysis ---------*- C++ -*-===// 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 the LiveInterval analysis pass. Given some numbering of 11// each the machine instructions (in this implemention depth-first order) an 12// interval [i, j) is said to be a live interval for register v if there is no 13// instruction with number j' > j such that v is live at j' abd there is no 14// instruction with number i' < i such that v is live at i'. In this 15// implementation intervals can have holes, i.e. an interval might look like 16// [1,20), [50,65), [1000,1001). 17// 18//===----------------------------------------------------------------------===// 19 20#ifndef LLVM_CODEGEN_LIVEINTERVAL_ANALYSIS_H 21#define LLVM_CODEGEN_LIVEINTERVAL_ANALYSIS_H 22 23#include "llvm/ADT/DenseMap.h" 24#include "llvm/CodeGen/MachineFunctionPass.h" 25#include "llvm/CodeGen/LiveInterval.h" 26 27namespace llvm { 28 29 class LiveVariables; 30 class MRegisterInfo; 31 class TargetInstrInfo; 32 class VirtRegMap; 33 34 class LiveIntervals : public MachineFunctionPass { 35 MachineFunction* mf_; 36 const TargetMachine* tm_; 37 const MRegisterInfo* mri_; 38 const TargetInstrInfo* tii_; 39 LiveVariables* lv_; 40 41 /// MBB2IdxMap - The index of the first instruction in the specified basic 42 /// block. 43 std::vector<unsigned> MBB2IdxMap; 44 45 typedef std::map<MachineInstr*, unsigned> Mi2IndexMap; 46 Mi2IndexMap mi2iMap_; 47 48 typedef std::vector<MachineInstr*> Index2MiMap; 49 Index2MiMap i2miMap_; 50 51 typedef std::map<unsigned, LiveInterval> Reg2IntervalMap; 52 Reg2IntervalMap r2iMap_; 53 54 typedef DenseMap<unsigned> Reg2RegMap; 55 Reg2RegMap r2rMap_; 56 57 std::vector<bool> allocatableRegs_; 58 59 public: 60 struct CopyRec { 61 MachineInstr *MI; 62 unsigned SrcReg, DstReg; 63 }; 64 CopyRec getCopyRec(MachineInstr *MI, unsigned SrcReg, unsigned DstReg) { 65 CopyRec R; 66 R.MI = MI; 67 R.SrcReg = SrcReg; 68 R.DstReg = DstReg; 69 return R; 70 } 71 struct InstrSlots { 72 enum { 73 LOAD = 0, 74 USE = 1, 75 DEF = 2, 76 STORE = 3, 77 NUM = 4 78 }; 79 }; 80 81 static unsigned getBaseIndex(unsigned index) { 82 return index - (index % InstrSlots::NUM); 83 } 84 static unsigned getBoundaryIndex(unsigned index) { 85 return getBaseIndex(index + InstrSlots::NUM - 1); 86 } 87 static unsigned getLoadIndex(unsigned index) { 88 return getBaseIndex(index) + InstrSlots::LOAD; 89 } 90 static unsigned getUseIndex(unsigned index) { 91 return getBaseIndex(index) + InstrSlots::USE; 92 } 93 static unsigned getDefIndex(unsigned index) { 94 return getBaseIndex(index) + InstrSlots::DEF; 95 } 96 static unsigned getStoreIndex(unsigned index) { 97 return getBaseIndex(index) + InstrSlots::STORE; 98 } 99 100 typedef Reg2IntervalMap::iterator iterator; 101 typedef Reg2IntervalMap::const_iterator const_iterator; 102 const_iterator begin() const { return r2iMap_.begin(); } 103 const_iterator end() const { return r2iMap_.end(); } 104 iterator begin() { return r2iMap_.begin(); } 105 iterator end() { return r2iMap_.end(); } 106 unsigned getNumIntervals() const { return r2iMap_.size(); } 107 108 LiveInterval &getInterval(unsigned reg) { 109 Reg2IntervalMap::iterator I = r2iMap_.find(reg); 110 assert(I != r2iMap_.end() && "Interval does not exist for register"); 111 return I->second; 112 } 113 114 const LiveInterval &getInterval(unsigned reg) const { 115 Reg2IntervalMap::const_iterator I = r2iMap_.find(reg); 116 assert(I != r2iMap_.end() && "Interval does not exist for register"); 117 return I->second; 118 } 119 120 /// getMBBStartIdx - Return the base index of the first instruction in the 121 /// specified MachineBasicBlock. 122 unsigned getMBBStartIdx(MachineBasicBlock *MBB) const { 123 return getMBBStartIdx(MBB->getNumber()); 124 } 125 126 unsigned getMBBStartIdx(unsigned MBBNo) const { 127 assert(MBBNo < MBB2IdxMap.size() && "Invalid MBB number!"); 128 return MBB2IdxMap[MBBNo]; 129 } 130 131 /// getInstructionIndex - returns the base index of instr 132 unsigned getInstructionIndex(MachineInstr* instr) const { 133 Mi2IndexMap::const_iterator it = mi2iMap_.find(instr); 134 assert(it != mi2iMap_.end() && "Invalid instruction!"); 135 return it->second; 136 } 137 138 /// getInstructionFromIndex - given an index in any slot of an 139 /// instruction return a pointer the instruction 140 MachineInstr* getInstructionFromIndex(unsigned index) const { 141 index /= InstrSlots::NUM; // convert index to vector index 142 assert(index < i2miMap_.size() && 143 "index does not correspond to an instruction"); 144 return i2miMap_[index]; 145 } 146 147 std::vector<LiveInterval*> addIntervalsForSpills(const LiveInterval& i, 148 VirtRegMap& vrm, 149 int slot); 150 151 /// CreateNewLiveInterval - Create a new live interval with the given live 152 /// ranges. The new live interval will have an infinite spill weight. 153 LiveInterval &CreateNewLiveInterval(const LiveInterval *LI, 154 const std::vector<LiveRange> &LRs); 155 156 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 157 virtual void releaseMemory(); 158 159 /// runOnMachineFunction - pass entry point 160 virtual bool runOnMachineFunction(MachineFunction&); 161 162 /// print - Implement the dump method. 163 virtual void print(std::ostream &O, const Module* = 0) const; 164 void print(std::ostream *O, const Module* M = 0) const { 165 if (O) print(*O, M); 166 } 167 168 private: 169 /// RemoveMachineInstrFromMaps - This marks the specified machine instr as 170 /// deleted. 171 void RemoveMachineInstrFromMaps(MachineInstr *MI) { 172 // remove index -> MachineInstr and 173 // MachineInstr -> index mappings 174 Mi2IndexMap::iterator mi2i = mi2iMap_.find(MI); 175 if (mi2i != mi2iMap_.end()) { 176 i2miMap_[mi2i->second/InstrSlots::NUM] = 0; 177 mi2iMap_.erase(mi2i); 178 } 179 } 180 181 /// computeIntervals - Compute live intervals. 182 void computeIntervals(); 183 184 /// joinIntervals - join compatible live intervals 185 void joinIntervals(); 186 187 /// CopyCoallesceInMBB - Coallsece copies in the specified MBB, putting 188 /// copies that cannot yet be coallesced into the "TryAgain" list. 189 void CopyCoallesceInMBB(MachineBasicBlock *MBB, 190 std::vector<CopyRec> &TryAgain); 191 /// JoinCopy - Attempt to join intervals corresponding to SrcReg/DstReg, 192 /// which are the src/dst of the copy instruction CopyMI. This returns true 193 /// if the copy was successfully coallesced away, or if it is never possible 194 /// to coallesce these this copy, due to register constraints. It returns 195 /// false if it is not currently possible to coallesce this interval, but 196 /// it may be possible if other things get coallesced. 197 bool JoinCopy(MachineInstr *CopyMI, unsigned SrcReg, unsigned DstReg); 198 199 /// JoinIntervals - Attempt to join these two intervals. On failure, this 200 /// returns false. Otherwise, if one of the intervals being joined is a 201 /// physreg, this method always canonicalizes DestInt to be it. The output 202 /// "SrcInt" will not have been modified, so we can use this information 203 /// below to update aliases. 204 bool JoinIntervals(LiveInterval &LHS, LiveInterval &RHS); 205 206 /// SimpleJoin - Attempt to join the specified interval into this one. The 207 /// caller of this method must guarantee that the RHS only contains a single 208 /// value number and that the RHS is not defined by a copy from this 209 /// interval. This returns false if the intervals are not joinable, or it 210 /// joins them and returns true. 211 bool SimpleJoin(LiveInterval &LHS, LiveInterval &RHS); 212 213 /// handleRegisterDef - update intervals for a register def 214 /// (calls handlePhysicalRegisterDef and 215 /// handleVirtualRegisterDef) 216 void handleRegisterDef(MachineBasicBlock *MBB, 217 MachineBasicBlock::iterator MI, unsigned MIIdx, 218 unsigned reg); 219 220 /// handleVirtualRegisterDef - update intervals for a virtual 221 /// register def 222 void handleVirtualRegisterDef(MachineBasicBlock *MBB, 223 MachineBasicBlock::iterator MI, 224 unsigned MIIdx, 225 LiveInterval& interval); 226 227 /// handlePhysicalRegisterDef - update intervals for a physical register 228 /// def. 229 void handlePhysicalRegisterDef(MachineBasicBlock* mbb, 230 MachineBasicBlock::iterator mi, 231 unsigned MIIdx, 232 LiveInterval &interval, 233 unsigned SrcReg); 234 235 /// Return true if the two specified registers belong to different 236 /// register classes. The registers may be either phys or virt regs. 237 bool differingRegisterClasses(unsigned RegA, unsigned RegB) const; 238 239 240 bool AdjustCopiesBackFrom(LiveInterval &IntA, LiveInterval &IntB, 241 MachineInstr *CopyMI); 242 243 bool overlapsAliases(const LiveInterval *lhs, 244 const LiveInterval *rhs) const; 245 246 static LiveInterval createInterval(unsigned Reg); 247 248 LiveInterval &getOrCreateInterval(unsigned reg) { 249 Reg2IntervalMap::iterator I = r2iMap_.find(reg); 250 if (I == r2iMap_.end()) 251 I = r2iMap_.insert(I, std::make_pair(reg, createInterval(reg))); 252 return I->second; 253 } 254 255 /// rep - returns the representative of this register 256 unsigned rep(unsigned Reg) { 257 unsigned Rep = r2rMap_[Reg]; 258 if (Rep) 259 return r2rMap_[Reg] = rep(Rep); 260 return Reg; 261 } 262 263 void printRegName(unsigned reg) const; 264 }; 265 266} // End llvm namespace 267 268#endif 269