[llvm-commits] [llvm] r43060 - in /llvm/trunk: include/llvm/CodeGen/LiveIntervalAnalysis.h lib/CodeGen/LiveIntervalAnalysis.cpp

Evan Cheng evan.cheng at apple.com
Tue Oct 16 19:10:23 PDT 2007


Author: evancheng
Date: Tue Oct 16 21:10:22 2007
New Revision: 43060

URL: http://llvm.org/viewvc/llvm-project?rev=43060&view=rev
Log:
Clean up code that calculate MBB live-in's.

Modified:
    llvm/trunk/include/llvm/CodeGen/LiveIntervalAnalysis.h
    llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp

Modified: llvm/trunk/include/llvm/CodeGen/LiveIntervalAnalysis.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/LiveIntervalAnalysis.h?rev=43060&r1=43059&r2=43060&view=diff

==============================================================================
--- llvm/trunk/include/llvm/CodeGen/LiveIntervalAnalysis.h (original)
+++ llvm/trunk/include/llvm/CodeGen/LiveIntervalAnalysis.h Tue Oct 16 21:10:22 2007
@@ -36,6 +36,7 @@
   class TargetInstrInfo;
   class TargetRegisterClass;
   class VirtRegMap;
+  typedef std::pair<unsigned, MachineBasicBlock*> IdxMBBPair;
 
   class LiveIntervals : public MachineFunctionPass {
     MachineFunction* mf_;
@@ -52,6 +53,10 @@
     /// specified basic block.
     std::vector<std::pair<unsigned, unsigned> > MBB2IdxMap;
 
+    /// Idx2MBBMap - Sorted list of pairs of index of first instruction
+    /// and MBB id.
+    std::vector<IdxMBBPair> Idx2MBBMap;
+
     typedef std::map<MachineInstr*, unsigned> Mi2IndexMap;
     Mi2IndexMap mi2iMap_;
 
@@ -158,6 +163,12 @@
       return i2miMap_[index];
     }
 
+    /// findLiveInMBBs - Given a live range, if the value of the range
+    /// is live in any MBB returns true as well as the list of basic blocks
+    /// where the value is live in.
+    bool findLiveInMBBs(const LiveRange &LR,
+                        SmallVector<MachineBasicBlock*, 4> &MBBs) const;
+
     // Interval creation
 
     LiveInterval &getOrCreateInterval(unsigned reg) {

Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp?rev=43060&r1=43059&r2=43060&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Tue Oct 16 21:10:22 2007
@@ -62,6 +62,7 @@
 }
 
 void LiveIntervals::releaseMemory() {
+  Idx2MBBMap.clear();
   mi2iMap_.clear();
   i2miMap_.clear();
   r2iMap_.clear();
@@ -71,6 +72,22 @@
     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) {
@@ -100,7 +117,9 @@
 
     // Set the MBB2IdxMap entry for this MBB.
     MBB2IdxMap[MBB->getNumber()] = std::make_pair(StartIdx, MIIndex - 1);
+    Idx2MBBMap.push_back(std::make_pair(StartIdx, MBB));
   }
+  std::sort(Idx2MBBMap.begin(), Idx2MBBMap.end(), Idx2MBBCompare());
 
   computeIntervals();
 
@@ -797,6 +816,23 @@
   }
 }
 
+bool LiveIntervals::findLiveInMBBs(const LiveRange &LR,
+                               SmallVector<MachineBasicBlock*, 4> &MBBs) const {
+  std::vector<IdxMBBPair>::const_iterator I =
+    std::lower_bound(Idx2MBBMap.begin(), Idx2MBBMap.end(), LR.start);
+
+  bool ResVal = false;
+  while (I != Idx2MBBMap.end()) {
+    if (LR.end <= I->first)
+      break;
+    MBBs.push_back(I->second);
+    ResVal = true;
+    ++I;
+  }
+  return ResVal;
+}
+
+
 LiveInterval LiveIntervals::createInterval(unsigned reg) {
   float Weight = MRegisterInfo::isPhysicalRegister(reg) ?
                        HUGE_VALF : 0.0F;





More information about the llvm-commits mailing list