forked from OSchip/llvm-project
LiveIntervalAnalysis: Factor out code to update liveness on physreg def removal
This cleans up code and is more in line with the general philosophy of modifying LiveIntervals through LiveIntervalAnalysis instead of changing them directly. llvm-svn: 226687
This commit is contained in:
parent
1002baf7b9
commit
cfb8ad29b5
|
@ -393,6 +393,8 @@ namespace llvm {
|
|||
return RegUnitRanges[Unit];
|
||||
}
|
||||
|
||||
void removePhysRegDefAt(unsigned Reg, SlotIndex Pos);
|
||||
|
||||
private:
|
||||
/// Compute live intervals for all virtual registers.
|
||||
void computeVirtRegs();
|
||||
|
|
|
@ -1142,13 +1142,8 @@ foldMemoryOperand(ArrayRef<std::pair<MachineInstr*, unsigned> > Ops,
|
|||
continue;
|
||||
// FoldMI does not define this physreg. Remove the LI segment.
|
||||
assert(MO->isDead() && "Cannot fold physreg def");
|
||||
for (MCRegUnitIterator Units(Reg, &TRI); Units.isValid(); ++Units) {
|
||||
if (LiveRange *LR = LIS.getCachedRegUnit(*Units)) {
|
||||
SlotIndex Idx = LIS.getInstructionIndex(MI).getRegSlot();
|
||||
if (VNInfo *VNI = LR->getVNInfoAt(Idx))
|
||||
LR->removeValNo(VNI);
|
||||
}
|
||||
}
|
||||
SlotIndex Idx = LIS.getInstructionIndex(MI).getRegSlot();
|
||||
LIS.removePhysRegDefAt(Reg, Idx);
|
||||
}
|
||||
|
||||
LIS.ReplaceMachineInstrInMaps(MI, FoldMI);
|
||||
|
|
|
@ -1367,3 +1367,11 @@ LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB,
|
|||
repairOldRegInRange(Begin, End, endIdx, LI, Reg);
|
||||
}
|
||||
}
|
||||
|
||||
void LiveIntervals::removePhysRegDefAt(unsigned Reg, SlotIndex Pos) {
|
||||
for (MCRegUnitIterator Units(Reg, TRI); Units.isValid(); ++Units) {
|
||||
if (LiveRange *LR = getCachedRegUnit(*Units))
|
||||
if (VNInfo *VNI = LR->getVNInfoAt(Pos))
|
||||
LR->removeValNo(VNI);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -256,15 +256,8 @@ void LiveRangeEdit::eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink) {
|
|||
// Check if MI reads any unreserved physregs.
|
||||
if (Reg && MOI->readsReg() && !MRI.isReserved(Reg))
|
||||
ReadsPhysRegs = true;
|
||||
else if (MOI->isDef()) {
|
||||
for (MCRegUnitIterator Units(Reg, MRI.getTargetRegisterInfo());
|
||||
Units.isValid(); ++Units) {
|
||||
if (LiveRange *LR = LIS.getCachedRegUnit(*Units)) {
|
||||
if (VNInfo *VNI = LR->getVNInfoAt(Idx))
|
||||
LR->removeValNo(VNI);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (MOI->isDef())
|
||||
LIS.removePhysRegDefAt(Reg, Idx);
|
||||
continue;
|
||||
}
|
||||
LiveInterval &LI = LIS.getInterval(Reg);
|
||||
|
|
|
@ -1463,17 +1463,13 @@ bool RegisterCoalescer::joinReservedPhysReg(CoalescerPair &CP) {
|
|||
|
||||
// We're going to remove the copy which defines a physical reserved
|
||||
// register, so remove its valno, etc.
|
||||
DEBUG(dbgs() << "\t\tRemoving phys reg def of " << DstReg << " at "
|
||||
<< CopyRegIdx << "\n");
|
||||
|
||||
LIS->removePhysRegDefAt(DstReg, CopyRegIdx);
|
||||
// Create a new dead def at the new def location.
|
||||
for (MCRegUnitIterator UI(DstReg, TRI); UI.isValid(); ++UI) {
|
||||
LiveRange &LR = LIS->getRegUnit(*UI);
|
||||
VNInfo *OrigRegVNI = LR.getVNInfoAt(CopyRegIdx);
|
||||
if (!OrigRegVNI)
|
||||
continue;
|
||||
|
||||
DEBUG(dbgs() << "\t\tRemoving: " << CopyRegIdx << " from " << LR << "\n");
|
||||
LR.removeSegment(CopyRegIdx, CopyRegIdx.getDeadSlot());
|
||||
LR.removeValNo(OrigRegVNI);
|
||||
|
||||
// Create a new dead def at the new def location.
|
||||
LR.createDeadDef(DestRegIdx, LIS->getVNInfoAllocator());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue