mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-04 10:59:04 +00:00
When merging live intervals, we also need to merge in any live ranges that are inputs to two-address instructions
that themselves define a range we already care about. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54185 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
068acc3caa
commit
b9fb8d1e69
@ -792,20 +792,49 @@ void StrongPHIElimination::mergeLiveIntervals(unsigned primary,
|
|||||||
VNInfo* NewVN = LHS.getNextValue(RangeMergingIn->valno->def,
|
VNInfo* NewVN = LHS.getNextValue(RangeMergingIn->valno->def,
|
||||||
RangeMergingIn->valno->copy,
|
RangeMergingIn->valno->copy,
|
||||||
LI.getVNInfoAllocator());
|
LI.getVNInfoAllocator());
|
||||||
|
|
||||||
for (LiveInterval::iterator RI = RHS.begin(), RE = RHS.end();
|
// If we discover that a live range was defined by a two-addr
|
||||||
RI != RE; )
|
// instruction, we need to merge over the input as well, even if
|
||||||
if (RI->valno == RHSVN) {
|
// it has a different VNInfo.
|
||||||
NewVN->hasPHIKill = true;
|
SmallPtrSet<VNInfo*, 4> MergedVNs;
|
||||||
LiveRange NewRange(RI->start, RI->end, NewVN);
|
MergedVNs.insert(RHSVN);
|
||||||
LHS.addRange(NewRange);
|
|
||||||
|
DenseMap<VNInfo*, VNInfo*> VNMap;
|
||||||
|
VNMap.insert(std::make_pair(RangeMergingIn->valno, NewVN));
|
||||||
|
|
||||||
|
bool changed = true;
|
||||||
|
while (changed) {
|
||||||
|
changed = false;
|
||||||
|
for (LiveInterval::iterator RI = RHS.begin(), RE = RHS.end();
|
||||||
|
RI != RE; )
|
||||||
|
if (MergedVNs.count(RI->valno)) {
|
||||||
|
NewVN->hasPHIKill = true;
|
||||||
|
LiveRange NewRange(RI->start, RI->end, VNMap[RI->valno]);
|
||||||
|
LHS.addRange(NewRange);
|
||||||
|
|
||||||
unsigned start = RI->start;
|
MachineInstr* instr = LI.getInstructionFromIndex(RI->start);
|
||||||
unsigned end = RI->end;
|
for (unsigned i = 0; i < instr->getNumOperands(); ++i) {
|
||||||
++RI;
|
if (instr->getOperand(i).isReg() &&
|
||||||
RHS.removeRange(start, end, true);
|
instr->getOperand(i).getReg() == secondary)
|
||||||
} else
|
if (instr->isRegReDefinedByTwoAddr(secondary, i)) {
|
||||||
++RI;
|
VNInfo* twoaddr = RHS.getLiveRangeContaining(RI->start-1)->valno;
|
||||||
|
MergedVNs.insert(twoaddr);
|
||||||
|
|
||||||
|
VNInfo* NextVN = LHS.getNextValue(twoaddr->def,
|
||||||
|
twoaddr->copy,
|
||||||
|
LI.getVNInfoAllocator());
|
||||||
|
VNMap.insert(std::make_pair(twoaddr, NextVN));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned start = RI->start;
|
||||||
|
unsigned end = RI->end;
|
||||||
|
++RI;
|
||||||
|
RHS.removeRange(start, end, true);
|
||||||
|
changed = true;
|
||||||
|
} else
|
||||||
|
++RI;
|
||||||
|
}
|
||||||
|
|
||||||
if (RHS.begin() == RHS.end())
|
if (RHS.begin() == RHS.end())
|
||||||
LI.removeInterval(RHS.reg);
|
LI.removeInterval(RHS.reg);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user