From d08d77318a095c5f85c077899caa3594a7767113 Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Tue, 8 Feb 2011 21:46:11 +0000 Subject: [PATCH] Also handle the situation where an indirect branch is the first (and last) 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 | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/CodeGen/RegAllocGreedy.cpp b/lib/CodeGen/RegAllocGreedy.cpp index 4713da8a9af..d5d76ca1f81 100644 --- a/lib/CodeGen/RegAllocGreedy.cpp +++ b/lib/CodeGen/RegAllocGreedy.cpp @@ -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. -- 2.34.1