Be careful when to add implicit kill / dead operands. Don't add them during / post...
authorEvan Cheng <evan.cheng@apple.com>
Thu, 26 Apr 2007 01:40:09 +0000 (01:40 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 26 Apr 2007 01:40:09 +0000 (01:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36458 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/LiveVariables.h
lib/CodeGen/LiveVariables.cpp

index 5b42a71318946becc8300bcfebecad1d72253b08..ebbe610ed0140792e298fb1acfe3935021f63a38 100644 (file)
@@ -147,12 +147,18 @@ private:   // Intermediate data structures
   SmallVector<unsigned, 4> *PHIVarInfo;
 
   /// addRegisterKilled - We have determined MI kills a register. Look for the
-  /// operand that uses it and mark it as IsKill.
-  void addRegisterKilled(unsigned IncomingReg, MachineInstr *MI);
+  /// operand that uses it and mark it as IsKill. If AddIfNotFound is true,
+  /// add a implicit operand if it's not found. Returns true if the operand
+  /// exists / is added.
+  bool addRegisterKilled(unsigned IncomingReg, MachineInstr *MI,
+                         bool AddIfNotFound = false);
 
   /// addRegisterDead - We have determined MI defined a register without a use.
-  /// Look for the operand that defines it and mark it as IsDead. 
-  void addRegisterDead(unsigned IncomingReg, MachineInstr *MI);
+  /// Look for the operand that defines it and mark it as IsDead. If
+  /// AddIfNotFound is true, add a implicit operand if it's not found. Returns
+  /// true if the operand exists / is added.
+  bool addRegisterDead(unsigned IncomingReg, MachineInstr *MI,
+                       bool AddIfNotFound = false);
 
   void HandlePhysRegUse(unsigned Reg, MachineInstr *MI);
   void HandlePhysRegDef(unsigned Reg, MachineInstr *MI);
@@ -189,11 +195,12 @@ public:
 
   /// addVirtualRegisterKilled - Add information about the fact that the
   /// specified register is killed after being used by the specified
-  /// instruction.
-  ///
-  void addVirtualRegisterKilled(unsigned IncomingReg, MachineInstr *MI) {
-    addRegisterKilled(IncomingReg, MI);
-    getVarInfo(IncomingReg).Kills.push_back(MI); 
+  /// instruction. If AddIfNotFound is true, add a implicit operand if it's
+  /// not found.
+  void addVirtualRegisterKilled(unsigned IncomingReg, MachineInstr *MI,
+                                bool AddIfNotFound = false) {
+    if (addRegisterKilled(IncomingReg, MI, AddIfNotFound))
+      getVarInfo(IncomingReg).Kills.push_back(MI); 
  }
 
   /// removeVirtualRegisterKilled - Remove the specified virtual
@@ -225,11 +232,12 @@ public:
   void removeVirtualRegistersKilled(MachineInstr *MI);
   
   /// addVirtualRegisterDead - Add information about the fact that the specified
-  /// register is dead after being used by the specified instruction.
-  ///
-  void addVirtualRegisterDead(unsigned IncomingReg, MachineInstr *MI) {
-    addRegisterDead(IncomingReg, MI);
-    getVarInfo(IncomingReg).Kills.push_back(MI);
+  /// register is dead after being used by the specified instruction. If
+  /// AddIfNotFound is true, add a implicit operand if it's not found.
+  void addVirtualRegisterDead(unsigned IncomingReg, MachineInstr *MI,
+                              bool AddIfNotFound = false) {
+    if (addRegisterDead(IncomingReg, MI, AddIfNotFound))
+        getVarInfo(IncomingReg).Kills.push_back(MI);
   }
 
   /// removeVirtualRegisterDead - Remove the specified virtual
index a2b1703ce690cc5dc0365d804a3792c5a8cc5920..fcefe263db2ec2a185c07082e6251d8a2e5c5068 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,9 +279,9 @@ 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);
+      addRegisterDead(Reg, LastRef, true);
   }
   PhysRegInfo[Reg] = MI;
   PhysRegUsed[Reg] = false;