diff --git a/lib/CodeGen/LiveInterval.h b/lib/CodeGen/LiveInterval.h
index d23e413..87cb570 100644
--- a/lib/CodeGen/LiveInterval.h
+++ b/lib/CodeGen/LiveInterval.h
@@ -76,6 +76,11 @@
       : reg(Reg), weight(Weight), NumValues(0) {
     }
 
+
+    typedef Ranges::iterator iterator;
+    iterator begin() { return ranges.begin(); }
+    iterator end()   { return ranges.end(); }
+
     void swap(LiveInterval& other) {
       std::swap(reg, other.reg);
       std::swap(weight, other.weight);
@@ -91,21 +96,21 @@
 
     bool empty() const { return ranges.empty(); }
 
-    /// start - Return the lowest numbered slot covered by interval.
-    unsigned start() const {
+    /// beginNumber - Return the lowest numbered slot covered by interval.
+    unsigned beginNumber() const {
       assert(!empty() && "empty interval for register");
       return ranges.front().start;
     }
 
-    /// end - return the maximum point of the interval of the whole,
+    /// endNumber - return the maximum point of the interval of the whole,
     /// exclusive.
-    unsigned end() const {
+    unsigned endNumber() const {
       assert(!empty() && "empty interval for register");
       return ranges.back().end;
     }
 
     bool expiredAt(unsigned index) const {
-      return end() <= (index + 1);
+      return endNumber() <= (index + 1);
     }
 
     bool liveAt(unsigned index) const;
@@ -142,7 +147,7 @@
     void removeRange(unsigned Start, unsigned End);
 
     bool operator<(const LiveInterval& other) const {
-      return start() < other.start();
+      return beginNumber() < other.beginNumber();
     }
 
     void dump() const;
diff --git a/lib/CodeGen/RegAllocIterativeScan.cpp b/lib/CodeGen/RegAllocIterativeScan.cpp
index 4cdcc1d..e5f7be7 100644
--- a/lib/CodeGen/RegAllocIterativeScan.cpp
+++ b/lib/CodeGen/RegAllocIterativeScan.cpp
@@ -270,7 +270,7 @@
     unsigned reg = i->reg;
 
     // remove expired intervals
-    if (i->expiredAt(cur->start())) {
+    if (i->expiredAt(cur->beginNumber())) {
       DEBUG(std::cerr << "\t\tinterval " << *i << " expired\n");
       if (MRegisterInfo::isVirtualRegister(reg))
         reg = vrm_->getPhys(reg);
@@ -279,7 +279,7 @@
       std::iter_swap(ii, --ie);
     }
     // move inactive intervals to inactive list
-    else if (!i->liveAt(cur->start())) {
+    else if (!i->liveAt(cur->beginNumber())) {
       DEBUG(std::cerr << "\t\tinterval " << *i << " inactive\n");
       if (MRegisterInfo::isVirtualRegister(reg))
         reg = vrm_->getPhys(reg);
@@ -305,13 +305,13 @@
     unsigned reg = i->reg;
 
     // remove expired intervals
-    if (i->expiredAt(cur->start())) {
+    if (i->expiredAt(cur->beginNumber())) {
       DEBUG(std::cerr << "\t\tinterval " << *i << " expired\n");
       // swap with last element and move end iterator back one position
       std::iter_swap(ii, --ie);
     }
     // move re-activated intervals in active list
-    else if (i->liveAt(cur->start())) {
+    else if (i->liveAt(cur->beginNumber())) {
       DEBUG(std::cerr << "\t\tinterval " << *i << " active\n");
       if (MRegisterInfo::isVirtualRegister(reg))
         reg = vrm_->getPhys(reg);
@@ -424,7 +424,7 @@
   toSpill[minReg] = true;
   for (const unsigned* as = mri_->getAliasSet(minReg); *as; ++as)
     toSpill[*as] = true;
-  unsigned earliestStart = cur->start();
+  unsigned earliestStart = cur->beginNumber();
 
   std::set<unsigned> spilled;
 
diff --git a/lib/CodeGen/RegAllocLinearScan.cpp b/lib/CodeGen/RegAllocLinearScan.cpp
index 3025d25..83d9093 100644
--- a/lib/CodeGen/RegAllocLinearScan.cpp
+++ b/lib/CodeGen/RegAllocLinearScan.cpp
@@ -29,7 +29,6 @@
 #include <cmath>
 #include <set>
 #include <queue>
-
 using namespace llvm;
 
 namespace {
@@ -45,7 +44,8 @@
     const TargetMachine* tm_;
     const MRegisterInfo* mri_;
     LiveIntervals* li_;
-    typedef std::vector<LiveInterval*> IntervalPtrs;
+    typedef LiveInterval* IntervalPtr;
+    typedef std::vector<IntervalPtr> IntervalPtrs;
     IntervalPtrs handled_, fixed_, active_, inactive_;
     typedef std::priority_queue<LiveInterval*,
                                 IntervalPtrs,
@@ -231,13 +231,14 @@
 void RA::processActiveIntervals(IntervalPtrs::value_type cur)
 {
   DEBUG(std::cerr << "\tprocessing active intervals:\n");
+
   IntervalPtrs::iterator ii = active_.begin(), ie = active_.end();
   while (ii != ie) {
     LiveInterval* i = *ii;
     unsigned reg = i->reg;
 
     // remove expired intervals
-    if (i->expiredAt(cur->start())) {
+    if (i->expiredAt(cur->beginNumber())) {
       DEBUG(std::cerr << "\t\tinterval " << *i << " expired\n");
       if (MRegisterInfo::isVirtualRegister(reg))
         reg = vrm_->getPhys(reg);
@@ -246,7 +247,7 @@
       std::iter_swap(ii, --ie);
     }
     // move inactive intervals to inactive list
-    else if (!i->liveAt(cur->start())) {
+    else if (!i->liveAt(cur->beginNumber())) {
       DEBUG(std::cerr << "\t\tinterval " << *i << " inactive\n");
       if (MRegisterInfo::isVirtualRegister(reg))
         reg = vrm_->getPhys(reg);
@@ -267,18 +268,19 @@
 {
   DEBUG(std::cerr << "\tprocessing inactive intervals:\n");
   IntervalPtrs::iterator ii = inactive_.begin(), ie = inactive_.end();
+
   while (ii != ie) {
     LiveInterval* i = *ii;
     unsigned reg = i->reg;
 
     // remove expired intervals
-    if (i->expiredAt(cur->start())) {
+    if (i->expiredAt(cur->beginNumber())) {
       DEBUG(std::cerr << "\t\tinterval " << *i << " expired\n");
       // swap with last element and move end iterator back one position
       std::iter_swap(ii, --ie);
     }
     // move re-activated intervals in active list
-    else if (i->liveAt(cur->start())) {
+    else if (i->liveAt(cur->beginNumber())) {
       DEBUG(std::cerr << "\t\tinterval " << *i << " active\n");
       if (MRegisterInfo::isVirtualRegister(reg))
         reg = vrm_->getPhys(reg);
@@ -413,7 +415,7 @@
 
   // the earliest start of a spilled interval indicates up to where
   // in handled we need to roll back
-  unsigned earliestStart = cur->start();
+  unsigned earliestStart = cur->beginNumber();
 
   // set of spilled vregs (used later to rollback properly)
   std::set<unsigned> spilled;
@@ -431,7 +433,7 @@
         toSpill[vrm_->getPhys(reg)] &&
         cur->overlaps(**i)) {
       DEBUG(std::cerr << "\t\t\tspilling(a): " << **i << '\n');
-      earliestStart = std::min(earliestStart, (*i)->start());
+      earliestStart = std::min(earliestStart, (*i)->beginNumber());
       int slot = vrm_->assignVirt2StackSlot((*i)->reg);
       std::vector<LiveInterval*> newIs =
         li_->addIntervalsForSpills(**i, *vrm_, slot);
@@ -446,7 +448,7 @@
         toSpill[vrm_->getPhys(reg)] &&
         cur->overlaps(**i)) {
       DEBUG(std::cerr << "\t\t\tspilling(i): " << **i << '\n');
-      earliestStart = std::min(earliestStart, (*i)->start());
+      earliestStart = std::min(earliestStart, (*i)->beginNumber());
       int slot = vrm_->assignVirt2StackSlot((*i)->reg);
       std::vector<LiveInterval*> newIs =
         li_->addIntervalsForSpills(**i, *vrm_, slot);
@@ -462,7 +464,7 @@
   while (!handled_.empty()) {
     LiveInterval* i = handled_.back();
     // if this interval starts before t we are done
-    if (i->start() < earliestStart)
+    if (i->beginNumber() < earliestStart)
       break;
     DEBUG(std::cerr << "\t\t\tundo changes for: " << *i << '\n');
     handled_.pop_back();
@@ -505,7 +507,7 @@
   // put it in inactive if required)
   for (IntervalPtrs::iterator i = handled_.begin(), e = handled_.end(); 
        i != e; ++i) {
-    if (!(*i)->expiredAt(earliestStart) && (*i)->expiredAt(cur->start())) {
+    if (!(*i)->expiredAt(earliestStart) && (*i)->expiredAt(cur->beginNumber())){
       DEBUG(std::cerr << "\t\t\tundo changes for: " << **i << '\n');
       active_.push_back(*i);
       if (MRegisterInfo::isPhysicalRegister((*i)->reg))
