LLVM: llvm::SchedBoundary Class Reference (original) (raw)

Each Scheduling boundary is associated with ready queues. More...

#include "[llvm/CodeGen/MachineScheduler.h](MachineScheduler%5F8h%5Fsource.html)"

Public Member Functions
SchedBoundary (unsigned ID, const Twine &Name)
Pending queues extend the ready queues with the same ID and the PendingFlag set.
SchedBoundary & operator= (const SchedBoundary &other)=delete
SchedBoundary (const SchedBoundary &other)=delete
LLVM_ABI ~SchedBoundary ()
LLVM_ABI void reset ()
LLVM_ABI void init (ScheduleDAGMI *dag, const TargetSchedModel *smodel, SchedRemainder *rem)
bool isTop () const
unsigned getCurrCycle () const
Number of cycles to issue the instructions scheduled in this zone.
unsigned getCurrMOps () const
Micro-ops issued in the current cycle.
unsigned getDependentLatency () const
unsigned getScheduledLatency () const
Get the number of latency cycles "covered" by the scheduled instructions.
unsigned getUnscheduledLatency (SUnit *SU) const
unsigned getResourceCount (unsigned ResIdx) const
unsigned getCriticalCount () const
Get the scaled count of scheduled micro-ops and resources, including executed resources.
unsigned getExecutedCount () const
Get a scaled count for the minimum execution time of the scheduled micro-ops that are ready to execute by getExecutedCount.
unsigned getZoneCritResIdx () const
bool isResourceLimited () const
LLVM_ABI unsigned getLatencyStallCycles (SUnit *SU)
Get the difference between the given SUnit's ready time and the current cycle.
LLVM_ABI unsigned getNextResourceCycleByInstance (unsigned InstanceIndex, unsigned ReleaseAtCycle, unsigned AcquireAtCycle)
Compute the next cycle at which the given processor resource unit can be scheduled.
LLVM_ABI std::pair< unsigned, unsigned > getNextResourceCycle (const MCSchedClassDesc *SC, unsigned PIdx, unsigned ReleaseAtCycle, unsigned AcquireAtCycle)
Compute the next cycle at which the given processor resource can be scheduled.
bool isReservedGroup (unsigned PIdx) const
LLVM_ABI bool checkHazard (SUnit *SU)
Does this SU have a hazard within the current instruction group.
LLVM_ABI unsigned findMaxLatency (ArrayRef< SUnit * > ReadySUs)
LLVM_ABI unsigned getOtherResourceCount (unsigned &OtherCritIdx)
LLVM_ABI void releaseNode (SUnit *SU, unsigned ReadyCycle, bool InPQueue, unsigned Idx=0)
Release SU to make it ready.
LLVM_ABI void bumpCycle (unsigned NextCycle)
Move the boundary of scheduled code by one cycle.
LLVM_ABI void incExecutedResources (unsigned PIdx, unsigned Count)
LLVM_ABI unsigned countResource (const MCSchedClassDesc *SC, unsigned PIdx, unsigned Cycles, unsigned ReadyCycle, unsigned StartAtCycle)
Add the given processor resource to this scheduled zone.
LLVM_ABI void bumpNode (SUnit *SU)
Move the boundary of scheduled code by one SUnit.
LLVM_ABI void releasePending ()
Release pending ready nodes in to the available queue.
LLVM_ABI void removeReady (SUnit *SU)
Remove SU from the ready set for this boundary.
LLVM_ABI SUnit * pickOnlyChoice ()
Call this before applying any other heuristics to the Available queue.
LLVM_ABI void dumpReservedCycles () const
Dump the state of the information that tracks resource usage.
LLVM_ABI void dumpScheduledState () const
Public Attributes
ScheduleDAGMI * DAG = nullptr
const TargetSchedModel * SchedModel = nullptr
SchedRemainder * Rem = nullptr
ReadyQueue Available
ReadyQueue Pending
ScheduleHazardRecognizer * HazardRec = nullptr

Each Scheduling boundary is associated with ready queues.

It tracks the current cycle in the direction of movement, and maintains the state of "hazards" and other interlocks at the current cycle.

Definition at line 856 of file MachineScheduler.h.

anonymous enum

SchedBoundary() [2/2]

~SchedBoundary()

SchedBoundary::~SchedBoundary ( )

bumpCycle()

void SchedBoundary::bumpCycle ( unsigned NextCycle )

