18#include "llvm/Config/llvm-config.h"
28#define DEBUG_TYPE DebugType
32 const char *ParentDebugType)
33 : DebugType(ParentDebugType), ItinData(
II), DAG(SchedDAG) {
38 unsigned ScoreboardDepth = 1;
39 if (ItinData && !ItinData->isEmpty()) {
40 for (unsigned idx = 0; ; ++idx) {
41 if (ItinData->isEndMarker(idx))
44 const InstrStage *IS = ItinData->beginStage(idx);
45 const InstrStage *E = ItinData->endStage(idx);
46 unsigned CurCycle = 0;
47 unsigned ItinDepth = 0;
48 for (; IS != E; ++IS) {
49 unsigned StageDepth = CurCycle + IS->getCycles();
50 if (ItinDepth < StageDepth) ItinDepth = StageDepth;
51 CurCycle += IS->getNextCycles();
55 while (ItinDepth > ScoreboardDepth) {
60 MaxLookAhead = ScoreboardDepth;
65 ReservedScoreboard.reset(ScoreboardDepth);
66 RequiredScoreboard.reset(ScoreboardDepth);
73 IssueWidth = ItinData->SchedModel.IssueWidth;
74 LLVM_DEBUG(
dbgs() <<
"Using scoreboard hazard recognizer: Depth = "
75 << ScoreboardDepth <<
'\n');
81 RequiredScoreboard.reset();
82 ReservedScoreboard.reset();
85#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
87 dbgs() <<
"Scoreboard:\n";
89 unsigned last =
Depth - 1;
90 while ((last > 0) && ((*
this)[last] == 0))
93 for (
unsigned i = 0; i <= last; i++) {
96 for (
int j = std::numeric_limits<InstrStage::FuncUnits>::digits - 1;
98 dbgs() << ((FUs & (1ULL << j)) ?
'1' :
'0');
108 return IssueCount == IssueWidth;
113 if (!ItinData || ItinData->isEmpty())
127 unsigned idx =
MCID->getSchedClass();
128 for (
const InstrStage *IS = ItinData->beginStage(idx),
129 *E = ItinData->endStage(idx); IS != E; ++IS) {
133 for (
unsigned int i = 0; i < IS->getCycles(); ++i) {
134 int StageCycle = cycle + (int)i;
138 if (StageCycle >= (
int)RequiredScoreboard.getDepth()) {
139 assert((StageCycle - Stalls) < (
int)RequiredScoreboard.getDepth() &&
140 "Scoreboard depth exceeded!");
146 switch (IS->getReservationKind()) {
149 freeUnits &= ~ReservedScoreboard[StageCycle];
153 freeUnits &= ~RequiredScoreboard[StageCycle];
158 LLVM_DEBUG(
dbgs() <<
"*** Hazard in cycle +" << StageCycle <<
", ");
165 cycle += IS->getNextCycles();
172 if (!ItinData || ItinData->isEmpty())
178 assert(
MCID &&
"The scheduler must filter non-machineinstrs");
179 if (DAG->TII->isZeroCost(
MCID->Opcode))
186 unsigned idx =
MCID->getSchedClass();
187 for (
const InstrStage *IS = ItinData->beginStage(idx),
188 *E = ItinData->endStage(idx); IS != E; ++IS) {
192 for (
unsigned int i = 0; i < IS->getCycles(); ++i) {
193 assert(((cycle + i) < RequiredScoreboard.getDepth()) &&
194 "Scoreboard depth exceeded!");
197 switch (IS->getReservationKind()) {
200 freeUnits &= ~ReservedScoreboard[cycle + i];
204 freeUnits &= ~RequiredScoreboard[cycle + i];
211 freeUnit = freeUnits;
212 freeUnits = freeUnit & (freeUnit - 1);
216 RequiredScoreboard[cycle + i] |= freeUnit;
218 ReservedScoreboard[cycle + i] |= freeUnit;
222 cycle += IS->getNextCycles();
231 ReservedScoreboard[0] = 0; ReservedScoreboard.advance();
232 RequiredScoreboard[0] = 0; RequiredScoreboard.advance();
237 ReservedScoreboard[ReservedScoreboard.getDepth()-1] = 0;
238 ReservedScoreboard.recede();
239 RequiredScoreboard[RequiredScoreboard.getDepth()-1] = 0;
240 RequiredScoreboard.recede();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
uint64_t IntrinsicInst * II
Itinerary data supplied by a subtarget to be used by a target.
Describe properties that are true of each instruction in the target description file.
Scheduling unit. This is a node in the scheduling DAG.
void Reset() override
Reset - This callback is invoked when a new block of instructions is about to be schedule.
void EmitInstruction(SUnit *SU) override
EmitInstruction - This callback is invoked when an instruction is emitted, to advance the hazard stat...
void RecedeCycle() override
RecedeCycle - This callback is invoked whenever the next bottom-up instruction to be scheduled cannot...
HazardType getHazardType(SUnit *SU, int Stalls) override
getHazardType - Return the hazard type of emitting this node.
ScoreboardHazardRecognizer(const InstrItineraryData *II, const ScheduleDAG *DAG, const char *ParentDebugType="")
bool atIssueLimit() const override
atIssueLimit - Return true if no more instructions may be issued in this cycle.
void AdvanceCycle() override
AdvanceCycle - This callback is invoked whenever the next top-down instruction to be scheduled cannot...
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.
These values represent a non-pipelined step in the execution of an instruction.
uint64_t FuncUnits
Bitmask representing a set of functional units.