LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Protected Member Functions | List of all members
llvm::RegPressureTracker Class Reference

#include <RegisterPressure.h>

Public Member Functions

 RegPressureTracker (IntervalPressure &rp)
 
 RegPressureTracker (RegionPressure &rp)
 
void reset ()
 
void init (const MachineFunction *mf, const RegisterClassInfo *rci, const LiveIntervals *lis, const MachineBasicBlock *mbb, MachineBasicBlock::const_iterator pos, bool ShouldTrackUntiedDefs=false)
 
void addLiveRegs (ArrayRef< unsigned > Regs)
 Force liveness of registers. More...
 
MachineBasicBlock::const_iterator getPos () const
 Get the MI position corresponding to this register pressure. More...
 
void setPos (MachineBasicBlock::const_iterator Pos)
 
SlotIndex getCurrSlot () const
 Get the SlotIndex for the first nondebug instruction including or after the current position. More...
 
bool recede (SmallVectorImpl< unsigned > *LiveUses=0, PressureDiff *PDiff=0)
 Recede across the previous instruction. More...
 
bool advance ()
 Advance across the current instruction. More...
 
void closeRegion ()
 Finalize the region boundaries and recored live ins and live outs. More...
 
void initLiveThru (const RegPressureTracker &RPTracker)
 
void initLiveThru (ArrayRef< unsigned > PressureSet)
 Copy an existing live thru pressure result. More...
 
ArrayRef< unsignedgetLiveThru () const
 
RegisterPressuregetPressure ()
 
const RegisterPressuregetPressure () const
 
std::vector< unsigned > & getRegSetPressureAtPos ()
 
void discoverLiveOut (unsigned Reg)
 Add Reg to the live out set and increase max pressure. More...
 
void discoverLiveIn (unsigned Reg)
 Add Reg to the live in set and increase max pressure. More...
 
bool isTopClosed () const
 Does this pressure result have a valid top position and live ins. More...
 
bool isBottomClosed () const
 Does this pressure result have a valid bottom position and live outs. More...
 
void closeTop ()
 Set the boundary for the top of the region and summarize live ins. More...
 
void closeBottom ()
 Set the boundary for the bottom of the region and summarize live outs. More...
 
void getMaxUpwardPressureDelta (const MachineInstr *MI, PressureDiff *PDiff, RegPressureDelta &Delta, ArrayRef< PressureChange > CriticalPSets, ArrayRef< unsigned > MaxPressureLimit)
 
void getUpwardPressureDelta (const MachineInstr *MI, PressureDiff &PDiff, RegPressureDelta &Delta, ArrayRef< PressureChange > CriticalPSets, ArrayRef< unsigned > MaxPressureLimit) const
 
void getMaxDownwardPressureDelta (const MachineInstr *MI, RegPressureDelta &Delta, ArrayRef< PressureChange > CriticalPSets, ArrayRef< unsigned > MaxPressureLimit)
 
void getMaxPressureDelta (const MachineInstr *MI, RegPressureDelta &Delta, ArrayRef< PressureChange > CriticalPSets, ArrayRef< unsigned > MaxPressureLimit)
 
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. More...
 
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. More...
 
void getPressureAfterInst (const MachineInstr *MI, std::vector< unsigned > &PressureResult, std::vector< unsigned > &MaxPressureResult)
 
bool hasUntiedDef (unsigned VirtReg) const
 
void dump () const
 

Protected Member Functions

const LiveRangegetLiveRange (unsigned Reg) const
 
void increaseRegPressure (ArrayRef< unsigned > Regs)
 
void decreaseRegPressure (ArrayRef< unsigned > Regs)
 Simply decrease the current pressure as impacted by these registers. More...
 
void bumpUpwardPressure (const MachineInstr *MI)
 
void bumpDownwardPressure (const MachineInstr *MI)
 

Detailed Description

Track the current register pressure at some position in the instruction stream, and remember the high water mark within the region traversed. This does not automatically consider live-through ranges. The client may independently adjust for global liveness.

Each RegPressureTracker only works within a MachineBasicBlock. Pressure can be tracked across a larger region by storing a RegisterPressure result at each block boundary and explicitly adjusting pressure to account for block live-in and live-out register sets.

RegPressureTracker holds a reference to a RegisterPressure result that it computes incrementally. During downward tracking, P.BottomIdx or P.BottomPos is invalid until it reaches the end of the block or closeRegion() is explicitly called. Similarly, P.TopIdx is invalid during upward tracking. Changing direction has the side effect of closing region, and traversing past TopIdx or BottomIdx reopens it.

Definition at line 250 of file RegisterPressure.h.

