diff --git a/lib/CodeGen/LiveInterval.cpp b/lib/CodeGen/LiveInterval.cpp index b786b1d85b0..0d2f6ba76a7 100644 --- a/lib/CodeGen/LiveInterval.cpp +++ b/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/lib/CodeGen/SimpleRegisterCoalescing.cpp b/lib/CodeGen/SimpleRegisterCoalescing.cpp index 12001d08b04..f5d85ab4544 100644 --- a/lib/CodeGen/SimpleRegisterCoalescing.cpp +++ b/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) &&