[llvm-commits] CVS: llvm/lib/CodeGen/LiveIntervals.cpp

Chris Lattner lattner at cs.uiuc.edu
Mon Jul 19 07:40:40 PDT 2004



Changes in directory llvm/lib/CodeGen:

LiveIntervals.cpp updated: 1.95 -> 1.96

---
Log message:

When joining intervals, join intervals in deeply nested loops first.  This
is a simple change, but seems to improve code a little.  For example, on
256.bzip2, we went from 75.0s -> 73.33s (2% speedup).



---
Diffs of the changes:  (+35 -5)

Index: llvm/lib/CodeGen/LiveIntervals.cpp
diff -u llvm/lib/CodeGen/LiveIntervals.cpp:1.95 llvm/lib/CodeGen/LiveIntervals.cpp:1.96
--- llvm/lib/CodeGen/LiveIntervals.cpp:1.95	Mon Jul 19 09:08:09 2004
+++ llvm/lib/CodeGen/LiveIntervals.cpp	Mon Jul 19 09:40:29 2004
@@ -109,7 +109,6 @@
 
     // join intervals if requested
     if (EnableJoining) joinIntervals();
-    //DEBUG(mf_->viewCFG());
 
     numIntervalsAfter += intervals_.size();
 
@@ -581,13 +580,44 @@
     }
 }
 
-void LiveIntervals::joinIntervals()
-{
-    DEBUG(std::cerr << "********** JOINING INTERVALS ***********\n");
-
+namespace {
+  // DepthMBBCompare - Comparison predicate that sort first based on the loop
+  // depth of the basic block (the unsigned), and then on the MBB number.
+  struct DepthMBBCompare {
+    typedef std::pair<unsigned, MachineBasicBlock*> DepthMBBPair;
+    bool operator()(const DepthMBBPair &LHS, const DepthMBBPair &RHS) const {
+      if (LHS.first > RHS.first) return true;   // Deeper loops first
+      return LHS.first == RHS.first && 
+             LHS.second->getNumber() < RHS.second->getNumber();
+    }
+  };
+}
+
+void LiveIntervals::joinIntervals() {
+  DEBUG(std::cerr << "********** JOINING INTERVALS ***********\n");
+
+  const LoopInfo &LI = getAnalysis<LoopInfo>();
+  if (LI.begin() == LI.end()) {
+    // If there are no loops in the function, join intervals in function order.
     for (MachineFunction::iterator I = mf_->begin(), E = mf_->end();
          I != E; ++I)
       joinIntervalsInMachineBB(I);
+  } else {
+    // Otherwise, join intervals in inner loops before other intervals.
+    // Unfortunately we can't just iterate over loop hierarchy here because
+    // there may be more MBB's than BB's.  Collect MBB's for sorting.
+    std::vector<std::pair<unsigned, MachineBasicBlock*> > MBBs;
+    for (MachineFunction::iterator I = mf_->begin(), E = mf_->end();
+         I != E; ++I)
+      MBBs.push_back(std::make_pair(LI.getLoopDepth(I->getBasicBlock()), I));
+
+    // Sort by loop depth.
+    std::sort(MBBs.begin(), MBBs.end(), DepthMBBCompare());
+
+    // Finally, join intervals in loop nest order. 
+    for (unsigned i = 0, e = MBBs.size(); i != e; ++i)
+      joinIntervalsInMachineBB(MBBs[i].second);
+  }
 }
 
 bool LiveIntervals::overlapsAliases(const LiveInterval& lhs,





More information about the llvm-commits mailing list