Initial implementation of the nodes in a SelectionDAG.
[oota-llvm.git] / include / llvm / CodeGen / LiveVariables.h
index 67c213daf224588cc481b50f889840d9eba40937..17c1e2a7704c2c74994a4c8abc247fd8f62f1a8a 100644 (file)
@@ -39,8 +39,7 @@ class MRegisterInfo;
 class LiveVariables : public MachineFunctionPass {
 public:
   struct VarInfo {
-    /// DefBlock - The basic block which defines this value...
-    MachineBasicBlock *DefBlock;
+    /// DefInst - The machine instruction that defines this register.
     MachineInstr      *DefInst;
 
     /// AliveBlocks - Set of blocks of which this value is alive completely
@@ -49,25 +48,23 @@ public:
     ///
     std::vector<bool> AliveBlocks;
 
-    /// Kills - List of MachineBasicblock's which contain the last use of this
-    /// virtual register (kill it).  This also includes the specific instruction
-    /// which kills the value.
+    /// Kills - List of MachineInstruction's which are the last use of this
+    /// virtual register (kill it) in their basic block.
     ///
-    std::vector<std::pair<MachineBasicBlock*, MachineInstr*> > Kills;
+    std::vector<MachineInstr*> Kills;
 
-    VarInfo() : DefBlock(0), DefInst(0) {}
+    VarInfo() : DefInst(0) {}
 
     /// removeKill - Delete a kill corresponding to the specified
     /// machine instruction. Returns true if there was a kill
     /// corresponding to this instruction, false otherwise.
     bool removeKill(MachineInstr *MI) {
-      for (std::vector<std::pair<MachineBasicBlock*, MachineInstr*> >::iterator
-             i = Kills.begin(); i != Kills.end(); ++i) {
-        if (i->second == MI) {
+      for (std::vector<MachineInstr*>::iterator i = Kills.begin(),
+             e = Kills.end(); i != e; ++i)
+        if (*i == MI) {
           Kills.erase(i);
           return true;
         }
-      }
       return false;
     }
   };
@@ -128,6 +125,16 @@ public:
     return RegistersKilled.equal_range(MI);
   }
 
+  /// KillsRegister - Return true if the specified instruction kills the
+  /// specified register.
+  bool KillsRegister(MachineInstr *MI, unsigned Reg) {
+    std::pair<killed_iterator, killed_iterator> KIP = killed_range(MI);
+    for (; KIP.first != KIP.second; ++KIP.first)
+      if (KIP.first->second == Reg)
+        return true;
+    return false;
+  }
+
   killed_iterator dead_begin(MachineInstr *MI) {
     return RegistersDead.lower_bound(MI);
   }
@@ -152,11 +159,9 @@ public:
   /// specified register is killed after being used by the specified
   /// instruction.
   ///
-  void addVirtualRegisterKilled(unsigned IncomingReg,
-                                MachineBasicBlock *MBB,
-                                MachineInstr *MI) {
+  void addVirtualRegisterKilled(unsigned IncomingReg, MachineInstr *MI) {
     RegistersKilled.insert(std::make_pair(MI, IncomingReg));
-    getVarInfo(IncomingReg).Kills.push_back(std::make_pair(MBB, MI));
+    getVarInfo(IncomingReg).Kills.push_back(MI);
   }
 
   /// removeVirtualRegisterKilled - Remove the specified virtual
@@ -190,11 +195,9 @@ public:
   /// addVirtualRegisterDead - Add information about the fact that the specified
   /// register is dead after being used by the specified instruction.
   ///
-  void addVirtualRegisterDead(unsigned IncomingReg,
-                              MachineBasicBlock *MBB,
-                              MachineInstr *MI) {
+  void addVirtualRegisterDead(unsigned IncomingReg, MachineInstr *MI) {
     RegistersDead.insert(std::make_pair(MI, IncomingReg));
-    getVarInfo(IncomingReg).Kills.push_back(std::make_pair(MBB, MI));
+    getVarInfo(IncomingReg).Kills.push_back(MI);
   }
 
   /// removeVirtualRegisterDead - Remove the specified virtual
@@ -238,10 +241,6 @@ public:
   /// register.
   VarInfo &getVarInfo(unsigned RegIdx);
 
-  const std::vector<bool>& getAllocatablePhysicalRegisters() const {
-    return AllocatablePhysicalRegisters;
-  }
-
   void MarkVirtRegAliveInBlock(VarInfo &VRInfo, MachineBasicBlock *BB);
   void HandleVirtRegUse(VarInfo &VRInfo, MachineBasicBlock *MBB,
                                MachineInstr *MI);