diff options
author | Chris Lattner <sabre@nondot.org> | 2004-07-23 18:40:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-07-23 18:40:00 +0000 |
commit | 2fcc5e416d373e25a8b739532b20b8545f70c16a (patch) | |
tree | 2d0c64101f817f8b0aebfade13bff251c01d180a /llvm/lib/CodeGen | |
parent | 60babd0431db7ce53b91d5e39df0b5d6d0d52315 (diff) | |
download | bcm5719-llvm-2fcc5e416d373e25a8b739532b20b8545f70c16a.tar.gz bcm5719-llvm-2fcc5e416d373e25a8b739532b20b8545f70c16a.zip |
Search by the start point, not by the whole interval. This saves some
comparisons, reducing linscan by another .1 seconds :)
llvm-svn: 15139
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/LiveInterval.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/llvm/lib/CodeGen/LiveInterval.cpp b/llvm/lib/CodeGen/LiveInterval.cpp index b0189daf83e..25081e1f890 100644 --- a/llvm/lib/CodeGen/LiveInterval.cpp +++ b/llvm/lib/CodeGen/LiveInterval.cpp @@ -25,10 +25,10 @@ using namespace llvm; // An example for liveAt(): // -// this = [1,4), liveAt(0) will return false. The instruction defining -// this spans slots [0,3]. The interval belongs to an spilled -// definition of the variable it represents. This is because slot 1 is -// used (def slot) and spans up to slot 3 (store slot). +// this = [1,4), liveAt(0) will return false. The instruction defining this +// spans slots [0,3]. The interval belongs to an spilled definition of the +// variable it represents. This is because slot 1 is used (def slot) and spans +// up to slot 3 (store slot). // bool LiveInterval::liveAt(unsigned I) const { Ranges::const_iterator r = std::upper_bound(ranges.begin(), ranges.end(), I); @@ -37,7 +37,7 @@ bool LiveInterval::liveAt(unsigned I) const { return false; --r; - return I >= r->start && I < r->end; + return r->contains(I); } // An example for overlaps(): @@ -60,12 +60,13 @@ bool LiveInterval::overlaps(const LiveInterval& other) const { Ranges::const_iterator j = other.ranges.begin(); Ranges::const_iterator je = other.ranges.end(); if (i->start < j->start) { - i = std::upper_bound(i, ie, *j); + i = std::upper_bound(i, ie, j->start); if (i != ranges.begin()) --i; - } - else if (j->start < i->start) { - j = std::upper_bound(j, je, *i); + } else if (j->start < i->start) { + j = std::upper_bound(j, je, i->start); if (j != other.ranges.begin()) --j; + } else { + return true; } while (i != ie && j != je) { @@ -88,7 +89,7 @@ bool LiveInterval::overlaps(const LiveInterval& other) const { void LiveInterval::addRange(LiveRange LR) { Ranges::iterator it = - ranges.insert(std::upper_bound(ranges.begin(), ranges.end(), LR), LR); + ranges.insert(std::upper_bound(ranges.begin(), ranges.end(), LR.start), LR); mergeRangesBackward(mergeRangesForward(it)); } @@ -99,7 +100,7 @@ void LiveInterval::join(const LiveInterval& other) { for (Ranges::const_iterator i = other.ranges.begin(), e = other.ranges.end(); i != e; ++i) { - cur = ranges.insert(std::upper_bound(cur, ranges.end(), *i), *i); + cur = ranges.insert(std::upper_bound(cur, ranges.end(), i->start), *i); cur = mergeRangesBackward(mergeRangesForward(cur)); } weight += other.weight; |