misched: handle scheduler that insert instructions at empty region boundaries.
authorAndrew Trick <atrick@apple.com>
Fri, 9 Mar 2012 22:34:56 +0000 (22:34 +0000)
committerAndrew Trick <atrick@apple.com>
Fri, 9 Mar 2012 22:34:56 +0000 (22:34 +0000)
And add comments, since this is obviously confusing.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152445 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MachineScheduler.cpp

index 5c44a0e24d65f9eea6bc4749403566d5c6f450f3..8b70ae5350d446cf976218a2917f52efc8549f07 100644 (file)
@@ -144,10 +144,18 @@ bool MachineScheduler::runOnMachineFunction(MachineFunction &mf) {
     Scheduler->startBlock(MBB);
 
     // Break the block into scheduling regions [I, RegionEnd), and schedule each
-    // region as soon as it is discovered.
+    // region as soon as it is discovered. RegionEnd points the the scheduling
+    // boundary at the bottom of the region. The DAG does not include RegionEnd,
+    // but the region does (i.e. the next RegionEnd is above the previous
+    // RegionBegin). If the current block has no terminator then RegionEnd ==
+    // MBB->end() for the bottom region.
+    //
+    // The Scheduler may insert instructions during either schedule() or
+    // exitRegion(), even for empty regions. So the local iterators 'I' and
+    // 'RegionEnd' are invalid across these calls.
     unsigned RemainingCount = MBB->size();
     for(MachineBasicBlock::iterator RegionEnd = MBB->end();
-        RegionEnd != MBB->begin();) {
+        RegionEnd != MBB->begin(); RegionEnd = Scheduler->begin()) {
       // Avoid decrementing RegionEnd for blocks with no terminator.
       if (RegionEnd != MBB->end()
           || TII->isSchedulingBoundary(llvm::prior(RegionEnd), MBB, *MF)) {
@@ -170,8 +178,8 @@ bool MachineScheduler::runOnMachineFunction(MachineFunction &mf) {
       // Skip empty scheduling regions (0 or 1 schedulable instructions).
       if (I == RegionEnd || I == llvm::prior(RegionEnd)) {
         // Close the current region. Bundle the terminator if needed.
+        // This invalidates 'RegionEnd' and 'I'.
         Scheduler->exitRegion();
-        RegionEnd = I;
         continue;
       }
       DEBUG(dbgs() << "MachineScheduling " << MF->getFunction()->getName()
@@ -181,6 +189,7 @@ bool MachineScheduler::runOnMachineFunction(MachineFunction &mf) {
             dbgs() << " Remaining: " << RemainingCount << "\n");
 
       // Schedule a region: possibly reorder instructions.
+      // This invalidates 'RegionEnd' and 'I'.
       Scheduler->schedule();
 
       // Close the current region.