17 #ifndef LLVM_CODEGEN_REGISTERSCAVENGING_H
18 #define LLVM_CODEGEN_REGISTERSCAVENGING_H
26 class MachineRegisterInfo;
27 class TargetRegisterInfo;
28 class TargetInstrInfo;
29 class TargetRegisterClass;
44 struct ScavengedInfo {
45 ScavengedInfo(
int FI = -1) :
FrameIndex(FI),
Reg(0), Restore(NULL) {}
76 : MBB(NULL), NumPhysRegs(0), Tracking(
false) {}
136 if (
I->FrameIndex == FI)
146 if (
I->FrameIndex >= 0)
165 bool isReserved(
unsigned Reg)
const {
return MRI->
isReserved(Reg); }
171 bool isUsed(
unsigned Reg,
bool CheckReserved =
true)
const {
172 return !RegsAvailable.
test(Reg) || (CheckReserved && isReserved(Reg));
176 bool isAliasUsed(
unsigned Reg)
const;
180 void setUsed(BitVector &Regs) {
181 RegsAvailable.
reset(Regs);
183 void setUnused(BitVector &Regs) {
184 RegsAvailable |= Regs;
189 void determineKillsAndDefs();
192 void addRegWithSubRegs(BitVector &BV,
unsigned Reg);
200 BitVector &Candidates,
void push_back(const T &Elt)
void skipTo(MachineBasicBlock::iterator I)
skipTo - Move the internal MBB iterator but do not update register states.
MachineBasicBlock::iterator getCurrentPosition() const
void forward()
forward - Move the internal MBB iterator and update register states.
BitVector getRegsAvailable(const TargetRegisterClass *RC)
void unprocess(MachineBasicBlock::iterator I)
Unprocess instructions until you reach the provided iterator.
void enterBasicBlock(MachineBasicBlock *mbb)
void setUsed(unsigned Reg)
setUsed - Set the register and its sub-registers as being used.
bundle_iterator< MachineInstr, instr_iterator > iterator
bool isReserved(unsigned PhysReg) const
void forward(MachineBasicBlock::iterator I)
void getRegsUsed(BitVector &used, bool includeReserved)
getRegsUsed - return all registers currently in use in used.
void getScavengingFrameIndices(SmallVectorImpl< int > &A) const
Get an array of scavenging frame indices.
bool isScavengingFrameIndex(int FI) const
Query whether a frame index is a scavenging frame index.
void addScavengingFrameIndex(int FI)
Add a scavenging frame index.
bool test(unsigned Idx) const
unsigned FindUnusedReg(const TargetRegisterClass *RegClass) const
unsigned scavengeRegister(const TargetRegisterClass *RegClass, int SPAdj)
unsigned scavengeRegister(const TargetRegisterClass *RegClass, MachineBasicBlock::iterator I, int SPAdj)