From fc60d7729bb5b63b7d61e370e51bd05e9a18b8bc Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Tue, 5 Oct 2010 20:36:25 +0000 Subject: [PATCH] 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 --- lib/CodeGen/SplitKit.cpp | 20 ++++++++------------ lib/CodeGen/SplitKit.h | 10 +++++----- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp index 048f6ab1baf..062194586ff 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'); } diff --git a/lib/CodeGen/SplitKit.h b/lib/CodeGen/SplitKit.h index 3e6776868d2..ebc783d79b9 100644 --- a/lib/CodeGen/SplitKit.h +++ b/lib/CodeGen/SplitKit.h @@ -161,11 +161,6 @@ class LiveIntervalMap { // values not present (unknown/unmapped). ValueMap valueMap_; - // extendTo - Find the last li_ value defined in MBB at or before Idx. The - // parentli is assumed to be live at Idx. Extend the live range to include - // Idx. Return the found VNInfo, or NULL. - VNInfo *extendTo(MachineBasicBlock *MBB, SlotIndex Idx); - public: LiveIntervalMap(LiveIntervals &lis, const LiveInterval &parentli) @@ -194,6 +189,11 @@ public: /// mapped value. VNInfo *mapValue(const VNInfo *ParentVNI, SlotIndex Idx, bool *simple = 0); + // extendTo - Find the last li_ value defined in MBB at or before Idx. The + // parentli is assumed to be live at Idx. Extend the live range to include + // Idx. Return the found VNInfo, or NULL. + VNInfo *extendTo(MachineBasicBlock *MBB, SlotIndex Idx); + /// isMapped - Return true is ParentVNI is a known mapped value. It may be a /// simple 1-1 mapping or a complex mapping to later defs. bool isMapped(const VNInfo *ParentVNI) const { -- 2.34.1