Go to the documentation of this file.
14 #ifndef LLVM_CODEGEN_REGISTERPRESSURE_H
15 #define LLVM_CODEGEN_REGISTERPRESSURE_H
33 class MachineFunction;
35 class MachineRegisterInfo;
36 class RegisterClassInfo;
129 return PSetID ==
RHS.PSetID && UnitInc ==
RHS.UnitInc;
144 enum { MaxPSets = 16 };
150 iterator nonconst_begin() {
return &PressureChanges[0]; }
151 iterator nonconst_end() {
return &PressureChanges[MaxPSets]; }
208 void init(
unsigned N);
211 assert(Idx < Size &&
"PressureDiff index out of bounds");
212 return PDiffArray[Idx];
261 struct IndexMaskPair {
268 unsigned getSparseSetIndex()
const {
275 unsigned NumRegUnits;
277 unsigned getSparseIndexFromReg(
Register Reg)
const {
284 Register getRegFromSparseIndex(
unsigned SparseIndex)
const {
285 if (SparseIndex >= NumRegUnits)
295 unsigned SparseIndex = getSparseIndexFromReg(
Reg);
305 unsigned SparseIndex = getSparseIndexFromReg(Pair.
RegUnit);
306 auto InsertRes = Regs.
insert(IndexMaskPair(SparseIndex, Pair.
LaneMask));
307 if (!InsertRes.second) {
309 InsertRes.first->LaneMask |= Pair.
LaneMask;
318 unsigned SparseIndex = getSparseIndexFromReg(Pair.
RegUnit);
331 template<
typename ContainerT>
333 for (
const IndexMaskPair &
P : Regs) {
335 if (
P.LaneMask.any())
372 bool RequireIntervals;
375 bool TrackUntiedDefs =
false;
378 bool TrackLaneMasks =
false;
386 std::vector<unsigned> CurrSetPressure;
394 std::vector<unsigned> LiveThruPressure;
405 bool TrackLaneMasks,
bool TrackUntiedDefs);
451 LiveThruPressure.assign(PressureSet.
begin(), PressureSet.
end());
464 return CurrSetPressure;
516 std::vector<unsigned> &PressureResult,
517 std::vector<unsigned> &MaxPressureResult);
521 std::vector<unsigned> &PressureResult,
522 std::vector<unsigned> &MaxPressureResult);
525 std::vector<unsigned> &PressureResult,
526 std::vector<unsigned> &MaxPressureResult) {
535 return UntiedDefs.
count(VirtReg);
569 const TargetRegisterInfo *
TRI);
573 #endif // LLVM_CODEGEN_REGISTERPRESSURE_H
bool hasUntiedDef(Register VirtReg) const
unsigned getPSetOrMax() const
void reset()
Clear the result so it can be used for another round of pressure tracking.
MachineBasicBlock::const_iterator BottomPos
LaneBitmask getLiveThroughAt(Register RegUnit, SlotIndex Pos) const
typename DenseT::iterator iterator
void detectDeadDefs(const MachineInstr &MI, const LiveIntervals &LIS)
Use liveness information to find dead defs not marked with a dead flag and move them to the DeadDefs ...
typename DenseT::const_iterator const_iterator
This is an optimization pass for GlobalISel generic memory operations.
const RegisterPressure & getPressure() const
void addLiveRegs(ArrayRef< RegisterMaskPair > Regs)
Force liveness of virtual registers or physical register units.
void init(const MachineFunction *mf, const RegisterClassInfo *rci, const LiveIntervals *lis, const MachineBasicBlock *mbb, MachineBasicBlock::const_iterator pos, bool TrackLaneMasks, bool TrackUntiedDefs)
Setup the RegPressureTracker.
iterator find(const KeyT &Key)
find - Find an element by its key.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
SmallVector< RegisterMaskPair, 8 > Defs
List of virtual registers and register units defined by the instruction which are not dead.
SlotIndex getCurrSlot() const
Get the SlotIndex for the first nondebug instruction including or after the current position.
This currently compiles esp xmm0 movsd esp eax eax esp ret We should use not the dag combiner This is because dagcombine2 needs to be able to see through the X86ISD::Wrapper which DAGCombine can t really do The code for turning x load into a single vector load is target independent and should be moved to the dag combiner The code for turning x load into a vector load can only handle a direct load from a global or a direct load from the stack It should be generalized to handle any load from P
List of registers defined and used by a machine instruction.
List of PressureChanges in order of increasing, unique PSetID.
PressureDiff & operator[](unsigned Idx)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
void getUpwardPressure(const MachineInstr *MI, std::vector< unsigned > &PressureResult, std::vector< unsigned > &MaxPressureResult)
Get the pressure of each PSet after traversing this instruction bottom-up.
LaneBitmask erase(RegisterMaskPair Pair)
Clears the Pair.LaneMask lanes of Pair.Reg (mark them as dead).
Reg
All possible values of the reg field in the ModR/M byte.
bool operator==(const PressureChange &RHS) const
RegisterPressure computed within a region of instructions delimited by TopIdx and BottomIdx.
void bumpDeadDefs(ArrayRef< RegisterMaskPair > DeadDefs)
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Track the current register pressure at some position in the instruction stream, and remember the high...
LaneBitmask insert(RegisterMaskPair Pair)
Mark the Pair.LaneMask lanes of Pair.Reg as live.
MachineBasicBlock::const_iterator TopPos
Record the boundary of the region being tracked.
void openBottom(MachineBasicBlock::const_iterator PrevBottom)
If the current bottom is the previous instr (before advancing), open it.
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
Expected< ExpressionValue > max(const ExpressionValue &Lhs, const ExpressionValue &Rhs)
void closeRegion()
Finalize the region boundaries and recored live ins and live outs.
Register RegUnit
Virtual register or register unit.
void init(unsigned N)
Initialize an array of N PressureDiffs.
void getPressureAfterInst(const MachineInstr *MI, std::vector< unsigned > &PressureResult, std::vector< unsigned > &MaxPressureResult)
unsigned const TargetRegisterInfo * TRI
void addInstruction(unsigned Idx, const RegisterOperands &RegOpers, const MachineRegisterInfo &MRI)
Record pressure difference induced by the given operand list to node with index Idx.
size_type size() const
size - Returns the number of elements in the set.
bool isBottomClosed() const
Does this pressure result have a valid bottom position and live outs.
void setPos(MachineBasicBlock::const_iterator Pos)
PressureChange CurrentMax
void getUpwardPressureDelta(const MachineInstr *MI, PressureDiff &PDiff, RegPressureDelta &Delta, ArrayRef< PressureChange > CriticalPSets, ArrayRef< unsigned > MaxPressureLimit) const
This is the fast version of querying register pressure that does not directly depend on current liven...
PressureChange(unsigned id)
const_iterator end() const
const_iterator end() const
void getDownwardPressure(const MachineInstr *MI, std::vector< unsigned > &PressureResult, std::vector< unsigned > &MaxPressureResult)
Get the pressure of each PSet after traversing this instruction top-down.
static constexpr LaneBitmask getNone()
SlotIndex TopIdx
Record the boundary of the region being tracked.
ArrayRef< unsigned > getLiveThru() const
SmallVector< RegisterMaskPair, 8 > LiveOutRegs
void initLiveThru(const RegPressureTracker &RPTracker)
Initialize the LiveThru pressure set based on the untied defs found in RPTracker.
SlotIndex - An opaque wrapper around machine indexes.
void collect(const MachineInstr &MI, const TargetRegisterInfo &TRI, const MachineRegisterInfo &MRI, bool TrackLaneMasks, bool IgnoreDead)
Analyze the given instruction MI and fill in the Uses, Defs and DeadDefs list based on the MachineOpe...
const std::vector< unsigned > & getRegSetPressureAtPos() const
Get the register set pressure at the current position, which may be less than the pressure across the...
void recedeSkipDebugValues()
Recede until we find an instruction which is not a DebugValue.
SmallVector< RegisterMaskPair, 8 > DeadDefs
List of virtual registers and register units defined by the instruction but dead.
void openTop(MachineBasicBlock::const_iterator PrevTop)
If the current top is the previous instruction (before receding), open it.
void closeBottom()
Set the boundary for the bottom of the region and summarize live outs.
Representation of each machine instruction.
void appendTo(ContainerT &To) const
void getMaxPressureDelta(const MachineInstr *MI, RegPressureDelta &Delta, ArrayRef< PressureChange > CriticalPSets, ArrayRef< unsigned > MaxPressureLimit)
Find the pressure set with the most change beyond its pressure limit after traversing this instructio...
void closeTop()
Set the boundary for the top of the region and summarize live ins.
void advance()
Advance across the current instruction.
RegisterPressure & getPressure()
Get the resulting register pressure over the traversed region.
PressureChange CriticalMax
std::vector< unsigned > MaxSetPressure
Map of max reg pressure indexed by pressure set ID, not class ID.
void getMaxDownwardPressureDelta(const MachineInstr *MI, RegPressureDelta &Delta, ArrayRef< PressureChange > CriticalPSets, ArrayRef< unsigned > MaxPressureLimit)
Consider the pressure increase caused by traversing this instruction top-down.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
SmallVector< RegisterMaskPair, 8 > LiveInRegs
List of live in virtual registers or physical register units.
void init(const MachineRegisterInfo &MRI)
bool operator!=(const RegPressureDelta &RHS) const
void decreaseRegPressure(Register RegUnit, LaneBitmask PreviousMask, LaneBitmask NewMask)
void getMaxUpwardPressureDelta(const MachineInstr *MI, PressureDiff *PDiff, RegPressureDelta &Delta, ArrayRef< PressureChange > CriticalPSets, ArrayRef< unsigned > MaxPressureLimit)
Consider the pressure increase caused by traversing this instruction bottom-up.
void dumpRegSetPressure(ArrayRef< unsigned > SetPressure, const TargetRegisterInfo *TRI)
bool isTopClosed() const
Does this pressure result have a valid top position and live ins.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
MachineBasicBlock::const_iterator getPos() const
Get the MI position corresponding to this register pressure.
A set of live virtual registers and physical register units.
unsigned const MachineRegisterInfo * MRI
Wrapper class representing virtual and physical registers.
RegPressureDelta()=default
RegisterPressure computed within a region of instructions delimited by TopPos and BottomPos.
Store the effects of a change in pressure on things that MI scheduler cares about.
std::pair< iterator, bool > insert(const ValueT &Val)
insert - Attempts to insert a new element.
LaneBitmask getLiveLanesAt(Register RegUnit, SlotIndex Pos) const
bool operator==(const RegPressureDelta &RHS) const
void openBottom(SlotIndex PrevBottom)
If the current bottom is not greater than the previous index, open it.
void bumpDownwardPressure(const MachineInstr *MI)
Record the downward impact of a single instruction on current register pressure.
size_type count(const KeyT &Key) const
count - Returns 1 if this set contains an element identified by Key, 0 otherwise.
void initLiveThru(ArrayRef< unsigned > PressureSet)
Copy an existing live thru pressure result.
Capture a change in pressure for a single pressure set.
void discoverLiveInOrOut(RegisterMaskPair Pair, SmallVectorImpl< RegisterMaskPair > &LiveInOrOut)
void adjustLaneLiveness(const LiveIntervals &LIS, const MachineRegisterInfo &MRI, SlotIndex Pos, MachineInstr *AddFlagsMI=nullptr)
Use liveness information to find out which uses/defs are partially undefined/dead and adjust the Regi...
void openTop(SlotIndex NextTop)
If the current top is not less than or equal to the next index, open it.
Base class for register pressure results.
void discoverLiveIn(RegisterMaskPair Pair)
Add Reg to the live in set and increase max pressure.
void bumpUpwardPressure(const MachineInstr *MI)
Record the upward impact of a single instruction on current register pressure.
SmallVector< RegisterMaskPair, 8 > Uses
List of virtual registers and register units read by the instruction.
void addPressureChange(Register RegUnit, bool IsDec, const MachineRegisterInfo *MRI)
Add a change in pressure to the pressure diff of a given instruction.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void dump(const TargetRegisterInfo *TRI) const
LaneBitmask getLastUsedLanes(Register RegUnit, SlotIndex Pos) const
static unsigned virtReg2Index(Register Reg)
Convert a virtual register number to a 0-based index.
void discoverLiveOut(RegisterMaskPair Pair)
Add Reg to the live out set and increase max pressure.
void dump(const TargetRegisterInfo &TRI) const
RegisterMaskPair(Register RegUnit, LaneBitmask LaneMask)
RegPressureTracker(RegionPressure &rp)
void increaseRegPressure(Register RegUnit, LaneBitmask PreviousMask, LaneBitmask NewMask)
void recede(SmallVectorImpl< RegisterMaskPair > *LiveUses=nullptr)
Recede across the previous instruction.
const PressureDiff & operator[](unsigned Idx) const
LaneBitmask contains(Register Reg) const
const_iterator begin() const
RegPressureTracker(IntervalPressure &rp)
void reset()
Clear the result so it can be used for another round of pressure tracking.