Only propagate IsKill if the last use is a kill.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34878 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp
index 66633fa..9a1e58f 100644
--- a/lib/CodeGen/VirtRegMap.cpp
+++ b/lib/CodeGen/VirtRegMap.cpp
@@ -703,15 +703,19 @@
 
           // Extend the live range of the MI that last kill the register if
           // necessary.
+          bool WasKill = false;
           if (SSMI) {
             MachineOperand *MOK = SSMI->findRegisterUseOperand(PhysReg, true);
-            if (MOK)
+            if (MOK) {
+              WasKill = MOK->isKill();
               MOK->unsetIsKill();
+            }
           }
           if (ti == -1) {
             // Unless it's the use of a two-address code, transfer the kill
             // of the reused register to this use.
-            MI.getOperand(i).setIsKill();
+            if (WasKill)
+              MI.getOperand(i).setIsKill();
             Spills.addLastUse(PhysReg, &MI);
           }
 
@@ -782,15 +786,21 @@
 
         // Extend the live range of the MI that last kill the register if
         // necessary.
+        bool WasKill = false;
         if (SSMI) {
           MachineOperand *MOK = SSMI->findRegisterUseOperand(PhysReg, true);
-          if (MOK)
+          if (MOK) {
+            WasKill = MOK->isKill();
             MOK->unsetIsKill();
+          }
         }
         MachineInstr *CopyMI = prior(MII);
-        MachineOperand *MOU = CopyMI->findRegisterUseOperand(PhysReg);
-        MOU->setIsKill();
-        Spills.addLastUse(PhysReg, &MI);
+        if (WasKill) {
+          // Transfer kill to the next use.
+          MachineOperand *MOU = CopyMI->findRegisterUseOperand(PhysReg);
+          MOU->setIsKill();
+        }
+        Spills.addLastUse(PhysReg, CopyMI);
 
         // This invalidates DesignatedReg.
         Spills.ClobberPhysReg(DesignatedReg);
@@ -877,16 +887,20 @@
 
               // Either way, the live range of the last kill of InReg has been
               // extended. Remove its kill.
+              bool WasKill = false;
               if (SSMI) {
                 MachineOperand *MOK = SSMI->findRegisterUseOperand(InReg, true);
-                if (MOK)
+                if (MOK) {
+                  WasKill = MOK->isKill();
                   MOK->unsetIsKill();
+                }
               }
               if (NextMII != MBB.end()) {
                 // If NextMII uses InReg (must be the copy?), mark it killed.
                 MachineOperand *MOU = NextMII->findRegisterUseOperand(InReg);
                 if (MOU) {
-                  MOU->setIsKill();
+                  if (WasKill)
+                    MOU->setIsKill();
                   Spills.addLastUse(InReg, &(*NextMII));
                 }
               }