If a split live interval is spilled again, remove the kill marker on its last use.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44611 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/VirtRegMap.h b/lib/CodeGen/VirtRegMap.h
index df32a65..7740740 100644
--- a/lib/CodeGen/VirtRegMap.h
+++ b/lib/CodeGen/VirtRegMap.h
@@ -66,6 +66,10 @@
     /// mapping.
     IndexedMap<unsigned, VirtReg2IndexFunctor> Virt2SplitMap;
 
+    /// Virt2SplitKillMap - This is splitted virtual register to its last use
+    /// (kill) mapping.
+    IndexedMap<MachineOperand*> Virt2SplitKillMap;
+
     /// ReMatMap - This is virtual register to re-materialized instruction
     /// mapping. Each virtual register whose definition is going to be
     /// re-materialized has an entry in it.
@@ -210,6 +214,21 @@
       ReMatMap[virtReg] = def;
     }
 
+    /// @brief record the last use (kill) of a split virtual register.
+    void addKillPoint(unsigned virtReg, MachineOperand *Op) {
+      Virt2SplitKillMap[virtReg] = Op;
+    }
+
+    /// @brief reset and 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;
+      }
+    }
+
     /// @brief returns true if the specified MachineInstr is a spill point.
     bool isSpillPt(MachineInstr *Pt) const {
       return SpillPt2VirtMap.find(Pt) != SpillPt2VirtMap.end();