Fixes for BreakCriticalMachineCodeEdge by Fernando.
[oota-llvm.git] / include / llvm / CodeGen / LiveVariables.h
index ec01556a7e7492d047548ad1683338995867ee20..5c714e308aaca046e9c13641a25f3323eef8a7f4 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -83,6 +83,10 @@ public:
     ///
     BitVector AliveBlocks;
 
+    /// UsedBlocks - Set of blocks of which this value is actually used. This
+    /// is a bit set which uses the basic block number as an index.
+    BitVector UsedBlocks;
+
     /// NumUses - Number of uses of this register across the entire function.
     ///
     unsigned NumUses;
@@ -150,20 +154,6 @@ 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. 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. 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 addRegisterKills(unsigned Reg, MachineInstr *MI,
                         SmallSet<unsigned, 4> &SubKills);
 
@@ -212,9 +202,9 @@ public:
   /// not found.
   void addVirtualRegisterKilled(unsigned IncomingReg, MachineInstr *MI,
                                 bool AddIfNotFound = false) {
-    if (addRegisterKilled(IncomingReg, MI, AddIfNotFound))
+    if (MI->addRegisterKilled(IncomingReg, RegInfo, AddIfNotFound))
       getVarInfo(IncomingReg).Kills.push_back(MI); 
- }
 }
 
   /// removeVirtualRegisterKilled - Remove the specified virtual
   /// register from the live variable information. Returns true if the
@@ -229,8 +219,8 @@ public:
     bool Removed = false;
     for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
       MachineOperand &MO = MI->getOperand(i);
-      if (MO.isReg() && MO.isUse() && MO.getReg() == reg) {
-        MO.unsetIsKill();
+      if (MO.isRegister() && MO.isKill() && MO.getReg() == reg) {
+        MO.setIsKill(false);
         Removed = true;
         break;
       }
@@ -243,13 +233,13 @@ public:
   /// removeVirtualRegistersKilled - Remove all killed info for the specified
   /// instruction.
   void removeVirtualRegistersKilled(MachineInstr *MI);
-  
+
   /// addVirtualRegisterDead - Add information about the fact that the specified
   /// 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))
+    if (MI->addRegisterDead(IncomingReg, RegInfo, AddIfNotFound))
         getVarInfo(IncomingReg).Kills.push_back(MI);
   }
 
@@ -266,8 +256,8 @@ public:
     bool Removed = false;
     for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
       MachineOperand &MO = MI->getOperand(i);
-      if (MO.isReg() && MO.isDef() && MO.getReg() == reg) {
-        MO.unsetIsDead();
+      if (MO.isRegister() && MO.isDef() && MO.getReg() == reg) {
+        MO.setIsDead(false);
         Removed = true;
         break;
       }
@@ -292,10 +282,12 @@ public:
   /// register.
   VarInfo &getVarInfo(unsigned RegIdx);
 
-  void MarkVirtRegAliveInBlock(VarInfo &VRInfo, MachineBasicBlock *BB);
-  void MarkVirtRegAliveInBlock(VarInfo &VRInfo, MachineBasicBlock *BB,
+  void MarkVirtRegAliveInBlock(VarInfo& VRInfo, MachineBasicBlock* DefBlock,
+                               MachineBasicBlock *BB);
+  void MarkVirtRegAliveInBlock(VarInfo& VRInfo, MachineBasicBlock* DefBlock,
+                               MachineBasicBlock *BB,
                                std::vector<MachineBasicBlock*> &WorkList);
-  void HandleVirtRegUse(VarInfo &VRInfo, MachineBasicBlock *MBB,
+  void HandleVirtRegUse(unsigned reg, MachineBasicBlock *MBB,
                         MachineInstr *MI);
 };