1 //===-- RegisterScavenging.h - Machine register scavenging ------*- 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 declares the machine register scavenger class. It can provide 11 // information such as unused register at any point in a machine basic block. 12 // It also provides a mechanism to make registers available by evicting them 13 // to spill slots. 14 // 15 //===----------------------------------------------------------------------===// 16 17 #ifndef LLVM_CODEGEN_REGISTERSCAVENGING_H 18 #define LLVM_CODEGEN_REGISTERSCAVENGING_H 19 20 #include "llvm/ADT/BitVector.h" 21 #include "llvm/CodeGen/MachineBasicBlock.h" 22 #include "llvm/CodeGen/MachineRegisterInfo.h" 23 24 namespace llvm { 25 26 class MachineRegisterInfo; 27 class TargetRegisterInfo; 28 class TargetInstrInfo; 29 class TargetRegisterClass; 30 31 class RegScavenger { 32 const TargetRegisterInfo *TRI; 33 const TargetInstrInfo *TII; 34 MachineRegisterInfo* MRI; 35 MachineBasicBlock *MBB; 36 MachineBasicBlock::iterator MBBI; 37 unsigned NumRegUnits; 38 39 /// True if RegScavenger is currently tracking the liveness of registers. 40 bool Tracking; 41 42 /// Information on scavenged registers (held in a spill slot). 43 struct ScavengedInfo { FrameIndexScavengedInfo44 ScavengedInfo(int FI = -1) : FrameIndex(FI), Reg(0), Restore(nullptr) {} 45 46 /// A spill slot used for scavenging a register post register allocation. 47 int FrameIndex; 48 49 /// If non-zero, the specific register is currently being 50 /// scavenged. That is, it is spilled to this scavenging stack slot. 51 unsigned Reg; 52 53 /// The instruction that restores the scavenged register from stack. 54 const MachineInstr *Restore; 55 }; 56 57 /// A vector of information on scavenged registers. 58 SmallVector<ScavengedInfo, 2> Scavenged; 59 60 /// The current state of each reg unit immediately before MBBI. 61 /// One bit per register unit. If bit is not set it means any 62 /// register containing that register unit is currently being used. 63 BitVector RegUnitsAvailable; 64 65 // These BitVectors are only used internally to forward(). They are members 66 // to avoid frequent reallocations. 67 BitVector KillRegUnits, DefRegUnits; 68 BitVector TmpRegUnits; 69 70 public: RegScavenger()71 RegScavenger() 72 : MBB(nullptr), NumRegUnits(0), Tracking(false) {} 73 74 /// Start tracking liveness from the begin of the specific basic block. 75 void enterBasicBlock(MachineBasicBlock *mbb); 76 77 /// Allow resetting register state info for multiple 78 /// passes over/within the same function. 79 void initRegState(); 80 81 /// Move the internal MBB iterator and update register states. 82 void forward(); 83 84 /// Move the internal MBB iterator and update register states until 85 /// it has processed the specific iterator. forward(MachineBasicBlock::iterator I)86 void forward(MachineBasicBlock::iterator I) { 87 if (!Tracking && MBB->begin() != I) forward(); 88 while (MBBI != I) forward(); 89 } 90 91 /// Invert the behavior of forward() on the current instruction (undo the 92 /// changes to the available registers made by forward()). 93 void unprocess(); 94 95 /// Unprocess instructions until you reach the provided iterator. unprocess(MachineBasicBlock::iterator I)96 void unprocess(MachineBasicBlock::iterator I) { 97 while (MBBI != I) unprocess(); 98 } 99 100 /// Move the internal MBB iterator but do not update register states. skipTo(MachineBasicBlock::iterator I)101 void skipTo(MachineBasicBlock::iterator I) { 102 if (I == MachineBasicBlock::iterator(nullptr)) 103 Tracking = false; 104 MBBI = I; 105 } 106 getCurrentPosition()107 MachineBasicBlock::iterator getCurrentPosition() const { 108 return MBBI; 109 } 110 111 /// Return if a specific register is currently used. 112 bool isRegUsed(unsigned Reg, bool includeReserved = true) const; 113 114 /// Return all available registers in the register class in Mask. 115 BitVector getRegsAvailable(const TargetRegisterClass *RC); 116 117 /// Find an unused register of the specified register class. 118 /// Return 0 if none is found. 119 unsigned FindUnusedReg(const TargetRegisterClass *RegClass) const; 120 121 /// Add a scavenging frame index. addScavengingFrameIndex(int FI)122 void addScavengingFrameIndex(int FI) { 123 Scavenged.push_back(ScavengedInfo(FI)); 124 } 125 126 /// Query whether a frame index is a scavenging frame index. isScavengingFrameIndex(int FI)127 bool isScavengingFrameIndex(int FI) const { 128 for (SmallVectorImpl<ScavengedInfo>::const_iterator I = Scavenged.begin(), 129 IE = Scavenged.end(); I != IE; ++I) 130 if (I->FrameIndex == FI) 131 return true; 132 133 return false; 134 } 135 136 /// Get an array of scavenging frame indices. getScavengingFrameIndices(SmallVectorImpl<int> & A)137 void getScavengingFrameIndices(SmallVectorImpl<int> &A) const { 138 for (SmallVectorImpl<ScavengedInfo>::const_iterator I = Scavenged.begin(), 139 IE = Scavenged.end(); I != IE; ++I) 140 if (I->FrameIndex >= 0) 141 A.push_back(I->FrameIndex); 142 } 143 144 /// Make a register of the specific register class 145 /// available and do the appropriate bookkeeping. SPAdj is the stack 146 /// adjustment due to call frame, it's passed along to eliminateFrameIndex(). 147 /// Returns the scavenged register. 148 unsigned scavengeRegister(const TargetRegisterClass *RegClass, 149 MachineBasicBlock::iterator I, int SPAdj); scavengeRegister(const TargetRegisterClass * RegClass,int SPAdj)150 unsigned scavengeRegister(const TargetRegisterClass *RegClass, int SPAdj) { 151 return scavengeRegister(RegClass, MBBI, SPAdj); 152 } 153 154 /// Tell the scavenger a register is used. 155 void setRegUsed(unsigned Reg); 156 private: 157 /// Returns true if a register is reserved. It is never "unused". isReserved(unsigned Reg)158 bool isReserved(unsigned Reg) const { return MRI->isReserved(Reg); } 159 160 /// setUsed / setUnused - Mark the state of one or a number of register units. 161 /// setUsed(BitVector & RegUnits)162 void setUsed(BitVector &RegUnits) { 163 RegUnitsAvailable.reset(RegUnits); 164 } setUnused(BitVector & RegUnits)165 void setUnused(BitVector &RegUnits) { 166 RegUnitsAvailable |= RegUnits; 167 } 168 169 /// Processes the current instruction and fill the KillRegUnits and 170 /// DefRegUnits bit vectors. 171 void determineKillsAndDefs(); 172 173 /// Add all Reg Units that Reg contains to BV. 174 void addRegUnits(BitVector &BV, unsigned Reg); 175 176 /// Return the candidate register that is unused for the longest after 177 /// StartMI. UseMI is set to the instruction where the search stopped. 178 /// 179 /// No more than InstrLimit instructions are inspected. 180 unsigned findSurvivorReg(MachineBasicBlock::iterator StartMI, 181 BitVector &Candidates, 182 unsigned InstrLimit, 183 MachineBasicBlock::iterator &UseMI); 184 185 }; 186 187 } // End llvm namespace 188 189 #endif 190