38#define DEBUG_TYPE "regalloc"
40STATISTIC(NumNewQueued,
"Number of new live ranges queued");
57void RegAllocBase::anchor() {}
66 MRI->freezeReservedRegs();
74void RegAllocBase::seedLiveRegs() {
77 for (
unsigned i = 0, e =
MRI->getNumVirtRegs(); i != e; ++i) {
79 if (
MRI->reg_nodbg_empty(Reg))
92 assert(!
VRM->hasPhys(VirtReg->reg()) &&
"Register already assigned");
95 if (
MRI->reg_nodbg_empty(VirtReg->reg())) {
98 LIS->removeInterval(VirtReg->reg());
103 Matrix->invalidateVirtRegs();
109 <<
TRI->getRegClassName(
MRI->getRegClass(VirtReg->reg()))
110 <<
':' << *VirtReg <<
'\n');
114 VirtRegVec SplitVRegs;
117 if (AvailablePhysReg == ~0u) {
123 if (
MI->isInlineAsm())
132 }
else if (AvailablePhysReg)
133 Matrix->assign(*VirtReg, AvailablePhysReg);
139 assert(!
VRM->hasPhys(SplitVirtReg->
reg()) &&
"Register already assigned");
140 if (
MRI->reg_nodbg_empty(SplitVirtReg->
reg())) {
141 assert(SplitVirtReg->
empty() &&
"Non-empty but used interval");
142 LLVM_DEBUG(
dbgs() <<
"not queueing unused " << *SplitVirtReg <<
'\n');
144 LIS->removeInterval(SplitVirtReg->
reg());
147 LLVM_DEBUG(
dbgs() <<
"queuing new interval: " << *SplitVirtReg <<
"\n");
149 "expect split value in virtual register");
159 LIS->RemoveMachineInstrFromMaps(*DeadInst);
160 DeadInst->eraseFromParent();
175 if (!
MRI->isReserved(PhysReg)) {
190 MRI->replaceRegWith(FailedReg, PhysReg);
191 LIS->removeInterval(FailedReg);
197 assert(Reg.isVirtual() &&
"Can only enqueue virtual registers");
199 if (
VRM->hasPhys(Reg))
207 <<
" in skipped register class\n");
225 if (AllocOrder.
empty()) {
233 "no registers from class available to allocate", Fn,
237 assert(!RawRegs.
empty() &&
"register classes cannot have no registers");
238 return RawRegs.
front();
244 "inline assembly requires more registers than available");
247 "ran out of registers during register allocation", Fn,
252 return AllocOrder.
front();
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Module.h This file contains the declarations for the Module class.
static cl::opt< bool, true > VerifyRegAlloc("verify-regalloc", cl::location(RegAllocBase::VerifyEnabled), cl::Hidden, cl::desc("Verify during register allocation"))
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const T & front() const
front - Get the first element.
bool empty() const
empty - Check if the array is empty.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
This is an important class for using LLVM in a threaded context.
LiveInterval - This class represents the liveness of a register, or stack slot.
LiveInterval & getInterval(Register Reg)
MCRegAliasIterator enumerates all registers aliasing Reg.
Wrapper class representing physical registers. Should be passed by value.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineFunctionProperties & getProperties() const
Get the function properties.
Representation of each machine instruction.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
LLVM_ABI void emitInlineAsmError(const Twine &ErrMsg) const
Emit an error referring to the source location of this instruction.
MachineOperand class - Representation of each machine instruction operand.
virtual void aboutToRemoveInterval(const LiveInterval &LI)
Method called when the allocator is about to remove a LiveInterval.
virtual MCRegister selectOrSplit(const LiveInterval &VirtReg, SmallVectorImpl< Register > &splitLVRs)=0
MCPhysReg getErrorAssignment(const TargetRegisterClass &RC, const MachineInstr *CtxMI=nullptr)
Query a physical register to use as a filler in contexts where the allocation has failed.
void enqueue(const LiveInterval *LI)
enqueue - Add VirtReg to the priority queue of unassigned registers.
void init(VirtRegMap &vrm, LiveIntervals &lis, LiveRegMatrix &mat)
SmallPtrSet< MachineInstr *, 32 > DeadRemats
Inst which is a def of an original reg and whose defs are already all dead after remat is saved in De...
void cleanupFailedVReg(Register FailedVReg, MCRegister PhysReg, SmallVectorImpl< Register > &SplitRegs)
Perform cleanups on registers that failed to allocate.
SmallSet< Register, 2 > FailedVRegs
virtual Spiller & spiller()=0
const TargetRegisterInfo * TRI
static const char TimerGroupName[]
static const char TimerGroupDescription[]
virtual const LiveInterval * dequeue()=0
dequeue - Return the next unassigned register, or NULL.
virtual void postOptimization()
RegisterClassInfo RegClassInfo
MachineRegisterInfo * MRI
virtual void enqueueImpl(const LiveInterval *LI)=0
enqueue - Add VirtReg to the priority queue of unassigned registers.
bool shouldAllocateRegister(Register Reg)
Get whether a given register should be allocated.
static bool VerifyEnabled
VerifyEnabled - True when -verify-regalloc is given.
Wrapper class representing virtual and physical registers.
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
virtual void postOptimization()
ArrayRef< MCPhysReg > getRegisters() const
MachineRegisterInfo & getRegInfo() const
MachineFunction & getMachineFunction() const
const TargetRegisterInfo & getTargetRegInfo() const
LocationClass< Ty > location(Ty &L)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool TimePassesIsEnabled
If the user specifies the -time-passes argument on an LLVM tool command line then the value of this b...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
LLVM_ABI 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.
This class is basically a combination of TimeRegion and Timer.