Constructor & Destructor Documentation

llvm::RegPressureTracker::RegPressureTracker ( IntervalPressure rp)
inline

Definition at line 287 of file RegisterPressure.h.

llvm::RegPressureTracker::RegPressureTracker ( RegionPressure rp)
inline

Definition at line 291 of file RegisterPressure.h.

Member Function Documentation

void RegPressureTracker::addLiveRegs ( ArrayRef< unsigned Regs)

Force liveness of registers.

Force liveness of virtual registers or physical register units. Particularly useful to initialize the livein/out state of the tracker before the first call to advance/recede.

Definition at line 422 of file RegisterPressure.cpp.

References increaseRegPressure(), llvm::LiveRegSet::insert(), and llvm::ArrayRef< T >::size().

Referenced by llvm::ScheduleDAGMI::initRegPressure().

bool RegPressureTracker::advance ( )
void RegPressureTracker::bumpDownwardPressure ( const MachineInstr MI)
protected

Record the downward impact of a single instruction on current register pressure. Unlike the advance/recede pressure tracking interface, this does not discover live in/outs.

This is intended for speculative queries. It leaves pressure inconsistent with the current position, so must be restored by the caller.

Definition at line 898 of file RegisterPressure.cpp.

References collectOperands(), decreaseRegPressure(), findUseBetween(), getCurrSlot(), llvm::LiveIntervals::getInstructionIndex(), getLiveRange(), llvm::SlotIndex::getRegSlot(), increaseRegPressure(), llvm::MachineInstr::isDebugValue(), llvm::LiveQueryResult::isKill(), llvm::TargetRegisterInfo::isVirtualRegister(), and llvm::LiveRange::Query().

Referenced by getDownwardPressure(), and getMaxDownwardPressureDelta().

void RegPressureTracker::bumpUpwardPressure ( const MachineInstr MI)
protected

Record the upward impact of a single instruction on current register pressure. Unlike the advance/recede pressure tracking interface, this does not discover live in/outs.

This is intended for speculative queries. It leaves pressure inconsistent with the current position, so must be restored by the caller.

Definition at line 700 of file RegisterPressure.cpp.

References collectOperands(), llvm::LiveRegSet::contains(), containsReg(), decreaseRegPressure(), llvm::LiveIntervals::getInstructionIndex(), getLiveRange(), increaseRegPressure(), llvm::LiveQueryResult::isDeadDef(), llvm::MachineInstr::isDebugValue(), and llvm::LiveRange::Query().

Referenced by getMaxUpwardPressureDelta(), and getUpwardPressure().

void RegPressureTracker::closeBottom ( )
void RegPressureTracker::closeRegion ( )

Finalize the region boundaries and recored live ins and live outs.

Finalize the region boundaries and record live ins and live outs.

Definition at line 272 of file RegisterPressure.cpp.

References closeBottom(), closeTop(), llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::empty(), isBottomClosed(), isTopClosed(), llvm::LiveRegSet::PhysRegs, and llvm::LiveRegSet::VirtRegs.

Referenced by advance(), llvm::ScheduleDAGMI::initRegPressure(), and recede().

void RegPressureTracker::closeTop ( )
void RegPressureTracker::decreaseRegPressure ( ArrayRef< unsigned Regs)
protected

Simply decrease the current pressure as impacted by these registers.

Definition at line 96 of file RegisterPressure.cpp.

References decreaseSetPressure(), llvm::MachineRegisterInfo::getPressureSets(), I, and llvm::ArrayRef< T >::size().

Referenced by advance(), bumpDownwardPressure(), bumpUpwardPressure(), and recede().

void RegPressureTracker::discoverLiveIn ( unsigned  Reg)
void RegPressureTracker::discoverLiveOut ( unsigned  Reg)
void RegPressureTracker::dump ( ) const
SlotIndex RegPressureTracker::getCurrSlot ( ) const

Get the SlotIndex for the first nondebug instruction including or after the current position.

Definition at line 226 of file RegisterPressure.cpp.

References llvm::MachineBasicBlock::end(), llvm::LiveIntervals::getInstructionIndex(), llvm::LiveIntervals::getMBBEndIdx(), and llvm::SlotIndex::getRegSlot().

Referenced by advance(), bumpDownwardPressure(), closeBottom(), and closeTop().

void RegPressureTracker::getDownwardPressure ( const MachineInstr MI,
std::vector< unsigned > &  PressureResult,
std::vector< unsigned > &  MaxPressureResult 
)

Get the pressure of each PSet after traversing this instruction top-down.

Definition at line 985 of file RegisterPressure.cpp.

