class RegScavenger
Declaration
class RegScavenger { /* full declaration omitted */ };
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:34
Member Variables
- private const llvm::TargetRegisterInfo* TRI
- private const llvm::TargetInstrInfo* TII
- private llvm::MachineRegisterInfo* MRI
- private llvm::MachineBasicBlock* MBB = nullptr
- private MachineBasicBlock::iterator MBBI
- private unsigned int NumRegUnits = 0
- private bool Tracking = false
- True if RegScavenger is currently tracking the liveness of registers.
- private SmallVector<llvm::RegScavenger::ScavengedInfo, 2> Scavenged
- A vector of information on scavenged registers.
- private llvm::LiveRegUnits LiveUnits
- private llvm::BitVector KillRegUnits
- private llvm::BitVector DefRegUnits
- private llvm::BitVector TmpRegUnits
Method Overview
- public llvm::Register FindUnusedReg(const llvm::TargetRegisterClass * RC) const
- public RegScavenger()
- private void addRegUnits(llvm::BitVector & BV, llvm::MCRegister Reg)
- public void addScavengingFrameIndex(int FI)
- public void assignRegToScavengingIndex(int FI, llvm::Register Reg, llvm::MachineInstr * Restore = nullptr)
- public void backward()
- public void backward(MachineBasicBlock::iterator I)
- private void determineKillsAndDefs()
- public void enterBasicBlock(llvm::MachineBasicBlock & MBB)
- public void enterBasicBlockEnd(llvm::MachineBasicBlock & MBB)
- private llvm::Register findSurvivorReg(MachineBasicBlock::iterator StartMI, llvm::BitVector & Candidates, unsigned int InstrLimit, MachineBasicBlock::iterator & UseMI)
- public void forward(MachineBasicBlock::iterator I)
- public void forward()
- public MachineBasicBlock::iterator getCurrentPosition() const
- public llvm::BitVector getRegsAvailable(const llvm::TargetRegisterClass * RC)
- public void getScavengingFrameIndices(SmallVectorImpl<int> & A) const
- private void init(llvm::MachineBasicBlock & MBB)
- public bool isRegUsed(llvm::Register Reg, bool includeReserved = true) const
- private bool isReserved(llvm::Register Reg) const
- public bool isScavengingFrameIndex(int FI) const
- private void removeRegUnits(llvm::BitVector & BV, llvm::MCRegister Reg)
- public llvm::Register scavengeRegister(const llvm::TargetRegisterClass * RegClass, int SPAdj, bool AllowSpill = true)
- public llvm::Register scavengeRegister(const llvm::TargetRegisterClass * RC, MachineBasicBlock::iterator I, int SPAdj, bool AllowSpill = true)
- public llvm::Register scavengeRegisterBackwards(const llvm::TargetRegisterClass & RC, MachineBasicBlock::iterator To, bool RestoreAfter, int SPAdj, bool AllowSpill = true)
- public void setRegUsed(llvm::Register Reg, llvm::LaneBitmask LaneMask = LaneBitmask::getAll())
- private void setUnused(const llvm::BitVector & RegUnits)
- private void setUsed(const llvm::BitVector & RegUnits)
- public void skipTo(MachineBasicBlock::iterator I)
- private llvm::RegScavenger::ScavengedInfo & spill(llvm::Register Reg, const llvm::TargetRegisterClass & RC, int SPAdj, MachineBasicBlock::iterator Before, MachineBasicBlock::iterator & UseMI)
Methods
¶llvm::Register FindUnusedReg(
const llvm::TargetRegisterClass* RC) const
llvm::Register FindUnusedReg(
const llvm::TargetRegisterClass* RC) const
Description
Find an unused register of the specified register class. Return 0 if none is found.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:140
Parameters
- const llvm::TargetRegisterClass* RC
¶RegScavenger()
RegScavenger()
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:71
¶void addRegUnits(llvm::BitVector& BV,
llvm::MCRegister Reg)
void addRegUnits(llvm::BitVector& BV,
llvm::MCRegister Reg)
Description
Add all Reg Units that Reg contains to BV.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:215
Parameters
- llvm::BitVector& BV
- llvm::MCRegister Reg
¶void addScavengingFrameIndex(int FI)
void addScavengingFrameIndex(int FI)
Description
Add a scavenging frame index.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:143
Parameters
- int FI
¶void assignRegToScavengingIndex(
int FI,
llvm::Register Reg,
llvm::MachineInstr* Restore = nullptr)
void assignRegToScavengingIndex(
int FI,
llvm::Register Reg,
llvm::MachineInstr* Restore = nullptr)
Description
Record that \p Reg is in use at scavenging index \p FI. This is for targets which need to directly manage the spilling process, and need to update the scavenger's internal state. It's expected this be called a second time with \p Restore set to a non-null value, so that the externally inserted restore instruction resets the scavenged slot liveness when encountered.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:79
Parameters
- int FI
- llvm::Register Reg
- llvm::MachineInstr* Restore = nullptr
¶void backward()
void backward()
Description
Update internal register state and move MBB iterator backwards. Contrary to unprocess() this method gives precise results even in the absence of kill flags.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:115
¶void backward(MachineBasicBlock::iterator I)
void backward(MachineBasicBlock::iterator I)
Description
Call backward() as long as the internal iterator does not point to \p I.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:118
Parameters
¶void determineKillsAndDefs()
void determineKillsAndDefs()
Description
Processes the current instruction and fill the KillRegUnits and DefRegUnits bit vectors.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:212
¶void enterBasicBlock(llvm::MachineBasicBlock& MBB)
void enterBasicBlock(llvm::MachineBasicBlock& MBB)
Description
Start tracking liveness from the begin of basic block \p MBB.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:94
Parameters
¶void enterBasicBlockEnd(
llvm::MachineBasicBlock& MBB)
void enterBasicBlockEnd(
llvm::MachineBasicBlock& MBB)
Description
Start tracking liveness from the end of basic block \p MBB. Use backward() to move towards the beginning of the block. This is preferred to enterBasicBlock() and forward() because it does not depend on the presence of kill flags.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:100
Parameters
¶llvm::Register findSurvivorReg(
MachineBasicBlock::iterator StartMI,
llvm::BitVector& Candidates,
unsigned int InstrLimit,
MachineBasicBlock::iterator& UseMI)
llvm::Register findSurvivorReg(
MachineBasicBlock::iterator StartMI,
llvm::BitVector& Candidates,
unsigned int InstrLimit,
MachineBasicBlock::iterator& UseMI)
Description
Return the candidate register that is unused for the longest after StartMI. UseMI is set to the instruction where the search stopped. No more than InstrLimit instructions are inspected.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:224
Parameters
- MachineBasicBlock::iterator StartMI
- llvm::BitVector& Candidates
- unsigned int InstrLimit
- MachineBasicBlock::iterator& UseMI
¶void forward(MachineBasicBlock::iterator I)
void forward(MachineBasicBlock::iterator I)
Description
Move the internal MBB iterator and update register states until it has processed the specific iterator.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:107
Parameters
¶void forward()
void forward()
Description
Move the internal MBB iterator and update register states.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:103
¶MachineBasicBlock::iterator getCurrentPosition()
const
MachineBasicBlock::iterator getCurrentPosition()
const
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:130
¶llvm::BitVector getRegsAvailable(
const llvm::TargetRegisterClass* RC)
llvm::BitVector getRegsAvailable(
const llvm::TargetRegisterClass* RC)
Description
Return all available registers in the register class in Mask.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:136
Parameters
- const llvm::TargetRegisterClass* RC
¶void getScavengingFrameIndices(
SmallVectorImpl<int>& A) const
void getScavengingFrameIndices(
SmallVectorImpl<int>& A) const
Description
Get an array of scavenging frame indices.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:157
Parameters
- SmallVectorImpl<int>& A
¶void init(llvm::MachineBasicBlock& MBB)
void init(llvm::MachineBasicBlock& MBB)
Description
Initialize RegisterScavenger.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:230
Parameters
¶bool isRegUsed(llvm::Register Reg,
bool includeReserved = true) const
bool isRegUsed(llvm::Register Reg,
bool includeReserved = true) const
Description
Return if a specific register is currently used.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:133
Parameters
- llvm::Register Reg
- bool includeReserved = true
¶bool isReserved(llvm::Register Reg) const
bool isReserved(llvm::Register Reg) const
Description
Returns true if a register is reserved. It is never "unused".
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:199
Parameters
- llvm::Register Reg
¶bool isScavengingFrameIndex(int FI) const
bool isScavengingFrameIndex(int FI) const
Description
Query whether a frame index is a scavenging frame index.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:148
Parameters
- int FI
¶void removeRegUnits(llvm::BitVector& BV,
llvm::MCRegister Reg)
void removeRegUnits(llvm::BitVector& BV,
llvm::MCRegister Reg)
Description
Remove all Reg Units that \p Reg contains from \p BV.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:218
Parameters
- llvm::BitVector& BV
- llvm::MCRegister Reg
¶llvm::Register scavengeRegister(
const llvm::TargetRegisterClass* RegClass,
int SPAdj,
bool AllowSpill = true)
llvm::Register scavengeRegister(
const llvm::TargetRegisterClass* RegClass,
int SPAdj,
bool AllowSpill = true)
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:175
Parameters
- const llvm::TargetRegisterClass* RegClass
- int SPAdj
- bool AllowSpill = true
¶llvm::Register scavengeRegister(
const llvm::TargetRegisterClass* RC,
MachineBasicBlock::iterator I,
int SPAdj,
bool AllowSpill = true)
llvm::Register scavengeRegister(
const llvm::TargetRegisterClass* RC,
MachineBasicBlock::iterator I,
int SPAdj,
bool AllowSpill = true)
Description
Make a register of the specific register class available and do the appropriate bookkeeping. SPAdj is the stack adjustment due to call frame, it's passed along to eliminateFrameIndex(). Returns the scavenged register. This is deprecated as it depends on the quality of the kill flags being present; Use scavengeRegisterBackwards() instead! If \p AllowSpill is false, fail if a spill is required to make the register available, and return NoRegister.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:172
Parameters
- const llvm::TargetRegisterClass* RC
- MachineBasicBlock::iterator I
- int SPAdj
- bool AllowSpill = true
¶llvm::Register scavengeRegisterBackwards(
const llvm::TargetRegisterClass& RC,
MachineBasicBlock::iterator To,
bool RestoreAfter,
int SPAdj,
bool AllowSpill = true)
llvm::Register scavengeRegisterBackwards(
const llvm::TargetRegisterClass& RC,
MachineBasicBlock::iterator To,
bool RestoreAfter,
int SPAdj,
bool AllowSpill = true)
Description
Make a register of the specific register class available from the current position backwards to the place before \p To. If \p RestoreAfter is true this includes the instruction following the current position. SPAdj is the stack adjustment due to call frame, it's passed along to eliminateFrameIndex(). Returns the scavenged register. If \p AllowSpill is false, fail if a spill is required to make the register available, and return NoRegister.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:189
Parameters
- const llvm::TargetRegisterClass& RC
- MachineBasicBlock::iterator To
- bool RestoreAfter
- int SPAdj
- bool AllowSpill = true
¶void setRegUsed(llvm::Register Reg,
llvm::LaneBitmask LaneMask =
LaneBitmask::getAll())
void setRegUsed(llvm::Register Reg,
llvm::LaneBitmask LaneMask =
LaneBitmask::getAll())
Description
Tell the scavenger a register is used.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:195
Parameters
- llvm::Register Reg
- llvm::LaneBitmask LaneMask = LaneBitmask::getAll()
¶void setUnused(const llvm::BitVector& RegUnits)
void setUnused(const llvm::BitVector& RegUnits)
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:206
Parameters
- const llvm::BitVector& RegUnits
¶void setUsed(const llvm::BitVector& RegUnits)
void setUsed(const llvm::BitVector& RegUnits)
Description
setUsed / setUnused - Mark the state of one or a number of register units.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:203
Parameters
- const llvm::BitVector& RegUnits
¶void skipTo(MachineBasicBlock::iterator I)
void skipTo(MachineBasicBlock::iterator I)
Description
Move the internal MBB iterator but do not update register states.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:124
Parameters
¶llvm::RegScavenger::ScavengedInfo& spill(
llvm::Register Reg,
const llvm::TargetRegisterClass& RC,
int SPAdj,
MachineBasicBlock::iterator Before,
MachineBasicBlock::iterator& UseMI)
llvm::RegScavenger::ScavengedInfo& spill(
llvm::Register Reg,
const llvm::TargetRegisterClass& RC,
int SPAdj,
MachineBasicBlock::iterator Before,
MachineBasicBlock::iterator& UseMI)
Description
Spill a register after position \p After and reload it before position\p UseMI.
Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:234
Parameters
- llvm::Register Reg
- const llvm::TargetRegisterClass& RC
- int SPAdj
- MachineBasicBlock::iterator Before
- MachineBasicBlock::iterator& UseMI