aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/SplitKit.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2010-10-05 20:36:25 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2010-10-05 20:36:25 +0000
commitfc60d7729bb5b63b7d61e370e51bd05e9a18b8bc (patch)
tree4f888fcd501203f05e1c46fb89982c268b7ea0ff /lib/CodeGen/SplitKit.cpp
parent9c3aa4d4cd8227858fbb4b84c6ea88ff9da2ba99 (diff)
downloadexternal_llvm-fc60d7729bb5b63b7d61e370e51bd05e9a18b8bc.zip
external_llvm-fc60d7729bb5b63b7d61e370e51bd05e9a18b8bc.tar.gz
external_llvm-fc60d7729bb5b63b7d61e370e51bd05e9a18b8bc.tar.bz2
Don't use nextIndex to check for live out of instruction.
Insert copy after defining instruction. Fix LiveIntervalMap::extendTo to properly handle live segments starting before the current basic block. Make sure the open live range is extended to the inserted copy's use slot. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115665 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SplitKit.cpp')
-rw-r--r--lib/CodeGen/SplitKit.cpp20
1 files changed, 8 insertions, 12 deletions
diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp
index 048f6ab..0621945 100644
--- a/lib/CodeGen/SplitKit.cpp
+++ b/lib/CodeGen/SplitKit.cpp
@@ -521,7 +521,7 @@ VNInfo *LiveIntervalMap::extendTo(MachineBasicBlock *MBB, SlotIndex Idx) {
if (I == li_->begin())
return 0;
--I;
- if (I->start < lis_.getMBBStartIdx(MBB))
+ if (I->end <= lis_.getMBBStartIdx(MBB))
return 0;
if (I->end <= Idx)
I->end = Idx.getNextSlot();
@@ -703,23 +703,20 @@ void SplitEditor::leaveIntvAfter(SlotIndex Idx) {
assert(openli_.getLI() && "openIntv not called before leaveIntvAfter");
// The interval must be live beyond the instruction at Idx.
- SlotIndex EndIdx = Idx.getNextIndex().getBaseIndex();
- VNInfo *ParentVNI = curli_->getVNInfoAt(EndIdx);
+ VNInfo *ParentVNI = curli_->getVNInfoAt(Idx.getBoundaryIndex());
if (!ParentVNI) {
DEBUG(dbgs() << " leaveIntvAfter " << Idx << ": not live\n");
return;
}
- MachineInstr *MI = lis_.getInstructionFromIndex(Idx);
- assert(MI && "leaveIntvAfter called with invalid index");
-
- VNInfo *VNI = dupli_.defByCopyFrom(openli_.getLI()->reg, ParentVNI,
- *MI->getParent(), MI);
+ MachineBasicBlock::iterator MII = lis_.getInstructionFromIndex(Idx);
+ MachineBasicBlock *MBB = MII->getParent();
+ VNInfo *VNI = dupli_.defByCopyFrom(openli_.getLI()->reg, ParentVNI, *MBB,
+ llvm::next(MII));
// Finally we must make sure that openli is properly extended from Idx to the
// new copy.
- openli_.mapValue(ParentVNI, VNI->def.getUseIndex());
-
+ openli_.addSimpleRange(Idx.getBoundaryIndex(), VNI->def, ParentVNI);
DEBUG(dbgs() << " leaveIntvAfter " << Idx << ": " << *openli_.getLI()
<< '\n');
}
@@ -744,8 +741,7 @@ void SplitEditor::leaveIntvAtTop(MachineBasicBlock &MBB) {
// Finally we must make sure that openli is properly extended from Start to
// the new copy.
- openli_.mapValue(ParentVNI, VNI->def.getUseIndex());
-
+ openli_.addSimpleRange(Start, VNI->def, ParentVNI);
DEBUG(dbgs() << " leaveIntvAtTop at " << Start << ": " << *openli_.getLI()
<< '\n');
}