Move the boundary of scheduled code by one cycle.

Definition at line 2850 of file MachineScheduler.cpp.

References assert(), Available, checkResourceLimit(), llvm::dbgs(), getCriticalCount(), getScheduledLatency(), HazardRec, isTop(), LLVM_DEBUG, and SchedModel.

Referenced by bumpNode(), llvm::GCNSchedStrategy::pickNode(), and pickOnlyChoice().

bumpNode()

void SchedBoundary::bumpNode ( SUnit * SU )

Move the boundary of scheduled code by one SUnit.

Definition at line 2941 of file MachineScheduler.cpp.

References assert(), Available, llvm::SUnit::BotReadyCycle, bumpCycle(), checkResourceLimit(), countResource(), DAG, llvm::dbgs(), dumpScheduledState(), getCriticalCount(), llvm::SUnit::getDepth(), llvm::SUnit::getHeight(), llvm::SUnit::getInstr(), getNextResourceCycle(), getResourceCount(), llvm::ResourceSegments::getResourceIntervalBottom(), llvm::ResourceSegments::getResourceIntervalTop(), getScheduledLatency(), llvm::SUnit::hasReservedResource, HazardRec, llvm::SUnit::isCall, isTop(), llvm::SUnit::isUnbuffered, LLVM_DEBUG, MIResourceCutOff, llvm::SUnit::NodeNum, Rem, SchedModel, and llvm::SUnit::TopReadyCycle.

checkHazard()

bool SchedBoundary::checkHazard ( SUnit * SU )

Does this SU have a hazard within the current instruction group.

The scheduler supports two modes of hazard recognition. The first is the ScheduleHazardRecognizer API. It is a fully general hazard recognizer that supports highly complicated in-order reservation tables (ScoreboardHazardRecognizer) and arbitrary target-specific logic.

The second is a streamlined mechanism that checks for hazards based on simple counters that the scheduler itself maintains. It explicitly checks for instruction dispatch limitations, including the number of micro-ops that can dispatch per cycle.

TODO: Also check whether the SU must start a new group.

Definition at line 2700 of file MachineScheduler.cpp.

References DAG, llvm::dbgs(), llvm::SUnit::getInstr(), getNextResourceCycle(), llvm::SUnit::hasReservedResource, HazardRec, isTop(), LLVM_DEBUG, llvm::make_range(), llvm::SUnit::NodeNum, llvm::ScheduleHazardRecognizer::NoHazard, and SchedModel.

Referenced by llvm::GCNSchedStrategy::pickNode(), pickOnlyChoice(), and releaseNode().

countResource()

dumpReservedCycles()

dumpScheduledState()

findMaxLatency()

getCriticalCount()

unsigned llvm::SchedBoundary::getCriticalCount ( ) const inline

getCurrCycle()

unsigned llvm::SchedBoundary::getCurrCycle ( ) const inline

getCurrMOps()

unsigned llvm::SchedBoundary::getCurrMOps ( ) const inline

getDependentLatency()

unsigned llvm::SchedBoundary::getDependentLatency ( ) const inline

getExecutedCount()

unsigned llvm::SchedBoundary::getExecutedCount ( ) const inline

Get a scaled count for the minimum execution time of the scheduled micro-ops that are ready to execute by getExecutedCount.

Notice the feedback loop.

Definition at line 1019 of file MachineScheduler.h.

References SchedModel.

Referenced by dumpScheduledState().

getLatencyStallCycles()

getNextResourceCycle()

Compute the next cycle at which the given processor resource can be scheduled.

Returns the next cycle and the index of the processor resource instance in the reserved cycles vector.

Definition at line 2619 of file MachineScheduler.cpp.

References assert(), llvm::dbgs(), dumpReservedCycles(), getNextResourceCycle(), getNextResourceCycleByInstance(), I, InvalidCycle, isReservedGroup(), LLVM_DEBUG, llvm::make_range(), MischedDetailResourceBooking, and SchedModel.

Referenced by bumpNode(), checkHazard(), countResource(), and getNextResourceCycle().

getNextResourceCycleByInstance()

getOtherResourceCount()

getResourceCount()

getScheduledLatency()

unsigned llvm::SchedBoundary::getScheduledLatency ( ) const inline

Get the number of latency cycles "covered" by the scheduled instructions.

This is the larger of the critical path within the zone and the number of cycles required to issue the instructions.

Definition at line 996 of file MachineScheduler.h.

