[llvm-commits] CVS: llvm/lib/CodeGen/VirtRegMap.cpp

Evan Cheng evan.cheng at apple.com
Fri Mar 2 22:32:54 PST 2007



Changes in directory llvm/lib/CodeGen:

VirtRegMap.cpp updated: 1.103 -> 1.104
---
Log message:

Only propagate IsKill if the last use is a kill.

---
Diffs of the changes:  (+22 -8)

 VirtRegMap.cpp |   30 ++++++++++++++++++++++--------
 1 files changed, 22 insertions(+), 8 deletions(-)


Index: llvm/lib/CodeGen/VirtRegMap.cpp
diff -u llvm/lib/CodeGen/VirtRegMap.cpp:1.103 llvm/lib/CodeGen/VirtRegMap.cpp:1.104
--- llvm/lib/CodeGen/VirtRegMap.cpp:1.103	Fri Mar  2 02:52:00 2007
+++ llvm/lib/CodeGen/VirtRegMap.cpp	Sat Mar  3 00:32:37 2007
@@ -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));
                 }
               }






More information about the llvm-commits mailing list