33#define DEBUG_TYPE "regalloc"
35STATISTIC(NumAssigned ,
"Number of registers assigned");
36STATISTIC(NumUnassigned ,
"Number of registers unassigned");
40 "Live Register Matrix",
false,
false)
56 LRM.init(MF, LIS, VRM);
66 unsigned NumRegUnits = TRI->getNumRegUnits();
67 if (NumRegUnits != Matrix.size())
69 Matrix.
init(*LIUAlloc, NumRegUnits);
77void LiveRegMatrix::releaseMemory() {
78 for (
unsigned i = 0, e =
Matrix.size(); i != e; ++i) {
86template <
typename Callable>
92 unsigned Unit = (*Units).first;
95 if ((S.LaneMask & Mask).any()) {
104 if (Func(Unit, VRegInterval))
114 assert(!VRM->hasPhys(VirtReg.
reg()) &&
"Duplicate VirtReg assignment");
115 VRM->assignVirt2Phys(VirtReg.
reg(), PhysReg);
118 TRI, VirtReg, PhysReg, [&](
unsigned Unit,
const LiveRange &
Range) {
120 Matrix[Unit].unify(VirtReg,
Range);
131 <<
" from " <<
printReg(PhysReg, TRI) <<
':');
132 VRM->clearVirt(VirtReg.
reg());
137 Matrix[Unit].extract(VirtReg,
Range);
146 for (
MCRegUnit Unit : TRI->regunits(PhysReg)) {
147 if (!Matrix[Unit].empty())
158 if (RegMaskVirtReg != VirtReg.
reg() || RegMaskTag != UserTag) {
159 RegMaskVirtReg = VirtReg.
reg();
160 RegMaskTag = UserTag;
161 RegMaskUsable.clear();
162 LIS->checkRegMaskInterference(VirtReg, RegMaskUsable);
168 return !RegMaskUsable.empty() &&
169 (!PhysReg || !RegMaskUsable.test(PhysReg.
id()));
178 bool Result =
foreachUnit(TRI, VirtReg, PhysReg, [&](
unsigned Unit,
180 const LiveRange &UnitRange = LIS->getRegUnit(Unit);
181 return Range.overlaps(UnitRange, CP, *LIS->getSlotIndexes());
189 Q.
init(UserTag, LR, Matrix[RegUnit]);
208 bool Interference =
foreachUnit(TRI, VirtReg, PhysReg,
227 for (
MCRegUnit Unit : TRI->regunits(PhysReg)) {
241 Q.
reset(UserTag, LR, Matrix[Unit]);
261 auto [Unit, Lanes] = *MCRU;
275 Q.
reset(UserTag, LR, Matrix[Unit]);
277 InterferingLanes |= Lanes;
280 return InterferingLanes;
285 for (
MCRegUnit Unit : TRI->regunits(PhysReg)) {
286 if ((VRegInterval = Matrix[Unit].
getOneVReg()))
287 return VRegInterval->
reg();
300 LRM.
init(MF, LIS, VRM);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
A common definition of LaneBitmask for use in TableGen and CodeGen.
static bool foreachUnit(const TargetRegisterInfo *TRI, const LiveInterval &VRegInterval, MCRegister PhysReg, Callable Func)
Register const TargetRegisterInfo * TRI
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
A helper class for register coalescers.
Query interferences between a single live virtual register and a live interval union.
void init(unsigned NewUserTag, const LiveRange &NewLR, const LiveIntervalUnion &NewLiveUnion)
void reset(unsigned NewUserTag, const LiveRange &NewLR, const LiveIntervalUnion &NewLiveUnion)
A live range for subregisters.
LiveInterval - This class represents the liveness of a register, or stack slot.
bool hasSubRanges() const
Returns true if subregister liveness information is available.
iterator_range< subrange_iterator > subranges()
This class represents the liveness of a register, stack slot, etc.
LLVM_ABI iterator addSegment(Segment S)
Add the specified Segment to this range, merging segments as appropriate.
LiveRegMatrix run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
void releaseMemory() override
releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memo...
LiveRegMatrixWrapperLegacy()
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
bool checkRegMaskInterference(const LiveInterval &VirtReg, MCRegister PhysReg=MCRegister::NoRegister)
Check for regmask interference only.
void unassign(const LiveInterval &VirtReg)
Unassign VirtReg from its PhysReg.
bool isPhysRegUsed(MCRegister PhysReg) const
Returns true if the given PhysReg has any live intervals assigned.
void invalidateVirtRegs()
Invalidate cached interference queries after modifying virtual register live ranges.
Register getOneVReg(unsigned PhysReg) const
LiveIntervalUnion::Query & query(const LiveRange &LR, MCRegUnit RegUnit)
Query a line of the assigned virtual register matrix directly.
@ IK_VirtReg
Virtual register interference.
@ IK_RegUnit
Register unit interference.
@ IK_Free
No interference, go ahead and assign.
@ IK_RegMask
RegMask interference.
void init(MachineFunction &MF, LiveIntervals &LIS, VirtRegMap &VRM)
void assign(const LiveInterval &VirtReg, MCRegister PhysReg)
Assign VirtReg to PhysReg.
InterferenceKind checkInterference(const LiveInterval &VirtReg, MCRegister PhysReg)
Check for interference before assigning VirtReg to PhysReg.
bool checkRegUnitInterference(const LiveInterval &VirtReg, MCRegister PhysReg)
Check for regunit interference only.
LaneBitmask checkInterferenceLanes(SlotIndex Start, SlotIndex End, MCRegister PhysReg)
Check for interference in the segment [Start, End) that may prevent assignment to PhysReg,...
MCRegUnitMaskIterator enumerates a list of register units and their associated lane masks for Reg.
bool isValid() const
Returns true if this iterator is not yet at the end.
Wrapper class representing physical registers. Should be passed by value.
static constexpr unsigned NoRegister
constexpr unsigned id() const
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
Wrapper class representing virtual and physical registers.
SlotIndex - An opaque wrapper around machine indexes.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
VNInfo - Value Number Information.
LLVM_ABI void init(MachineFunction &MF)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI Printable printRegUnit(unsigned Unit, const TargetRegisterInfo *TRI)
Create Printable object to print register units on a raw_ostream.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
unsigned MCRegUnit
Register units are used to compute register aliasing.
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.
A special type used by analysis passes to provide an address that identifies that particular analysis...
This represents a simple continuous liveness interval for a value.