add some helpers
[oota-llvm.git] / lib / CodeGen / LiveVariables.cpp
index 19ea588cd03346be4c75eb7375ec5bb3b58f1a80..4816cc12577ed5211e57f54ef068a33c13c19474 100644 (file)
@@ -170,7 +170,8 @@ void LiveVariables::HandleVirtRegUse(VarInfo &VRInfo, MachineBasicBlock *MBB,
     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 @@ void LiveVariables::addRegisterKilled(unsigned IncomingReg, MachineInstr *MI) {
                  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 @@ void LiveVariables::addRegisterDead(unsigned IncomingReg, MachineInstr *MI) {
                  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,7 +279,7 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) {
       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);
   }
@@ -286,7 +294,7 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) {
         addRegisterKilled(SubReg, LastRef);
       else if (PhysRegPartUse[SubReg])
         // Add implicit use / kill to last use of a sub-register.
-        addRegisterKilled(SubReg, PhysRegPartUse[SubReg]);
+        addRegisterKilled(SubReg, PhysRegPartUse[SubReg], true);
       else
         addRegisterDead(SubReg, LastRef);
     }
@@ -427,7 +435,8 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) {
                "Cannot have a live-in virtual register!");
         HandlePhysRegUse(*I, Ret);
         // Add live-out registers as implicit uses.
-        Ret->addRegOperand(*I, false, true);
+        if (Ret->findRegisterUseOperandIdx(*I) == -1)
+          Ret->addRegOperand(*I, false, true);
       }
     }
 
@@ -438,10 +447,8 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) {
         HandlePhysRegDef(i, 0);
 
     // Clear some states between BB's. These are purely local information.
-    for (unsigned i = 0; i != NumRegs; ++i) {
+    for (unsigned i = 0; i != NumRegs; ++i)
       PhysRegPartDef[i].clear();
-      //PhysRegPartUse[i] = NULL;
-    }
     std::fill(PhysRegPartUse, PhysRegPartUse + NumRegs, (MachineInstr*)0);
   }