23 void MachineRegisterInfo::Delegate::anchor() {}
26 : TM(TM), TheDelegate(0), IsSSA(
true), TracksLiveness(
true) {
27 VRegInfo.reserve(256);
28 RegAllocHints.reserve(256);
35 memset(PhysRegUseDefLists, 0,
40 delete [] PhysRegUseDefLists;
47 assert(RC && RC->
isAllocatable() &&
"Invalid RC for virtual register");
48 VRegInfo[
Reg].first = RC;
54 unsigned MinNumRegs) {
60 if (!NewRC || NewRC == OldRC)
83 I->getRegClassConstraint(
I.getOperandNo(),
TII,
85 if (
unsigned SubIdx =
I.getOperand().getSubReg()) {
93 if (!NewRC || NewRC == OldRC)
105 assert(RegClass &&
"Cannot create register without RegClass!");
107 "Virtual register RegClass must be allocatable.");
112 VRegInfo[
Reg].first = RegClass;
113 RegAllocHints.grow(Reg);
124 if (!VRegInfo[Reg].second)
141 <<
" use list MachineOperand " << MO
142 <<
" has no parent instruction.\n";
147 if (!(MO >= MO0 && MO < MO0+NumOps)) {
149 <<
" use list MachineOperand " << MO
150 <<
" doesn't belong to parent MI: " << *
MI;
155 <<
" MachineOperand " << MO <<
": " << *MO
156 <<
" is not a register\n";
161 <<
" use-list MachineOperand " << MO <<
": "
162 << *MO <<
" is the wrong register\n";
166 assert(Valid &&
"Invalid use list");
181 assert(!MO->isOnRegUseList() &&
"Already on list");
191 MO->Contents.
Reg.Prev = MO;
192 MO->Contents.
Reg.Next = 0;
196 assert(MO->
getReg() == Head->getReg() &&
"Different regs on the same list!");
200 assert(Last &&
"Inconsistent use list");
201 assert(MO->
getReg() == Last->getReg() &&
"Different regs on the same list!");
202 Head->Contents.Reg.Prev = MO;
203 MO->Contents.
Reg.Prev = Last;
209 MO->Contents.
Reg.Next = Head;
213 MO->Contents.
Reg.Next = 0;
214 Last->Contents.Reg.Next = MO;
220 assert(MO->isOnRegUseList() &&
"Operand not on use list");
223 assert(Head &&
"List already empty");
233 Prev->Contents.
Reg.Next = Next;
235 (Next ? Next : Head)->Contents.
Reg.Prev = Prev;
237 MO->Contents.
Reg.Prev = 0;
238 MO->Contents.
Reg.Next = 0;
251 assert(Src != Dst && NumOps &&
"Noop moveOperands");
255 if (Dst >= Src && Dst < Src + NumOps) {
270 assert(Head &&
"List empty, but operand is chained");
271 assert(Prev &&
"Operand was not on use-def list");
278 Prev->Contents.
Reg.Next = Dst;
282 (Next ? Next : Head)->Contents.
Reg.Prev = Dst;
294 assert(FromReg != ToReg &&
"Cannot replace a reg with itself");
312 "getVRegDef assumes a single definition or no definition");
313 return !I.
atEnd() ? &*I : 0;
340 UI.getOperand().setIsKill(
false);
345 if (
I->first == Reg ||
I->second == Reg)
354 if (
I->second == VReg)
363 if (
I->first == PReg)
375 for (
unsigned i = 0, e = LiveIns.size(); i != e; ++i)
376 if (LiveIns[i].second) {
383 LiveIns.erase(LiveIns.begin() + i);
389 .addReg(LiveIns[i].first);
403 I.getOperand().getParent()->dump();
410 "Invalid ReservedRegs vector from target");
bool isConstantPhysReg(unsigned PhysReg, const MachineFunction &MF) const
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
void EmitLiveInCopies(MachineBasicBlock *EntryMBB, const TargetRegisterInfo &TRI, const TargetInstrInfo &TII)
MachineInstr * getParent()
void removeRegOperandFromUseList(MachineOperand *MO)
Remove MO from its use-def list.
struct llvm::MachineOperand::@32::@33 Reg
livein_iterator livein_end() const
static unsigned index2VirtReg(unsigned Index)
unsigned createVirtualRegister(const TargetRegisterClass *RegClass)
void addLiveIn(unsigned Reg)
const TargetRegisterClass * getCommonSubClass(const TargetRegisterClass *A, const TargetRegisterClass *B) const
static use_nodbg_iterator use_nodbg_end()
void clearVirtRegs()
clearVirtRegs - Remove all virtual registers (after physreg assignment).
unsigned getNumVirtRegs() const
static use_iterator use_end()
const HexagonInstrInfo * TII
const TargetRegisterInfo * getTargetRegisterInfo() const
#define llvm_unreachable(msg)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
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.
unsigned getNumOperands() const
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
bool isLiveIn(unsigned Reg) const
virtual const TargetRegisterClass * getMatchingSuperRegClass(const TargetRegisterClass *A, const TargetRegisterClass *B, unsigned Idx) const
const TargetRegisterClass * constrainRegClass(unsigned Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
const MachineOperand & getOperand(unsigned i) const
unsigned getLiveInVirtReg(unsigned PReg) const
ItTy next(ItTy it, Dist n)
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
const MCInstrDesc & get(unsigned Opcode) const
virtual const TargetInstrInfo * getInstrInfo() const
bool isAllocatable(unsigned PhysReg) const
livein_iterator livein_begin() const
virtual BitVector getReservedRegs(const MachineFunction &MF) const =0
unsigned getNumRegs() const
MachineInstr * getUniqueVRegDef(unsigned Reg) const
void replaceRegWith(unsigned FromReg, unsigned ToReg)
def_iterator def_begin(unsigned RegNo) const
void verifyUseList(unsigned Reg) const
Verify the sanity of the use list for Reg.
static bool isPhysicalRegister(unsigned Reg)
bool recomputeRegClass(unsigned Reg, const TargetMachine &)
use_iterator use_begin(unsigned RegNo) const
bool hasOneNonDBGUse(unsigned RegNo) const
void setReg(unsigned Reg)
bool isAllocatable() const
void clearKillFlags(unsigned Reg) const
MachineInstr * getVRegDef(unsigned Reg) const
static reg_nodbg_iterator reg_nodbg_end()
std::vector< std::pair< unsigned, unsigned > >::const_iterator livein_iterator
unsigned getReg() const
getReg - Returns the register number.
void dumpUses(unsigned RegNo) const
static def_iterator def_end()
virtual const TargetRegisterClass * getSubClassWithSubReg(const TargetRegisterClass *RC, unsigned Idx) const
virtual const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC) const
void moveOperands(MachineOperand *Dst, MachineOperand *Src, unsigned NumOps)
bool def_empty(unsigned RegNo) const
void setRegClass(unsigned Reg, const TargetRegisterClass *RC)
reg_iterator reg_begin(unsigned RegNo) const
virtual void MRI_NoteNewVirtualRegister(unsigned Reg)=0
void verifyUseLists() const
Verify the use list of all registers.
reg_nodbg_iterator reg_nodbg_begin(unsigned RegNo) const
static reg_iterator reg_end()
use_nodbg_iterator use_nodbg_begin(unsigned RegNo) const
unsigned getLiveInPhysReg(unsigned VReg) const
bool use_empty(unsigned RegNo) const
unsigned size() const
size - Returns the number of bits in this bitvector.
void addRegOperandToUseList(MachineOperand *MO)
Add MO to the linked list of operands for its register.