References bumpDownwardPressure(), and llvm::RegisterPressure::MaxSetPressure.

Referenced by getPressureAfterInst().

const LiveRange * RegPressureTracker::getLiveRange ( unsigned  Reg) const
protected
ArrayRef<unsigned> llvm::RegPressureTracker::getLiveThru ( ) const
inline
void RegPressureTracker::getMaxDownwardPressureDelta ( const MachineInstr MI,
RegPressureDelta Delta,
ArrayRef< PressureChange CriticalPSets,
ArrayRef< unsigned MaxPressureLimit 
)

Consider the pressure increase caused by traversing this instruction top-down. Find the pressure set with the most change beyond its pressure limit based on the tracker's current pressure, and record the number of excess register units of that pressure set introduced by this instruction.

Consider the pressure increase caused by traversing this instruction top-down. Find the register class with the most change in its pressure limit based on the tracker's current pressure, and return the number of excess register units of that pressure set introduced by this instruction.

This assumes that the current LiveIn set is sufficient.

Definition at line 946 of file RegisterPressure.cpp.

References bumpDownwardPressure(), computeExcessPressureDelta(), computeMaxPressureDelta(), llvm::RegPressureDelta::CriticalMax, llvm::RegPressureDelta::CurrentMax, llvm::PressureChange::getUnitInc(), and llvm::RegisterPressure::MaxSetPressure.

Referenced by getMaxPressureDelta().

void llvm::RegPressureTracker::getMaxPressureDelta ( const MachineInstr MI,
RegPressureDelta Delta,
ArrayRef< PressureChange CriticalPSets,
ArrayRef< unsigned MaxPressureLimit 
)
inline

Find the pressure set with the most change beyond its pressure limit after traversing this instruction either upward or downward depending on the closed end of the current region.

Definition at line 387 of file RegisterPressure.h.

References getMaxDownwardPressureDelta(), getMaxUpwardPressureDelta(), isBottomClosed(), and isTopClosed().

void RegPressureTracker::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. Find the pressure set with the most change beyond its pressure limit based on the tracker's current pressure, and record the number of excess register units of that pressure set introduced by this instruction.

Consider the pressure increase caused by traversing this instruction bottom-up. Find the pressure set with the most change beyond its pressure limit based on the tracker's current pressure, and return the change in number of register units of that pressure set introduced by this instruction.

This assumes that the current LiveOut set is sufficient.

FIXME: This is expensive for an on-the-fly query. We need to cache the result per-SUnit with enough information to adjust for the current scheduling position. But this works as a proof of concept.

Definition at line 749 of file RegisterPressure.cpp.

References bumpUpwardPressure(), computeExcessPressureDelta(), computeMaxPressureDelta(), llvm::RegPressureDelta::CriticalMax, llvm::RegPressureDelta::CurrentMax, llvm::dbgs(), llvm::RegPressureDelta::Excess, llvm::PressureChange::getPSet(), llvm::TargetRegisterInfo::getRegPressureSetName(), llvm::PressureChange::getUnitInc(), getUpwardPressureDelta(), llvm::PressureChange::isValid(), llvm_unreachable, llvm::RegisterPressure::MaxSetPressure, and llvm::A64CC::MI.

Referenced by getMaxPressureDelta().

MachineBasicBlock::const_iterator llvm::RegPressureTracker::getPos ( ) const
inline
RegisterPressure& llvm::RegPressureTracker::getPressure ( )
inline

Get the resulting register pressure over the traversed region. This result is complete if either advance() or recede() has returned true, or if closeRegion() was explicitly invoked.

Definition at line 343 of file RegisterPressure.h.

Referenced by llvm::ScheduleDAGMI::computeCyclicCriticalPath(), llvm::ScheduleDAGMI::initRegPressure(), and llvm::ScheduleDAGMI::scheduleMI().

const RegisterPressure& llvm::RegPressureTracker::getPressure ( ) const
inline

Definition at line 344 of file RegisterPressure.h.

void llvm::RegPressureTracker::getPressureAfterInst ( const MachineInstr MI,
std::vector< unsigned > &  PressureResult,
std::vector< unsigned > &  MaxPressureResult 
)
inline
std::vector<unsigned>& llvm::RegPressureTracker::getRegSetPressureAtPos ( )
inline

Get the register set pressure at the current position, which may be less than the pressure across the traversed region.

Definition at line 348 of file RegisterPressure.h.

void RegPressureTracker::getUpwardPressure ( const MachineInstr MI,
std::vector< unsigned > &  PressureResult,
std::vector< unsigned > &  MaxPressureResult 
)

Get the pressure of each PSet after traversing this instruction bottom-up.

