aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/LiveInterval.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-08-26 01:28:16 +0000
committerChris Lattner <sabre@nondot.org>2006-08-26 01:28:16 +0000
commite7f729b42b54fa751ba3524e1c597aad6d3ec3d7 (patch)
tree2728d9326be431b5764b9eee366ab2ce9a5ecaad /lib/CodeGen/LiveInterval.cpp
parent6da2f3268d12a9e64f2635dbb94b63e1c4142f59 (diff)
Simplifications to liveinterval analysis, no functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29896 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LiveInterval.cpp')
-rw-r--r--lib/CodeGen/LiveInterval.cpp26
1 files changed, 15 insertions, 11 deletions
diff --git a/lib/CodeGen/LiveInterval.cpp b/lib/CodeGen/LiveInterval.cpp
index 80c050ff33..7f16b31823 100644
--- a/lib/CodeGen/LiveInterval.cpp
+++ b/lib/CodeGen/LiveInterval.cpp
@@ -374,21 +374,25 @@ LiveInterval::FindLiveRangeContaining(unsigned Idx) {
/// is the result of a copy instruction in the source program, that occurs at
/// index 'CopyIdx' that copies from 'Other' to 'this'.
void LiveInterval::join(LiveInterval &Other, unsigned CopyIdx) {
- const LiveRange *SourceLR = Other.getLiveRangeContaining(CopyIdx-1);
- const LiveRange *DestLR = getLiveRangeContaining(CopyIdx);
- assert(SourceLR && DestLR && "Not joining due to a copy?");
- 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);
- std::swap(InstDefiningValue, Other.InstDefiningValue);
+ //
+ // Also, if one range is a physreg and one is a vreg, we always merge from the
+ // vreg into the physreg, which leaves the vreg intervals pristine.
+ unsigned OtherOffs = 1, ThisOffs = 0;
+ if ((Other.ranges.size() > ranges.size() &&
+ MRegisterInfo::isVirtualRegister(reg)) ||
+ MRegisterInfo::isPhysicalRegister(Other.reg)) {
+ swap(Other);
+ std::swap(ThisOffs, OtherOffs);
}
+
+ const LiveRange *SourceLR = Other.getLiveRangeContaining(CopyIdx-OtherOffs);
+ const LiveRange *DestLR = getLiveRangeContaining(CopyIdx-ThisOffs);
+ assert(SourceLR && DestLR && "Not joining due to a copy?");
+ unsigned MergedSrcValIdx = SourceLR->ValId;
+ unsigned MergedDstValIdx = DestLR->ValId;
// Join the ranges of other into the ranges of this interval.
std::map<unsigned, unsigned> Dst2SrcIdxMap;