mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
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. llvm-svn: 54174
This commit is contained in:
parent
bebb8e5d20
commit
ab575176fc
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user