Definition at line 969 of file RegisterPressure.cpp.

References bumpUpwardPressure(), and llvm::RegisterPressure::MaxSetPressure.

Referenced by getPressureAfterInst().

void RegPressureTracker::getUpwardPressureDelta ( const MachineInstr MI,
PressureDiff PDiff,
RegPressureDelta Delta,
ArrayRef< PressureChange CriticalPSets,
ArrayRef< unsigned MaxPressureLimit 
) const

This is a prototype of the fast version of querying register pressure that does not directly depend on current liveness. It's still slow because we recompute pressure change on-the-fly. This implementation only exists to prove correctness.

Parameters
Deltacaptures information needed for heuristics.
CriticalPSetsAre the pressure sets that are known to exceed some limit within the region, not necessarily at the current position.
MaxPressureLimitIs the max pressure within the region, not necessarily at the current position.

Definition at line 817 of file RegisterPressure.cpp.

References llvm::PressureDiff::begin(), llvm::RegPressureDelta::CriticalMax, llvm::RegPressureDelta::CurrentMax, llvm::PressureDiff::end(), llvm::RegPressureDelta::Excess, llvm::RegisterClassInfo::getRegPressureSetLimit(), llvm::PressureChange::isValid(), llvm::RegisterPressure::MaxSetPressure, llvm::PressureChange::setUnitInc(), and llvm::ArrayRef< T >::size().

Referenced by getMaxUpwardPressureDelta().

bool llvm::RegPressureTracker::hasUntiedDef ( unsigned  VirtReg) const
inline

Definition at line 420 of file RegisterPressure.h.

Referenced by initLiveThru().

void RegPressureTracker::increaseRegPressure ( ArrayRef< unsigned RegUnits)
protected

Increase the current pressure as impacted by these registers and bump the high water mark if needed.

Definition at line 82 of file RegisterPressure.cpp.

References llvm::MachineRegisterInfo::getPressureSets(), llvm::PSetIterator::getWeight(), llvm::PSetIterator::isValid(), llvm::RegisterPressure::MaxSetPressure, and llvm::ArrayRef< T >::size().

Referenced by addLiveRegs(), advance(), bumpDownwardPressure(), bumpUpwardPressure(), and recede().

void RegPressureTracker::init ( const MachineFunction mf,
const RegisterClassInfo rci,
const LiveIntervals lis,
const MachineBasicBlock mbb,
MachineBasicBlock::const_iterator  pos,
bool  ShouldTrackUntiedDefs = false 
)
void RegPressureTracker::initLiveThru ( const RegPressureTracker RPTracker)

Initialize the LiveThru pressure set based on the untied defs found in RPTracker.

The register tracker is unaware of global liveness so ignores normal live-thru ranges. However, two-address or coalesced chains can also lead to live ranges with no holes. Count these to inform heuristics that we can never drop below this pressure.

Definition at line 289 of file RegisterPressure.cpp.

References llvm::TargetRegisterInfo::getNumRegPressureSets(), llvm::MachineRegisterInfo::getPressureSets(), hasUntiedDef(), increaseSetPressure(), isBottomClosed(), llvm::TargetRegisterInfo::isVirtualRegister(), llvm::RegisterPressure::LiveOutRegs, and llvm::SmallVectorTemplateCommon< T, typename >::size().

Referenced by llvm::ScheduleDAGMI::initRegPressure().

void llvm::RegPressureTracker::initLiveThru ( ArrayRef< unsigned PressureSet)
inline

Copy an existing live thru pressure result.

Definition at line 334 of file RegisterPressure.h.

References llvm::ArrayRef< T >::begin(), and llvm::ArrayRef< T >::end().

bool RegPressureTracker::isBottomClosed ( ) const

Does this pressure result have a valid bottom position and live outs.

Definition at line 218 of file RegisterPressure.cpp.

Referenced by advance(), closeRegion(), dump(), getMaxPressureDelta(), getPressureAfterInst(), initLiveThru(), and recede().

bool RegPressureTracker::isTopClosed ( ) const

Does this pressure result have a valid top position and live ins.

Definition at line 210 of file RegisterPressure.cpp.

Referenced by advance(), closeRegion(), dump(), getMaxPressureDelta(), getPressureAfterInst(), and recede().

bool RegPressureTracker::recede ( SmallVectorImpl< unsigned > *  LiveUses = 0,
PressureDiff PDiff = 0 
)
void RegPressureTracker::reset ( )
void llvm::RegPressureTracker::setPos ( MachineBasicBlock::const_iterator  Pos)
inline

The documentation for this class was generated from the following files: