14 #ifndef LLVM_CODEGEN_MACHINEREGISTERINFO_H
15 #define LLVM_CODEGEN_MACHINEREGISTERINFO_H
33 virtual void anchor();
42 Delegate *TheDelegate;
77 return VRegInfo[RegNo].second;
78 return PhysRegUseDefLists[RegNo];
81 MachineOperand *getRegUseDefListHead(
unsigned RegNo)
const {
83 return VRegInfo[RegNo].second;
84 return PhysRegUseDefLists[RegNo];
88 static MachineOperand *getNextOperandForReg(
const MachineOperand *MO) {
89 assert(MO && MO->isReg() &&
"This is not a register operand!");
90 return MO->Contents.
Reg.Next;
101 BitVector UsedRegUnits;
107 BitVector UsedPhysRegMask;
113 BitVector ReservedRegs;
119 std::vector<std::pair<unsigned, unsigned> > LiveIns;
122 void operator=(const MachineRegisterInfo&) LLVM_DELETED_FUNCTION;
124 explicit MachineRegisterInfo(const TargetMachine &TM);
125 ~MachineRegisterInfo();
128 return TM.getRegisterInfo();
135 assert(TheDelegate == delegate &&
136 "Only the current delegate can perform reset!");
141 assert(delegate && !TheDelegate &&
142 "Attempted to set delegate to null, or to change it without "
143 "first resetting it!");
145 TheDelegate = delegate;
159 bool isSSA()
const {
return IsSSA; }
203 template<
bool Uses,
bool Defs,
bool SkipDebug>
323 void dumpUses(
unsigned RegNo)
const;
343 return VRegInfo[
Reg].first;
359 unsigned MinNumRegs = 0);
386 RegAllocHints[
Reg].first =
Type;
387 RegAllocHints[
Reg].second = PrefReg;
392 std::pair<unsigned, unsigned>
394 return RegAllocHints[
Reg];
401 return Hint.first ? 0 : Hint.second;
417 if (UsedPhysRegMask.
test(Reg))
421 if (UsedRegUnits.
test(*Units))
429 UsedRegUnits.
set(RegUnit);
437 UsedRegUnits.
set(*Units);
449 UsedPhysRegMask.
reset(Reg);
452 UsedRegUnits.
reset(*Units);
475 return !ReservedRegs.
empty();
490 "Reserved registers haven't been frozen yet. "
491 "Use TRI::getReservedRegs().");
522 LiveIns.push_back(std::make_pair(Reg, vreg));
527 typedef std::vector<std::pair<unsigned,unsigned> >::const_iterator
555 template<
bool ReturnUses,
bool ReturnDefs,
bool SkipDebug>
557 :
public std::iterator<std::forward_iterator_tag, MachineInstr, ptrdiff_t> {
563 if ((!ReturnUses && op->
isUse()) ||
564 (!ReturnDefs && op->
isDef()) ||
571 typedef std::iterator<std::forward_iterator_tag,
573 typedef std::iterator<std::forward_iterator_tag,
587 bool atEnd()
const {
return Op == 0; }
591 assert(Op &&
"Cannot increment end iterator!");
592 Op = getNextOperandForReg(Op);
600 assert(!Op->
isDebug() &&
"Can't have debug defs");
604 while (Op && ((!ReturnDefs && Op->
isDef()) ||
606 Op = getNextOperandForReg(Op);
635 assert(Op &&
"Cannot dereference end iterator!");
642 assert(Op &&
"Cannot dereference end iterator!");
648 assert(Op &&
"Cannot dereference end iterator!");
653 assert(Op &&
"Cannot dereference end iterator!");
688 assert(
isValid() &&
"Invalid PSetIterator.");
bool isConstantPhysReg(unsigned PhysReg, const MachineFunction &MF) const
COFF::RelocationTypeX86 Type
void setPhysRegUsed(unsigned Reg)
void EmitLiveInCopies(MachineBasicBlock *EntryMBB, const TargetRegisterInfo &TRI, const TargetInstrInfo &TII)
MachineInstr * getParent()
bool operator==(const defusechain_iterator &x) const
void removeRegOperandFromUseList(MachineOperand *MO)
Remove MO from its use-def list.
struct llvm::MachineOperand::@32::@33 Reg
bool isValid() const
isValid - returns true if this iterator is not yet at the end.
livein_iterator livein_end() const
unsigned createVirtualRegister(const TargetRegisterClass *RegClass)
void addLiveIn(unsigned Reg, unsigned vreg=0)
static bool isVirtualRegister(unsigned Reg)
bool use_nodbg_empty(unsigned RegNo) const
void setBitsNotInMask(const uint32_t *Mask, unsigned MaskWords=~0u)
virtual const int * getRegClassPressureSets(const TargetRegisterClass *RC) const =0
static use_nodbg_iterator use_nodbg_end()
bool canReserveReg(unsigned PhysReg) const
void clearVirtRegs()
clearVirtRegs - Remove all virtual registers (after physreg assignment).
virtual unsigned getRegUnitWeight(unsigned RegUnit) const =0
Get the weight in units of pressure for this register unit.
const BitVector & getReservedRegs() const
std::iterator< std::forward_iterator_tag, MachineInstr, ptrdiff_t >::reference reference
unsigned getNumVirtRegs() const
defusechain_iterator< true, false, true > use_nodbg_iterator
static use_iterator use_end()
defusechain_iterator(const defusechain_iterator &I)
defusechain_iterator< true, false, false > use_iterator
use_iterator/use_begin/use_end - Walk all uses of the specified register.
const HexagonInstrInfo * TII
const TargetRegisterInfo * getTargetRegisterInfo() const
std::pair< unsigned, unsigned > getRegAllocationHint(unsigned Reg) const
const TargetRegisterClass * getRegClass(unsigned Reg) const
void freezeReservedRegs(const MachineFunction &)
bool atEnd() const
atEnd - return true if this iterator is equal to reg_end() on the value.
defusechain_iterator operator++(int)
void setRegAllocationHint(unsigned Reg, unsigned Type, unsigned PrefReg)
bool isLiveIn(unsigned Reg) const
unsigned getSimpleHint(unsigned Reg) const
PSetIterator(unsigned RegUnit, const MachineRegisterInfo *MRI)
MachineInstr * operator->() const
const TargetRegisterClass * constrainRegClass(unsigned Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
bool isInAllocatableClass(unsigned RegNo) const
defusechain_iterator< true, true, true > reg_nodbg_iterator
bool reservedRegsFrozen() const
MachineInstr & operator*() const
bool isReserved(unsigned PhysReg) const
const MachineOperand & getOperand(unsigned i) const
bool empty() const
empty - Tests whether there are no bits in this bitvector.
unsigned getLiveInVirtReg(unsigned PReg) const
bool tracksLiveness() const
MachineOperand & getOperand() const
bool operator!=(const defusechain_iterator &x) const
MachineInstr * skipBundle()
virtual const RegClassWeight & getRegClassWeight(const TargetRegisterClass *RC) const =0
Get the weight in units of pressure for this register class.
void setPhysRegUnused(unsigned Reg)
bool test(unsigned Idx) const
bool hasOneUse(unsigned RegNo) const
unsigned getWeight() const
bool isAllocatable(unsigned PhysReg) const
livein_iterator livein_begin() const
unsigned getOperandNo() const
void invalidateLiveness()
void resetDelegate(Delegate *delegate)
#define LLVM_DELETED_FUNCTION
unsigned operator*() const
MachineInstr * getUniqueVRegDef(unsigned Reg) const
void replaceRegWith(unsigned FromReg, unsigned ToReg)
MachineInstr * getBundleStart(MachineInstr *MI)
def_iterator def_begin(unsigned RegNo) const
void verifyUseList(unsigned Reg) const
Verify the sanity of the use list for Reg.
bool hasOneDef(unsigned RegNo) const
bool recomputeRegClass(unsigned Reg, const TargetMachine &)
friend class defusechain_iterator
use_iterator use_begin(unsigned RegNo) const
bool hasOneNonDBGUse(unsigned RegNo) const
PSetIterator getPressureSets(unsigned RegUnit) const
void setRegUnitUsed(unsigned RegUnit)
virtual const int * getRegUnitPressureSets(unsigned RegUnit) const =0
void addPhysRegsUsedFromRegMask(const uint32_t *RegMask)
void clearKillFlags(unsigned Reg) const
bool reg_empty(unsigned RegNo) const
MachineInstr * getVRegDef(unsigned Reg) const
static reg_nodbg_iterator reg_nodbg_end()
std::vector< std::pair< unsigned, unsigned > >::const_iterator livein_iterator
void dumpUses(unsigned RegNo) const
static def_iterator def_end()
defusechain_iterator & operator++()
defusechain_iterator< false, true, false > def_iterator
def_iterator/def_begin/def_end - Walk all defs of the specified register.
bool livein_empty() const
void moveOperands(MachineOperand *Dst, MachineOperand *Src, unsigned NumOps)
bool def_empty(unsigned RegNo) const
bool isPhysRegUsed(unsigned Reg) const
void setRegClass(unsigned Reg, const TargetRegisterClass *RC)
void setDelegate(Delegate *delegate)
reg_iterator reg_begin(unsigned RegNo) const
virtual void MRI_NoteNewVirtualRegister(unsigned Reg)=0
const MCRegisterInfo & MRI
void verifyUseLists() const
Verify the use list of all registers.
std::iterator< std::forward_iterator_tag, MachineInstr, ptrdiff_t >::pointer pointer
reg_nodbg_iterator reg_nodbg_begin(unsigned RegNo) const
static reg_iterator reg_end()
MachineInstr * skipInstruction()
defusechain_iterator< true, true, false > reg_iterator
bool reg_nodbg_empty(unsigned RegNo) const
use_nodbg_iterator use_nodbg_begin(unsigned RegNo) const
unsigned getLiveInPhysReg(unsigned VReg) const
bool use_empty(unsigned RegNo) const
void addRegOperandToUseList(MachineOperand *MO)
Add MO to the linked list of operands for its register.