MachineInstr can change. Store indexes instead.
authorEvan Cheng <evan.cheng@apple.com>
Wed, 5 Dec 2007 10:24:35 +0000 (10:24 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 5 Dec 2007 10:24:35 +0000 (10:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44612 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveIntervalAnalysis.cpp
lib/CodeGen/VirtRegMap.cpp
lib/CodeGen/VirtRegMap.h

index b321b3fdf6b26938d14814804252e25637f60d33..a9e69483be4cc05f394996e6055783b7ca22b0ea 100644 (file)
@@ -1165,6 +1165,15 @@ addIntervalsForSpills(const LiveInterval &li,
   // it's also guaranteed to be a single val# / range interval.
   if (vrm.getPreSplitReg(li.reg)) {
     vrm.setIsSplitFromReg(li.reg, 0);
+    // Unset the split kill marker on the last use.
+    unsigned KillIdx = vrm.getKillPoint(li.reg);
+    if (KillIdx) {
+      MachineInstr *KillMI = getInstructionFromIndex(KillIdx);
+      assert(KillMI && "Last use disappeared?");
+      int KillOp = KillMI->findRegisterUseOperandIdx(li.reg, true);
+      assert(KillOp != -1 && "Last use disappeared?");
+      KillMI->getOperand(KillOp).unsetIsKill();
+    }
     vrm.removeKillPoint(li.reg);
     bool DefIsReMat = vrm.isReMaterialized(li.reg);
     Slot = vrm.getStackSlot(li.reg);
@@ -1395,13 +1404,14 @@ addIntervalsForSpills(const LiveInterval &li,
       LI->weight /= LI->getSize();
       if (!AddedKill.count(LI)) {
         LiveRange *LR = &LI->ranges[LI->ranges.size()-1];
-        MachineInstr *LastUse = getInstructionFromIndex(getBaseIndex(LR->end));
+        unsigned LastUseIdx = getBaseIndex(LR->end);
+        MachineInstr *LastUse = getInstructionFromIndex(LastUseIdx);
         int UseIdx = LastUse->findRegisterUseOperandIdx(LI->reg);
         assert(UseIdx != -1);
         if (LastUse->getInstrDescriptor()->
             getOperandConstraint(UseIdx, TOI::TIED_TO) == -1) {
           LastUse->getOperand(UseIdx).setIsKill();
-          vrm.addKillPoint(LI->reg, &LastUse->getOperand(UseIdx));
+          vrm.addKillPoint(LI->reg, LastUseIdx);
         }
       }
       RetNewLIs.push_back(LI);
index e39f6a7df821a809f2ff08487a8ebf886de54850..d0fd62a6f9d8cc5dea64c8faf7356666591929ba 100644 (file)
@@ -64,7 +64,7 @@ VirtRegMap::VirtRegMap(MachineFunction &mf)
   : TII(*mf.getTarget().getInstrInfo()), MF(mf), 
     Virt2PhysMap(NO_PHYS_REG), Virt2StackSlotMap(NO_STACK_SLOT),
     Virt2ReMatIdMap(NO_STACK_SLOT), Virt2SplitMap(0),
-    Virt2SplitKillMap(NULL), ReMatMap(NULL), ReMatId(MAX_STACK_SLOT+1) {
+    Virt2SplitKillMap(0), ReMatMap(NULL), ReMatId(MAX_STACK_SLOT+1) {
   grow();
 }
 
index 7740740548b88ed29578a90f0d9ac1106d4e09ef..192d64a30edd1eb926b326ec88c0298b9b226edd 100644 (file)
@@ -67,8 +67,8 @@ namespace llvm {
     IndexedMap<unsigned, VirtReg2IndexFunctor> Virt2SplitMap;
 
     /// Virt2SplitKillMap - This is splitted virtual register to its last use
-    /// (kill) mapping.
-    IndexedMap<MachineOperand*> Virt2SplitKillMap;
+    /// (kill) index mapping.
+    IndexedMap<unsigned> Virt2SplitKillMap;
 
     /// ReMatMap - This is virtual register to re-materialized instruction
     /// mapping. Each virtual register whose definition is going to be
@@ -215,18 +215,17 @@ namespace llvm {
     }
 
     /// @brief record the last use (kill) of a split virtual register.
-    void addKillPoint(unsigned virtReg, MachineOperand *Op) {
-      Virt2SplitKillMap[virtReg] = Op;
+    void addKillPoint(unsigned virtReg, unsigned index) {
+      Virt2SplitKillMap[virtReg] = index;
     }
 
-    /// @brief reset and remove the last use (kill) of a split virtual register.
+    unsigned getKillPoint(unsigned virtReg) const {
+      return Virt2SplitKillMap[virtReg];
+    }
+
+    /// @brief remove the last use (kill) of a split virtual register.
     void removeKillPoint(unsigned virtReg) {
-      MachineOperand *MO = Virt2SplitKillMap[virtReg];
-      if (MO) {
-        assert(MO->isKill() && "Split last use is not marked kill?");
-        MO->unsetIsKill();
-        Virt2SplitKillMap[virtReg] = NULL;
-      }
+      Virt2SplitKillMap[virtReg] = 0;
     }
 
     /// @brief returns true if the specified MachineInstr is a spill point.