1 //===- MachineScheduler.cpp - Machine Instruction Scheduler ---------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // MachineScheduler schedules machine instructions after phi elimination. It 11 // preserves LiveIntervals so it can be invoked before register allocation. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #define DEBUG_TYPE "misched" 16 17 #include "RegisterPressure.h" 18 #include "llvm/CodeGen/LiveIntervalAnalysis.h" 19 #include "llvm/CodeGen/MachineScheduler.h" 20 #include "llvm/CodeGen/Passes.h" 21 #include "llvm/CodeGen/ScheduleDAGInstrs.h" 22 #include "llvm/Analysis/AliasAnalysis.h" 23 #include "llvm/Target/TargetInstrInfo.h" 24 #include "llvm/Support/CommandLine.h" 25 #include "llvm/Support/Debug.h" 26 #include "llvm/Support/ErrorHandling.h" 27 #include "llvm/Support/raw_ostream.h" 28 #include "llvm/ADT/OwningPtr.h" 29 #include "llvm/ADT/PriorityQueue.h" 30 31 #include <queue> 32 33 using namespace llvm; 34 35 static cl::opt<bool> ForceTopDown("misched-topdown", cl::Hidden, 36 cl::desc("Force top-down list scheduling")); 37 static cl::opt<bool> ForceBottomUp("misched-bottomup", cl::Hidden, 38 cl::desc("Force bottom-up list scheduling")); 39 40 #ifndef NDEBUG 41 static cl::opt<bool> ViewMISchedDAGs("view-misched-dags", cl::Hidden, 42 cl::desc("Pop up a window to show MISched dags after they are processed")); 43 44 static cl::opt<unsigned> MISchedCutoff("misched-cutoff", cl::Hidden, 45 cl::desc("Stop scheduling after N instructions"), cl::init(~0U)); 46 #else 47 static bool ViewMISchedDAGs = false; 48 #endif // NDEBUG 49 50 //===----------------------------------------------------------------------===// 51 // Machine Instruction Scheduling Pass and Registry 52 //===----------------------------------------------------------------------===// 53 54 namespace { 55 /// MachineScheduler runs after coalescing and before register allocation. 56 class MachineScheduler : public MachineSchedContext, 57 public MachineFunctionPass { 58 public: 59 MachineScheduler(); 60 61 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 62 63 virtual void releaseMemory() {} 64 65 virtual bool runOnMachineFunction(MachineFunction&); 66 67 virtual void print(raw_ostream &O, const Module* = 0) const; 68 69 static char ID; // Class identification, replacement for typeinfo 70 }; 71 } // namespace 72 73 char MachineScheduler::ID = 0; 74 75 char &llvm::MachineSchedulerID = MachineScheduler::ID; 76 77 INITIALIZE_PASS_BEGIN(MachineScheduler, "misched", 78 "Machine Instruction Scheduler", false, false) 79 INITIALIZE_AG_DEPENDENCY(AliasAnalysis) 80 INITIALIZE_PASS_DEPENDENCY(SlotIndexes) 81 INITIALIZE_PASS_DEPENDENCY(LiveIntervals) 82 INITIALIZE_PASS_END(MachineScheduler, "misched", 83 "Machine Instruction Scheduler", false, false) 84 85 MachineScheduler::MachineScheduler() 86 : MachineFunctionPass(ID) { 87 initializeMachineSchedulerPass(*PassRegistry::getPassRegistry()); 88 } 89 90 void MachineScheduler::getAnalysisUsage(AnalysisUsage &AU) const { 91 AU.setPreservesCFG(); 92 AU.addRequiredID(MachineDominatorsID); 93 AU.addRequired<MachineLoopInfo>(); 94 AU.addRequired<AliasAnalysis>(); 95 AU.addRequired<TargetPassConfig>(); 96 AU.addRequired<SlotIndexes>(); 97 AU.addPreserved<SlotIndexes>(); 98 AU.addRequired<LiveIntervals>(); 99 AU.addPreserved<LiveIntervals>(); 100 MachineFunctionPass::getAnalysisUsage(AU); 101 } 102 103 MachinePassRegistry MachineSchedRegistry::Registry; 104 105 /// A dummy default scheduler factory indicates whether the scheduler 106 /// is overridden on the command line. 107 static ScheduleDAGInstrs *useDefaultMachineSched(MachineSchedContext *C) { 108 return 0; 109 } 110 111 /// MachineSchedOpt allows command line selection of the scheduler. 112 static cl::opt<MachineSchedRegistry::ScheduleDAGCtor, false, 113 RegisterPassParser<MachineSchedRegistry> > 114 MachineSchedOpt("misched", 115 cl::init(&useDefaultMachineSched), cl::Hidden, 116 cl::desc("Machine instruction scheduler to use")); 117 118 static MachineSchedRegistry 119 DefaultSchedRegistry("default", "Use the target's default scheduler choice.", 120 useDefaultMachineSched); 121 122 /// Forward declare the standard machine scheduler. This will be used as the 123 /// default scheduler if the target does not set a default. 124 static ScheduleDAGInstrs *createConvergingSched(MachineSchedContext *C); 125 126 127 /// Decrement this iterator until reaching the top or a non-debug instr. 128 static MachineBasicBlock::iterator 129 priorNonDebug(MachineBasicBlock::iterator I, MachineBasicBlock::iterator Beg) { 130 assert(I != Beg && "reached the top of the region, cannot decrement"); 131 while (--I != Beg) { 132 if (!I->isDebugValue()) 133 break; 134 } 135 return I; 136 } 137 138 /// If this iterator is a debug value, increment until reaching the End or a 139 /// non-debug instruction. 140 static MachineBasicBlock::iterator 141 nextIfDebug(MachineBasicBlock::iterator I, MachineBasicBlock::iterator End) { 142 while(I != End) { 143 if (!I->isDebugValue()) 144 break; 145 } 146 return I; 147 } 148 149 /// Top-level MachineScheduler pass driver. 150 /// 151 /// Visit blocks in function order. Divide each block into scheduling regions 152 /// and visit them bottom-up. Visiting regions bottom-up is not required, but is 153 /// consistent with the DAG builder, which traverses the interior of the 154 /// scheduling regions bottom-up. 155 /// 156 /// This design avoids exposing scheduling boundaries to the DAG builder, 157 /// simplifying the DAG builder's support for "special" target instructions. 158 /// At the same time the design allows target schedulers to operate across 159 /// scheduling boundaries, for example to bundle the boudary instructions 160 /// without reordering them. This creates complexity, because the target 161 /// scheduler must update the RegionBegin and RegionEnd positions cached by 162 /// ScheduleDAGInstrs whenever adding or removing instructions. A much simpler 163 /// design would be to split blocks at scheduling boundaries, but LLVM has a 164 /// general bias against block splitting purely for implementation simplicity. 165 bool MachineScheduler::runOnMachineFunction(MachineFunction &mf) { 166 // Initialize the context of the pass. 167 MF = &mf; 168 MLI = &getAnalysis<MachineLoopInfo>(); 169 MDT = &getAnalysis<MachineDominatorTree>(); 170 PassConfig = &getAnalysis<TargetPassConfig>(); 171 AA = &getAnalysis<AliasAnalysis>(); 172 173 LIS = &getAnalysis<LiveIntervals>(); 174 const TargetInstrInfo *TII = MF->getTarget().getInstrInfo(); 175 176 RegClassInfo.runOnMachineFunction(*MF); 177 178 // Select the scheduler, or set the default. 179 MachineSchedRegistry::ScheduleDAGCtor Ctor = MachineSchedOpt; 180 if (Ctor == useDefaultMachineSched) { 181 // Get the default scheduler set by the target. 182 Ctor = MachineSchedRegistry::getDefault(); 183 if (!Ctor) { 184 Ctor = createConvergingSched; 185 MachineSchedRegistry::setDefault(Ctor); 186 } 187 } 188 // Instantiate the selected scheduler. 189 OwningPtr<ScheduleDAGInstrs> Scheduler(Ctor(this)); 190 191 // Visit all machine basic blocks. 192 // 193 // TODO: Visit blocks in global postorder or postorder within the bottom-up 194 // loop tree. Then we can optionally compute global RegPressure. 195 for (MachineFunction::iterator MBB = MF->begin(), MBBEnd = MF->end(); 196 MBB != MBBEnd; ++MBB) { 197 198 Scheduler->startBlock(MBB); 199 200 // Break the block into scheduling regions [I, RegionEnd), and schedule each 201 // region as soon as it is discovered. RegionEnd points the the scheduling 202 // boundary at the bottom of the region. The DAG does not include RegionEnd, 203 // but the region does (i.e. the next RegionEnd is above the previous 204 // RegionBegin). If the current block has no terminator then RegionEnd == 205 // MBB->end() for the bottom region. 206 // 207 // The Scheduler may insert instructions during either schedule() or 208 // exitRegion(), even for empty regions. So the local iterators 'I' and 209 // 'RegionEnd' are invalid across these calls. 210 unsigned RemainingCount = MBB->size(); 211 for(MachineBasicBlock::iterator RegionEnd = MBB->end(); 212 RegionEnd != MBB->begin(); RegionEnd = Scheduler->begin()) { 213 214 // Avoid decrementing RegionEnd for blocks with no terminator. 215 if (RegionEnd != MBB->end() 216 || TII->isSchedulingBoundary(llvm::prior(RegionEnd), MBB, *MF)) { 217 --RegionEnd; 218 // Count the boundary instruction. 219 --RemainingCount; 220 } 221 222 // The next region starts above the previous region. Look backward in the 223 // instruction stream until we find the nearest boundary. 224 MachineBasicBlock::iterator I = RegionEnd; 225 for(;I != MBB->begin(); --I, --RemainingCount) { 226 if (TII->isSchedulingBoundary(llvm::prior(I), MBB, *MF)) 227 break; 228 } 229 // Notify the scheduler of the region, even if we may skip scheduling 230 // it. Perhaps it still needs to be bundled. 231 Scheduler->enterRegion(MBB, I, RegionEnd, RemainingCount); 232 233 // Skip empty scheduling regions (0 or 1 schedulable instructions). 234 if (I == RegionEnd || I == llvm::prior(RegionEnd)) { 235 // Close the current region. Bundle the terminator if needed. 236 // This invalidates 'RegionEnd' and 'I'. 237 Scheduler->exitRegion(); 238 continue; 239 } 240 DEBUG(dbgs() << "MachineScheduling " << MF->getFunction()->getName() 241 << ":BB#" << MBB->getNumber() << "\n From: " << *I << " To: "; 242 if (RegionEnd != MBB->end()) dbgs() << *RegionEnd; 243 else dbgs() << "End"; 244 dbgs() << " Remaining: " << RemainingCount << "\n"); 245 246 // Schedule a region: possibly reorder instructions. 247 // This invalidates 'RegionEnd' and 'I'. 248 Scheduler->schedule(); 249 250 // Close the current region. 251 Scheduler->exitRegion(); 252 253 // Scheduling has invalidated the current iterator 'I'. Ask the 254 // scheduler for the top of it's scheduled region. 255 RegionEnd = Scheduler->begin(); 256 } 257 assert(RemainingCount == 0 && "Instruction count mismatch!"); 258 Scheduler->finishBlock(); 259 } 260 Scheduler->finalizeSchedule(); 261 DEBUG(LIS->print(dbgs())); 262 return true; 263 } 264 265 void MachineScheduler::print(raw_ostream &O, const Module* m) const { 266 // unimplemented 267 } 268 269 //===----------------------------------------------------------------------===// 270 // MachineSchedStrategy - Interface to a machine scheduling algorithm. 271 //===----------------------------------------------------------------------===// 272 273 namespace { 274 class ScheduleDAGMI; 275 276 /// MachineSchedStrategy - Interface used by ScheduleDAGMI to drive the selected 277 /// scheduling algorithm. 278 /// 279 /// If this works well and targets wish to reuse ScheduleDAGMI, we may expose it 280 /// in ScheduleDAGInstrs.h 281 class MachineSchedStrategy { 282 public: 283 virtual ~MachineSchedStrategy() {} 284 285 /// Initialize the strategy after building the DAG for a new region. 286 virtual void initialize(ScheduleDAGMI *DAG) = 0; 287 288 /// Pick the next node to schedule, or return NULL. Set IsTopNode to true to 289 /// schedule the node at the top of the unscheduled region. Otherwise it will 290 /// be scheduled at the bottom. 291 virtual SUnit *pickNode(bool &IsTopNode) = 0; 292 293 /// When all predecessor dependencies have been resolved, free this node for 294 /// top-down scheduling. 295 virtual void releaseTopNode(SUnit *SU) = 0; 296 /// When all successor dependencies have been resolved, free this node for 297 /// bottom-up scheduling. 298 virtual void releaseBottomNode(SUnit *SU) = 0; 299 }; 300 } // namespace 301 302 //===----------------------------------------------------------------------===// 303 // ScheduleDAGMI - Base class for MachineInstr scheduling with LiveIntervals 304 // preservation. 305 //===----------------------------------------------------------------------===// 306 307 namespace { 308 /// ScheduleDAGMI is an implementation of ScheduleDAGInstrs that schedules 309 /// machine instructions while updating LiveIntervals. 310 class ScheduleDAGMI : public ScheduleDAGInstrs { 311 AliasAnalysis *AA; 312 RegisterClassInfo *RegClassInfo; 313 MachineSchedStrategy *SchedImpl; 314 315 // Register pressure in this region computed by buildSchedGraph. 316 IntervalPressure RegPressure; 317 RegPressureTracker RPTracker; 318 319 /// The top of the unscheduled zone. 320 MachineBasicBlock::iterator CurrentTop; 321 322 /// The bottom of the unscheduled zone. 323 MachineBasicBlock::iterator CurrentBottom; 324 325 /// The number of instructions scheduled so far. Used to cut off the 326 /// scheduler at the point determined by misched-cutoff. 327 unsigned NumInstrsScheduled; 328 public: 329 ScheduleDAGMI(MachineSchedContext *C, MachineSchedStrategy *S): 330 ScheduleDAGInstrs(*C->MF, *C->MLI, *C->MDT, /*IsPostRA=*/false, C->LIS), 331 AA(C->AA), RegClassInfo(&C->RegClassInfo), SchedImpl(S), 332 RPTracker(RegPressure), CurrentTop(), CurrentBottom(), 333 NumInstrsScheduled(0) {} 334 335 ~ScheduleDAGMI() { 336 delete SchedImpl; 337 } 338 339 MachineBasicBlock::iterator top() const { return CurrentTop; } 340 MachineBasicBlock::iterator bottom() const { return CurrentBottom; } 341 342 /// Implement the ScheduleDAGInstrs interface for handling the next scheduling 343 /// region. This covers all instructions in a block, while schedule() may only 344 /// cover a subset. 345 void enterRegion(MachineBasicBlock *bb, 346 MachineBasicBlock::iterator begin, 347 MachineBasicBlock::iterator end, 348 unsigned endcount); 349 350 /// Implement ScheduleDAGInstrs interface for scheduling a sequence of 351 /// reorderable instructions. 352 void schedule(); 353 354 protected: 355 void moveInstruction(MachineInstr *MI, MachineBasicBlock::iterator InsertPos); 356 bool checkSchedLimit(); 357 358 void releaseSucc(SUnit *SU, SDep *SuccEdge); 359 void releaseSuccessors(SUnit *SU); 360 void releasePred(SUnit *SU, SDep *PredEdge); 361 void releasePredecessors(SUnit *SU); 362 363 void placeDebugValues(); 364 }; 365 } // namespace 366 367 /// ReleaseSucc - Decrement the NumPredsLeft count of a successor. When 368 /// NumPredsLeft reaches zero, release the successor node. 369 void ScheduleDAGMI::releaseSucc(SUnit *SU, SDep *SuccEdge) { 370 SUnit *SuccSU = SuccEdge->getSUnit(); 371 372 #ifndef NDEBUG 373 if (SuccSU->NumPredsLeft == 0) { 374 dbgs() << "*** Scheduling failed! ***\n"; 375 SuccSU->dump(this); 376 dbgs() << " has been released too many times!\n"; 377 llvm_unreachable(0); 378 } 379 #endif 380 --SuccSU->NumPredsLeft; 381 if (SuccSU->NumPredsLeft == 0 && SuccSU != &ExitSU) 382 SchedImpl->releaseTopNode(SuccSU); 383 } 384 385 /// releaseSuccessors - Call releaseSucc on each of SU's successors. 386 void ScheduleDAGMI::releaseSuccessors(SUnit *SU) { 387 for (SUnit::succ_iterator I = SU->Succs.begin(), E = SU->Succs.end(); 388 I != E; ++I) { 389 releaseSucc(SU, &*I); 390 } 391 } 392 393 /// ReleasePred - Decrement the NumSuccsLeft count of a predecessor. When 394 /// NumSuccsLeft reaches zero, release the predecessor node. 395 void ScheduleDAGMI::releasePred(SUnit *SU, SDep *PredEdge) { 396 SUnit *PredSU = PredEdge->getSUnit(); 397 398 #ifndef NDEBUG 399 if (PredSU->NumSuccsLeft == 0) { 400 dbgs() << "*** Scheduling failed! ***\n"; 401 PredSU->dump(this); 402 dbgs() << " has been released too many times!\n"; 403 llvm_unreachable(0); 404 } 405 #endif 406 --PredSU->NumSuccsLeft; 407 if (PredSU->NumSuccsLeft == 0 && PredSU != &EntrySU) 408 SchedImpl->releaseBottomNode(PredSU); 409 } 410 411 /// releasePredecessors - Call releasePred on each of SU's predecessors. 412 void ScheduleDAGMI::releasePredecessors(SUnit *SU) { 413 for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end(); 414 I != E; ++I) { 415 releasePred(SU, &*I); 416 } 417 } 418 419 void ScheduleDAGMI::moveInstruction(MachineInstr *MI, 420 MachineBasicBlock::iterator InsertPos) { 421 // Fix RegionBegin if the first instruction moves down. 422 if (&*RegionBegin == MI) 423 RegionBegin = llvm::next(RegionBegin); 424 BB->splice(InsertPos, BB, MI); 425 LIS->handleMove(MI); 426 // Fix RegionBegin if another instruction moves above the first instruction. 427 if (RegionBegin == InsertPos) 428 RegionBegin = MI; 429 } 430 431 bool ScheduleDAGMI::checkSchedLimit() { 432 #ifndef NDEBUG 433 if (NumInstrsScheduled == MISchedCutoff && MISchedCutoff != ~0U) { 434 CurrentTop = CurrentBottom; 435 return false; 436 } 437 ++NumInstrsScheduled; 438 #endif 439 return true; 440 } 441 442 /// enterRegion - Called back from MachineScheduler::runOnMachineFunction after 443 /// crossing a scheduling boundary. [begin, end) includes all instructions in 444 /// the region, including the boundary itself and single-instruction regions 445 /// that don't get scheduled. 446 void ScheduleDAGMI::enterRegion(MachineBasicBlock *bb, 447 MachineBasicBlock::iterator begin, 448 MachineBasicBlock::iterator end, 449 unsigned endcount) 450 { 451 ScheduleDAGInstrs::enterRegion(bb, begin, end, endcount); 452 // Setup the register pressure tracker to begin tracking at the end of this 453 // region. 454 RPTracker.init(&MF, RegClassInfo, LIS, BB, end); 455 } 456 457 /// schedule - Called back from MachineScheduler::runOnMachineFunction 458 /// after setting up the current scheduling region. [RegionBegin, RegionEnd) 459 /// only includes instructions that have DAG nodes, not scheduling boundaries. 460 void ScheduleDAGMI::schedule() { 461 while(RPTracker.getPos() != RegionEnd) { 462 bool Moved = RPTracker.recede(); 463 assert(Moved && "Regpressure tracker cannot find RegionEnd"); (void)Moved; 464 } 465 466 // Build the DAG. 467 buildSchedGraph(AA, &RPTracker); 468 469 DEBUG(dbgs() << "********** MI Scheduling **********\n"); 470 DEBUG(for (unsigned su = 0, e = SUnits.size(); su != e; ++su) 471 SUnits[su].dumpAll(this)); 472 473 if (ViewMISchedDAGs) viewGraph(); 474 475 SchedImpl->initialize(this); 476 477 // Release edges from the special Entry node or to the special Exit node. 478 releaseSuccessors(&EntrySU); 479 releasePredecessors(&ExitSU); 480 481 // Release all DAG roots for scheduling. 482 for (std::vector<SUnit>::iterator I = SUnits.begin(), E = SUnits.end(); 483 I != E; ++I) { 484 // A SUnit is ready to top schedule if it has no predecessors. 485 if (I->Preds.empty()) 486 SchedImpl->releaseTopNode(&(*I)); 487 // A SUnit is ready to bottom schedule if it has no successors. 488 if (I->Succs.empty()) 489 SchedImpl->releaseBottomNode(&(*I)); 490 } 491 492 CurrentTop = nextIfDebug(RegionBegin, RegionEnd); 493 CurrentBottom = RegionEnd; 494 bool IsTopNode = false; 495 while (SUnit *SU = SchedImpl->pickNode(IsTopNode)) { 496 DEBUG(dbgs() << "*** " << (IsTopNode ? "Top" : "Bottom") 497 << " Scheduling Instruction:\n"; SU->dump(this)); 498 if (!checkSchedLimit()) 499 break; 500 501 // Move the instruction to its new location in the instruction stream. 502 MachineInstr *MI = SU->getInstr(); 503 504 if (IsTopNode) { 505 assert(SU->isTopReady() && "node still has unscheduled dependencies"); 506 if (&*CurrentTop == MI) 507 CurrentTop = nextIfDebug(++CurrentTop, CurrentBottom); 508 else 509 moveInstruction(MI, CurrentTop); 510 // Release dependent instructions for scheduling. 511 releaseSuccessors(SU); 512 } 513 else { 514 assert(SU->isBottomReady() && "node still has unscheduled dependencies"); 515 MachineBasicBlock::iterator priorII = 516 priorNonDebug(CurrentBottom, CurrentTop); 517 if (&*priorII == MI) 518 CurrentBottom = priorII; 519 else { 520 if (&*CurrentTop == MI) 521 CurrentTop = nextIfDebug(++CurrentTop, CurrentBottom); 522 moveInstruction(MI, CurrentBottom); 523 CurrentBottom = MI; 524 } 525 // Release dependent instructions for scheduling. 526 releasePredecessors(SU); 527 } 528 SU->isScheduled = true; 529 } 530 assert(CurrentTop == CurrentBottom && "Nonempty unscheduled zone."); 531 532 placeDebugValues(); 533 } 534 535 /// Reinsert any remaining debug_values, just like the PostRA scheduler. 536 void ScheduleDAGMI::placeDebugValues() { 537 // If first instruction was a DBG_VALUE then put it back. 538 if (FirstDbgValue) { 539 BB->splice(RegionBegin, BB, FirstDbgValue); 540 RegionBegin = FirstDbgValue; 541 } 542 543 for (std::vector<std::pair<MachineInstr *, MachineInstr *> >::iterator 544 DI = DbgValues.end(), DE = DbgValues.begin(); DI != DE; --DI) { 545 std::pair<MachineInstr *, MachineInstr *> P = *prior(DI); 546 MachineInstr *DbgValue = P.first; 547 MachineBasicBlock::iterator OrigPrevMI = P.second; 548 BB->splice(++OrigPrevMI, BB, DbgValue); 549 if (OrigPrevMI == llvm::prior(RegionEnd)) 550 RegionEnd = DbgValue; 551 } 552 DbgValues.clear(); 553 FirstDbgValue = NULL; 554 } 555 556 //===----------------------------------------------------------------------===// 557 // ConvergingScheduler - Implementation of the standard MachineSchedStrategy. 558 //===----------------------------------------------------------------------===// 559 560 namespace { 561 /// ConvergingScheduler shrinks the unscheduled zone using heuristics to balance 562 /// the schedule. 563 class ConvergingScheduler : public MachineSchedStrategy { 564 ScheduleDAGMI *DAG; 565 566 unsigned NumTopReady; 567 unsigned NumBottomReady; 568 569 public: 570 virtual void initialize(ScheduleDAGMI *dag) { 571 DAG = dag; 572 573 assert((!ForceTopDown || !ForceBottomUp) && 574 "-misched-topdown incompatible with -misched-bottomup"); 575 } 576 577 virtual SUnit *pickNode(bool &IsTopNode) { 578 if (DAG->top() == DAG->bottom()) 579 return NULL; 580 581 // As an initial placeholder heuristic, schedule in the direction that has 582 // the fewest choices. 583 SUnit *SU; 584 if (ForceTopDown || (!ForceBottomUp && NumTopReady <= NumBottomReady)) { 585 SU = DAG->getSUnit(DAG->top()); 586 IsTopNode = true; 587 } 588 else { 589 SU = DAG->getSUnit(priorNonDebug(DAG->bottom(), DAG->top())); 590 IsTopNode = false; 591 } 592 if (SU->isTopReady()) { 593 assert(NumTopReady > 0 && "bad ready count"); 594 --NumTopReady; 595 } 596 if (SU->isBottomReady()) { 597 assert(NumBottomReady > 0 && "bad ready count"); 598 --NumBottomReady; 599 } 600 return SU; 601 } 602 603 virtual void releaseTopNode(SUnit *SU) { 604 ++NumTopReady; 605 } 606 virtual void releaseBottomNode(SUnit *SU) { 607 ++NumBottomReady; 608 } 609 }; 610 } // namespace 611 612 /// Create the standard converging machine scheduler. This will be used as the 613 /// default scheduler if the target does not set a default. 614 static ScheduleDAGInstrs *createConvergingSched(MachineSchedContext *C) { 615 assert((!ForceTopDown || !ForceBottomUp) && 616 "-misched-topdown incompatible with -misched-bottomup"); 617 return new ScheduleDAGMI(C, new ConvergingScheduler()); 618 } 619 static MachineSchedRegistry 620 ConvergingSchedRegistry("converge", "Standard converging scheduler.", 621 createConvergingSched); 622 623 //===----------------------------------------------------------------------===// 624 // Machine Instruction Shuffler for Correctness Testing 625 //===----------------------------------------------------------------------===// 626 627 #ifndef NDEBUG 628 namespace { 629 /// Apply a less-than relation on the node order, which corresponds to the 630 /// instruction order prior to scheduling. IsReverse implements greater-than. 631 template<bool IsReverse> 632 struct SUnitOrder { 633 bool operator()(SUnit *A, SUnit *B) const { 634 if (IsReverse) 635 return A->NodeNum > B->NodeNum; 636 else 637 return A->NodeNum < B->NodeNum; 638 } 639 }; 640 641 /// Reorder instructions as much as possible. 642 class InstructionShuffler : public MachineSchedStrategy { 643 bool IsAlternating; 644 bool IsTopDown; 645 646 // Using a less-than relation (SUnitOrder<false>) for the TopQ priority 647 // gives nodes with a higher number higher priority causing the latest 648 // instructions to be scheduled first. 649 PriorityQueue<SUnit*, std::vector<SUnit*>, SUnitOrder<false> > 650 TopQ; 651 // When scheduling bottom-up, use greater-than as the queue priority. 652 PriorityQueue<SUnit*, std::vector<SUnit*>, SUnitOrder<true> > 653 BottomQ; 654 public: 655 InstructionShuffler(bool alternate, bool topdown) 656 : IsAlternating(alternate), IsTopDown(topdown) {} 657 658 virtual void initialize(ScheduleDAGMI *) { 659 TopQ.clear(); 660 BottomQ.clear(); 661 } 662 663 /// Implement MachineSchedStrategy interface. 664 /// ----------------------------------------- 665 666 virtual SUnit *pickNode(bool &IsTopNode) { 667 SUnit *SU; 668 if (IsTopDown) { 669 do { 670 if (TopQ.empty()) return NULL; 671 SU = TopQ.top(); 672 TopQ.pop(); 673 } while (SU->isScheduled); 674 IsTopNode = true; 675 } 676 else { 677 do { 678 if (BottomQ.empty()) return NULL; 679 SU = BottomQ.top(); 680 BottomQ.pop(); 681 } while (SU->isScheduled); 682 IsTopNode = false; 683 } 684 if (IsAlternating) 685 IsTopDown = !IsTopDown; 686 return SU; 687 } 688 689 virtual void releaseTopNode(SUnit *SU) { 690 TopQ.push(SU); 691 } 692 virtual void releaseBottomNode(SUnit *SU) { 693 BottomQ.push(SU); 694 } 695 }; 696 } // namespace 697 698 static ScheduleDAGInstrs *createInstructionShuffler(MachineSchedContext *C) { 699 bool Alternate = !ForceTopDown && !ForceBottomUp; 700 bool TopDown = !ForceBottomUp; 701 assert((TopDown || !ForceTopDown) && 702 "-misched-topdown incompatible with -misched-bottomup"); 703 return new ScheduleDAGMI(C, new InstructionShuffler(Alternate, TopDown)); 704 } 705 static MachineSchedRegistry ShufflerRegistry( 706 "shuffle", "Shuffle machine instructions alternating directions", 707 createInstructionShuffler); 708 #endif // !NDEBUG 709