Don't accidentally leave small gaps in the live ranges when leaving the active
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 19 Jan 2011 23:14:56 +0000 (23:14 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 19 Jan 2011 23:14:56 +0000 (23:14 +0000)
interval after an instruction. The leaveIntvAfter() method only adds liveness
from the instruction's boundary index to the inserted copy.

Ideally, SplitKit should be smarter about this, perhaps by combining useIntv()
and leaveIntvAfter() into one method that guarantees continuity.

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

lib/CodeGen/RegAllocGreedy.cpp

index fa3b5871fcefe4a87fc291868a21b1f7da40581a..2083c4bdc417f765a33c7c1c90ffa5d4e8780780 100644 (file)
@@ -757,7 +757,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg,
       }
       if (!BI.LiveThrough) {
         DEBUG(dbgs() << ", killed in block.\n");
-        SE.useIntv(Start, BI.Kill);
+        SE.useIntv(Start, BI.Kill.getBoundaryIndex());
         SE.leaveIntvAfter(BI.Kill);
         continue;
       }
@@ -765,7 +765,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg,
         // Block is live-through, but exit bundle is on the stack.
         // Spill immediately after the last use.
         DEBUG(dbgs() << ", uses, stack-out.\n");
-        SE.useIntv(Start, BI.LastUse);
+        SE.useIntv(Start, BI.LastUse.getBoundaryIndex());
         SE.leaveIntvAfter(BI.LastUse);
         continue;
       }
@@ -789,6 +789,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg,
       SlotIndex Use = std::lower_bound(SA->UseSlots.begin(), SA->UseSlots.end(),
                                        IP.second)[-1];
       DEBUG(dbgs() << ", free use at " << Use << ".\n");
+      Use = Use.getBoundaryIndex();
       assert(Use >= BI.FirstUse && Use < IP.first);
       SE.useIntv(Start, Use);
       SE.leaveIntvAfter(Use);