[llvm-commits] [llvm] r55698 - /llvm/trunk/lib/CodeGen/MachineInstr.cpp

Dan Gohman gohman at apple.com
Wed Sep 3 08:56:17 PDT 2008


Author: djg
Date: Wed Sep  3 10:56:16 2008
New Revision: 55698

URL: http://llvm.org/viewvc/llvm-project?rev=55698&view=rev
Log:
Fix addRegisterDead and addRegisterKilled to be more thorough
when searching for redundant subregister dead/kill bits.

Previously it was common to see instructions marked like this:
  "RET %EAX<imp-use,kill>, %AX<imp-use,kill>"

With this change, addRegisterKilled continues scanning after
finding the %EAX operand, so it proceeds to discover the
redundant %AX kill and eliminates it, producing this:
  "RET %EAX<imp-use,kill>"

This currently has no effect on the generated code.

Modified:
    llvm/trunk/lib/CodeGen/MachineInstr.cpp

Modified: llvm/trunk/lib/CodeGen/MachineInstr.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineInstr.cpp?rev=55698&r1=55697&r2=55698&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/MachineInstr.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineInstr.cpp Wed Sep  3 10:56:16 2008
@@ -800,6 +800,7 @@
                                      bool AddIfNotFound) {
   bool isPhysReg = TargetRegisterInfo::isPhysicalRegister(IncomingReg);
   bool hasAliases = isPhysReg && RegInfo->getAliasSet(IncomingReg);
+  bool Found = false;
   SmallVector<unsigned,4> DeadOps;
   for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
     MachineOperand &MO = getOperand(i);
@@ -810,11 +811,15 @@
       continue;
 
     if (Reg == IncomingReg) {
-      MO.setIsKill();
-      return true;
-    }
-    if (hasAliases && MO.isKill() &&
-        TargetRegisterInfo::isPhysicalRegister(Reg)) {
+      if (!Found) {
+        if (MO.isKill())
+          // The register is already marked kill.
+          return true;
+        MO.setIsKill();
+        Found = true;
+      }
+    } else if (hasAliases && MO.isKill() &&
+               TargetRegisterInfo::isPhysicalRegister(Reg)) {
       // A super-register kill already exists.
       if (RegInfo->isSuperRegister(IncomingReg, Reg))
         return true;
@@ -835,14 +840,14 @@
 
   // If not found, this means an alias of one of the operands is killed. Add a
   // new implicit operand if required.
-  if (AddIfNotFound) {
+  if (!Found && AddIfNotFound) {
     addOperand(MachineOperand::CreateReg(IncomingReg,
                                          false /*IsDef*/,
                                          true  /*IsImp*/,
                                          true  /*IsKill*/));
     return true;
   }
-  return false;
+  return Found;
 }
 
 bool MachineInstr::addRegisterDead(unsigned IncomingReg,
@@ -850,18 +855,26 @@
                                    bool AddIfNotFound) {
   bool isPhysReg = TargetRegisterInfo::isPhysicalRegister(IncomingReg);
   bool hasAliases = isPhysReg && RegInfo->getAliasSet(IncomingReg);
+  bool Found = false;
   SmallVector<unsigned,4> DeadOps;
   for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
     MachineOperand &MO = getOperand(i);
     if (!MO.isRegister() || !MO.isDef())
       continue;
     unsigned Reg = MO.getReg();
+    if (!Reg)
+      continue;
+
     if (Reg == IncomingReg) {
-      MO.setIsDead();
-      return true;
-    }
-    if (hasAliases && MO.isDead() &&
-        TargetRegisterInfo::isPhysicalRegister(Reg)) {
+      if (!Found) {
+        if (MO.isDead())
+          // The register is already marked dead.
+          return true;
+        MO.setIsDead();
+        Found = true;
+      }
+    } else if (hasAliases && MO.isDead() &&
+               TargetRegisterInfo::isPhysicalRegister(Reg)) {
       // There exists a super-register that's marked dead.
       if (RegInfo->isSuperRegister(IncomingReg, Reg))
         return true;
@@ -882,13 +895,15 @@
     DeadOps.pop_back();
   }
 
-  // If not found, this means an alias of one of the operand is dead. Add a
-  // new implicit operand.
-  if (AddIfNotFound) {
-    addOperand(MachineOperand::CreateReg(IncomingReg, true/*IsDef*/,
-                                         true/*IsImp*/,false/*IsKill*/,
-                                         true/*IsDead*/));
+  // If not found, this means an alias of one of the operands is dead. Add a
+  // new implicit operand if required.
+  if (!Found && AddIfNotFound) {
+    addOperand(MachineOperand::CreateReg(IncomingReg,
+                                         true  /*IsDef*/,
+                                         true  /*IsImp*/,
+                                         false /*IsKill*/,
+                                         true  /*IsDead*/));
     return true;
   }
-  return false;
+  return Found;
 }





More information about the llvm-commits mailing list