17 #define DEBUG_TYPE "reg-scavenging"
36 RegsAvailable.
reset(*SubRegs);
39 bool RegScavenger::isAliasUsed(
unsigned Reg)
const {
41 if (isUsed(*AI, *AI == Reg))
77 assert((NumPhysRegs == 0 || NumPhysRegs == TRI->
getNumRegs()) &&
83 "Cannot use register scavenger with inaccurate liveness");
88 RegsAvailable.
resize(NumPhysRegs);
89 KillRegs.
resize(NumPhysRegs);
90 DefRegs.
resize(NumPhysRegs);
93 CalleeSavedRegs.
resize(NumPhysRegs);
96 for (
unsigned i = 0; CSRegs[i]; ++i)
97 CalleeSavedRegs.
set(CSRegs[i]);
106 void RegScavenger::addRegWithSubRegs(
BitVector &BV,
unsigned Reg) {
112 void RegScavenger::determineKillsAndDefs() {
113 assert(Tracking &&
"Must be tracking to determine kills and defs");
116 assert(!MI->
isDebugValue() &&
"Debug values have no kills or defs");
129 (isPred ? DefRegs : KillRegs).setBitsNotInMask(MO.
getRegMask());
132 unsigned Reg = MO.
getReg();
140 if (!isPred && MO.
isKill())
141 addRegWithSubRegs(KillRegs, Reg);
144 if (!isPred && MO.
isDead())
145 addRegWithSubRegs(KillRegs, Reg);
147 addRegWithSubRegs(DefRegs, Reg);
153 assert(Tracking &&
"Cannot unprocess because we're not tracking");
157 determineKillsAndDefs();
164 if (MBBI == MBB->
begin()) {
177 assert(MBBI != MBB->
end() &&
"Already past the end of the basic block!");
180 assert(MBBI != MBB->
end() &&
"Already at the end of the basic block!");
186 if (
I->Restore != MI)
193 if (MI->isDebugValue())
196 determineKillsAndDefs();
200 for (
unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
204 unsigned Reg = MO.
getReg();
219 bool SubUsed =
false;
221 if (isUsed(*SubRegs)) {
236 assert((KillRegs.test(Reg) || isUnused(Reg) ||
237 isLiveInButUnusedBefore(Reg, MI, MBB, TRI, MRI)) &&
238 "Re-defining a live register!");
250 used = RegsAvailable;
261 if (!isAliasUsed(*
I)) {
275 if (!isAliasUsed(*
I))
291 assert(Survivor > 0 &&
"No candidates for scavenging");
294 assert(StartMI != ME &&
"MI already at terminator");
298 bool inVirtLiveRange =
false;
299 for (++MI; InstrLimit > 0 && MI != ME; ++
MI, --InstrLimit) {
300 if (MI->isDebugValue()) {
304 bool isVirtKillInsn =
false;
305 bool isVirtDefInsn =
false;
307 for (
unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
315 isVirtDefInsn =
true;
317 isVirtKillInsn =
true;
321 Candidates.
reset(*AI);
325 if (!inVirtLiveRange) RestorePointMI =
MI;
328 if (isVirtKillInsn) inVirtLiveRange =
false;
329 if (isVirtDefInsn) inVirtLiveRange =
true;
332 if (Candidates.
test(Survivor))
336 if (Candidates.
none())
342 if (MI == ME) RestorePointMI = ME;
343 assert (RestorePointMI != StartMI &&
344 "No available scavenger restore location!");
347 UseMI = RestorePointMI;
355 assert(i < MI->getNumOperands() &&
356 "Instr doesn't have FrameIndex operand!");
369 for (
unsigned i = 0, e = I->getNumOperands(); i != e; ++i) {
381 Available &= Candidates;
383 Candidates = Available;
387 unsigned SReg = findSurvivorReg(I, Candidates, 25, UseMI);
390 if (!isAliasUsed(SReg)) {
397 for (SI = 0; SI < Scavenged.
size(); ++SI)
398 if (Scavenged[SI].Reg == 0)
401 if (SI == Scavenged.
size()) {
408 Scavenged[SI].Reg = SReg;
415 "Cannot scavenge register without an emergency spill slot!");
432 Scavenged[SI].Restore =
prior(UseMI);
437 DEBUG(
dbgs() <<
"Scavenged register (with spill): " << TRI->
getName(SReg) <<
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
void push_back(const T &Elt)
const MachineFunction * getParent() const
virtual bool saveScavengerRegister(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, MachineBasicBlock::iterator &UseMI, const TargetRegisterClass *RC, unsigned Reg) const
bool isValid() const
isValid - returns true if this iterator is not yet at the end.
bool none() const
none - Returns true if none of the bits are set.
void verify(Pass *p=NULL, const char *Banner=NULL) const
int find_next(unsigned Prev) const
std::vector< unsigned >::const_iterator livein_iterator
iterator getFirstTerminator()
static bool isVirtualRegister(unsigned Reg)
bool any() const
any - Returns true if any bit is set.
const MCPhysReg * iterator
const BitVector & getReservedRegs() const
virtual const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF=0) const =0
livein_iterator livein_begin() const
#define llvm_unreachable(msg)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
unsigned getNumOperands() const
void forward()
forward - Move the internal MBB iterator and update register states.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
BitVector getRegsAvailable(const TargetRegisterClass *RC)
void enterBasicBlock(MachineBasicBlock *mbb)
void setUsed(unsigned Reg)
setUsed - Set the register and its sub-registers as being used.
bool isDebugValue() const
bundle_iterator< MachineInstr, instr_iterator > iterator
void clearBitsNotInMask(const uint32_t *Mask, unsigned MaskWords=~0u)
livein_iterator livein_end() const
const MachineOperand & getOperand(unsigned i) const
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
BitVector getAllocatableSet(const MachineFunction &MF, const TargetRegisterClass *RC=NULL) const
bool tracksLiveness() const
ItTy next(ItTy it, Dist n)
static unsigned getFrameIndexOperandNum(MachineInstr *MI)
virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
void getRegsUsed(BitVector &used, bool includeReserved)
getRegsUsed - return all registers currently in use in used.
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
BitVector getPristineRegs(const MachineBasicBlock *MBB) const
virtual const TargetInstrInfo * getInstrInfo() const
const uint32_t * getRegMask() const
bool test(unsigned Idx) const
MachineFrameInfo * getFrameInfo()
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
unsigned FindUnusedReg(const TargetRegisterClass *RegClass) const
MachineRegisterInfo & getRegInfo()
const TargetMachine & getTarget() const
virtual const TargetRegisterInfo * getRegisterInfo() const
unsigned getReg() const
getReg - Returns the register number.
virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=NULL) const =0
ItTy prior(ItTy it, Dist n)
const char * getName(unsigned RegNo) const
Return the human-readable symbolic target-specific name for the specified physical register...
virtual bool isPredicated(const MachineInstr *MI) const
unsigned scavengeRegister(const TargetRegisterClass *RegClass, MachineBasicBlock::iterator I, int SPAdj)