21 #define DEBUG_TYPE "pre-RA-sched"
38 STATISTIC(NumNoops ,
"Number of noops inserted");
39 STATISTIC(NumStalls,
"Number of pipeline stalls");
60 std::vector<SUnit*> PendingQueue;
80 delete AvailableQueue;
86 void releaseSucc(
SUnit *SU,
const SDep &D);
87 void releaseSuccessors(
SUnit *SU);
88 void scheduleNodeTopDown(
SUnit *SU,
unsigned CurCycle);
89 void listScheduleTopDown();
94 void ScheduleDAGVLIW::Schedule() {
96 <<
"********** List Scheduling BB#" << BB->getNumber()
97 <<
" '" << BB->getName() <<
"' **********\n");
102 AvailableQueue->initNodes(SUnits);
104 listScheduleTopDown();
106 AvailableQueue->releaseState();
115 void ScheduleDAGVLIW::releaseSucc(
SUnit *SU,
const SDep &D) {
120 dbgs() <<
"*** Scheduling failed! ***\n";
122 dbgs() <<
" has been released too many times!\n";
126 assert(!D.
isWeak() &&
"unexpected artificial DAG edge");
135 PendingQueue.push_back(SuccSU);
139 void ScheduleDAGVLIW::releaseSuccessors(
SUnit *SU) {
143 assert(!
I->isAssignedRegDep() &&
144 "The list-td scheduler doesn't yet support physreg dependencies!");
153 void ScheduleDAGVLIW::scheduleNodeTopDown(
SUnit *SU,
unsigned CurCycle) {
154 DEBUG(
dbgs() <<
"*** Scheduling [" << CurCycle <<
"]: ");
158 assert(CurCycle >= SU->
getDepth() &&
"Node scheduled above its depth!");
161 releaseSuccessors(SU);
163 AvailableQueue->scheduledNode(SU);
168 void ScheduleDAGVLIW::listScheduleTopDown() {
169 unsigned CurCycle = 0;
172 releaseSuccessors(&EntrySU);
175 for (
unsigned i = 0, e = SUnits.size(); i != e; ++i) {
177 if (SUnits[i].Preds.empty()) {
178 AvailableQueue->push(&SUnits[i]);
179 SUnits[i].isAvailable =
true;
185 std::vector<SUnit*> NotReady;
187 while (!AvailableQueue->empty() || !PendingQueue.empty()) {
190 for (
unsigned i = 0, e = PendingQueue.size(); i != e; ++i) {
191 if (PendingQueue[i]->getDepth() == CurCycle) {
192 AvailableQueue->push(PendingQueue[i]);
193 PendingQueue[i]->isAvailable =
true;
194 PendingQueue[i] = PendingQueue.back();
195 PendingQueue.pop_back();
199 assert(PendingQueue[i]->getDepth() > CurCycle &&
"Negative latency?");
205 if (AvailableQueue->empty()) {
207 AvailableQueue->scheduledNode(0);
212 SUnit *FoundSUnit = 0;
214 bool HasNoopHazards =
false;
215 while (!AvailableQueue->empty()) {
216 SUnit *CurSUnit = AvailableQueue->pop();
219 HazardRec->getHazardType(CurSUnit, 0);
221 FoundSUnit = CurSUnit;
228 NotReady.push_back(CurSUnit);
232 if (!NotReady.empty()) {
233 AvailableQueue->push_all(NotReady);
239 scheduleNodeTopDown(FoundSUnit, CurCycle);
240 HazardRec->EmitInstruction(FoundSUnit);
246 }
else if (!HasNoopHazards) {
249 DEBUG(
dbgs() <<
"*** Advancing cycle, no work to do\n");
250 HazardRec->AdvanceCycle();
258 HazardRec->EmitNoop();
266 VerifyScheduledSequence(
false);
#define llvm_unreachable(msg)
static RegisterScheduler VLIWScheduler("vliw-td","VLIW scheduler", createVLIWDAGScheduler)
Sequence
A sequence of states that a pointer may go through in which an objc_retain and objc_release are actua...
void setDepthToAtLeast(unsigned NewDepth)
ScheduleDAGSDNodes * createVLIWDAGScheduler(SelectionDAGISel *IS, CodeGenOpt::Level OptLevel)
createVLIWDAGScheduler - This creates a top-down list scheduler.
unsigned getLatency() const
virtual const TargetInstrInfo * getInstrInfo() const
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
virtual ScheduleHazardRecognizer * CreateTargetHazardRecognizer(const TargetMachine *TM, const ScheduleDAG *DAG) const
unsigned getDepth() const
const TargetMachine & getTarget() const
STATISTIC(NumNoops,"Number of noops inserted")
SmallVector< SDep, 4 > Succs
void dump(const ScheduleDAG *G) const
SUnit - Scheduling unit. This is a node in the scheduling DAG.