RegisterScavenging.cpp revision d68f47c6fd744e051f7f2d97b6366d40bf27c438
1//===-- RegisterScavenging.cpp - Machine register scavenging --------------===// 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 machine register scavenger. It can provide 11// information, such as unused registers, at any point in a machine basic block. 12// It also provides a mechanism to make registers available by evicting them to 13// spill slots. 14// 15//===----------------------------------------------------------------------===// 16 17#define DEBUG_TYPE "reg-scavenging" 18#include "llvm/CodeGen/RegisterScavenging.h" 19#include "llvm/CodeGen/MachineFunction.h" 20#include "llvm/CodeGen/MachineBasicBlock.h" 21#include "llvm/CodeGen/MachineInstr.h" 22#include "llvm/Target/TargetRegisterInfo.h" 23#include "llvm/Target/TargetInstrInfo.h" 24#include "llvm/Target/TargetMachine.h" 25#include "llvm/ADT/STLExtras.h" 26using namespace llvm; 27 28/// RedefinesSuperRegPart - Return true if the specified register is redefining 29/// part of a super-register. 30static bool RedefinesSuperRegPart(const MachineInstr *MI, unsigned SubReg, 31 const TargetRegisterInfo *TRI) { 32 bool SeenSuperUse = false; 33 bool SeenSuperDef = false; 34 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 35 const MachineOperand &MO = MI->getOperand(i); 36 if (!MO.isRegister()) 37 continue; 38 if (TRI->isSuperRegister(SubReg, MO.getReg())) 39 if (MO.isUse()) 40 SeenSuperUse = true; 41 else if (MO.isImplicit()) 42 SeenSuperDef = true; 43 } 44 45 return SeenSuperDef && SeenSuperUse; 46} 47 48static bool RedefinesSuperRegPart(const MachineInstr *MI, 49 const MachineOperand &MO, 50 const TargetRegisterInfo *TRI) { 51 assert(MO.isRegister() && MO.isDef() && "Not a register def!"); 52 return RedefinesSuperRegPart(MI, MO.getReg(), TRI); 53} 54 55/// setUsed - Set the register and its sub-registers as being used. 56void RegScavenger::setUsed(unsigned Reg) { 57 RegsAvailable.reset(Reg); 58 59 for (const unsigned *SubRegs = TRI->getSubRegisters(Reg); 60 unsigned SubReg = *SubRegs; ++SubRegs) 61 RegsAvailable.reset(SubReg); 62} 63 64/// setUnused - Set the register and its sub-registers as being unused. 65void RegScavenger::setUnused(unsigned Reg, const MachineInstr *MI) { 66 RegsAvailable.set(Reg); 67 68 for (const unsigned *SubRegs = TRI->getSubRegisters(Reg); 69 unsigned SubReg = *SubRegs; ++SubRegs) 70 if (!RedefinesSuperRegPart(MI, Reg, TRI)) 71 RegsAvailable.set(SubReg); 72} 73 74void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) { 75 const MachineFunction &MF = *mbb->getParent(); 76 const TargetMachine &TM = MF.getTarget(); 77 TII = TM.getInstrInfo(); 78 TRI = TM.getRegisterInfo(); 79 80 assert((NumPhysRegs == 0 || NumPhysRegs == TRI->getNumRegs()) && 81 "Target changed?"); 82 83 if (!MBB) { 84 NumPhysRegs = TRI->getNumRegs(); 85 RegsAvailable.resize(NumPhysRegs); 86 87 // Create reserved registers bitvector. 88 ReservedRegs = TRI->getReservedRegs(MF); 89 90 // Create callee-saved registers bitvector. 91 CalleeSavedRegs.resize(NumPhysRegs); 92 const unsigned *CSRegs = TRI->getCalleeSavedRegs(); 93 if (CSRegs != NULL) 94 for (unsigned i = 0; CSRegs[i]; ++i) 95 CalleeSavedRegs.set(CSRegs[i]); 96 } 97 98 MBB = mbb; 99 ScavengedReg = 0; 100 ScavengedRC = NULL; 101 102 // All registers started out unused. 103 RegsAvailable.set(); 104 105 // Reserved registers are always used. 106 RegsAvailable ^= ReservedRegs; 107 108 // Live-in registers are in use. 109 if (!MBB->livein_empty()) 110 for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(), 111 E = MBB->livein_end(); I != E; ++I) 112 setUsed(*I); 113 114 Tracking = false; 115} 116 117void RegScavenger::restoreScavengedReg() { 118 if (!ScavengedReg) 119 return; 120 121 TII->loadRegFromStackSlot(*MBB, MBBI, ScavengedReg, 122 ScavengingFrameIndex, ScavengedRC); 123 MachineBasicBlock::iterator II = prior(MBBI); 124 TRI->eliminateFrameIndex(II, 0, this); 125 setUsed(ScavengedReg); 126 ScavengedReg = 0; 127 ScavengedRC = NULL; 128} 129 130void RegScavenger::forward() { 131 // Move ptr forward. 132 if (!Tracking) { 133 MBBI = MBB->begin(); 134 Tracking = true; 135 } else { 136 assert(MBBI != MBB->end() && "Already at the end of the basic block!"); 137 MBBI = next(MBBI); 138 } 139 140 MachineInstr *MI = MBBI; 141 const TargetInstrDesc &TID = MI->getDesc(); 142 143 // Reaching a terminator instruction. Restore a scavenged register (which 144 // must be life out. 145 if (TID.isTerminator()) 146 restoreScavengedReg(); 147 148 // Process uses first. 149 BitVector ChangedRegs(NumPhysRegs); 150 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 151 const MachineOperand &MO = MI->getOperand(i); 152 if (!MO.isRegister() || !MO.isUse()) 153 continue; 154 155 unsigned Reg = MO.getReg(); 156 if (Reg == 0) continue; 157 158 if (!isUsed(Reg)) { 159 // Register has been scavenged. Restore it! 160 if (Reg != ScavengedReg) 161 assert(false && "Using an undefined register!"); 162 else 163 restoreScavengedReg(); 164 } 165 166 if (MO.isKill() && !isReserved(Reg)) { 167 ChangedRegs.set(Reg); 168 169 // Mark sub-registers as changed if they aren't defined in the same 170 // instruction. 171 for (const unsigned *SubRegs = TRI->getSubRegisters(Reg); 172 unsigned SubReg = *SubRegs; ++SubRegs) 173 if (!RedefinesSuperRegPart(MI, Reg, TRI)) 174 ChangedRegs.set(SubReg); 175 } 176 } 177 178 // Change states of all registers after all the uses are processed to guard 179 // against multiple uses. 180 setUnused(ChangedRegs); 181 182 // Process defs. 183 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 184 const MachineOperand &MO = MI->getOperand(i); 185 186 if (!MO.isRegister() || !MO.isDef()) 187 continue; 188 189 unsigned Reg = MO.getReg(); 190 191 // If it's dead upon def, then it is now free. 192 if (MO.isDead()) { 193 setUnused(Reg, MI); 194 continue; 195 } 196 197 // Skip two-address destination operand. 198 if (TID.findTiedToSrcOperand(i) != -1) { 199 assert(isUsed(Reg) && "Using an undefined register!"); 200 continue; 201 } 202 203 // Skip is this is merely redefining part of a super-register. 204 if (RedefinesSuperRegPart(MI, MO, TRI)) 205 continue; 206 207 assert((isUnused(Reg) || isReserved(Reg)) && 208 "Re-defining a live register!"); 209 setUsed(Reg); 210 } 211} 212 213void RegScavenger::backward() { 214 assert(Tracking && "Not tracking states!"); 215 assert(MBBI != MBB->begin() && "Already at start of basic block!"); 216 // Move ptr backward. 217 MBBI = prior(MBBI); 218 219 MachineInstr *MI = MBBI; 220 // Process defs first. 221 const TargetInstrDesc &TID = MI->getDesc(); 222 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 223 const MachineOperand &MO = MI->getOperand(i); 224 if (!MO.isRegister() || !MO.isDef()) 225 continue; 226 // Skip two-address destination operand. 227 if (TID.findTiedToSrcOperand(i) != -1) 228 continue; 229 unsigned Reg = MO.getReg(); 230 assert(isUsed(Reg)); 231 if (!isReserved(Reg)) 232 setUnused(Reg, MI); 233 } 234 235 // Process uses. 236 BitVector ChangedRegs(NumPhysRegs); 237 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 238 const MachineOperand &MO = MI->getOperand(i); 239 if (!MO.isRegister() || !MO.isUse()) 240 continue; 241 unsigned Reg = MO.getReg(); 242 if (Reg == 0) 243 continue; 244 assert(isUnused(Reg) || isReserved(Reg)); 245 ChangedRegs.set(Reg); 246 247 // Set the sub-registers as "used". 248 for (const unsigned *SubRegs = TRI->getSubRegisters(Reg); 249 unsigned SubReg = *SubRegs; ++SubRegs) 250 ChangedRegs.set(SubReg); 251 } 252 setUsed(ChangedRegs); 253} 254 255void RegScavenger::getRegsUsed(BitVector &used, bool includeReserved) { 256 if (includeReserved) 257 used = ~RegsAvailable; 258 else 259 used = ~RegsAvailable & ~ReservedRegs; 260} 261 262/// CreateRegClassMask - Set the bits that represent the registers in the 263/// TargetRegisterClass. 264static void CreateRegClassMask(const TargetRegisterClass *RC, BitVector &Mask) { 265 for (TargetRegisterClass::iterator I = RC->begin(), E = RC->end(); I != E; 266 ++I) 267 Mask.set(*I); 268} 269 270unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass, 271 const BitVector &Candidates) const { 272 // Mask off the registers which are not in the TargetRegisterClass. 273 BitVector RegsAvailableCopy(NumPhysRegs, false); 274 CreateRegClassMask(RegClass, RegsAvailableCopy); 275 RegsAvailableCopy &= RegsAvailable; 276 277 // Restrict the search to candidates. 278 RegsAvailableCopy &= Candidates; 279 280 // Returns the first unused (bit is set) register, or 0 is none is found. 281 int Reg = RegsAvailableCopy.find_first(); 282 return (Reg == -1) ? 0 : Reg; 283} 284 285unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass, 286 bool ExCalleeSaved) const { 287 // Mask off the registers which are not in the TargetRegisterClass. 288 BitVector RegsAvailableCopy(NumPhysRegs, false); 289 CreateRegClassMask(RegClass, RegsAvailableCopy); 290 RegsAvailableCopy &= RegsAvailable; 291 292 // If looking for a non-callee-saved register, mask off all the callee-saved 293 // registers. 294 if (ExCalleeSaved) 295 RegsAvailableCopy &= ~CalleeSavedRegs; 296 297 // Returns the first unused (bit is set) register, or 0 is none is found. 298 int Reg = RegsAvailableCopy.find_first(); 299 return (Reg == -1) ? 0 : Reg; 300} 301 302/// calcDistanceToUse - Calculate the distance to the first use of the 303/// specified register. 304static unsigned calcDistanceToUse(MachineBasicBlock *MBB, 305 MachineBasicBlock::iterator I, unsigned Reg, 306 const TargetRegisterInfo *TRI) { 307 unsigned Dist = 0; 308 I = next(I); 309 while (I != MBB->end()) { 310 Dist++; 311 if (I->readsRegister(Reg, TRI)) 312 return Dist; 313 I = next(I); 314 } 315 return Dist + 1; 316} 317 318unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC, 319 MachineBasicBlock::iterator I, 320 int SPAdj) { 321 assert(ScavengingFrameIndex >= 0 && 322 "Cannot scavenge a register without an emergency spill slot!"); 323 324 // Mask off the registers which are not in the TargetRegisterClass. 325 BitVector Candidates(NumPhysRegs, false); 326 CreateRegClassMask(RC, Candidates); 327 Candidates ^= ReservedRegs; // Do not include reserved registers. 328 329 // Exclude all the registers being used by the instruction. 330 for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) { 331 MachineOperand &MO = I->getOperand(i); 332 if (MO.isRegister()) 333 Candidates.reset(MO.getReg()); 334 } 335 336 // Find the register whose use is furthest away. 337 unsigned SReg = 0; 338 unsigned MaxDist = 0; 339 int Reg = Candidates.find_first(); 340 while (Reg != -1) { 341 unsigned Dist = calcDistanceToUse(MBB, I, Reg, TRI); 342 if (Dist >= MaxDist) { 343 MaxDist = Dist; 344 SReg = Reg; 345 } 346 Reg = Candidates.find_next(Reg); 347 } 348 349 if (ScavengedReg != 0) { 350 // First restore previously scavenged register. 351 TII->loadRegFromStackSlot(*MBB, I, ScavengedReg, 352 ScavengingFrameIndex, ScavengedRC); 353 MachineBasicBlock::iterator II = prior(I); 354 TRI->eliminateFrameIndex(II, SPAdj, this); 355 } 356 357 TII->storeRegToStackSlot(*MBB, I, SReg, true, ScavengingFrameIndex, RC); 358 MachineBasicBlock::iterator II = prior(I); 359 TRI->eliminateFrameIndex(II, SPAdj, this); 360 ScavengedReg = SReg; 361 ScavengedRC = RC; 362 363 return SReg; 364} 365