aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/LiveInterval.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-07-24 03:41:50 +0000
committerChris Lattner <sabre@nondot.org>2004-07-24 03:41:50 +0000
commitdeb9971061cfb9c57930724fcf8d62fb26dc2213 (patch)
tree91ee65a78d1d9c5d6f3dbdaceecace09ad55330a /lib/CodeGen/LiveInterval.cpp
parent4df98e546dd0cca214df661ae1072e1a3f6eff98 (diff)
In the joiner, merge the small interval into the large interval. This restores
us back to taking about 10.5s on gcc, instead of taking 15.6s! The net result is that my big patches have hand no significant effect on compile time or code quality. heh. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15156 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LiveInterval.cpp')
-rw-r--r--lib/CodeGen/LiveInterval.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/CodeGen/LiveInterval.cpp b/lib/CodeGen/LiveInterval.cpp
index 1cd9fb1a4a..79aa710c03 100644
--- a/lib/CodeGen/LiveInterval.cpp
+++ b/lib/CodeGen/LiveInterval.cpp
@@ -260,6 +260,15 @@ void LiveInterval::join(LiveInterval &Other, unsigned CopyIdx) {
unsigned MergedSrcValIdx = SourceLR->ValId;
unsigned MergedDstValIdx = DestLR->ValId;
+ // Try to do the least amount of work possible. In particular, if there are
+ // more liverange chunks in the other set than there are in the 'this' set,
+ // swap sets to merge the fewest chunks in possible.
+ if (Other.ranges.size() > ranges.size()) {
+ std::swap(MergedSrcValIdx, MergedDstValIdx);
+ std::swap(ranges, Other.ranges);
+ std::swap(NumValues, Other.NumValues);
+ }
+
// Join the ranges of other into the ranges of this interval.
Ranges::iterator InsertPos = ranges.begin();
std::map<unsigned, unsigned> Dst2SrcIdxMap;