From 83ea1f8e19dc1fae54a3e40689ad0a76a8ff3992 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Tue, 29 Jul 2008 21:17:08 +0000 Subject: When merging a PHI operand's live interval into the PHI's live interval, we need to merge over all liveranges in the operand's interval that share the relevant value number, not just the range that immediately precedes the PHI. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54174 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/StrongPHIElimination.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'lib/CodeGen/StrongPHIElimination.cpp') diff --git a/lib/CodeGen/StrongPHIElimination.cpp b/lib/CodeGen/StrongPHIElimination.cpp index 399e615..3d23efe 100644 --- a/lib/CodeGen/StrongPHIElimination.cpp +++ b/lib/CodeGen/StrongPHIElimination.cpp @@ -786,21 +786,29 @@ void StrongPHIElimination::mergeLiveIntervals(unsigned primary, LiveInterval& RHS = LI.getOrCreateInterval(secondary); LI.computeNumbering(); - const LiveRange* RangeMergingIn = RHS.getLiveRangeContaining(LI.getMBBEndIdx(pred)); + VNInfo* RHSVN = RangeMergingIn->valno; VNInfo* NewVN = LHS.getNextValue(RangeMergingIn->valno->def, RangeMergingIn->valno->copy, LI.getVNInfoAllocator()); - NewVN->hasPHIKill = true; - LiveRange NewRange(RangeMergingIn->start, RangeMergingIn->end, NewVN); - - if (RHS.containsOneValue()) + + for (LiveInterval::iterator RI = RHS.begin(), RE = RHS.end(); + RI != RE; ) + if (RI->valno == RHSVN) { + NewVN->hasPHIKill = true; + LiveRange NewRange(RI->start, RI->end, NewVN); + LHS.addRange(NewRange); + + unsigned start = RI->start; + unsigned end = RI->end; + ++RI; + RHS.removeRange(start, end, true); + } else + ++RI; + + if (RHS.begin() == RHS.end()) LI.removeInterval(RHS.reg); - else - RHS.removeRange(RangeMergingIn->start, RangeMergingIn->end, true); - - LHS.addRange(NewRange); } bool StrongPHIElimination::runOnMachineFunction(MachineFunction &Fn) { -- cgit v1.1