+void LiveIntervals::Interval::addRange(unsigned start, unsigned end)
+{
+ DEBUG(std::cerr << "\t\t\t\tadding range: [" << start <<','<< end << "]\n");
+ //assert(start < end && "invalid range?");
+ Range range = std::make_pair(start, end);
+ Ranges::iterator it =
+ ranges.insert(std::upper_bound(ranges.begin(), ranges.end(), range),
+ range);
+
+ DEBUG(std::cerr << "\t\t\t\tbefore merge forward: " << *this << '\n');
+ mergeRangesForward(it);
+ DEBUG(std::cerr << "\t\t\t\tbefore merge backward: " << *this << '\n');
+ mergeRangesBackward(it);
+ DEBUG(std::cerr << "\t\t\t\tafter merging: " << *this << '\n');
+}
+
+void LiveIntervals::Interval::mergeRangesForward(Ranges::iterator it)
+{
+ for (Ranges::iterator next = it + 1;
+ next != ranges.end() && it->second >= next->first; ) {
+ it->second = std::max(it->second, next->second);
+ next = ranges.erase(next);
+ }
+}
+
+void LiveIntervals::Interval::mergeRangesBackward(Ranges::iterator it)
+{
+ for (Ranges::iterator prev = it - 1;
+ it != ranges.begin() && it->first <= prev->second; ) {
+ it->first = std::min(it->first, prev->first);
+ it->second = std::max(it->second, prev->second);
+ it = ranges.erase(prev);
+ prev = it - 1;
+ }
+}
+