Don't use nextIndex to check for live out of instruction.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 5 Oct 2010 20:36:25 +0000 (20:36 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 5 Oct 2010 20:36:25 +0000 (20:36 +0000)
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
lib/CodeGen/SplitKit.h

index 048f6ab1bafb792ca4035ba88966ae430d811453..062194586ffd02badb8a7dbd9a91eb3658ec89e4 100644 (file)
@@ -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');
 }
index 3e6776868d2c7ee21603e4c9e4d9ebc16395a507..ebc783d79b91e7523b291ecc4020306cac27133f 100644 (file)
@@ -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 {