Updated ModuloScheduling. It makes it all the wya through register allocation on...
[oota-llvm.git] / lib / CodeGen / RegAllocIterativeScan.cpp
index 9c946a7703f140ce9e435c4e57c7e2f7e6e8d811..e9e9fd8e13603b4a5c08b4c6761172ec3b7fd23a 100644 (file)
 #include "Support/Debug.h"
 #include "Support/Statistic.h"
 #include "Support/STLExtras.h"
-#include "LiveIntervals.h"
+#include "LiveIntervalAnalysis.h"
 #include "PhysRegTracker.h"
 #include "VirtRegMap.h"
 #include <algorithm>
 #include <cmath>
-#include <iostream>
 #include <set>
 
 using namespace llvm;
@@ -86,7 +85,7 @@ namespace {
 
         /// initIntervalSets - initializes the four interval sets:
         /// unhandled, fixed, active and inactive
-        void initIntervalSets(LiveIntervals::Intervals& li);
+        void initIntervalSets();
 
         /// processActiveIntervals - expire old intervals and move
         /// non-overlapping ones to the incative list
@@ -152,9 +151,9 @@ bool RA::runOnMachineFunction(MachineFunction &fn) {
     vrm_.reset(new VirtRegMap(*mf_));
     if (!spiller_.get()) spiller_.reset(createSpiller());
 
-    initIntervalSets(li_->getIntervals());
+    initIntervalSets();
 
-    numIntervals += li_->getIntervals().size();
+    numIntervals += li_->getNumIntervals();
 
     while (linearScan()) {
         // we spilled some registers, so we need to add intervals for
@@ -231,44 +230,44 @@ bool RA::linearScan()
     }
     
     // expire any remaining active intervals
-    for (IntervalPtrs::iterator i = active_.begin(); i != active_.end(); ) {
+    for (IntervalPtrs::reverse_iterator
+             i = active_.rbegin(); i != active_.rend(); ) {
         unsigned reg = (*i)->reg;
         DEBUG(std::cerr << "\tinterval " << **i << " expired\n");
         if (MRegisterInfo::isVirtualRegister(reg))
             reg = vrm_->getPhys(reg);
         prt_->delRegUse(reg);
-        i = active_.erase(i);
+        i = IntervalPtrs::reverse_iterator(active_.erase(i.base()-1));
     }
 
     // expire any remaining inactive intervals
-    for (IntervalPtrs::iterator
-             i = inactive_.begin(); i != inactive_.end(); ) {
+    for (IntervalPtrs::reverse_iterator
+             i = inactive_.rbegin(); i != inactive_.rend(); ) {
         DEBUG(std::cerr << "\tinterval " << **i << " expired\n");
-        i = inactive_.erase(i);
+        i = IntervalPtrs::reverse_iterator(inactive_.erase(i.base()-1));
     }
 
     // return true if we spilled anything
     return !spilled_.empty();
 }
 
-void RA::initIntervalSets(LiveIntervals::Intervals& li)
-{
+void RA::initIntervalSets() {
     assert(unhandled_.empty() && fixed_.empty() &&
            active_.empty() && inactive_.empty() &&
            "interval sets should be empty on initialization");
 
-    for (LiveIntervals::Intervals::iterator i = li.begin(), e = li.end();
-         i != e; ++i) {
-        unhandled_.push_back(&*i);
-        if (MRegisterInfo::isPhysicalRegister(i->reg))
-            fixed_.push_back(&*i);
+    for (LiveIntervals::iterator i = li_->begin(), e = li_->end(); i != e; ++i){
+      unhandled_.push_back(&i->second);
+      if (MRegisterInfo::isPhysicalRegister(i->second.reg))
+        fixed_.push_back(&i->second);
     }
 }
 
 void RA::processActiveIntervals(IntervalPtrs::value_type cur)
 {
     DEBUG(std::cerr << "\tprocessing active intervals:\n");
-    for (IntervalPtrs::iterator i = active_.begin(); i != active_.end();) {
+    for (IntervalPtrs::reverse_iterator
+             i = active_.rbegin(); i != active_.rend();) {
         unsigned reg = (*i)->reg;
         // remove expired intervals
         if ((*i)->expiredAt(cur->start())) {
@@ -277,7 +276,7 @@ void RA::processActiveIntervals(IntervalPtrs::value_type cur)
                 reg = vrm_->getPhys(reg);
             prt_->delRegUse(reg);
             // remove from active
-            i = active_.erase(i);
+            i = IntervalPtrs::reverse_iterator(active_.erase(i.base()-1));
         }
         // move inactive intervals to inactive list
         else if (!(*i)->liveAt(cur->start())) {
@@ -288,7 +287,7 @@ void RA::processActiveIntervals(IntervalPtrs::value_type cur)
             // add to inactive
             inactive_.push_back(*i);
             // remove from active
-            i = active_.erase(i);
+            i = IntervalPtrs::reverse_iterator(active_.erase(i.base()-1));
         }
         else {
             ++i;
@@ -299,14 +298,15 @@ void RA::processActiveIntervals(IntervalPtrs::value_type cur)
 void RA::processInactiveIntervals(IntervalPtrs::value_type cur)
 {
     DEBUG(std::cerr << "\tprocessing inactive intervals:\n");
-    for (IntervalPtrs::iterator i = inactive_.begin(); i != inactive_.end();) {
+    for (IntervalPtrs::reverse_iterator
+             i = inactive_.rbegin(); i != inactive_.rend();) {
         unsigned reg = (*i)->reg;
 
         // remove expired intervals
         if ((*i)->expiredAt(cur->start())) {
             DEBUG(std::cerr << "\t\tinterval " << **i << " expired\n");
             // remove from inactive
-            i = inactive_.erase(i);
+            i = IntervalPtrs::reverse_iterator(inactive_.erase(i.base()-1));
         }
         // move re-activated intervals in active list
         else if ((*i)->liveAt(cur->start())) {
@@ -317,7 +317,7 @@ void RA::processInactiveIntervals(IntervalPtrs::value_type cur)
             // add to active
             active_.push_back(*i);
             // remove from inactive
-            i = inactive_.erase(i);
+            i = IntervalPtrs::reverse_iterator(inactive_.erase(i.base()-1));
         }
         else {
             ++i;