From 1fabd9f85e8ac728c35cb63c70d8aac2c94c92a8 Mon Sep 17 00:00:00 2001 From: Andrew Trick Date: Fri, 9 Mar 2012 08:02:51 +0000 Subject: [PATCH] misched: handle scheduling region boundaries nicely. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152393 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MachineScheduler.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/MachineScheduler.cpp b/lib/CodeGen/MachineScheduler.cpp index 4f27274796b..5c44a0e24d6 100644 --- a/lib/CodeGen/MachineScheduler.cpp +++ b/lib/CodeGen/MachineScheduler.cpp @@ -141,12 +141,21 @@ bool MachineScheduler::runOnMachineFunction(MachineFunction &mf) { for (MachineFunction::iterator MBB = MF->begin(), MBBEnd = MF->end(); MBB != MBBEnd; ++MBB) { + Scheduler->startBlock(MBB); + // Break the block into scheduling regions [I, RegionEnd), and schedule each // region as soon as it is discovered. unsigned RemainingCount = MBB->size(); for(MachineBasicBlock::iterator RegionEnd = MBB->end(); RegionEnd != MBB->begin();) { - Scheduler->startBlock(MBB); + // Avoid decrementing RegionEnd for blocks with no terminator. + if (RegionEnd != MBB->end() + || TII->isSchedulingBoundary(llvm::prior(RegionEnd), MBB, *MF)) { + --RegionEnd; + // Count the boundary instruction. + --RemainingCount; + } + // The next region starts above the previous region. Look backward in the // instruction stream until we find the nearest boundary. MachineBasicBlock::iterator I = RegionEnd; @@ -160,11 +169,9 @@ bool MachineScheduler::runOnMachineFunction(MachineFunction &mf) { // Skip empty scheduling regions (0 or 1 schedulable instructions). if (I == RegionEnd || I == llvm::prior(RegionEnd)) { - RegionEnd = llvm::prior(RegionEnd); - if (I != RegionEnd) - --RemainingCount; // Close the current region. Bundle the terminator if needed. Scheduler->exitRegion(); + RegionEnd = I; continue; } DEBUG(dbgs() << "MachineScheduling " << MF->getFunction()->getName()