New helper function getMBBFromIndex() that given an index in any instruction of an...
authorRoman Levenstein <romix.llvm@googlemail.com>
Mon, 18 Feb 2008 09:35:30 +0000 (09:35 +0000)
committerRoman Levenstein <romix.llvm@googlemail.com>
Mon, 18 Feb 2008 09:35:30 +0000 (09:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47267 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 440ae6ec5b6944fef852dde0764d057b7f18f9e1..2861ac80f673caa491c0ed698f00118da0c512b6 100644 (file)
@@ -40,6 +40,20 @@ namespace llvm {
   class VirtRegMap;
   typedef std::pair<unsigned, MachineBasicBlock*> IdxMBBPair;
 
+  inline bool operator<(unsigned V, const IdxMBBPair &IM) {
+    return V < IM.first;
+  }
+
+  inline bool operator<(const IdxMBBPair &IM, unsigned V) {
+    return IM.first < V;
+  }
+
+  struct Idx2MBBCompare {
+    bool operator()(const IdxMBBPair &LHS, const IdxMBBPair &RHS) const {
+      return LHS.first < RHS.first;
+    }
+  };
+
   class LiveIntervals : public MachineFunctionPass {
     MachineFunction* mf_;
     const TargetMachine* tm_;
@@ -153,6 +167,22 @@ namespace llvm {
       return MBB2IdxMap[MBBNo].second;
     }
 
+    /// getMBBFromIndex - given an index in any instruction of an
+    /// MBB return a pointer the MBB
+    MachineBasicBlock* getMBBFromIndex(unsigned index) const {
+      std::vector<IdxMBBPair>::const_iterator I =
+           std::lower_bound(Idx2MBBMap.begin(), Idx2MBBMap.end(), index);
+      // Take the pair containing the index
+      std::vector<IdxMBBPair>::const_iterator J =
+         ((I != Idx2MBBMap.end() && I->first > index) ||
+          (I == Idx2MBBMap.end() && Idx2MBBMap.size()>0)) ? (I-1): I;
+
+      assert(J != Idx2MBBMap.end() && J->first < index+1 &&
+            index <= getMBBEndIdx(J->second) &&
+            "index does not correspond to an MBB");
+      return J->second;
+    }
+
     /// getInstructionIndex - returns the base index of instr
     unsigned getInstructionIndex(MachineInstr* instr) const {
       Mi2IndexMap::const_iterator it = mi2iMap_.find(instr);
index a64bf60f3b243c9427e70f8fc4faf24ad04ee403..db9cfee5f80710267e78bb5377be5c1836d980a5 100644 (file)
@@ -79,22 +79,6 @@ void LiveIntervals::releaseMemory() {
     delete ClonedMIs[i];
 }
 
-namespace llvm {
-  inline bool operator<(unsigned V, const IdxMBBPair &IM) {
-    return V < IM.first;
-  }
-
-  inline bool operator<(const IdxMBBPair &IM, unsigned V) {
-    return IM.first < V;
-  }
-
-  struct Idx2MBBCompare {
-    bool operator()(const IdxMBBPair &LHS, const IdxMBBPair &RHS) const {
-      return LHS.first < RHS.first;
-    }
-  };
-}
-
 /// runOnMachineFunction - Register allocate the whole function
 ///
 bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {