Use existing LiveInterval methods to simplify live interval merging. Thanks to Evan for pointing these out.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54225 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson
2008-07-30 18:27:35 +00:00
parent 1053502486
commit d723f722b2

View File

@ -802,38 +802,39 @@ void StrongPHIElimination::mergeLiveIntervals(unsigned primary,
DenseMap<VNInfo*, VNInfo*> VNMap; DenseMap<VNInfo*, VNInfo*> VNMap;
VNMap.insert(std::make_pair(RangeMergingIn->valno, NewVN)); VNMap.insert(std::make_pair(RangeMergingIn->valno, NewVN));
bool changed = true; // Find all VNs that are the inputs to two-address instructiosn
while (changed) { // chaining upwards from the VN we're trying to merge.
changed = false; bool addedVN = true;
for (LiveInterval::iterator RI = RHS.begin(), RE = RHS.end(); while (addedVN) {
RI != RE; ) addedVN = false;
if (MergedVNs.count(RI->valno)) { unsigned defIndex = RHSVN->def;
NewVN->hasPHIKill = true;
LiveRange NewRange(RI->start, RI->end, VNMap[RI->valno]); if (defIndex != ~0U) {
LHS.addRange(NewRange); MachineInstr* instr = LI.getInstructionFromIndex(defIndex);
MachineInstr* instr = LI.getInstructionFromIndex(RI->start); for (unsigned i = 0; i < instr->getNumOperands(); ++i) {
for (unsigned i = 0; i < instr->getNumOperands(); ++i) { if (instr->getOperand(i).isReg() &&
if (instr->getOperand(i).isReg() && instr->getOperand(i).getReg() == secondary)
instr->getOperand(i).getReg() == secondary) if (instr->isRegReDefinedByTwoAddr(secondary, i)) {
if (instr->isRegReDefinedByTwoAddr(secondary, i)) { RHSVN = RHS.getLiveRangeContaining(defIndex-1)->valno;
VNInfo* twoaddr = RHS.getLiveRangeContaining(RI->start-1)->valno; addedVN = true;
MergedVNs.insert(twoaddr);
VNInfo* NextVN = LHS.getNextValue(RHSVN->def,
VNInfo* NextVN = LHS.getNextValue(twoaddr->def, RHSVN->copy,
twoaddr->copy, LI.getVNInfoAllocator());
LI.getVNInfoAllocator()); VNMap.insert(std::make_pair(RHSVN, NextVN));
VNMap.insert(std::make_pair(twoaddr, NextVN));
} break;
} }
}
unsigned start = RI->start; }
unsigned end = RI->end; }
++RI;
RHS.removeRange(start, end, true); // Merge VNs from RHS into LHS using the mapping we computed above.
changed = true; for (DenseMap<VNInfo*, VNInfo*>::iterator VI = VNMap.begin(),
} else VE = VNMap.end(); VI != VE; ++VI) {
++RI; LHS.MergeValueInAsValue(RHS, VI->first, VI->second);
RHS.removeValNo(VI->first);
} }
if (RHS.begin() == RHS.end()) if (RHS.begin() == RHS.end())