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
This commit is contained in:
Owen Anderson 2008-07-29 21:17:08 +00:00
parent a0c032f9b2
commit 83ea1f8e19

View File

@ -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);
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.containsOneValue())
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) {