From c47bd8565784347db8c83112c80ce3d2c474b6f3 Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Wed, 19 Jan 2011 23:14:56 +0000 Subject: [PATCH] Don't accidentally leave small gaps in the live ranges when leaving the active 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. llvm-svn: 123858 --- lib/CodeGen/RegAllocGreedy.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/CodeGen/RegAllocGreedy.cpp b/lib/CodeGen/RegAllocGreedy.cpp index fa3b5871fce..2083c4bdc41 100644 --- a/lib/CodeGen/RegAllocGreedy.cpp +++ b/lib/CodeGen/RegAllocGreedy.cpp @@ -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);