LiveIntervalAnalysis: Factor out code to update liveness on physreg def removal
authorMatthias Braun <matze@braunis.de>
Wed, 21 Jan 2015 18:50:21 +0000 (18:50 +0000)
committerMatthias Braun <matze@braunis.de>
Wed, 21 Jan 2015 18:50:21 +0000 (18:50 +0000)
This cleans up code and is more in line with the general philosophy of
modifying LiveIntervals through LiveIntervalAnalysis instead of changing
them directly.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226687 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/LiveIntervalAnalysis.h
lib/CodeGen/InlineSpiller.cpp
lib/CodeGen/LiveIntervalAnalysis.cpp
lib/CodeGen/LiveRangeEdit.cpp
lib/CodeGen/RegisterCoalescer.cpp

index 61c705e04d29be4b028c2dc54e5eec2c040a29b3..d97087036976520a433666430e669a85e9ce0419 100644 (file)
@@ -393,6 +393,8 @@ namespace llvm {
       return RegUnitRanges[Unit];
     }
 
+    void removePhysRegDefAt(unsigned Reg, SlotIndex Pos);
+
   private:
     /// Compute live intervals for all virtual registers.
     void computeVirtRegs();
index df889f76412c5bfe0433255d144b8ed33c882bef..631b42c7348ed2e969ef2f1a0362a7e182ec026b 100644 (file)
@@ -1142,13 +1142,8 @@ foldMemoryOperand(ArrayRef<std::pair<MachineInstr*, unsigned> > Ops,
       continue;
     // FoldMI does not define this physreg. Remove the LI segment.
     assert(MO->isDead() && "Cannot fold physreg def");
-    for (MCRegUnitIterator Units(Reg, &TRI); Units.isValid(); ++Units) {
-      if (LiveRange *LR = LIS.getCachedRegUnit(*Units)) {
-        SlotIndex Idx = LIS.getInstructionIndex(MI).getRegSlot();
-        if (VNInfo *VNI = LR->getVNInfoAt(Idx))
-          LR->removeValNo(VNI);
-      }
-    }
+    SlotIndex Idx = LIS.getInstructionIndex(MI).getRegSlot();
+    LIS.removePhysRegDefAt(Reg, Idx);
   }
 
   LIS.ReplaceMachineInstrInMaps(MI, FoldMI);
index 36aeaa176a28195fe06a816aedabee969872ea6f..48daf2ccd06939d1d251f83d933599562c532a81 100644 (file)
@@ -1367,3 +1367,11 @@ LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB,
     repairOldRegInRange(Begin, End, endIdx, LI, Reg);
   }
 }
+
+void LiveIntervals::removePhysRegDefAt(unsigned Reg, SlotIndex Pos) {
+  for (MCRegUnitIterator Units(Reg, TRI); Units.isValid(); ++Units) {
+    if (LiveRange *LR = getCachedRegUnit(*Units))
+      if (VNInfo *VNI = LR->getVNInfoAt(Pos))
+        LR->removeValNo(VNI);
+  }
+}
index 47da205df6942f97bbf22427f37ef3e5015213da..c4bfc0e876cafca6a3a904d7e42c62acf23847ae 100644 (file)
@@ -256,15 +256,8 @@ void LiveRangeEdit::eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink) {
       // Check if MI reads any unreserved physregs.
       if (Reg && MOI->readsReg() && !MRI.isReserved(Reg))
         ReadsPhysRegs = true;
-      else if (MOI->isDef()) {
-        for (MCRegUnitIterator Units(Reg, MRI.getTargetRegisterInfo());
-             Units.isValid(); ++Units) {
-          if (LiveRange *LR = LIS.getCachedRegUnit(*Units)) {
-            if (VNInfo *VNI = LR->getVNInfoAt(Idx))
-              LR->removeValNo(VNI);
-          }
-        }
-      }
+      else if (MOI->isDef())
+        LIS.removePhysRegDefAt(Reg, Idx);
       continue;
     }
     LiveInterval &LI = LIS.getInterval(Reg);
index 5eb1721b35cf28732ed320e55c5d80514354b443..70d2e0e18ce3be67e1e7af301e493f87ab453eed 100644 (file)
@@ -1463,17 +1463,13 @@ bool RegisterCoalescer::joinReservedPhysReg(CoalescerPair &CP) {
 
     // We're going to remove the copy which defines a physical reserved
     // register, so remove its valno, etc.
+    DEBUG(dbgs() << "\t\tRemoving phys reg def of " << DstReg << " at "
+          << CopyRegIdx << "\n");
+
+    LIS->removePhysRegDefAt(DstReg, CopyRegIdx);
+    // Create a new dead def at the new def location.
     for (MCRegUnitIterator UI(DstReg, TRI); UI.isValid(); ++UI) {
       LiveRange &LR = LIS->getRegUnit(*UI);
-      VNInfo *OrigRegVNI = LR.getVNInfoAt(CopyRegIdx);
-      if (!OrigRegVNI)
-        continue;
-
-      DEBUG(dbgs() << "\t\tRemoving: " << CopyRegIdx << " from " << LR << "\n");
-      LR.removeSegment(CopyRegIdx, CopyRegIdx.getDeadSlot());
-      LR.removeValNo(OrigRegVNI);
-
-      // Create a new dead def at the new def location.
       LR.createDeadDef(DestRegIdx, LIS->getVNInfoAllocator());
     }
   }