Fix one more case of splitting after the last split point.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 8 Feb 2011 23:26:48 +0000 (23:26 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 8 Feb 2011 23:26:48 +0000 (23:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125137 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocGreedy.cpp

index e767bbad7edc8521eb9cdca456a1961646ef2836..cfef95e1e8a425872ba40e96f3fac74427eebb27 100644 (file)
@@ -746,8 +746,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg,
       continue;
     }
 
-    if (IP.second.getBoundaryIndex() < BI.LastUse &&
-        IP.second.getBoundaryIndex() <= BI.LastSplitPoint) {
+    if (IP.second.getBoundaryIndex() < BI.LastUse) {
       // There are interference-free uses at the end of the block.
       // Find the first use that can get the live-out register.
       SmallVectorImpl<SlotIndex>::const_iterator UI =
@@ -755,13 +754,16 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg,
                          IP.second.getBoundaryIndex());
       assert(UI != SA->UseSlots.end() && "Couldn't find last use");
       SlotIndex Use = *UI;
-      DEBUG(dbgs() << ", free use at " << Use << ".\n");
       assert(Use <= BI.LastUse && "Couldn't find last use");
-      SlotIndex SegStart = SE.enterIntvBefore(Use);
-      assert(SegStart >= IP.second && "Couldn't avoid interference");
-      assert(SegStart < BI.LastSplitPoint && "Impossible split point");
-      SE.useIntv(SegStart, Stop);
-      continue;
+      // Only attempt a split befroe the last split point.
+      if (Use.getBaseIndex() <= BI.LastSplitPoint) {
+        DEBUG(dbgs() << ", free use at " << Use << ".\n");
+        SlotIndex SegStart = SE.enterIntvBefore(Use);
+        assert(SegStart >= IP.second && "Couldn't avoid interference");
+        assert(SegStart < BI.LastSplitPoint && "Impossible split point");
+        SE.useIntv(SegStart, Stop);
+        continue;
+      }
     }
 
     // Interference is after the last use.