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/CodeGen/MachineRegisterInfo.h" 23 #include "llvm/Target/TargetRegisterInfo.h" 24 #include "llvm/Target/TargetInstrInfo.h" 25 #include "llvm/Target/TargetMachine.h" 26 #include "llvm/ADT/SmallPtrSet.h" 27 #include "llvm/ADT/SmallVector.h" 28 #include "llvm/ADT/STLExtras.h" 29 using namespace llvm; 30 31 /// RedefinesSuperRegPart - Return true if the specified register is redefining 32 /// part of a super-register. 33 static bool RedefinesSuperRegPart(const MachineInstr *MI, unsigned SubReg, 34 const TargetRegisterInfo *TRI) { 35 bool SeenSuperUse = false; 36 bool SeenSuperDef = false; 37 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 38 const MachineOperand &MO = MI->getOperand(i); 39 if (!MO.isReg() || MO.isUndef()) 40 continue; 41 if (TRI->isSuperRegister(SubReg, MO.getReg())) { 42 if (MO.isUse()) 43 SeenSuperUse = true; 44 else if (MO.isImplicit()) 45 SeenSuperDef = true; 46 } 47 } 48 49 return SeenSuperDef && SeenSuperUse; 50 } 51 52 static bool RedefinesSuperRegPart(const MachineInstr *MI, 53 const MachineOperand &MO, 54 const TargetRegisterInfo *TRI) { 55 assert(MO.isReg() && MO.isDef() && "Not a register def!"); 56 return RedefinesSuperRegPart(MI, MO.getReg(), TRI); 57 } 58 59 /// setUsed - Set the register and its sub-registers as being used. 60 void RegScavenger::setUsed(unsigned Reg) { 61 RegsAvailable.reset(Reg); 62 63 for (const unsigned *SubRegs = TRI->getSubRegisters(Reg); 64 unsigned SubReg = *SubRegs; ++SubRegs) 65 RegsAvailable.reset(SubReg); 66 } 67 68 /// setUnused - Set the register and its sub-registers as being unused. 69 void RegScavenger::setUnused(unsigned Reg, const MachineInstr *MI) { 70 RegsAvailable.set(Reg); 71 72 for (const unsigned *SubRegs = TRI->getSubRegisters(Reg); 73 unsigned SubReg = *SubRegs; ++SubRegs) 74 if (!RedefinesSuperRegPart(MI, Reg, TRI)) 75 RegsAvailable.set(SubReg); 76 } 77 78 void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) { 79 MachineFunction &MF = *mbb->getParent(); 80 const TargetMachine &TM = MF.getTarget(); 81 TII = TM.getInstrInfo(); 82 TRI = TM.getRegisterInfo(); 83 MRI = &MF.getRegInfo(); 84 85 assert((NumPhysRegs == 0 || NumPhysRegs == TRI->getNumRegs()) && 86 "Target changed?"); 87 88 if (!MBB) { 89 NumPhysRegs = TRI->getNumRegs(); 90 RegsAvailable.resize(NumPhysRegs); 91 92 // Create reserved registers bitvector. 93 ReservedRegs = TRI->getReservedRegs(MF); 94 95 // Create callee-saved registers bitvector. 96 CalleeSavedRegs.resize(NumPhysRegs); 97 const unsigned *CSRegs = TRI->getCalleeSavedRegs(); 98 if (CSRegs != NULL) 99 for (unsigned i = 0; CSRegs[i]; ++i) 100 CalleeSavedRegs.set(CSRegs[i]); 101 } 102 103 MBB = mbb; 104 ScavengedReg = 0; 105 ScavengedRC = NULL; 106 ScavengeRestore = NULL; 107 CurrDist = 0; 108 DistanceMap.clear(); 109 110 // All registers started out unused. 111 RegsAvailable.set(); 112 113 // Reserved registers are always used. 114 RegsAvailable ^= ReservedRegs; 115 116 // Live-in registers are in use. 117 if (!MBB->livein_empty()) 118 for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(), 119 E = MBB->livein_end(); I != E; ++I) 120 setUsed(*I); 121 122 Tracking = false; 123 } 124 125 void RegScavenger::restoreScavengedReg() { 126 TII->loadRegFromStackSlot(*MBB, MBBI, ScavengedReg, 127 ScavengingFrameIndex, ScavengedRC); 128 MachineBasicBlock::iterator II = prior(MBBI); 129 TRI->eliminateFrameIndex(II, 0, this); 130 setUsed(ScavengedReg); 131 ScavengedReg = 0; 132 ScavengedRC = NULL; 133 } 134 135 #ifndef NDEBUG 136 /// isLiveInButUnusedBefore - Return true if register is livein the MBB not 137 /// not used before it reaches the MI that defines register. 138 static bool isLiveInButUnusedBefore(unsigned Reg, MachineInstr *MI, 139 MachineBasicBlock *MBB, 140 const TargetRegisterInfo *TRI, 141 MachineRegisterInfo* MRI) { 142 // First check if register is livein. 143 bool isLiveIn = false; 144 for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(), 145 E = MBB->livein_end(); I != E; ++I) 146 if (Reg == *I || TRI->isSuperRegister(Reg, *I)) { 147 isLiveIn = true; 148 break; 149 } 150 if (!isLiveIn) 151 return false; 152 153 // Is there any use of it before the specified MI? 154 SmallPtrSet<MachineInstr*, 4> UsesInMBB; 155 for (MachineRegisterInfo::use_iterator UI = MRI->use_begin(Reg), 156 UE = MRI->use_end(); UI != UE; ++UI) { 157 MachineInstr *UseMI = &*UI; 158 if (UseMI->getParent() == MBB) 159 UsesInMBB.insert(UseMI); 160 } 161 if (UsesInMBB.empty()) 162 return true; 163 164 for (MachineBasicBlock::iterator I = MBB->begin(), E = MI; I != E; ++I) 165 if (UsesInMBB.count(&*I)) 166 return false; 167 return true; 168 } 169 #endif 170 171 void RegScavenger::forward() { 172 // Move ptr forward. 173 if (!Tracking) { 174 MBBI = MBB->begin(); 175 Tracking = true; 176 } else { 177 assert(MBBI != MBB->end() && "Already at the end of the basic block!"); 178 MBBI = next(MBBI); 179 } 180 181 MachineInstr *MI = MBBI; 182 DistanceMap.insert(std::make_pair(MI, CurrDist++)); 183 184 if (MI == ScavengeRestore) { 185 ScavengedReg = 0; 186 ScavengedRC = NULL; 187 ScavengeRestore = NULL; 188 } 189 190 #if 0 191 if (MI->getOpcode() == TargetInstrInfo::IMPLICIT_DEF) 192 return; 193 #endif 194 195 // Separate register operands into 3 classes: uses, defs, earlyclobbers. 196 SmallVector<std::pair<const MachineOperand*,unsigned>, 4> UseMOs; 197 SmallVector<std::pair<const MachineOperand*,unsigned>, 4> DefMOs; 198 SmallVector<std::pair<const MachineOperand*,unsigned>, 4> EarlyClobberMOs; 199 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 200 const MachineOperand &MO = MI->getOperand(i); 201 if (!MO.isReg() || MO.getReg() == 0 || MO.isUndef()) 202 continue; 203 if (MO.isUse()) 204 UseMOs.push_back(std::make_pair(&MO,i)); 205 else if (MO.isEarlyClobber()) 206 EarlyClobberMOs.push_back(std::make_pair(&MO,i)); 207 else 208 DefMOs.push_back(std::make_pair(&MO,i)); 209 } 210 211 // Process uses first. 212 BitVector KillRegs(NumPhysRegs); 213 for (unsigned i = 0, e = UseMOs.size(); i != e; ++i) { 214 const MachineOperand MO = *UseMOs[i].first; 215 unsigned Reg = MO.getReg(); 216 217 assert(isUsed(Reg) && "Using an undefined register!"); 218 219 if (MO.isKill() && !isReserved(Reg)) { 220 KillRegs.set(Reg); 221 222 // Mark sub-registers as used. 223 for (const unsigned *SubRegs = TRI->getSubRegisters(Reg); 224 unsigned SubReg = *SubRegs; ++SubRegs) 225 KillRegs.set(SubReg); 226 } 227 } 228 229 // Change states of all registers after all the uses are processed to guard 230 // against multiple uses. 231 setUnused(KillRegs); 232 233 // Process early clobber defs then process defs. We can have a early clobber 234 // that is dead, it should not conflict with a def that happens one "slot" 235 // (see InstrSlots in LiveIntervalAnalysis.h) later. 236 unsigned NumECs = EarlyClobberMOs.size(); 237 unsigned NumDefs = DefMOs.size(); 238 239 for (unsigned i = 0, e = NumECs + NumDefs; i != e; ++i) { 240 const MachineOperand &MO = (i < NumECs) 241 ? *EarlyClobberMOs[i].first : *DefMOs[i-NumECs].first; 242 unsigned Idx = (i < NumECs) 243 ? EarlyClobberMOs[i].second : DefMOs[i-NumECs].second; 244 unsigned Reg = MO.getReg(); 245 if (MO.isUndef()) 246 continue; 247 248 // If it's dead upon def, then it is now free. 249 if (MO.isDead()) { 250 setUnused(Reg, MI); 251 continue; 252 } 253 254 // Skip two-address destination operand. 255 unsigned UseIdx; 256 if (MI->isRegTiedToUseOperand(Idx, &UseIdx) && 257 !MI->getOperand(UseIdx).isUndef()) { 258 assert(isUsed(Reg) && "Using an undefined register!"); 259 continue; 260 } 261 262 // Skip if this is merely redefining part of a super-register. 263 if (RedefinesSuperRegPart(MI, MO, TRI)) 264 continue; 265 266 // Implicit def is allowed to "re-define" any register. Similarly, 267 // implicitly defined registers can be clobbered. 268 assert((isReserved(Reg) || isUnused(Reg) || 269 isLiveInButUnusedBefore(Reg, MI, MBB, TRI, MRI)) && 270 "Re-defining a live register!"); 271 setUsed(Reg); 272 } 273 } 274 275 void RegScavenger::backward() { 276 assert(Tracking && "Not tracking states!"); 277 assert(MBBI != MBB->begin() && "Already at start of basic block!"); 278 // Move ptr backward. 279 MBBI = prior(MBBI); 280 281 MachineInstr *MI = MBBI; 282 DistanceMap.erase(MI); 283 --CurrDist; 284 285 // Separate register operands into 3 classes: uses, defs, earlyclobbers. 286 SmallVector<std::pair<const MachineOperand*,unsigned>, 4> UseMOs; 287 SmallVector<std::pair<const MachineOperand*,unsigned>, 4> DefMOs; 288 SmallVector<std::pair<const MachineOperand*,unsigned>, 4> EarlyClobberMOs; 289 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 290 const MachineOperand &MO = MI->getOperand(i); 291 if (!MO.isReg() || MO.getReg() == 0 || MO.isUndef()) 292 continue; 293 if (MO.isUse()) 294 UseMOs.push_back(std::make_pair(&MO,i)); 295 else if (MO.isEarlyClobber()) 296 EarlyClobberMOs.push_back(std::make_pair(&MO,i)); 297 else 298 DefMOs.push_back(std::make_pair(&MO,i)); 299 } 300 301 302 // Process defs first. 303 unsigned NumECs = EarlyClobberMOs.size(); 304 unsigned NumDefs = DefMOs.size(); 305 for (unsigned i = 0, e = NumECs + NumDefs; i != e; ++i) { 306 const MachineOperand &MO = (i < NumDefs) 307 ? *DefMOs[i].first : *EarlyClobberMOs[i-NumDefs].first; 308 unsigned Idx = (i < NumECs) 309 ? DefMOs[i].second : EarlyClobberMOs[i-NumDefs].second; 310 if (MO.isUndef()) 311 continue; 312 313 // Skip two-address destination operand. 314 if (MI->isRegTiedToUseOperand(Idx)) 315 continue; 316 317 unsigned Reg = MO.getReg(); 318 assert(isUsed(Reg)); 319 if (!isReserved(Reg)) 320 setUnused(Reg, MI); 321 } 322 323 // Process uses. 324 BitVector UseRegs(NumPhysRegs); 325 for (unsigned i = 0, e = UseMOs.size(); i != e; ++i) { 326 const MachineOperand MO = *UseMOs[i].first; 327 unsigned Reg = MO.getReg(); 328 assert(isUnused(Reg) || isReserved(Reg)); 329 UseRegs.set(Reg); 330 331 // Set the sub-registers as "used". 332 for (const unsigned *SubRegs = TRI->getSubRegisters(Reg); 333 unsigned SubReg = *SubRegs; ++SubRegs) 334 UseRegs.set(SubReg); 335 } 336 setUsed(UseRegs); 337 } 338 339 void RegScavenger::getRegsUsed(BitVector &used, bool includeReserved) { 340 if (includeReserved) 341 used = ~RegsAvailable; 342 else 343 used = ~RegsAvailable & ~ReservedRegs; 344 } 345 346 /// CreateRegClassMask - Set the bits that represent the registers in the 347 /// TargetRegisterClass. 348 static void CreateRegClassMask(const TargetRegisterClass *RC, BitVector &Mask) { 349 for (TargetRegisterClass::iterator I = RC->begin(), E = RC->end(); I != E; 350 ++I) 351 Mask.set(*I); 352 } 353 354 unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass, 355 const BitVector &Candidates) const { 356 // Mask off the registers which are not in the TargetRegisterClass. 357 BitVector RegsAvailableCopy(NumPhysRegs, false); 358 CreateRegClassMask(RegClass, RegsAvailableCopy); 359 RegsAvailableCopy &= RegsAvailable; 360 361 // Restrict the search to candidates. 362 RegsAvailableCopy &= Candidates; 363 364 // Returns the first unused (bit is set) register, or 0 is none is found. 365 int Reg = RegsAvailableCopy.find_first(); 366 return (Reg == -1) ? 0 : Reg; 367 } 368 369 unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass, 370 bool ExCalleeSaved) const { 371 // Mask off the registers which are not in the TargetRegisterClass. 372 BitVector RegsAvailableCopy(NumPhysRegs, false); 373 CreateRegClassMask(RegClass, RegsAvailableCopy); 374 RegsAvailableCopy &= RegsAvailable; 375 376 // If looking for a non-callee-saved register, mask off all the callee-saved 377 // registers. 378 if (ExCalleeSaved) 379 RegsAvailableCopy &= ~CalleeSavedRegs; 380 381 // Returns the first unused (bit is set) register, or 0 is none is found. 382 int Reg = RegsAvailableCopy.find_first(); 383 return (Reg == -1) ? 0 : Reg; 384 } 385 386 /// findFirstUse - Calculate the distance to the first use of the 387 /// specified register. 388 MachineInstr* 389 RegScavenger::findFirstUse(MachineBasicBlock *MBB, 390 MachineBasicBlock::iterator I, unsigned Reg, 391 unsigned &Dist) { 392 MachineInstr *UseMI = 0; 393 Dist = ~0U; 394 for (MachineRegisterInfo::reg_iterator RI = MRI->reg_begin(Reg), 395 RE = MRI->reg_end(); RI != RE; ++RI) { 396 MachineInstr *UDMI = &*RI; 397 if (UDMI->getParent() != MBB) 398 continue; 399 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(UDMI); 400 if (DI == DistanceMap.end()) { 401 // If it's not in map, it's below current MI, let's initialize the 402 // map. 403 I = next(I); 404 unsigned Dist = CurrDist + 1; 405 while (I != MBB->end()) { 406 DistanceMap.insert(std::make_pair(I, Dist++)); 407 I = next(I); 408 } 409 } 410 DI = DistanceMap.find(UDMI); 411 if (DI->second > CurrDist && DI->second < Dist) { 412 Dist = DI->second; 413 UseMI = UDMI; 414 } 415 } 416 return UseMI; 417 } 418 419 unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC, 420 MachineBasicBlock::iterator I, 421 int SPAdj) { 422 assert(ScavengingFrameIndex >= 0 && 423 "Cannot scavenge a register without an emergency spill slot!"); 424 425 // Mask off the registers which are not in the TargetRegisterClass. 426 BitVector Candidates(NumPhysRegs, false); 427 CreateRegClassMask(RC, Candidates); 428 Candidates ^= ReservedRegs; // Do not include reserved registers. 429 430 // Exclude all the registers being used by the instruction. 431 for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) { 432 MachineOperand &MO = I->getOperand(i); 433 if (MO.isReg()) 434 Candidates.reset(MO.getReg()); 435 } 436 437 // Find the register whose use is furthest away. 438 unsigned SReg = 0; 439 unsigned MaxDist = 0; 440 MachineInstr *MaxUseMI = 0; 441 int Reg = Candidates.find_first(); 442 while (Reg != -1) { 443 unsigned Dist; 444 MachineInstr *UseMI = findFirstUse(MBB, I, Reg, Dist); 445 for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) { 446 unsigned AsDist; 447 MachineInstr *AsUseMI = findFirstUse(MBB, I, *AS, AsDist); 448 if (AsDist < Dist) { 449 Dist = AsDist; 450 UseMI = AsUseMI; 451 } 452 } 453 if (Dist >= MaxDist) { 454 MaxDist = Dist; 455 MaxUseMI = UseMI; 456 SReg = Reg; 457 } 458 Reg = Candidates.find_next(Reg); 459 } 460 461 if (ScavengedReg != 0) { 462 assert(0 && "Scavenger slot is live, unable to scavenge another register!"); 463 abort(); 464 } 465 466 // Spill the scavenged register before I. 467 TII->storeRegToStackSlot(*MBB, I, SReg, true, ScavengingFrameIndex, RC); 468 MachineBasicBlock::iterator II = prior(I); 469 TRI->eliminateFrameIndex(II, SPAdj, this); 470 471 // Restore the scavenged register before its use (or first terminator). 472 II = MaxUseMI 473 ? MachineBasicBlock::iterator(MaxUseMI) : MBB->getFirstTerminator(); 474 TII->loadRegFromStackSlot(*MBB, II, SReg, ScavengingFrameIndex, RC); 475 ScavengeRestore = prior(II); 476 ScavengedReg = SReg; 477 ScavengedRC = RC; 478 479 return SReg; 480 } 481