LiveIntervalAnalysis.h revision 826cbac2a0cef418fd8949813761c2ed975f3df1
1//===-- LiveIntervalAnalysis.h - Live Interval Analysis ---------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// 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' and 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/CodeGen/MachineBasicBlock.h" 24#include "llvm/CodeGen/MachineFunctionPass.h" 25#include "llvm/CodeGen/LiveInterval.h" 26#include "llvm/CodeGen/SlotIndexes.h" 27#include "llvm/ADT/BitVector.h" 28#include "llvm/ADT/DenseMap.h" 29#include "llvm/ADT/SmallPtrSet.h" 30#include "llvm/ADT/SmallVector.h" 31#include "llvm/Support/Allocator.h" 32#include <cmath> 33#include <iterator> 34 35namespace llvm { 36 37 class AliasAnalysis; 38 class LiveVariables; 39 class MachineLoopInfo; 40 class TargetRegisterInfo; 41 class MachineRegisterInfo; 42 class TargetInstrInfo; 43 class TargetRegisterClass; 44 class VirtRegMap; 45 46 class LiveIntervals : public MachineFunctionPass { 47 MachineFunction* mf_; 48 MachineRegisterInfo* mri_; 49 const TargetMachine* tm_; 50 const TargetRegisterInfo* tri_; 51 const TargetInstrInfo* tii_; 52 AliasAnalysis *aa_; 53 LiveVariables* lv_; 54 SlotIndexes* indexes_; 55 56 /// Special pool allocator for VNInfo's (LiveInterval val#). 57 /// 58 BumpPtrAllocator VNInfoAllocator; 59 60 typedef DenseMap<unsigned, LiveInterval*> Reg2IntervalMap; 61 Reg2IntervalMap r2iMap_; 62 63 /// allocatableRegs_ - A bit vector of allocatable registers. 64 BitVector allocatableRegs_; 65 66 /// CloneMIs - A list of clones as result of re-materialization. 67 std::vector<MachineInstr*> CloneMIs; 68 69 public: 70 static char ID; // Pass identification, replacement for typeid 71 LiveIntervals() : MachineFunctionPass(&ID) {} 72 73 // Calculate the spill weight to assign to a single instruction. 74 static float getSpillWeight(bool isDef, bool isUse, unsigned loopDepth); 75 76 // After summing the spill weights of all defs and uses, the final weight 77 // should be normalized, dividing the weight of the interval by its size. 78 // This encourages spilling of intervals that are large and have few uses, 79 // and discourages spilling of small intervals with many uses. 80 void normalizeSpillWeight(LiveInterval &li) { 81 li.weight /= getApproximateInstructionCount(li) + 25; 82 } 83 84 typedef Reg2IntervalMap::iterator iterator; 85 typedef Reg2IntervalMap::const_iterator const_iterator; 86 const_iterator begin() const { return r2iMap_.begin(); } 87 const_iterator end() const { return r2iMap_.end(); } 88 iterator begin() { return r2iMap_.begin(); } 89 iterator end() { return r2iMap_.end(); } 90 unsigned getNumIntervals() const { return (unsigned)r2iMap_.size(); } 91 92 LiveInterval &getInterval(unsigned reg) { 93 Reg2IntervalMap::iterator I = r2iMap_.find(reg); 94 assert(I != r2iMap_.end() && "Interval does not exist for register"); 95 return *I->second; 96 } 97 98 const LiveInterval &getInterval(unsigned reg) const { 99 Reg2IntervalMap::const_iterator I = r2iMap_.find(reg); 100 assert(I != r2iMap_.end() && "Interval does not exist for register"); 101 return *I->second; 102 } 103 104 bool hasInterval(unsigned reg) const { 105 return r2iMap_.count(reg); 106 } 107 108 /// getScaledIntervalSize - get the size of an interval in "units," 109 /// where every function is composed of one thousand units. This 110 /// measure scales properly with empty index slots in the function. 111 double getScaledIntervalSize(LiveInterval& I) { 112 return (1000.0 * I.getSize()) / indexes_->getIndexesLength(); 113 } 114 115 /// getApproximateInstructionCount - computes an estimate of the number 116 /// of instructions in a given LiveInterval. 117 unsigned getApproximateInstructionCount(LiveInterval& I) { 118 double IntervalPercentage = getScaledIntervalSize(I) / 1000.0; 119 return (unsigned)(IntervalPercentage * indexes_->getFunctionSize()); 120 } 121 122 /// conflictsWithPhysReg - Returns true if the specified register is used or 123 /// defined during the duration of the specified interval. Copies to and 124 /// from li.reg are allowed. This method is only able to analyze simple 125 /// ranges that stay within a single basic block. Anything else is 126 /// considered a conflict. 127 bool conflictsWithPhysReg(const LiveInterval &li, VirtRegMap &vrm, 128 unsigned reg); 129 130 /// conflictsWithSubPhysRegRef - Similar to conflictsWithPhysRegRef except 131 /// it checks for sub-register reference and it can check use as well. 132 bool conflictsWithSubPhysRegRef(LiveInterval &li, unsigned Reg, 133 bool CheckUse, 134 SmallPtrSet<MachineInstr*,32> &JoinedCopies); 135 136 // Interval creation 137 LiveInterval &getOrCreateInterval(unsigned reg) { 138 Reg2IntervalMap::iterator I = r2iMap_.find(reg); 139 if (I == r2iMap_.end()) 140 I = r2iMap_.insert(std::make_pair(reg, createInterval(reg))).first; 141 return *I->second; 142 } 143 144 /// dupInterval - Duplicate a live interval. The caller is responsible for 145 /// managing the allocated memory. 146 LiveInterval *dupInterval(LiveInterval *li); 147 148 /// addLiveRangeToEndOfBlock - Given a register and an instruction, 149 /// adds a live range from that instruction to the end of its MBB. 150 LiveRange addLiveRangeToEndOfBlock(unsigned reg, 151 MachineInstr* startInst); 152 153 // Interval removal 154 155 void removeInterval(unsigned Reg) { 156 DenseMap<unsigned, LiveInterval*>::iterator I = r2iMap_.find(Reg); 157 delete I->second; 158 r2iMap_.erase(I); 159 } 160 161 SlotIndex getZeroIndex() const { 162 return indexes_->getZeroIndex(); 163 } 164 165 SlotIndex getInvalidIndex() const { 166 return indexes_->getInvalidIndex(); 167 } 168 169 /// isNotInMIMap - returns true if the specified machine instr has been 170 /// removed or was never entered in the map. 171 bool isNotInMIMap(const MachineInstr* Instr) const { 172 return !indexes_->hasIndex(Instr); 173 } 174 175 /// Returns the base index of the given instruction. 176 SlotIndex getInstructionIndex(const MachineInstr *instr) const { 177 return indexes_->getInstructionIndex(instr); 178 } 179 180 /// Returns the instruction associated with the given index. 181 MachineInstr* getInstructionFromIndex(SlotIndex index) const { 182 return indexes_->getInstructionFromIndex(index); 183 } 184 185 /// Return the first index in the given basic block. 186 SlotIndex getMBBStartIdx(const MachineBasicBlock *mbb) const { 187 return indexes_->getMBBStartIdx(mbb); 188 } 189 190 /// Return the last index in the given basic block. 191 SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const { 192 return indexes_->getMBBEndIdx(mbb); 193 } 194 195 MachineBasicBlock* getMBBFromIndex(SlotIndex index) const { 196 return indexes_->getMBBFromIndex(index); 197 } 198 199 SlotIndex getMBBTerminatorGap(const MachineBasicBlock *mbb) { 200 return indexes_->getTerminatorGap(mbb); 201 } 202 203 SlotIndex InsertMachineInstrInMaps(MachineInstr *MI) { 204 return indexes_->insertMachineInstrInMaps(MI); 205 } 206 207 void RemoveMachineInstrFromMaps(MachineInstr *MI) { 208 indexes_->removeMachineInstrFromMaps(MI); 209 } 210 211 void ReplaceMachineInstrInMaps(MachineInstr *MI, MachineInstr *NewMI) { 212 indexes_->replaceMachineInstrInMaps(MI, NewMI); 213 } 214 215 bool findLiveInMBBs(SlotIndex Start, SlotIndex End, 216 SmallVectorImpl<MachineBasicBlock*> &MBBs) const { 217 return indexes_->findLiveInMBBs(Start, End, MBBs); 218 } 219 220 void renumber() { 221 indexes_->renumberIndexes(); 222 } 223 224 BumpPtrAllocator& getVNInfoAllocator() { return VNInfoAllocator; } 225 226 /// getVNInfoSourceReg - Helper function that parses the specified VNInfo 227 /// copy field and returns the source register that defines it. 228 unsigned getVNInfoSourceReg(const VNInfo *VNI) const; 229 230 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 231 virtual void releaseMemory(); 232 233 /// runOnMachineFunction - pass entry point 234 virtual bool runOnMachineFunction(MachineFunction&); 235 236 /// print - Implement the dump method. 237 virtual void print(raw_ostream &O, const Module* = 0) const; 238 239 /// addIntervalsForSpills - Create new intervals for spilled defs / uses of 240 /// the given interval. FIXME: It also returns the weight of the spill slot 241 /// (if any is created) by reference. This is temporary. 242 std::vector<LiveInterval*> 243 addIntervalsForSpills(const LiveInterval& i, 244 SmallVectorImpl<LiveInterval*> &SpillIs, 245 const MachineLoopInfo *loopInfo, VirtRegMap& vrm); 246 247 /// addIntervalsForSpillsFast - Quickly create new intervals for spilled 248 /// defs / uses without remat or splitting. 249 std::vector<LiveInterval*> 250 addIntervalsForSpillsFast(const LiveInterval &li, 251 const MachineLoopInfo *loopInfo, VirtRegMap &vrm); 252 253 /// spillPhysRegAroundRegDefsUses - Spill the specified physical register 254 /// around all defs and uses of the specified interval. Return true if it 255 /// was able to cut its interval. 256 bool spillPhysRegAroundRegDefsUses(const LiveInterval &li, 257 unsigned PhysReg, VirtRegMap &vrm); 258 259 /// isReMaterializable - Returns true if every definition of MI of every 260 /// val# of the specified interval is re-materializable. Also returns true 261 /// by reference if all of the defs are load instructions. 262 bool isReMaterializable(const LiveInterval &li, 263 SmallVectorImpl<LiveInterval*> &SpillIs, 264 bool &isLoad); 265 266 /// isReMaterializable - Returns true if the definition MI of the specified 267 /// val# of the specified interval is re-materializable. 268 bool isReMaterializable(const LiveInterval &li, const VNInfo *ValNo, 269 MachineInstr *MI); 270 271 /// getRepresentativeReg - Find the largest super register of the specified 272 /// physical register. 273 unsigned getRepresentativeReg(unsigned Reg) const; 274 275 /// getNumConflictsWithPhysReg - Return the number of uses and defs of the 276 /// specified interval that conflicts with the specified physical register. 277 unsigned getNumConflictsWithPhysReg(const LiveInterval &li, 278 unsigned PhysReg) const; 279 280 /// processImplicitDefs - Process IMPLICIT_DEF instructions. Add isUndef 281 /// marker to implicit_def defs and their uses. 282 void processImplicitDefs(); 283 284 /// intervalIsInOneMBB - Returns true if the specified interval is entirely 285 /// within a single basic block. 286 bool intervalIsInOneMBB(const LiveInterval &li) const; 287 288 private: 289 /// computeIntervals - Compute live intervals. 290 void computeIntervals(); 291 292 /// handleRegisterDef - update intervals for a register def 293 /// (calls handlePhysicalRegisterDef and 294 /// handleVirtualRegisterDef) 295 void handleRegisterDef(MachineBasicBlock *MBB, 296 MachineBasicBlock::iterator MI, 297 SlotIndex MIIdx, 298 MachineOperand& MO, unsigned MOIdx); 299 300 /// handleVirtualRegisterDef - update intervals for a virtual 301 /// register def 302 void handleVirtualRegisterDef(MachineBasicBlock *MBB, 303 MachineBasicBlock::iterator MI, 304 SlotIndex MIIdx, MachineOperand& MO, 305 unsigned MOIdx, 306 LiveInterval& interval); 307 308 /// handlePhysicalRegisterDef - update intervals for a physical register 309 /// def. 310 void handlePhysicalRegisterDef(MachineBasicBlock* mbb, 311 MachineBasicBlock::iterator mi, 312 SlotIndex MIIdx, MachineOperand& MO, 313 LiveInterval &interval, 314 MachineInstr *CopyMI); 315 316 /// handleLiveInRegister - Create interval for a livein register. 317 void handleLiveInRegister(MachineBasicBlock* mbb, 318 SlotIndex MIIdx, 319 LiveInterval &interval, bool isAlias = false); 320 321 /// getReMatImplicitUse - If the remat definition MI has one (for now, we 322 /// only allow one) virtual register operand, then its uses are implicitly 323 /// using the register. Returns the virtual register. 324 unsigned getReMatImplicitUse(const LiveInterval &li, 325 MachineInstr *MI) const; 326 327 /// isValNoAvailableAt - Return true if the val# of the specified interval 328 /// which reaches the given instruction also reaches the specified use 329 /// index. 330 bool isValNoAvailableAt(const LiveInterval &li, MachineInstr *MI, 331 SlotIndex UseIdx) const; 332 333 /// isReMaterializable - Returns true if the definition MI of the specified 334 /// val# of the specified interval is re-materializable. Also returns true 335 /// by reference if the def is a load. 336 bool isReMaterializable(const LiveInterval &li, const VNInfo *ValNo, 337 MachineInstr *MI, 338 SmallVectorImpl<LiveInterval*> &SpillIs, 339 bool &isLoad); 340 341 /// tryFoldMemoryOperand - Attempts to fold either a spill / restore from 342 /// slot / to reg or any rematerialized load into ith operand of specified 343 /// MI. If it is successul, MI is updated with the newly created MI and 344 /// returns true. 345 bool tryFoldMemoryOperand(MachineInstr* &MI, VirtRegMap &vrm, 346 MachineInstr *DefMI, SlotIndex InstrIdx, 347 SmallVector<unsigned, 2> &Ops, 348 bool isSS, int FrameIndex, unsigned Reg); 349 350 /// canFoldMemoryOperand - Return true if the specified load / store 351 /// folding is possible. 352 bool canFoldMemoryOperand(MachineInstr *MI, 353 SmallVector<unsigned, 2> &Ops, 354 bool ReMatLoadSS) const; 355 356 /// anyKillInMBBAfterIdx - Returns true if there is a kill of the specified 357 /// VNInfo that's after the specified index but is within the basic block. 358 bool anyKillInMBBAfterIdx(const LiveInterval &li, const VNInfo *VNI, 359 MachineBasicBlock *MBB, 360 SlotIndex Idx) const; 361 362 /// hasAllocatableSuperReg - Return true if the specified physical register 363 /// has any super register that's allocatable. 364 bool hasAllocatableSuperReg(unsigned Reg) const; 365 366 /// SRInfo - Spill / restore info. 367 struct SRInfo { 368 SlotIndex index; 369 unsigned vreg; 370 bool canFold; 371 SRInfo(SlotIndex i, unsigned vr, bool f) 372 : index(i), vreg(vr), canFold(f) {} 373 }; 374 375 bool alsoFoldARestore(int Id, SlotIndex index, unsigned vr, 376 BitVector &RestoreMBBs, 377 DenseMap<unsigned,std::vector<SRInfo> >&RestoreIdxes); 378 void eraseRestoreInfo(int Id, SlotIndex index, unsigned vr, 379 BitVector &RestoreMBBs, 380 DenseMap<unsigned,std::vector<SRInfo> >&RestoreIdxes); 381 382 /// handleSpilledImpDefs - Remove IMPLICIT_DEF instructions which are being 383 /// spilled and create empty intervals for their uses. 384 void handleSpilledImpDefs(const LiveInterval &li, VirtRegMap &vrm, 385 const TargetRegisterClass* rc, 386 std::vector<LiveInterval*> &NewLIs); 387 388 /// rewriteImplicitOps - Rewrite implicit use operands of MI (i.e. uses of 389 /// interval on to-be re-materialized operands of MI) with new register. 390 void rewriteImplicitOps(const LiveInterval &li, 391 MachineInstr *MI, unsigned NewVReg, VirtRegMap &vrm); 392 393 /// rewriteInstructionForSpills, rewriteInstructionsForSpills - Helper 394 /// functions for addIntervalsForSpills to rewrite uses / defs for the given 395 /// live range. 396 bool rewriteInstructionForSpills(const LiveInterval &li, const VNInfo *VNI, 397 bool TrySplit, SlotIndex index, SlotIndex end, 398 MachineInstr *MI, MachineInstr *OrigDefMI, MachineInstr *DefMI, 399 unsigned Slot, int LdSlot, 400 bool isLoad, bool isLoadSS, bool DefIsReMat, bool CanDelete, 401 VirtRegMap &vrm, const TargetRegisterClass* rc, 402 SmallVector<int, 4> &ReMatIds, const MachineLoopInfo *loopInfo, 403 unsigned &NewVReg, unsigned ImpUse, bool &HasDef, bool &HasUse, 404 DenseMap<unsigned,unsigned> &MBBVRegsMap, 405 std::vector<LiveInterval*> &NewLIs); 406 void rewriteInstructionsForSpills(const LiveInterval &li, bool TrySplit, 407 LiveInterval::Ranges::const_iterator &I, 408 MachineInstr *OrigDefMI, MachineInstr *DefMI, unsigned Slot, int LdSlot, 409 bool isLoad, bool isLoadSS, bool DefIsReMat, bool CanDelete, 410 VirtRegMap &vrm, const TargetRegisterClass* rc, 411 SmallVector<int, 4> &ReMatIds, const MachineLoopInfo *loopInfo, 412 BitVector &SpillMBBs, 413 DenseMap<unsigned,std::vector<SRInfo> > &SpillIdxes, 414 BitVector &RestoreMBBs, 415 DenseMap<unsigned,std::vector<SRInfo> > &RestoreIdxes, 416 DenseMap<unsigned,unsigned> &MBBVRegsMap, 417 std::vector<LiveInterval*> &NewLIs); 418 419 // Normalize the spill weight of all the intervals in NewLIs. 420 void normalizeSpillWeights(std::vector<LiveInterval*> &NewLIs); 421 422 static LiveInterval* createInterval(unsigned Reg); 423 424 void printInstrs(raw_ostream &O) const; 425 void dumpInstrs() const; 426 }; 427} // End llvm namespace 428 429#endif 430