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

Evan Cheng evan.cheng at apple.com
Wed Apr 25 18:40:32 PDT 2007



Changes in directory llvm/lib/CodeGen:

LiveVariables.cpp updated: 1.76 -> 1.77
---
Log message:

Be careful when to add implicit kill / dead operands. Don't add them during / post reg-allocation.

---
Diffs of the changes:  (+17 -9)

 LiveVariables.cpp |   26 +++++++++++++++++---------
 1 files changed, 17 insertions(+), 9 deletions(-)


Index: llvm/lib/CodeGen/LiveVariables.cpp
diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.76 llvm/lib/CodeGen/LiveVariables.cpp:1.77
--- llvm/lib/CodeGen/LiveVariables.cpp:1.76	Wed Apr 25 16:34:08 2007
+++ llvm/lib/CodeGen/LiveVariables.cpp	Wed Apr 25 20:40:09 2007
@@ -170,7 +170,8 @@
     MarkVirtRegAliveInBlock(VRInfo, *PI);
 }
 
-void LiveVariables::addRegisterKilled(unsigned IncomingReg, MachineInstr *MI) {
+bool LiveVariables::addRegisterKilled(unsigned IncomingReg, MachineInstr *MI,
+                                      bool AddIfNotFound) {
   bool Found = false;
   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
     MachineOperand &MO = MI->getOperand(i);
@@ -187,17 +188,21 @@
                  RegInfo->isSuperRegister(IncomingReg, Reg) &&
                  MO.isKill())
         // A super-register kill already exists.
-        return;
+        return true;
     }
   }
 
   // If not found, this means an alias of one of the operand is killed. Add a
-  // new implicit operand.
-  if (!Found)
+  // new implicit operand if required.
+  if (!Found && AddIfNotFound) {
     MI->addRegOperand(IncomingReg, false/*IsDef*/,true/*IsImp*/,true/*IsKill*/);
+    return true;
+  }
+  return Found;
 }
 
-void LiveVariables::addRegisterDead(unsigned IncomingReg, MachineInstr *MI) {
+bool LiveVariables::addRegisterDead(unsigned IncomingReg, MachineInstr *MI,
+                                    bool AddIfNotFound) {
   bool Found = false;
   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
     MachineOperand &MO = MI->getOperand(i);
@@ -214,15 +219,18 @@
                  RegInfo->isSuperRegister(IncomingReg, Reg) &&
                  MO.isDead())
         // There exists a super-register that's marked dead.
-        return;
+        return true;
     }
   }
 
   // If not found, this means an alias of one of the operand is dead. Add a
   // new implicit operand.
-  if (!Found)
+  if (!Found && AddIfNotFound) {
     MI->addRegOperand(IncomingReg, true/*IsDef*/,true/*IsImp*/,false/*IsKill*/,
                       true/*IsDead*/);
+    return true;
+  }
+  return Found;
 }
 
 void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) {
@@ -271,9 +279,9 @@
       addRegisterKilled(Reg, LastRef);
     else if (PhysRegPartUse[Reg])
       // Add implicit use / kill to last use of a sub-register.
-      addRegisterKilled(Reg, PhysRegPartUse[Reg]);
+      addRegisterKilled(Reg, PhysRegPartUse[Reg], true);
     else
-      addRegisterDead(Reg, LastRef);
+      addRegisterDead(Reg, LastRef, true);
   }
   PhysRegInfo[Reg] = MI;
   PhysRegUsed[Reg] = false;






More information about the llvm-commits mailing list