Add LiveIntervals::getLastSplitPoint().

A live range cannot be split everywhere in a basic block. A split must go before
the first terminator, and if the variable is live into a landing pad, the split
must happen before the call that can throw.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124894 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen
2011-02-04 19:33:11 +00:00
parent 9b3d24bf3d
commit cb6404711b
5 changed files with 43 additions and 1 deletions

View File

@ -746,6 +746,28 @@ LiveInterval* LiveIntervals::dupInterval(LiveInterval *li) {
// Register allocator hooks.
//
MachineBasicBlock::iterator
LiveIntervals::getLastSplitPoint(const LiveInterval &li,
MachineBasicBlock *mbb) {
const MachineBasicBlock *lpad = mbb->getLandingPadSuccessor();
// If li is not live into a landing pad, we can insert spill code before the
// first terminator.
if (!lpad || !isLiveInToMBB(li, lpad))
return mbb->getFirstTerminator();
// When there is a landing pad, spill code must go before the call instruction
// that can throw.
MachineBasicBlock::iterator I = mbb->end(), B = mbb->begin();
while (I != B) {
--I;
if (I->getDesc().isCall())
return I;
}
assert(0 && "Block with landing pad successor contains no call instruction");
return mbb->getFirstTerminator();
}
/// getReMatImplicitUse - If the remat definition MI has one (for now, we only
/// allow one) virtual register operand, then its uses are implicitly using
/// the register. Returns the virtual register.