LLVM API Documentation

RegisterScavenging.cpp
Go to the documentation of this file.
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/MachineBasicBlock.h"
00020 #include "llvm/CodeGen/MachineFrameInfo.h"
00021 #include "llvm/CodeGen/MachineFunction.h"
00022 #include "llvm/CodeGen/MachineInstr.h"
00023 #include "llvm/CodeGen/MachineRegisterInfo.h"
00024 #include "llvm/Support/Debug.h"
00025 #include "llvm/Support/ErrorHandling.h"
00026 #include "llvm/Support/raw_ostream.h"
00027 #include "llvm/Target/TargetInstrInfo.h"
00028 #include "llvm/Target/TargetMachine.h"
00029 #include "llvm/Target/TargetRegisterInfo.h"
00030 using namespace llvm;
00031 
00032 /// setUsed - Set the register and its sub-registers as being used.
00033 void RegScavenger::setUsed(unsigned Reg) {
00034   RegsAvailable.reset(Reg);
00035 
00036   for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
00037     RegsAvailable.reset(*SubRegs);
00038 }
00039 
00040 bool RegScavenger::isAliasUsed(unsigned Reg) const {
00041   for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
00042     if (isUsed(*AI, *AI == Reg))
00043       return true;
00044   return false;
00045 }
00046 
00047 void RegScavenger::initRegState() {
00048   for (SmallVector<ScavengedInfo, 2>::iterator I = Scavenged.begin(),
00049        IE = Scavenged.end(); I != IE; ++I) {
00050     I->Reg = 0;
00051     I->Restore = NULL;
00052   }
00053 
00054   // All registers started out unused.
00055   RegsAvailable.set();
00056 
00057   if (!MBB)
00058     return;
00059 
00060   // Live-in registers are in use.
00061   for (MachineBasicBlock::livein_iterator I = MBB->livein_begin(),
00062          E = MBB->livein_end(); I != E; ++I)
00063     setUsed(*I);
00064 
00065   // Pristine CSRs are also unavailable.
00066   BitVector PR = MBB->getParent()->getFrameInfo()->getPristineRegs(MBB);
00067   for (int I = PR.find_first(); I>0; I = PR.find_next(I))
00068     setUsed(I);
00069 }
00070 
00071 void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) {
00072   MachineFunction &MF = *mbb->getParent();
00073   const TargetMachine &TM = MF.getTarget();
00074   TII = TM.getInstrInfo();
00075   TRI = TM.getRegisterInfo();
00076   MRI = &MF.getRegInfo();
00077 
00078   assert((NumPhysRegs == 0 || NumPhysRegs == TRI->getNumRegs()) &&
00079          "Target changed?");
00080 
00081   // It is not possible to use the register scavenger after late optimization
00082   // passes that don't preserve accurate liveness information.
00083   assert(MRI->tracksLiveness() &&
00084          "Cannot use register scavenger with inaccurate liveness");
00085 
00086   // Self-initialize.
00087   if (!MBB) {
00088     NumPhysRegs = TRI->getNumRegs();
00089     RegsAvailable.resize(NumPhysRegs);
00090     KillRegs.resize(NumPhysRegs);
00091     DefRegs.resize(NumPhysRegs);
00092 
00093     // Create callee-saved registers bitvector.
00094     CalleeSavedRegs.resize(NumPhysRegs);
00095     const uint16_t *CSRegs = TRI->getCalleeSavedRegs(&MF);
00096     if (CSRegs != NULL)
00097       for (unsigned i = 0; CSRegs[i]; ++i)
00098         CalleeSavedRegs.set(CSRegs[i]);
00099   }
00100 
00101   MBB = mbb;
00102   initRegState();
00103 
00104   Tracking = false;
00105 }
00106 
00107 void RegScavenger::addRegWithSubRegs(BitVector &BV, unsigned Reg) {
00108   BV.set(Reg);
00109   for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
00110     BV.set(*SubRegs);
00111 }
00112 
00113 void RegScavenger::determineKillsAndDefs() {
00114   assert(Tracking && "Must be tracking to determine kills and defs");
00115 
00116   MachineInstr *MI = MBBI;
00117   assert(!MI->isDebugValue() && "Debug values have no kills or defs");
00118 
00119   // Find out which registers are early clobbered, killed, defined, and marked
00120   // def-dead in this instruction.
00121   // FIXME: The scavenger is not predication aware. If the instruction is
00122   // predicated, conservatively assume "kill" markers do not actually kill the
00123   // register. Similarly ignores "dead" markers.
00124   bool isPred = TII->isPredicated(MI);
00125   KillRegs.reset();
00126   DefRegs.reset();
00127   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
00128     const MachineOperand &MO = MI->getOperand(i);
00129     if (MO.isRegMask())
00130       (isPred ? DefRegs : KillRegs).setBitsNotInMask(MO.getRegMask());
00131     if (!MO.isReg())
00132       continue;
00133     unsigned Reg = MO.getReg();
00134     if (!Reg || TargetRegisterInfo::isVirtualRegister(Reg) || isReserved(Reg))
00135       continue;
00136 
00137     if (MO.isUse()) {
00138       // Ignore undef uses.
00139       if (MO.isUndef())
00140         continue;
00141       if (!isPred && MO.isKill())
00142         addRegWithSubRegs(KillRegs, Reg);
00143     } else {
00144       assert(MO.isDef());
00145       if (!isPred && MO.isDead())
00146         addRegWithSubRegs(KillRegs, Reg);
00147       else
00148         addRegWithSubRegs(DefRegs, Reg);
00149     }
00150   }
00151 }
00152 
00153 void RegScavenger::unprocess() {
00154   assert(Tracking && "Cannot unprocess because we're not tracking");
00155 
00156   MachineInstr *MI = MBBI;
00157   if (!MI->isDebugValue()) {
00158     determineKillsAndDefs();
00159 
00160     // Commit the changes.
00161     setUsed(KillRegs);
00162     setUnused(DefRegs);
00163   }
00164 
00165   if (MBBI == MBB->begin()) {
00166     MBBI = MachineBasicBlock::iterator(NULL);
00167     Tracking = false;
00168   } else
00169     --MBBI;
00170 }
00171 
00172 void RegScavenger::forward() {
00173   // Move ptr forward.
00174   if (!Tracking) {
00175     MBBI = MBB->begin();
00176     Tracking = true;
00177   } else {
00178     assert(MBBI != MBB->end() && "Already past the end of the basic block!");
00179     MBBI = llvm::next(MBBI);
00180   }
00181   assert(MBBI != MBB->end() && "Already at the end of the basic block!");
00182 
00183   MachineInstr *MI = MBBI;
00184 
00185   for (SmallVector<ScavengedInfo, 2>::iterator I = Scavenged.begin(),
00186        IE = Scavenged.end(); I != IE; ++I) {
00187     if (I->Restore != MI)
00188       continue;
00189 
00190     I->Reg = 0;
00191     I->Restore = NULL;
00192   }
00193 
00194   if (MI->isDebugValue())
00195     return;
00196 
00197   determineKillsAndDefs();
00198 
00199   // Verify uses and defs.
00200 #ifndef NDEBUG
00201   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
00202     const MachineOperand &MO = MI->getOperand(i);
00203     if (!MO.isReg())
00204       continue;
00205     unsigned Reg = MO.getReg();
00206     if (!Reg || TargetRegisterInfo::isVirtualRegister(Reg) || isReserved(Reg))
00207       continue;
00208     if (MO.isUse()) {
00209       if (MO.isUndef())
00210         continue;
00211       if (!isUsed(Reg)) {
00212         // Check if it's partial live: e.g.
00213         // D0 = insert_subreg D0<undef>, S0
00214         // ... D0
00215         // The problem is the insert_subreg could be eliminated. The use of
00216         // D0 is using a partially undef value. This is not *incorrect* since
00217         // S1 is can be freely clobbered.
00218         // Ideally we would like a way to model this, but leaving the
00219         // insert_subreg around causes both correctness and performance issues.
00220         bool SubUsed = false;
00221         for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
00222           if (isUsed(*SubRegs)) {
00223             SubUsed = true;
00224             break;
00225           }
00226         if (!SubUsed) {
00227           MBB->getParent()->verify(NULL, "In Register Scavenger");
00228           llvm_unreachable("Using an undefined register!");
00229         }
00230         (void)SubUsed;
00231       }
00232     } else {
00233       assert(MO.isDef());
00234 #if 0
00235       // FIXME: Enable this once we've figured out how to correctly transfer
00236       // implicit kills during codegen passes like the coalescer.
00237       assert((KillRegs.test(Reg) || isUnused(Reg) ||
00238               isLiveInButUnusedBefore(Reg, MI, MBB, TRI, MRI)) &&
00239              "Re-defining a live register!");
00240 #endif
00241     }
00242   }
00243 #endif // NDEBUG
00244 
00245   // Commit the changes.
00246   setUnused(KillRegs);
00247   setUsed(DefRegs);
00248 }
00249 
00250 void RegScavenger::getRegsUsed(BitVector &used, bool includeReserved) {
00251   used = RegsAvailable;
00252   used.flip();
00253   if (includeReserved)
00254     used |= MRI->getReservedRegs();
00255   else
00256     used.reset(MRI->getReservedRegs());
00257 }
00258 
00259 unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RC) const {
00260   for (TargetRegisterClass::iterator I = RC->begin(), E = RC->end();
00261        I != E; ++I)
00262     if (!isAliasUsed(*I)) {
00263       DEBUG(dbgs() << "Scavenger found unused reg: " << TRI->getName(*I) <<
00264             "\n");
00265       return *I;
00266     }
00267   return 0;
00268 }
00269 
00270 /// getRegsAvailable - Return all available registers in the register class
00271 /// in Mask.
00272 BitVector RegScavenger::getRegsAvailable(const TargetRegisterClass *RC) {
00273   BitVector Mask(TRI->getNumRegs());
00274   for (TargetRegisterClass::iterator I = RC->begin(), E = RC->end();
00275        I != E; ++I)
00276     if (!isAliasUsed(*I))
00277       Mask.set(*I);
00278   return Mask;
00279 }
00280 
00281 /// findSurvivorReg - Return the candidate register that is unused for the
00282 /// longest after StargMII. UseMI is set to the instruction where the search
00283 /// stopped.
00284 ///
00285 /// No more than InstrLimit instructions are inspected.
00286 ///
00287 unsigned RegScavenger::findSurvivorReg(MachineBasicBlock::iterator StartMI,
00288                                        BitVector &Candidates,
00289                                        unsigned InstrLimit,
00290                                        MachineBasicBlock::iterator &UseMI) {
00291   int Survivor = Candidates.find_first();
00292   assert(Survivor > 0 && "No candidates for scavenging");
00293 
00294   MachineBasicBlock::iterator ME = MBB->getFirstTerminator();
00295   assert(StartMI != ME && "MI already at terminator");
00296   MachineBasicBlock::iterator RestorePointMI = StartMI;
00297   MachineBasicBlock::iterator MI = StartMI;
00298 
00299   bool inVirtLiveRange = false;
00300   for (++MI; InstrLimit > 0 && MI != ME; ++MI, --InstrLimit) {
00301     if (MI->isDebugValue()) {
00302       ++InstrLimit; // Don't count debug instructions
00303       continue;
00304     }
00305     bool isVirtKillInsn = false;
00306     bool isVirtDefInsn = false;
00307     // Remove any candidates touched by instruction.
00308     for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
00309       const MachineOperand &MO = MI->getOperand(i);
00310       if (MO.isRegMask())
00311         Candidates.clearBitsNotInMask(MO.getRegMask());
00312       if (!MO.isReg() || MO.isUndef() || !MO.getReg())
00313         continue;
00314       if (TargetRegisterInfo::isVirtualRegister(MO.getReg())) {
00315         if (MO.isDef())
00316           isVirtDefInsn = true;
00317         else if (MO.isKill())
00318           isVirtKillInsn = true;
00319         continue;
00320       }
00321       for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid(); ++AI)
00322         Candidates.reset(*AI);
00323     }
00324     // If we're not in a virtual reg's live range, this is a valid
00325     // restore point.
00326     if (!inVirtLiveRange) RestorePointMI = MI;
00327 
00328     // Update whether we're in the live range of a virtual register
00329     if (isVirtKillInsn) inVirtLiveRange = false;
00330     if (isVirtDefInsn) inVirtLiveRange = true;
00331 
00332     // Was our survivor untouched by this instruction?
00333     if (Candidates.test(Survivor))
00334       continue;
00335 
00336     // All candidates gone?
00337     if (Candidates.none())
00338       break;
00339 
00340     Survivor = Candidates.find_first();
00341   }
00342   // If we ran off the end, that's where we want to restore.
00343   if (MI == ME) RestorePointMI = ME;
00344   assert (RestorePointMI != StartMI &&
00345           "No available scavenger restore location!");
00346 
00347   // We ran out of candidates, so stop the search.
00348   UseMI = RestorePointMI;
00349   return Survivor;
00350 }
00351 
00352 static unsigned getFrameIndexOperandNum(MachineInstr *MI) {
00353   unsigned i = 0;
00354   while (!MI->getOperand(i).isFI()) {
00355     ++i;
00356     assert(i < MI->getNumOperands() &&
00357            "Instr doesn't have FrameIndex operand!");
00358   }
00359   return i;
00360 }
00361 
00362 unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
00363                                         MachineBasicBlock::iterator I,
00364                                         int SPAdj) {
00365   // Consider all allocatable registers in the register class initially
00366   BitVector Candidates =
00367     TRI->getAllocatableSet(*I->getParent()->getParent(), RC);
00368 
00369   // Exclude all the registers being used by the instruction.
00370   for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) {
00371     MachineOperand &MO = I->getOperand(i);
00372     if (MO.isReg() && MO.getReg() != 0 &&
00373         !TargetRegisterInfo::isVirtualRegister(MO.getReg()))
00374       Candidates.reset(MO.getReg());
00375   }
00376 
00377   // Try to find a register that's unused if there is one, as then we won't
00378   // have to spill. Search explicitly rather than masking out based on
00379   // RegsAvailable, as RegsAvailable does not take aliases into account.
00380   // That's what getRegsAvailable() is for.
00381   BitVector Available = getRegsAvailable(RC);
00382   Available &= Candidates;
00383   if (Available.any())
00384     Candidates = Available;
00385 
00386   // Find the register whose use is furthest away.
00387   MachineBasicBlock::iterator UseMI;
00388   unsigned SReg = findSurvivorReg(I, Candidates, 25, UseMI);
00389 
00390   // If we found an unused register there is no reason to spill it.
00391   if (!isAliasUsed(SReg)) {
00392     DEBUG(dbgs() << "Scavenged register: " << TRI->getName(SReg) << "\n");
00393     return SReg;
00394   }
00395 
00396   // Find an available scavenging slot.
00397   unsigned SI;
00398   for (SI = 0; SI < Scavenged.size(); ++SI)
00399     if (Scavenged[SI].Reg == 0)
00400       break;
00401 
00402   if (SI == Scavenged.size()) {
00403     // We need to scavenge a register but have no spill slot, the target
00404     // must know how to do it (if not, we'll assert below).
00405     Scavenged.push_back(ScavengedInfo());
00406   }
00407 
00408   // Avoid infinite regress
00409   Scavenged[SI].Reg = SReg;
00410 
00411   // If the target knows how to save/restore the register, let it do so;
00412   // otherwise, use the emergency stack spill slot.
00413   if (!TRI->saveScavengerRegister(*MBB, I, UseMI, RC, SReg)) {
00414     // Spill the scavenged register before I.
00415     assert(Scavenged[SI].FrameIndex >= 0 &&
00416            "Cannot scavenge register without an emergency spill slot!");
00417     TII->storeRegToStackSlot(*MBB, I, SReg, true, Scavenged[SI].FrameIndex,
00418                              RC, TRI);
00419     MachineBasicBlock::iterator II = prior(I);
00420 
00421     unsigned FIOperandNum = getFrameIndexOperandNum(II);
00422     TRI->eliminateFrameIndex(II, SPAdj, FIOperandNum, this);
00423 
00424     // Restore the scavenged register before its use (or first terminator).
00425     TII->loadRegFromStackSlot(*MBB, UseMI, SReg, Scavenged[SI].FrameIndex,
00426                               RC, TRI);
00427     II = prior(UseMI);
00428 
00429     FIOperandNum = getFrameIndexOperandNum(II);
00430     TRI->eliminateFrameIndex(II, SPAdj, FIOperandNum, this);
00431   }
00432 
00433   Scavenged[SI].Restore = prior(UseMI);
00434 
00435   // Doing this here leads to infinite regress.
00436   // Scavenged[SI].Reg = SReg;
00437 
00438   DEBUG(dbgs() << "Scavenged register (with spill): " << TRI->getName(SReg) <<
00439         "\n");
00440 
00441   return SReg;
00442 }