From 3424275325c505d96d863377e51a632f6e2de99a Mon Sep 17 00:00:00 2001 From: David Greene Date: Tue, 21 Jul 2009 23:36:14 +0000 Subject: [PATCH] Add some support for iterative coalescers to calculate a joined live range's weight properly. This is turned off right now in the sense that you'll get an assert if you get into a situation that can only be caused by an iterative coalescer. All other code paths operate exactly as before so there is no functional change with this patch. The asserts should be disabled if/when an iterative coalescer gets added to trunk. llvm-svn: 76680 --- llvm/lib/CodeGen/LiveInterval.cpp | 18 +++++++++++++++++- llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp | 19 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/llvm/lib/CodeGen/LiveInterval.cpp b/llvm/lib/CodeGen/LiveInterval.cpp index b786b1d..0d2f6ba 100644 --- a/llvm/lib/CodeGen/LiveInterval.cpp +++ b/llvm/lib/CodeGen/LiveInterval.cpp @@ -503,7 +503,23 @@ void LiveInterval::join(LiveInterval &Other, const int *LHSValNoAssignments, InsertPos = addRangeFrom(*I, InsertPos); } - weight += Other.weight; + // If either of these intervals was spilled, the weight is the + // weight of the non-spilled interval. This can only happen with + // iterative coalescers. + + if (weight == HUGE_VALF && !TargetRegisterInfo::isPhysicalRegister(reg)) { + // Remove this assert if you have an iterative coalescer + assert(0 && "Joining to spilled interval"); + weight = Other.weight; + } + else if (Other.weight != HUGE_VALF) { + weight += Other.weight; + } + else { + // Remove this assert if you have an iterative coalescer + assert(0 && "Joining from spilled interval"); + } + // Otherwise the weight stays the same // Update regalloc hint if currently there isn't one. if (TargetRegisterInfo::isVirtualRegister(reg) && diff --git a/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp b/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp index 12001d0..f5d85ab 100644 --- a/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp +++ b/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp @@ -1969,7 +1969,24 @@ bool SimpleRegisterCoalescing::SimpleJoin(LiveInterval &LHS, LiveInterval &RHS){ LHSValNo->setHasPHIKill(true); LHS.addKills(LHSValNo, VNI->kills); LHS.MergeRangesInAsValue(RHS, LHSValNo); - LHS.weight += RHS.weight; + + // If either of these intervals was spilled, the weight is the + // weight of the non-spilled interval. This can only happen + // with iterative coalescers. + if (LHS.weight == HUGE_VALF && !TargetRegisterInfo::isPhysicalRegister(LHS.reg)) { + // Remove this assert if you have an iterative coalescer + assert(0 && "Joining to spilled interval"); + LHS.weight = RHS.weight; + } + else if (RHS.weight != HUGE_VALF) { + LHS.weight += RHS.weight; + } + else { + // Remove this assert if you have an iterative coalescer + assert(0 && "Joining from spilled interval"); + } + + // Otherwise the LHS weight stays the same // Update regalloc hint if both are virtual registers. if (TargetRegisterInfo::isVirtualRegister(LHS.reg) && -- 2.7.4