Referenced by bumpCycle(), bumpNode(), and llvm::tryLatency().

getUnscheduledLatency()

unsigned llvm::SchedBoundary::getUnscheduledLatency ( SUnit * SU) const inline

getZoneCritResIdx()

unsigned llvm::SchedBoundary::getZoneCritResIdx ( ) const inline

incExecutedResources()

init()

isReservedGroup()

bool llvm::SchedBoundary::isReservedGroup ( unsigned PIdx) const inline

isResourceLimited()

bool llvm::SchedBoundary::isResourceLimited ( ) const inline

isTop()

bool llvm::SchedBoundary::isTop ( ) const inline

Definition at line 980 of file MachineScheduler.h.

References Available, and TopQID.

Referenced by bumpCycle(), bumpNode(), checkHazard(), getLatencyStallCycles(), getNextResourceCycleByInstance(), getUnscheduledLatency(), llvm::GCNSchedStrategy::pickNodeFromQueue(), llvm::GenericScheduler::pickNodeFromQueue(), llvm::PostGenericScheduler::pickNodeFromQueue(), releasePending(), llvm::GCNMaxILPSchedStrategy::tryCandidate(), llvm::GCNMaxMemoryClauseSchedStrategy::tryCandidate(), llvm::GenericScheduler::tryCandidate(), llvm::PPCPreRASchedStrategy::tryCandidate(), and llvm::tryLatency().

operator=()

pickOnlyChoice()

SUnit * SchedBoundary::pickOnlyChoice ( )

Call this before applying any other heuristics to the Available queue.

If this queue only has one ready candidate, return it.

Updates the Available/Pending Q's if necessary and returns the single available instruction, or NULL if there are multiple candidates.

As a side effect, defer any nodes that now hit a hazard, and advance the cycle until at least one node is ready. If multiple instructions are ready, return NULL.

Definition at line 3147 of file MachineScheduler.cpp.

References Available, bumpCycle(), checkHazard(), I, LLVM_DEBUG, Pending, and releasePending().

Referenced by pickOnlyChoice().

releaseNode()

Release SU to make it ready.

If it's not in hazard, remove it from pending queue (if already in) and push into available queue. Otherwise, push the SU into pending queue.

Parameters

SU The unit to be released.
ReadyCycle Until which cycle the unit is ready.
InPQueue Whether SU is already in pending queue.
Idx Position offset in pending queue (if in it).

Definition at line 2802 of file MachineScheduler.cpp.

References assert(), Available, checkHazard(), llvm::dbgs(), llvm::SUnit::getInstr(), LLVM_DEBUG, llvm::SUnit::NodeNum, Pending, ReadyListLimit, and SchedModel.

Referenced by releasePending().

releasePending()

void SchedBoundary::releasePending ( )

Release pending ready nodes in to the available queue.

This makes them visible to heuristics.

Definition at line 3106 of file MachineScheduler.cpp.

References Available, llvm::SUnit::BotReadyCycle, llvm::dbgs(), I, isTop(), LLVM_DEBUG, llvm::SUnit::NodeNum, Pending, ReadyListLimit, releaseNode(), and llvm::SUnit::TopReadyCycle.

Referenced by llvm::GCNSchedStrategy::pickNode(), and pickOnlyChoice().

removeReady()

void SchedBoundary::removeReady ( SUnit * SU )

reset()

void SchedBoundary::reset ( )

Available

Definition at line 869 of file MachineScheduler.h.

Referenced by bumpCycle(), bumpNode(), computeRemLatency(), dumpScheduledState(), findMaxLatency(), getOtherResourceCount(), isTop(), llvm::GCNSchedStrategy::pickNodeFromQueue(), llvm::GenericScheduler::pickNodeFromQueue(), llvm::PostGenericScheduler::pickNodeFromQueue(), pickOnlyChoice(), releaseNode(), releasePending(), removeReady(), reset(), SchedBoundary(), llvm::GenericSchedulerBase::setPolicy(), and shouldCheckPending().

DAG

HazardRec

Pending

Rem

SchedModel

Definition at line 866 of file MachineScheduler.h.

Referenced by bumpCycle(), bumpNode(), checkHazard(), countResource(), dumpReservedCycles(), dumpScheduledState(), getCriticalCount(), getExecutedCount(), getNextResourceCycle(), getNextResourceCycleByInstance(), getOtherResourceCount(), init(), isReservedGroup(), and releaseNode().


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