mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-23 01:24:30 +00:00
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:
@ -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 {
|
||||
|
@ -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 {
|
||||
|
Reference in New Issue
Block a user