Also handle the situation where an indirect branch is the first (and last)
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 8 Feb 2011 21:46:11 +0000 (21:46 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 8 Feb 2011 21:46:11 +0000 (21:46 +0000)
instruction in a basic block.

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

lib/CodeGen/RegAllocGreedy.cpp

index 4713da8a9afa6c1f1f14196aab51145c487b66ef..d5d76ca1f819d0ee2efd4d7f0ab3667fb305c36d 100644 (file)
@@ -808,16 +808,18 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg,
         DEBUG(dbgs() << ", uses at " << BI.LastUse << " after split point "
                      << BI.LastSplitPoint << ", stack-out.\n");
         SlotIndex SegEnd;
-        if (BI.LastSplitPoint == Start)
+        // Find the last real instruction before the split point.
+        MachineBasicBlock::iterator SplitI =
+          LIS->getInstructionFromIndex(BI.LastSplitPoint);
+        MachineBasicBlock::iterator I = SplitI, B = BI.MBB->begin();
+        while (I != B && (--I)->isDebugValue())
+          ;
+        if (I == SplitI)
           SegEnd = SE.leaveIntvAtTop(*BI.MBB);
         else {
-          MachineBasicBlock::iterator I =
-            LIS->getInstructionFromIndex(BI.LastSplitPoint);
-          do assert(I != BI.MBB->begin() && "Expected instruction");
-          while ((--I)->isDebugValue());
           SegEnd = SE.leaveIntvAfter(LIS->getInstructionIndex(I));
+          SE.useIntv(Start, SegEnd);
         }
-        SE.useIntv(Start, SegEnd);
         // Run a double interval from the split to the last use.
         // This makes it possible to spill the complement without affecting the
         // indirect branch.