Bugs: missing partial uses and redundant partial defs.
authorEvan Cheng <evan.cheng@apple.com>
Wed, 1 Aug 2007 20:18:21 +0000 (20:18 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 1 Aug 2007 20:18:21 +0000 (20:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40688 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveVariables.cpp

index d1ebaf102fc298c345cf56dae7aa4c6d3550bc03..e8d07bfcaf1cf4be7b5640bee7c9e513bf1994d7 100644 (file)
@@ -281,10 +281,24 @@ void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) {
     PhysRegUsed[SubReg] = true;
   }
 
-  // Remember the partial uses.
   for (const unsigned *SuperRegs = RegInfo->getSuperRegisters(Reg);
-       unsigned SuperReg = *SuperRegs; ++SuperRegs)
-    PhysRegPartUse[SuperReg] = MI;
+       unsigned SuperReg = *SuperRegs; ++SuperRegs) {
+    // Remember the partial use of this superreg if it was previously defined.
+    bool HasPrevDef = PhysRegInfo[SuperReg] != NULL;
+    if (!HasPrevDef) {
+      for (const unsigned *SSRegs = RegInfo->getSuperRegisters(SuperReg);
+           unsigned SSReg = *SSRegs; ++SSRegs) {
+        if (PhysRegInfo[SSReg] != NULL) {
+          HasPrevDef = true;
+          break;
+        }
+      }
+    }
+    if (HasPrevDef) {
+      PhysRegInfo[SuperReg] = MI;
+      PhysRegPartUse[SuperReg] = MI;
+    }
+  }
 }
 
 bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *RefMI,
@@ -342,7 +356,7 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) {
           addRegisterKilled(Reg, PhysRegPartUse[Reg], true);
       }
     } else if (PhysRegPartUse[Reg])
-      // Add implicit use / kill to last use of a sub-register.
+      // Add implicit use / kill to last partial use.
       addRegisterKilled(Reg, PhysRegPartUse[Reg], true);
     else
       addRegisterDead(Reg, LastRef);
@@ -385,11 +399,13 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) {
 
     PhysRegInfo[Reg] = MI;
     PhysRegUsed[Reg] = false;
+    PhysRegPartDef[Reg].clear();
     PhysRegPartUse[Reg] = NULL;
     for (const unsigned *SubRegs = RegInfo->getSubRegisters(Reg);
          unsigned SubReg = *SubRegs; ++SubRegs) {
       PhysRegInfo[SubReg] = MI;
       PhysRegUsed[SubReg] = false;
+      PhysRegPartDef[SubReg].clear();
       PhysRegPartUse[SubReg] = NULL;
     }
   }