23#include "llvm/Config/llvm-config.h"
41void MachineRegisterInfo::Delegate::anchor() {}
47 : MF->getSubtarget().enableSubRegLiveness()) {
50 UsedPhysRegMask.
resize(NumRegs);
75 MRI.getTargetRegisterInfo()->getCommonSubClass(OldRC, RC);
76 if (!NewRC || NewRC == OldRC)
80 MRI.setRegClass(Reg, NewRC);
88 return ::constrainRegClass(*
this, Reg,
getRegClass(Reg), RC, MinNumRegs);
94 unsigned MinNumRegs) {
96 const LLT ConstrainingRegTy =
getType(ConstrainingReg);
98 RegTy != ConstrainingRegTy)
101 if (!ConstrainingRegCB.isNull()) {
105 else if (isa<const TargetRegisterClass *>(RegCB) !=
106 isa<const TargetRegisterClass *>(ConstrainingRegCB))
108 else if (isa<const TargetRegisterClass *>(RegCB)) {
110 *
this, Reg, cast<const TargetRegisterClass *>(RegCB),
111 cast<const TargetRegisterClass *>(ConstrainingRegCB), MinNumRegs))
113 }
else if (RegCB != ConstrainingRegCB)
116 if (ConstrainingRegTy.
isValid())
117 setType(Reg, ConstrainingRegTy);
136 unsigned OpNo = &MO - &
MI->getOperand(0);
137 NewRC =
MI->getRegClassConstraintEffect(OpNo, NewRC,
TII,
139 if (!NewRC || NewRC == OldRC)
159 assert(RegClass &&
"Cannot create register without RegClass!");
161 "Virtual register RegClass must be allocatable.");
189 VRegToType.
grow(VReg);
190 VRegToType[VReg] = Ty;
214 errs() <<
"Remaining virtual register "
217 errs() <<
"...in instruction: " <<
MI <<
"\n";
222 for (
auto &
I : LiveIns)
234 <<
" use list MachineOperand " << MO
235 <<
" has no parent instruction.\n";
240 unsigned NumOps =
MI->getNumOperands();
241 if (!(MO >= MO0 && MO < MO0+NumOps)) {
243 <<
" use list MachineOperand " << MO
244 <<
" doesn't belong to parent MI: " << *
MI;
249 <<
" MachineOperand " << MO <<
": " << *MO
250 <<
" is not a register\n";
253 if (MO->
getReg() != Reg) {
255 <<
" use-list MachineOperand " << MO <<
": "
256 << *MO <<
" is the wrong register\n";
260 assert(Valid &&
"Invalid use list");
275 assert(!MO->isOnRegUseList() &&
"Already on list");
285 MO->Contents.Reg.Prev = MO;
286 MO->Contents.Reg.Next =
nullptr;
295 assert(MO->
getReg() ==
Last->getReg() &&
"Different regs on the same list!");
296 Head->Contents.Reg.Prev = MO;
297 MO->Contents.Reg.Prev =
Last;
303 MO->Contents.Reg.Next = Head;
307 MO->Contents.Reg.Next =
nullptr;
308 Last->Contents.Reg.Next = MO;
314 assert(MO->isOnRegUseList() &&
"Operand not on use list");
317 assert(Head &&
"List already empty");
327 Prev->Contents.Reg.Next = Next;
329 (Next ? Next : Head)->Contents.Reg.Prev = Prev;
331 MO->Contents.Reg.Prev =
nullptr;
332 MO->Contents.Reg.Next =
nullptr;
345 assert(Src != Dst && NumOps &&
"Noop moveOperands");
349 if (Dst >= Src && Dst < Src + NumOps) {
364 assert(Head &&
"List empty, but operand is chained");
365 assert(Prev &&
"Operand was not on use-def list");
372 Prev->Contents.Reg.Next = Dst;
376 (Next ? Next : Head)->Contents.Reg.Prev = Dst;
390 assert(FromReg != ToReg &&
"Cannot replace a reg with itself");
397 O.substPhysReg(ToReg, *
TRI);
411 "getVRegDef assumes a single definition or no definition");
412 return !
I.atEnd() ? &*
I :
nullptr;
435 unsigned MaxUsers)
const {
450 for (
const std::pair<MCRegister, Register> &LI :
liveins())
451 if ((
Register)LI.first == Reg || LI.second == Reg)
459 for (
const std::pair<MCRegister, Register> &LI :
liveins())
460 if (LI.second == VReg)
468 for (
const std::pair<MCRegister, Register> &LI :
liveins())
469 if (LI.first == PReg)
481 for (
unsigned i = 0, e = LiveIns.size(); i != e; ++i)
482 if (LiveIns[i].second) {
489 LiveIns.erase(LiveIns.begin() + i);
494 TII.get(TargetOpcode::COPY), LiveIns[i].second)
495 .
addReg(LiveIns[i].first);
513#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
523 "Invalid ReservedRegs vector from target");
530 if (
TRI->isConstantPhysReg(PhysReg))
549 if (
UseMI.isDebugValue() &&
UseMI.hasDebugOperandForReg(Reg))
550 UseMI.setDebugValueUndef();
558 const Function *Func = dyn_cast<Function>(MO.getGlobal());
579 return !(Called ==
nullptr || !Called->
hasFnAttribute(Attribute::NoReturn) ||
584 bool SkipNoReturnDef)
const {
585 if (UsedPhysRegMask.
test(PhysReg))
599 bool SkipRegMaskTest)
const {
600 if (!SkipRegMaskTest && UsedPhysRegMask.
test(PhysReg))
614 assert(Reg && (Reg < TRI->getNumRegs()) &&
615 "Trying to disable an invalid register");
617 if (!IsUpdatedCSRsInitialized) {
620 UpdatedCSRs.push_back(*
I);
624 UpdatedCSRs.push_back(0);
626 IsUpdatedCSRsInitialized =
true;
635 if (IsUpdatedCSRsInitialized)
636 return UpdatedCSRs.data();
642 if (IsUpdatedCSRsInitialized)
649 UpdatedCSRs.push_back(0);
650 IsUpdatedCSRsInitialized =
true;
656 if (
all_of(
TRI->superregs_inclusive(*Root),
657 [&](
MCPhysReg Super) { return isReserved(Super); }))
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
This file contains the simple types necessary to represent the attributes associated with functions a...
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
const HexagonInstrInfo * TII
static cl::opt< bool > EnableSubRegLiveness("enable-subreg-liveness", cl::Hidden, cl::init(true), cl::desc("Enable subregister liveness tracking."))
static bool isNoReturnDef(const MachineOperand &MO)
static const TargetRegisterClass * constrainRegClass(MachineRegisterInfo &MRI, Register Reg, const TargetRegisterClass *OldRC, const TargetRegisterClass *RC, unsigned MinNumRegs)
unsigned const TargetRegisterInfo * TRI
static const Function * getCalledFunction(const Value *V)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool test(unsigned Idx) const
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
size_type size() const
size - Returns the number of bits in this bitvector.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
constexpr bool isValid() const
MCRegAliasIterator enumerates all registers aliasing Reg.
MCRegUnitRootIterator enumerates the root registers of a register unit.
bool isValid() const
Check if the iterator is at the end of the list.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
Wrapper class representing physical registers. Should be passed by value.
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
Register getReg() const
getReg - Returns the register number.
defusechain_iterator - This class provides iterator support for machine operands in the function that...
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
void verifyUseList(Register Reg) const
Verify the sanity of the use list for Reg.
bool hasOneNonDBGUse(Register RegNo) const
hasOneNonDBGUse - Return true if there is exactly one non-Debug use of the specified register.
void insertVRegByName(StringRef Name, Register Reg)
void verifyUseLists() const
Verify the use list of all registers.
void markUsesInDebugValueAsUndef(Register Reg) const
markUsesInDebugValueAsUndef - Mark every DBG_VALUE referencing the specified register as undefined wh...
iterator_range< reg_iterator > reg_operands(Register Reg) const
bool recomputeRegClass(Register Reg)
recomputeRegClass - Try to find a legal super-class of Reg's register class that still satisfies the ...
void freezeReservedRegs()
freezeReservedRegs - Called by the register allocator to freeze the set of reserved registers before ...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
void clearKillFlags(Register Reg) const
clearKillFlags - Iterate over all the uses of the given register and clear the kill flag from the Mac...
MachineRegisterInfo(MachineFunction *MF)
MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
iterator_range< use_nodbg_iterator > use_nodbg_operands(Register Reg) const
void EmitLiveInCopies(MachineBasicBlock *EntryMBB, const TargetRegisterInfo &TRI, const TargetInstrInfo &TII)
EmitLiveInCopies - Emit copies to initialize livein virtual registers into the given entry block.
bool use_nodbg_empty(Register RegNo) const
use_nodbg_empty - Return true if there are no non-Debug instructions using the specified register.
const RegClassOrRegBank & getRegClassOrRegBank(Register Reg) const
Return the register bank or register class of Reg.
static def_instr_iterator def_instr_end()
void dumpUses(Register RegNo) const
void moveOperands(MachineOperand *Dst, MachineOperand *Src, unsigned NumOps)
Move NumOps operands from Src to Dst, updating use-def lists as needed.
def_iterator def_begin(Register RegNo) const
void setRegClassOrRegBank(Register Reg, const RegClassOrRegBank &RCOrRB)
Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
def_instr_iterator def_instr_begin(Register RegNo) const
LLT getType(Register Reg) const
Get the low-level type of Reg or LLT{} if Reg is not a generic (target independent) virtual register.
bool def_empty(Register RegNo) const
def_empty - Return true if there are no instructions defining the specified register (it may be live-...
bool isLiveIn(Register Reg) const
bool reg_nodbg_empty(Register RegNo) const
reg_nodbg_empty - Return true if the only instructions using or defining Reg are Debug instructions.
use_instr_nodbg_iterator use_instr_nodbg_begin(Register RegNo) const
ArrayRef< std::pair< MCRegister, Register > > liveins() const
bool hasAtMostUserInstrs(Register Reg, unsigned MaxUsers) const
hasAtMostUses - Return true if the given register has at most MaxUsers non-debug user instructions.
bool hasOneNonDBGUser(Register RegNo) const
hasOneNonDBGUse - Return true if there is exactly one non-Debug instruction using the specified regis...
void clearVirtRegs()
clearVirtRegs - Remove all virtual registers (after physreg assignment).
Register createIncompleteVirtualRegister(StringRef Name="")
Creates a new virtual register that has no register class, register bank or size assigned yet.
bool isAllocatable(MCRegister PhysReg) const
isAllocatable - Returns true when PhysReg belongs to an allocatable register class and it hasn't been...
void setRegBank(Register Reg, const RegisterBank &RegBank)
Set the register bank to RegBank for Reg.
MCRegister getLiveInPhysReg(Register VReg) const
getLiveInPhysReg - If VReg is a live-in virtual register, return the corresponding live-in physical r...
const MCPhysReg * getCalleeSavedRegs() const
Returns list of callee saved registers.
iterator_range< use_instr_nodbg_iterator > use_nodbg_instructions(Register Reg) const
void setType(Register VReg, LLT Ty)
Set the low-level type of VReg to Ty.
void setRegClass(Register Reg, const TargetRegisterClass *RC)
setRegClass - Set the register class of the specified virtual register.
Register createGenericVirtualRegister(LLT Ty, StringRef Name="")
Create and return a new generic virtual register with low-level type Ty.
void clearVirtRegTypes()
Remove all types associated to virtual registers (after instruction selection and constraining of all...
Register getLiveInVirtReg(MCRegister PReg) const
getLiveInVirtReg - If PReg is a live-in physical register, return the corresponding live-in virtual r...
static def_iterator def_end()
void disableCalleeSavedRegister(MCRegister Reg)
Disables the register from the list of CSRs.
iterator_range< reg_instr_iterator > reg_instructions(Register Reg) const
void noteNewVirtualRegister(Register Reg)
void setCalleeSavedRegs(ArrayRef< MCPhysReg > CSRs)
Sets the updated Callee Saved Registers list.
iterator_range< use_instr_iterator > use_instructions(Register Reg) const
const TargetRegisterInfo * getTargetRegisterInfo() const
LaneBitmask getMaxLaneMaskForVReg(Register Reg) const
Returns a mask covering all bits that can appear in lane masks of subregisters of the virtual registe...
bool isConstantPhysReg(MCRegister PhysReg) const
Returns true if PhysReg is unallocatable and constant throughout the function.
iterator_range< reg_nodbg_iterator > reg_nodbg_operands(Register Reg) const
Register cloneVirtualRegister(Register VReg, StringRef Name="")
Create and return a new virtual register in the function with the same attributes as the given regist...
bool constrainRegAttrs(Register Reg, Register ConstrainingReg, unsigned MinNumRegs=0)
Constrain the register class or the register bank of the virtual register Reg (and low-level type) to...
const TargetRegisterClass * constrainRegClass(Register Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
constrainRegClass - Constrain the register class of the specified virtual register to be a common sub...
bool isReservedRegUnit(unsigned Unit) const
Returns true when the given register unit is considered reserved.
void noteCloneVirtualRegister(Register NewReg, Register SrcReg)
iterator_range< use_iterator > use_operands(Register Reg) const
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
void removeRegOperandFromUseList(MachineOperand *MO)
Remove MO from its use-def list.
void replaceRegWith(Register FromReg, Register ToReg)
replaceRegWith - Replace all instances of FromReg with ToReg in the machine function.
bool isPhysRegModified(MCRegister PhysReg, bool SkipNoReturnDef=false) const
Return true if the specified register is modified in this function.
void addRegOperandToUseList(MachineOperand *MO)
Add MO to the linked list of operands for its register.
MachineInstr * getUniqueVRegDef(Register Reg) const
getUniqueVRegDef - Return the unique machine instr that defines the specified virtual register or nul...
static use_instr_nodbg_iterator use_instr_nodbg_end()
bool isPhysRegUsed(MCRegister PhysReg, bool SkipRegMaskTest=false) const
Return true if the specified register is modified or read in this function.
This class implements the register bank concept.
Wrapper class representing virtual and physical registers.
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
static constexpr bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
StringRef - Represent a constant reference to a string, i.e.
TargetInstrInfo - Interface to description of machine instruction set.
unsigned getNumRegs() const
Return the number of registers in this class.
bool isAllocatable() const
Return true if this register class may be used to create virtual registers.
LaneBitmask getLaneMask() const
Returns the combination of all lane masks of register in this class.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC, const MachineFunction &) const
Returns the largest super class of RC that is legal to use in the current sub-target and has the same...
virtual BitVector getReservedRegs(const MachineFunction &MF) const =0
Returns a bitset indexed by physical register number indicating if a register is a special register t...
virtual const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const =0
Return a null-terminated list of all of the callee-saved registers on this target.
virtual const TargetInstrInfo * getInstrInfo() const
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
bool hasNItemsOrLess(IterTy &&Begin, IterTy &&End, unsigned N, Pred &&ShouldBeCounted=[](const decltype(*std::declval< IterTy >()) &) { return true;})
Returns true if the sequence [Begin, End) has N or less items.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
All attributes(register class or bank and low-level type) a virtual register can have.