diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-11-19 20:06:13 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-11-19 20:06:13 +0000 |
| commit | c0981da47d5696fe36474fcf86b4ce03ae3ff818 (patch) | |
| tree | f42add1021b9f2ac6a69ac7cf6c4499962739a45 /llvm/lib/CodeGen/LiveIntervals.cpp | |
| parent | 344a3780b2e33f6ca763666c380202b18aab72a3 (diff) | |
Diffstat (limited to 'llvm/lib/CodeGen/LiveIntervals.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/LiveIntervals.cpp | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/llvm/lib/CodeGen/LiveIntervals.cpp b/llvm/lib/CodeGen/LiveIntervals.cpp index 23036c2b115f..2f97386b6d18 100644 --- a/llvm/lib/CodeGen/LiveIntervals.cpp +++ b/llvm/lib/CodeGen/LiveIntervals.cpp @@ -1571,15 +1571,14 @@ void LiveIntervals::repairOldRegInRange(const MachineBasicBlock::iterator Begin, LaneBitmask LaneMask) { LiveInterval::iterator LII = LR.find(EndIdx); SlotIndex lastUseIdx; - if (LII == LR.begin()) { - // This happens when the function is called for a subregister that only - // occurs _after_ the range that is to be repaired. - return; - } - if (LII != LR.end() && LII->start < EndIdx) + if (LII != LR.end() && LII->start < EndIdx) { lastUseIdx = LII->end; - else + } else if (LII == LR.begin()) { + // We may not have a liverange at all if this is a subregister untouched + // between \p Begin and \p End. + } else { --LII; + } for (MachineBasicBlock::iterator I = End; I != Begin;) { --I; @@ -1593,10 +1592,7 @@ void LiveIntervals::repairOldRegInRange(const MachineBasicBlock::iterator Begin, // FIXME: This doesn't currently handle early-clobber or multiple removed // defs inside of the region to repair. - for (MachineInstr::mop_iterator OI = MI.operands_begin(), - OE = MI.operands_end(); - OI != OE; ++OI) { - const MachineOperand &MO = *OI; + for (const MachineOperand &MO : MI.operands()) { if (!MO.isReg() || MO.getReg() != Reg) continue; @@ -1608,17 +1604,9 @@ void LiveIntervals::repairOldRegInRange(const MachineBasicBlock::iterator Begin, if (MO.isDef()) { if (!isStartValid) { if (LII->end.isDead()) { - SlotIndex prevStart; + LII = LR.removeSegment(LII, true); if (LII != LR.begin()) - prevStart = std::prev(LII)->start; - - // FIXME: This could be more efficient if there was a - // removeSegment method that returned an iterator. - LR.removeSegment(*LII, true); - if (prevStart.isValid()) - LII = LR.find(prevStart); - else - LII = LR.begin(); + --LII; } else { LII->start = instrIdx.getRegSlot(); LII->valno->def = instrIdx.getRegSlot(); @@ -1656,6 +1644,10 @@ void LiveIntervals::repairOldRegInRange(const MachineBasicBlock::iterator Begin, } } } + + bool isStartValid = getInstructionFromIndex(LII->start); + if (!isStartValid && LII->end.isDead()) + LR.removeSegment(*LII, true); } void @@ -1678,22 +1670,33 @@ LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB, Indexes->repairIndexesInRange(MBB, Begin, End); + // Make sure a live interval exists for all register operands in the range. + SmallVector<Register> RegsToRepair(OrigRegs.begin(), OrigRegs.end()); for (MachineBasicBlock::iterator I = End; I != Begin;) { --I; MachineInstr &MI = *I; if (MI.isDebugOrPseudoInstr()) continue; - for (MachineInstr::const_mop_iterator MOI = MI.operands_begin(), - MOE = MI.operands_end(); - MOI != MOE; ++MOI) { - if (MOI->isReg() && Register::isVirtualRegister(MOI->getReg()) && - !hasInterval(MOI->getReg())) { - createAndComputeVirtRegInterval(MOI->getReg()); + for (const MachineOperand &MO : MI.operands()) { + if (MO.isReg() && MO.getReg().isVirtual()) { + Register Reg = MO.getReg(); + // If the new instructions refer to subregs but the old instructions did + // not, throw away any old live interval so it will be recomputed with + // subranges. + if (MO.getSubReg() && hasInterval(Reg) && + !getInterval(Reg).hasSubRanges() && + MRI->shouldTrackSubRegLiveness(Reg)) + removeInterval(Reg); + if (!hasInterval(Reg)) { + createAndComputeVirtRegInterval(Reg); + // Don't bother to repair a freshly calculated live interval. + erase_value(RegsToRepair, Reg); + } } } } - for (Register Reg : OrigRegs) { + for (Register Reg : RegsToRepair) { if (!Reg.isVirtual()) continue; @@ -1704,6 +1707,7 @@ LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB, for (LiveInterval::SubRange &S : LI.subranges()) repairOldRegInRange(Begin, End, EndIdx, S, Reg, S.LaneMask); + LI.removeEmptySubRanges(); repairOldRegInRange(Begin, End, EndIdx, LI, Reg); } |
