LLVM API Documentation
00001 //===-- RegisterScavenging.cpp - Machine register scavenging --------------===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This file implements the machine register scavenger. It can provide 00011 // information, such as unused registers, at any point in a machine basic block. 00012 // It also provides a mechanism to make registers available by evicting them to 00013 // spill slots. 00014 // 00015 //===----------------------------------------------------------------------===// 00016 00017 #define DEBUG_TYPE "reg-scavenging" 00018 #include "llvm/CodeGen/RegisterScavenging.h" 00019 #include "llvm/CodeGen/MachineFunction.h" 00020 #include "llvm/CodeGen/MachineBasicBlock.h" 00021 #include "llvm/CodeGen/MachineInstr.h" 00022 #include "llvm/CodeGen/MachineRegisterInfo.h" 00023 #include "llvm/Target/TargetRegisterInfo.h" 00024 #include "llvm/Target/TargetInstrInfo.h" 00025 #include "llvm/Target/TargetMachine.h" 00026 #include "llvm/ADT/SmallPtrSet.h" 00027 #include "llvm/ADT/SmallVector.h" 00028 #include "llvm/ADT/STLExtras.h" 00029 using namespace llvm; 00030 00031 /// RedefinesSuperRegPart - Return true if the specified register is redefining 00032 /// part of a super-register. 00033 static bool RedefinesSuperRegPart(const MachineInstr *MI, unsigned SubReg, 00034 const TargetRegisterInfo *TRI) { 00035 bool SeenSuperUse = false; 00036 bool SeenSuperDef = false; 00037 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 00038 const MachineOperand &MO = MI->getOperand(i); 00039 if (!MO.isReg()) 00040 continue; 00041 if (TRI->isSuperRegister(SubReg, MO.getReg())) { 00042 if (MO.isUse()) 00043 SeenSuperUse = true; 00044 else if (MO.isImplicit()) 00045 SeenSuperDef = true; 00046 } 00047 } 00048 00049 return SeenSuperDef && SeenSuperUse; 00050 } 00051 00052 static bool RedefinesSuperRegPart(const MachineInstr *MI, 00053 const MachineOperand &MO, 00054 const TargetRegisterInfo *TRI) { 00055 assert(MO.isReg() && MO.isDef() && "Not a register def!"); 00056 return RedefinesSuperRegPart(MI, MO.getReg(), TRI); 00057 } 00058 00059 /// setUsed - Set the register and its sub-registers as being used. 00060 void RegScavenger::setUsed(unsigned Reg, bool ImpDef) { 00061 RegsAvailable.reset(Reg); 00062 ImplicitDefed[Reg] = ImpDef; 00063 00064 for (const unsigned *SubRegs = TRI->getSubRegisters(Reg); 00065 unsigned SubReg = *SubRegs; ++SubRegs) { 00066 RegsAvailable.reset(SubReg); 00067 ImplicitDefed[SubReg] = ImpDef; 00068 } 00069 } 00070 00071 /// setUnused - Set the register and its sub-registers as being unused. 00072 void RegScavenger::setUnused(unsigned Reg, const MachineInstr *MI) { 00073 RegsAvailable.set(Reg); 00074 ImplicitDefed.reset(Reg); 00075 00076 for (const unsigned *SubRegs = TRI->getSubRegisters(Reg); 00077 unsigned SubReg = *SubRegs; ++SubRegs) 00078 if (!RedefinesSuperRegPart(MI, Reg, TRI)) { 00079 RegsAvailable.set(SubReg); 00080 ImplicitDefed.reset(SubReg); 00081 } 00082 } 00083 00084 void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) { 00085 MachineFunction &MF = *mbb->getParent(); 00086 const TargetMachine &TM = MF.getTarget(); 00087 TII = TM.getInstrInfo(); 00088 TRI = TM.getRegisterInfo(); 00089 MRI = &MF.getRegInfo(); 00090 00091 assert((NumPhysRegs == 0 || NumPhysRegs == TRI->getNumRegs()) && 00092 "Target changed?"); 00093 00094 if (!MBB) { 00095 NumPhysRegs = TRI->getNumRegs(); 00096 RegsAvailable.resize(NumPhysRegs); 00097 ImplicitDefed.resize(NumPhysRegs); 00098 00099 // Create reserved registers bitvector. 00100 ReservedRegs = TRI->getReservedRegs(MF); 00101 00102 // Create callee-saved registers bitvector. 00103 CalleeSavedRegs.resize(NumPhysRegs); 00104 const unsigned *CSRegs = TRI->getCalleeSavedRegs(); 00105 if (CSRegs != NULL) 00106 for (unsigned i = 0; CSRegs[i]; ++i) 00107 CalleeSavedRegs.set(CSRegs[i]); 00108 } 00109 00110 MBB = mbb; 00111 ScavengedReg = 0; 00112 ScavengedRC = NULL; 00113 ScavengeRestore = NULL; 00114 CurrDist = 0; 00115 DistanceMap.clear(); 00116 ImplicitDefed.reset(); 00117 00118 // All registers started out unused. 00119 RegsAvailable.set(); 00120 00121 // Reserved registers are always used. 00122 RegsAvailable ^= ReservedRegs; 00123 00124 // Live-in registers are in use. 00125 if (!MBB->livein_empty()) 00126 for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(), 00127 E = MBB->livein_end(); I != E; ++I) 00128 setUsed(*I); 00129 00130 Tracking = false; 00131 } 00132 00133 void RegScavenger::restoreScavengedReg() { 00134 TII->loadRegFromStackSlot(*MBB, MBBI, ScavengedReg, 00135 ScavengingFrameIndex, ScavengedRC); 00136 MachineBasicBlock::iterator II = prior(MBBI); 00137 TRI->eliminateFrameIndex(II, 0, this); 00138 setUsed(ScavengedReg); 00139 ScavengedReg = 0; 00140 ScavengedRC = NULL; 00141 } 00142 00143 #ifndef NDEBUG 00144 /// isLiveInButUnusedBefore - Return true if register is livein the MBB not 00145 /// not used before it reaches the MI that defines register. 00146 static bool isLiveInButUnusedBefore(unsigned Reg, MachineInstr *MI, 00147 MachineBasicBlock *MBB, 00148 const TargetRegisterInfo *TRI, 00149 MachineRegisterInfo* MRI) { 00150 // First check if register is livein. 00151 bool isLiveIn = false; 00152 for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(), 00153 E = MBB->livein_end(); I != E; ++I) 00154 if (Reg == *I || TRI->isSuperRegister(Reg, *I)) { 00155 isLiveIn = true; 00156 break; 00157 } 00158 if (!isLiveIn) 00159 return false; 00160 00161 // Is there any use of it before the specified MI? 00162 SmallPtrSet<MachineInstr*, 4> UsesInMBB; 00163 for (MachineRegisterInfo::use_iterator UI = MRI->use_begin(Reg), 00164 UE = MRI->use_end(); UI != UE; ++UI) { 00165 MachineInstr *UseMI = &*UI; 00166 if (UseMI->getParent() == MBB) 00167 UsesInMBB.insert(UseMI); 00168 } 00169 if (UsesInMBB.empty()) 00170 return true; 00171 00172 for (MachineBasicBlock::iterator I = MBB->begin(), E = MI; I != E; ++I) 00173 if (UsesInMBB.count(&*I)) 00174 return false; 00175 return true; 00176 } 00177 #endif 00178 00179 void RegScavenger::forward() { 00180 // Move ptr forward. 00181 if (!Tracking) { 00182 MBBI = MBB->begin(); 00183 Tracking = true; 00184 } else { 00185 assert(MBBI != MBB->end() && "Already at the end of the basic block!"); 00186 MBBI = next(MBBI); 00187 } 00188 00189 MachineInstr *MI = MBBI; 00190 DistanceMap.insert(std::make_pair(MI, CurrDist++)); 00191 const TargetInstrDesc &TID = MI->getDesc(); 00192 00193 if (MI == ScavengeRestore) { 00194 ScavengedReg = 0; 00195 ScavengedRC = NULL; 00196 ScavengeRestore = NULL; 00197 } 00198 00199 bool IsImpDef = MI->getOpcode() == TargetInstrInfo::IMPLICIT_DEF; 00200 00201 // Separate register operands into 3 classes: uses, defs, earlyclobbers. 00202 SmallVector<std::pair<const MachineOperand*,unsigned>, 4> UseMOs; 00203 SmallVector<std::pair<const MachineOperand*,unsigned>, 4> DefMOs; 00204 SmallVector<std::pair<const MachineOperand*,unsigned>, 4> EarlyClobberMOs; 00205 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 00206 const MachineOperand &MO = MI->getOperand(i); 00207 if (!MO.isReg() || MO.getReg() == 0) 00208 continue; 00209 if (MO.isUse()) 00210 UseMOs.push_back(std::make_pair(&MO,i)); 00211 else if (MO.isEarlyClobber()) 00212 EarlyClobberMOs.push_back(std::make_pair(&MO,i)); 00213 else 00214 DefMOs.push_back(std::make_pair(&MO,i)); 00215 } 00216 00217 // Process uses first. 00218 BitVector UseRegs(NumPhysRegs); 00219 for (unsigned i = 0, e = UseMOs.size(); i != e; ++i) { 00220 const MachineOperand MO = *UseMOs[i].first; 00221 unsigned Reg = MO.getReg(); 00222 00223 assert(isUsed(Reg) && "Using an undefined register!"); 00224 00225 if (MO.isKill() && !isReserved(Reg)) { 00226 UseRegs.set(Reg); 00227 00228 // Mark sub-registers as used. 00229 for (const unsigned *SubRegs = TRI->getSubRegisters(Reg); 00230 unsigned SubReg = *SubRegs; ++SubRegs) 00231 UseRegs.set(SubReg); 00232 } 00233 } 00234 00235 // Change states of all registers after all the uses are processed to guard 00236 // against multiple uses. 00237 setUnused(UseRegs); 00238 00239 // Process early clobber defs then process defs. We can have a early clobber 00240 // that is dead, it should not conflict with a def that happens one "slot" 00241 // (see InstrSlots in LiveIntervalAnalysis.h) later. 00242 unsigned NumECs = EarlyClobberMOs.size(); 00243 unsigned NumDefs = DefMOs.size(); 00244 00245 for (unsigned i = 0, e = NumECs + NumDefs; i != e; ++i) { 00246 const MachineOperand &MO = (i < NumECs) 00247 ? *EarlyClobberMOs[i].first : *DefMOs[i-NumECs].first; 00248 unsigned Idx = (i < NumECs) 00249 ? EarlyClobberMOs[i].second : DefMOs[i-NumECs].second; 00250 unsigned Reg = MO.getReg(); 00251 00252 // If it's dead upon def, then it is now free. 00253 if (MO.isDead()) { 00254 setUnused(Reg, MI); 00255 continue; 00256 } 00257 00258 // Skip two-address destination operand. 00259 if (TID.findTiedToSrcOperand(Idx) != -1) { 00260 assert(isUsed(Reg) && "Using an undefined register!"); 00261 continue; 00262 } 00263 00264 // Skip if this is merely redefining part of a super-register. 00265 if (RedefinesSuperRegPart(MI, MO, TRI)) 00266 continue; 00267 00268 // Implicit def is allowed to "re-define" any register. Similarly, 00269 // implicitly defined registers can be clobbered. 00270 assert((isReserved(Reg) || isUnused(Reg) || 00271 IsImpDef || isImplicitlyDefined(Reg) || 00272 isLiveInButUnusedBefore(Reg, MI, MBB, TRI, MRI)) && 00273 "Re-defining a live register!"); 00274 setUsed(Reg, IsImpDef); 00275 } 00276 } 00277 00278 void RegScavenger::backward() { 00279 assert(Tracking && "Not tracking states!"); 00280 assert(MBBI != MBB->begin() && "Already at start of basic block!"); 00281 // Move ptr backward. 00282 MBBI = prior(MBBI); 00283 00284 MachineInstr *MI = MBBI; 00285 DistanceMap.erase(MI); 00286 --CurrDist; 00287 const TargetInstrDesc &TID = MI->getDesc(); 00288 00289 // Separate register operands into 3 classes: uses, defs, earlyclobbers. 00290 SmallVector<std::pair<const MachineOperand*,unsigned>, 4> UseMOs; 00291 SmallVector<std::pair<const MachineOperand*,unsigned>, 4> DefMOs; 00292 SmallVector<std::pair<const MachineOperand*,unsigned>, 4> EarlyClobberMOs; 00293 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 00294 const MachineOperand &MO = MI->getOperand(i); 00295 if (!MO.isReg() || MO.getReg() == 0) 00296 continue; 00297 if (MO.isUse()) 00298 UseMOs.push_back(std::make_pair(&MO,i)); 00299 else if (MO.isEarlyClobber()) 00300 EarlyClobberMOs.push_back(std::make_pair(&MO,i)); 00301 else 00302 DefMOs.push_back(std::make_pair(&MO,i)); 00303 } 00304 00305 00306 // Process defs first. 00307 unsigned NumECs = EarlyClobberMOs.size(); 00308 unsigned NumDefs = DefMOs.size(); 00309 for (unsigned i = 0, e = NumECs + NumDefs; i != e; ++i) { 00310 const MachineOperand &MO = (i < NumDefs) 00311 ? *DefMOs[i].first : *EarlyClobberMOs[i-NumDefs].first; 00312 unsigned Idx = (i < NumECs) 00313 ? DefMOs[i].second : EarlyClobberMOs[i-NumDefs].second; 00314 00315 // Skip two-address destination operand. 00316 if (TID.findTiedToSrcOperand(Idx) != -1) 00317 continue; 00318 00319 unsigned Reg = MO.getReg(); 00320 assert(isUsed(Reg)); 00321 if (!isReserved(Reg)) 00322 setUnused(Reg, MI); 00323 } 00324 00325 // Process uses. 00326 BitVector UseRegs(NumPhysRegs); 00327 for (unsigned i = 0, e = UseMOs.size(); i != e; ++i) { 00328 const MachineOperand MO = *UseMOs[i].first; 00329 unsigned Reg = MO.getReg(); 00330 assert(isUnused(Reg) || isReserved(Reg)); 00331 UseRegs.set(Reg); 00332 00333 // Set the sub-registers as "used". 00334 for (const unsigned *SubRegs = TRI->getSubRegisters(Reg); 00335 unsigned SubReg = *SubRegs; ++SubRegs) 00336 UseRegs.set(SubReg); 00337 } 00338 setUsed(UseRegs); 00339 } 00340 00341 void RegScavenger::getRegsUsed(BitVector &used, bool includeReserved) { 00342 if (includeReserved) 00343 used = ~RegsAvailable; 00344 else 00345 used = ~RegsAvailable & ~ReservedRegs; 00346 } 00347 00348 /// CreateRegClassMask - Set the bits that represent the registers in the 00349 /// TargetRegisterClass. 00350 static void CreateRegClassMask(const TargetRegisterClass *RC, BitVector &Mask) { 00351 for (TargetRegisterClass::iterator I = RC->begin(), E = RC->end(); I != E; 00352 ++I) 00353 Mask.set(*I); 00354 } 00355 00356 unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass, 00357 const BitVector &Candidates) const { 00358 // Mask off the registers which are not in the TargetRegisterClass. 00359 BitVector RegsAvailableCopy(NumPhysRegs, false); 00360 CreateRegClassMask(RegClass, RegsAvailableCopy); 00361 RegsAvailableCopy &= RegsAvailable; 00362 00363 // Restrict the search to candidates. 00364 RegsAvailableCopy &= Candidates; 00365 00366 // Returns the first unused (bit is set) register, or 0 is none is found. 00367 int Reg = RegsAvailableCopy.find_first(); 00368 return (Reg == -1) ? 0 : Reg; 00369 } 00370 00371 unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass, 00372 bool ExCalleeSaved) const { 00373 // Mask off the registers which are not in the TargetRegisterClass. 00374 BitVector RegsAvailableCopy(NumPhysRegs, false); 00375 CreateRegClassMask(RegClass, RegsAvailableCopy); 00376 RegsAvailableCopy &= RegsAvailable; 00377 00378 // If looking for a non-callee-saved register, mask off all the callee-saved 00379 // registers. 00380 if (ExCalleeSaved) 00381 RegsAvailableCopy &= ~CalleeSavedRegs; 00382 00383 // Returns the first unused (bit is set) register, or 0 is none is found. 00384 int Reg = RegsAvailableCopy.find_first(); 00385 return (Reg == -1) ? 0 : Reg; 00386 } 00387 00388 /// findFirstUse - Calculate the distance to the first use of the 00389 /// specified register. 00390 MachineInstr* 00391 RegScavenger::findFirstUse(MachineBasicBlock *MBB, 00392 MachineBasicBlock::iterator I, unsigned Reg, 00393 unsigned &Dist) { 00394 MachineInstr *UseMI = 0; 00395 Dist = ~0U; 00396 for (MachineRegisterInfo::reg_iterator RI = MRI->reg_begin(Reg), 00397 RE = MRI->reg_end(); RI != RE; ++RI) { 00398 MachineInstr *UDMI = &*RI; 00399 if (UDMI->getParent() != MBB) 00400 continue; 00401 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(UDMI); 00402 if (DI == DistanceMap.end()) { 00403 // If it's not in map, it's below current MI, let's initialize the 00404 // map. 00405 I = next(I); 00406 unsigned Dist = CurrDist + 1; 00407 while (I != MBB->end()) { 00408 DistanceMap.insert(std::make_pair(I, Dist++)); 00409 I = next(I); 00410 } 00411 } 00412 DI = DistanceMap.find(UDMI); 00413 if (DI->second > CurrDist && DI->second < Dist) { 00414 Dist = DI->second; 00415 UseMI = UDMI; 00416 } 00417 } 00418 return UseMI; 00419 } 00420 00421 unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC, 00422 MachineBasicBlock::iterator I, 00423 int SPAdj) { 00424 assert(ScavengingFrameIndex >= 0 && 00425 "Cannot scavenge a register without an emergency spill slot!"); 00426 00427 // Mask off the registers which are not in the TargetRegisterClass. 00428 BitVector Candidates(NumPhysRegs, false); 00429 CreateRegClassMask(RC, Candidates); 00430 Candidates ^= ReservedRegs; // Do not include reserved registers. 00431 00432 // Exclude all the registers being used by the instruction. 00433 for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) { 00434 MachineOperand &MO = I->getOperand(i); 00435 if (MO.isReg()) 00436 Candidates.reset(MO.getReg()); 00437 } 00438 00439 // Find the register whose use is furthest away. 00440 unsigned SReg = 0; 00441 unsigned MaxDist = 0; 00442 MachineInstr *MaxUseMI = 0; 00443 int Reg = Candidates.find_first(); 00444 while (Reg != -1) { 00445 unsigned Dist; 00446 MachineInstr *UseMI = findFirstUse(MBB, I, Reg, Dist); 00447 for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) { 00448 unsigned AsDist; 00449 MachineInstr *AsUseMI = findFirstUse(MBB, I, *AS, AsDist); 00450 if (AsDist < Dist) { 00451 Dist = AsDist; 00452 UseMI = AsUseMI; 00453 } 00454 } 00455 if (Dist >= MaxDist) { 00456 MaxDist = Dist; 00457 MaxUseMI = UseMI; 00458 SReg = Reg; 00459 } 00460 Reg = Candidates.find_next(Reg); 00461 } 00462 00463 if (ScavengedReg != 0) { 00464 assert(0 && "Scavenger slot is live, unable to scavenge another register!"); 00465 abort(); 00466 } 00467 00468 // Spill the scavenged register before I. 00469 TII->storeRegToStackSlot(*MBB, I, SReg, true, ScavengingFrameIndex, RC); 00470 MachineBasicBlock::iterator II = prior(I); 00471 TRI->eliminateFrameIndex(II, SPAdj, this); 00472 00473 // Restore the scavenged register before its use (or first terminator). 00474 II = MaxUseMI 00475 ? MachineBasicBlock::iterator(MaxUseMI) : MBB->getFirstTerminator(); 00476 TII->loadRegFromStackSlot(*MBB, II, SReg, ScavengingFrameIndex, RC); 00477 ScavengeRestore = prior(II); 00478 ScavengedReg = SReg; 00479 ScavengedRC = RC; 00480 00481 return SReg; 00482 }