[llvm-commits] [llvm] r41871 - in /llvm/trunk: lib/CodeGen/LiveVariables.cpp test/CodeGen/PowerPC/2007-09-11-RegCoalescerAssert.ll

Evan Cheng evan.cheng at apple.com
Tue Sep 11 15:34:51 PDT 2007


Author: evancheng
Date: Tue Sep 11 17:34:47 2007
New Revision: 41871

URL: http://llvm.org/viewvc/llvm-project?rev=41871&view=rev
Log:
Sometimes a MI can define a register as well as defining a super-register at the
same time. Do not mark the "smaller" def as dead.

Added:
    llvm/trunk/test/CodeGen/PowerPC/2007-09-11-RegCoalescerAssert.ll
Modified:
    llvm/trunk/lib/CodeGen/LiveVariables.cpp

Modified: llvm/trunk/lib/CodeGen/LiveVariables.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveVariables.cpp?rev=41871&r1=41870&r2=41871&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/LiveVariables.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveVariables.cpp Tue Sep 11 17:34:47 2007
@@ -249,9 +249,6 @@
 }
 
 void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) {
-  // There is a now a proper use, forget about the last partial use.
-  PhysRegPartUse[Reg] = NULL;
-
   // Turn previous partial def's into read/mod/write.
   for (unsigned i = 0, e = PhysRegPartDef[Reg].size(); i != e; ++i) {
     MachineInstr *Def = PhysRegPartDef[Reg][i];
@@ -266,12 +263,15 @@
   // A: EAX = ...
   // B:     = AX
   // Add implicit def to A.
-  if (PhysRegInfo[Reg] && !PhysRegUsed[Reg]) {
+  if (PhysRegInfo[Reg] && PhysRegInfo[Reg] != PhysRegPartUse[Reg] &&
+      !PhysRegUsed[Reg]) {
     MachineInstr *Def = PhysRegInfo[Reg];
     if (!Def->findRegisterDefOperand(Reg))
       Def->addRegOperand(Reg, true/*IsDef*/,true/*IsImp*/);
   }
 
+  // There is a now a proper use, forget about the last partial use.
+  PhysRegPartUse[Reg] = NULL;
   PhysRegInfo[Reg] = MI;
   PhysRegUsed[Reg] = true;
 
@@ -373,7 +373,8 @@
       } else if (PhysRegPartUse[SubReg])
         // Add implicit use / kill to last use of a sub-register.
         addRegisterKilled(SubReg, PhysRegPartUse[SubReg], true);
-      else
+      else if (LastRef != MI)
+        // This must be a def of the subreg on the same MI.
         addRegisterDead(SubReg, LastRef);
     }
   }
@@ -381,7 +382,7 @@
   if (MI) {
     for (const unsigned *SuperRegs = RegInfo->getSuperRegisters(Reg);
          unsigned SuperReg = *SuperRegs; ++SuperRegs) {
-      if (PhysRegInfo[SuperReg]) {
+      if (PhysRegInfo[SuperReg] && PhysRegInfo[SuperReg] != MI) {
         // The larger register is previously defined. Now a smaller part is
         // being re-defined. Treat it as read/mod/write.
         // EAX =

Added: llvm/trunk/test/CodeGen/PowerPC/2007-09-11-RegCoalescerAssert.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/2007-09-11-RegCoalescerAssert.ll?rev=41871&view=auto

==============================================================================
--- llvm/trunk/test/CodeGen/PowerPC/2007-09-11-RegCoalescerAssert.ll (added)
+++ llvm/trunk/test/CodeGen/PowerPC/2007-09-11-RegCoalescerAssert.ll Tue Sep 11 17:34:47 2007
@@ -0,0 +1,9 @@
+; RUN: llvm-as < %s | llc -march=ppc64
+
+        %struct.TCMalloc_SpinLock = type { i32 }
+
+define void @_ZN17TCMalloc_SpinLock4LockEv(%struct.TCMalloc_SpinLock* %this) {
+entry:
+        %tmp3 = call i32 asm sideeffect "1: lwarx $0, 0, $1\0A\09stwcx. $2, 0, $1\0A\09bne- 1b\0A\09isync", "=&r,=*r,r,1,~{dirflag},~{fpsr},~{flags},~{memory}"( i32** null, i32 1, i32* null )         ; <i32> [#uses=0]
+        unreachable
+}





More information about the llvm-commits mailing list