34#define DEBUG_TYPE "regalloc"
38 cl::desc(
"Limit all regclasses to N registers"));
50 if (STI.getRegisterInfo() != TRI || Reverse != Rev) {
52 TRI = STI.getRegisterInfo();
53 RegClass.reset(
new RCInfo[TRI->getNumRegClasses()]);
60 bool CSRChanged =
true;
63 size_t LastSize = LastCalleeSavedRegs.size();
64 for (
unsigned I = 0;; ++
I) {
66 CSRChanged =
I != LastSize;
73 if (CSR[
I] != LastCalleeSavedRegs[
I]) {
82 LastCalleeSavedRegs.clear();
85 CalleeSavedAliases.assign(TRI->getNumRegUnits(), 0);
87 for (MCRegUnit U : TRI->regunits(*
I))
88 CalleeSavedAliases[
static_cast<unsigned>(U)] = *
I;
89 LastCalleeSavedRegs.push_back(*
I);
97 BitVector CSRHintsForAllocOrder(TRI->getNumRegs());
100 CSRHintsForAllocOrder[(*AI).id()] =
101 STI.ignoreCSRForAllocationOrder(mf, *AI);
102 if (IgnoreCSRForAllocOrder != CSRHintsForAllocOrder) {
104 IgnoreCSRForAllocOrder = std::move(CSRHintsForAllocOrder);
107 RegCosts = TRI->getRegisterCosts(*MF);
110 const BitVector &RR = MF->getRegInfo().getReservedRegs();
111 if (RR != Reserved) {
118 unsigned NumPSets = TRI->getNumRegPressureSets();
119 PSetLimits.reset(
new unsigned[NumPSets]);
120 std::fill(&PSetLimits[0], &PSetLimits[NumPSets], 0);
129 assert(RC &&
"no register class given");
130 RCInfo &RCI = RegClass[RC->
getID()];
143 unsigned LastCostChange = 0;
153 MinCost = std::min(MinCost,
Cost);
156 !STI.ignoreCSRForAllocationOrder(*MF, PhysReg))
160 if (
Cost != LastCost)
162 RCI.Order[
N++] = PhysReg;
166 RCI.NumRegs =
N + CSRAlias.
size();
167 assert(RCI.NumRegs <= NumRegs &&
"Allocation order larger than regclass");
170 for (
unsigned PhysReg : CSRAlias) {
171 uint8_t
Cost = RegCosts[PhysReg];
172 if (
Cost != LastCost)
174 RCI.Order[
N++] = PhysReg;
184 TRI->getLargestLegalSuperClass(RC, *MF))
186 RCI.ProperSubClass =
true;
188 RCI.MinCost = MinCost;
189 RCI.LastCostChange = LastCostChange;
192 dbgs() <<
"AllocationOrder(" << TRI->getRegClassName(RC) <<
") = [";
193 for (
unsigned I = 0;
I != RCI.NumRegs; ++
I)
195 dbgs() << (RCI.ProperSubClass ?
" ] (sub-class)\n" :
" ]\n");
207 unsigned NumRCUnits = 0;
209 const int *PSetID = TRI->getRegClassPressureSets(&
C);
210 for (; *PSetID != -1; ++PSetID) {
211 if ((
unsigned)*PSetID == Idx)
219 unsigned NUnits = TRI->getRegClassWeight(&
C).WeightLimit;
220 if (!RC || NUnits > NumRCUnits) {
225 assert(RC &&
"Failed to find register class");
228 unsigned RegPressureSetLimit = TRI->getRegPressureSetLimit(*MF, Idx);
233 if (NAllocatableRegs == 0)
234 return RegPressureSetLimit;
235 unsigned NReserved = RC->
getNumRegs() - NAllocatableRegs;
236 return RegPressureSetLimit - TRI->getRegClassWeight(RC).RegWeight * NReserved;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements the BitVector class.
Register const TargetRegisterInfo * TRI
static cl::opt< unsigned > StressRA("stress-regalloc", cl::Hidden, cl::init(0), cl::value_desc("N"), cl::desc("Limit all regclasses to N registers"))
This file defines the SmallVector class.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
MCRegAliasIterator enumerates all registers aliasing Reg.
unsigned getID() const
getID() - Return the register class ID number.
unsigned getNumRegs() const
getNumRegs - Return the number of registers in this class.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI const MCPhysReg * getCalleeSavedRegs() const
Returns list of callee saved registers.
unsigned getNumAllocatableRegs(const TargetRegisterClass *RC) const
getNumAllocatableRegs - Returns the number of actually allocatable registers in RC in the current fun...
LLVM_ABI void runOnMachineFunction(const MachineFunction &MF, bool Rev=false)
runOnFunction - Prepare to answer questions about MF.
MCRegister getLastCalleeSavedAlias(MCRegister PhysReg) const
getLastCalleeSavedAlias - Returns the last callee saved register that overlaps PhysReg,...
LLVM_ABI RegisterClassInfo()
LLVM_ABI unsigned computePSetLimit(unsigned Idx) const
This is not accurate because two overlapping register sets may have some nonoverlapping reserved regi...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
@ C
The default llvm calling convention, compatible with C.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
auto reverse_conditionally(ContainerTy &&C, bool ShouldReverse)
Return a range that conditionally reverses C.
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.
MCRegisterClass TargetRegisterClass