Handle multiple virtual register definitions gracefully.

Move some of the longer LiveIntervals::Interval method out of the
header and add debug information to them. Fix bug and simplify range
merging code.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10509 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alkis Evlogimenos
2003-12-18 08:48:48 +00:00
parent 5b7142a877
commit dd2cc65f34
4 changed files with 79 additions and 192 deletions

View File

@ -59,55 +59,12 @@ namespace llvm {
return end() <= index;
}
bool overlaps(unsigned index) const {
for (Ranges::const_iterator
i = ranges.begin(), e = ranges.end(); i != e; ++i) {
if (index >= i->first && index < i->second) {
return true;
}
}
return false;
}
void addRange(unsigned start, unsigned end) {
Range range = std::make_pair(start, end);
Ranges::iterator it =
std::lower_bound(ranges.begin(), ranges.end(), range);
if (it == ranges.end()) {
it = ranges.insert(it, range);
goto exit;
}
assert(range.first <= it->first && "got wrong iterator?");
// merge ranges if necesary
if (range.first < it->first) {
if (range.second >= it->first) {
it->first = range.first;
}
else {
it = ranges.insert(it, range);
assert(it != ranges.end() && "wtf?");
goto exit;
}
}
exit:
mergeRangesIfNecessary(it);
}
void addRange(unsigned start, unsigned end);
private:
void mergeRangesIfNecessary(Ranges::iterator it) {
while (it != ranges.begin()) {
Ranges::iterator prev = it - 1;
if (prev->second < it->first) {
break;
}
prev->second = it->second;
ranges.erase(it);
it = prev;
}
}
void mergeRangesForward(Ranges::iterator it);
void mergeRangesBackward(Ranges::iterator it);
};
struct StartPointComp {

View File

@ -59,55 +59,12 @@ namespace llvm {
return end() <= index;
}
bool overlaps(unsigned index) const {
for (Ranges::const_iterator
i = ranges.begin(), e = ranges.end(); i != e; ++i) {
if (index >= i->first && index < i->second) {
return true;
}
}
return false;
}
void addRange(unsigned start, unsigned end) {
Range range = std::make_pair(start, end);
Ranges::iterator it =
std::lower_bound(ranges.begin(), ranges.end(), range);
if (it == ranges.end()) {
it = ranges.insert(it, range);
goto exit;
}
assert(range.first <= it->first && "got wrong iterator?");
// merge ranges if necesary
if (range.first < it->first) {
if (range.second >= it->first) {
it->first = range.first;
}
else {
it = ranges.insert(it, range);
assert(it != ranges.end() && "wtf?");
goto exit;
}
}
exit:
mergeRangesIfNecessary(it);
}
void addRange(unsigned start, unsigned end);
private:
void mergeRangesIfNecessary(Ranges::iterator it) {
while (it != ranges.begin()) {
Ranges::iterator prev = it - 1;
if (prev->second < it->first) {
break;
}
prev->second = it->second;
ranges.erase(it);
it = prev;
}
}
void mergeRangesForward(Ranges::iterator it);
void mergeRangesBackward(Ranges::iterator it);
};
struct StartPointComp {