diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
commit | cfca06d7963fa0909f90483b42a6d7d194d01e08 (patch) | |
tree | 209fb2a2d68f8f277793fc8df46c753d31bc853b /llvm/lib/CodeGen/LiveIntervals.cpp | |
parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) |
Notes
Diffstat (limited to 'llvm/lib/CodeGen/LiveIntervals.cpp')
-rw-r--r-- | llvm/lib/CodeGen/LiveIntervals.cpp | 102 |
1 files changed, 72 insertions, 30 deletions
diff --git a/llvm/lib/CodeGen/LiveIntervals.cpp b/llvm/lib/CodeGen/LiveIntervals.cpp index 9c80282bc59eb..e8ee0599e1a2c 100644 --- a/llvm/lib/CodeGen/LiveIntervals.cpp +++ b/llvm/lib/CodeGen/LiveIntervals.cpp @@ -21,7 +21,7 @@ #include "llvm/ADT/iterator_range.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/CodeGen/LiveInterval.h" -#include "llvm/CodeGen/LiveRangeCalc.h" +#include "llvm/CodeGen/LiveIntervalCalc.h" #include "llvm/CodeGen/LiveVariables.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" @@ -101,9 +101,7 @@ LiveIntervals::LiveIntervals() : MachineFunctionPass(ID) { initializeLiveIntervalsPass(*PassRegistry::getPassRegistry()); } -LiveIntervals::~LiveIntervals() { - delete LRCalc; -} +LiveIntervals::~LiveIntervals() { delete LICalc; } void LiveIntervals::releaseMemory() { // Free the live intervals themselves. @@ -131,8 +129,8 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) { Indexes = &getAnalysis<SlotIndexes>(); DomTree = &getAnalysis<MachineDominatorTree>(); - if (!LRCalc) - LRCalc = new LiveRangeCalc(); + if (!LICalc) + LICalc = new LiveIntervalCalc(); // Allocate space for all virtual registers. VirtRegIntervals.resize(MRI->getNumVirtRegs()); @@ -192,10 +190,10 @@ LiveInterval* LiveIntervals::createInterval(unsigned reg) { /// Compute the live interval of a virtual register, based on defs and uses. bool LiveIntervals::computeVirtRegInterval(LiveInterval &LI) { - assert(LRCalc && "LRCalc not initialized."); + assert(LICalc && "LICalc not initialized."); assert(LI.empty() && "Should only compute empty intervals."); - LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); - LRCalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.reg)); + LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); + LICalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.reg)); return computeDeadValues(LI, nullptr); } @@ -266,8 +264,8 @@ void LiveIntervals::computeRegMasks() { /// aliasing registers. The range should be empty, or contain only dead /// phi-defs from ABI blocks. void LiveIntervals::computeRegUnitRange(LiveRange &LR, unsigned Unit) { - assert(LRCalc && "LRCalc not initialized."); - LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); + assert(LICalc && "LICalc not initialized."); + LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); // The physregs aliasing Unit are the roots and their super-registers. // Create all values as dead defs before extending to uses. Note that roots @@ -281,7 +279,7 @@ void LiveIntervals::computeRegUnitRange(LiveRange &LR, unsigned Unit) { Super.isValid(); ++Super) { unsigned Reg = *Super; if (!MRI->reg_empty(Reg)) - LRCalc->createDeadDefs(LR, Reg); + LICalc->createDeadDefs(LR, Reg); // A register unit is considered reserved if all its roots and all their // super registers are reserved. if (!MRI->isReserved(Reg)) @@ -300,7 +298,7 @@ void LiveIntervals::computeRegUnitRange(LiveRange &LR, unsigned Unit) { Super.isValid(); ++Super) { unsigned Reg = *Super; if (!MRI->reg_empty(Reg)) - LRCalc->extendToUses(LR, Reg); + LICalc->extendToUses(LR, Reg); } } } @@ -623,10 +621,10 @@ void LiveIntervals::shrinkToUses(LiveInterval::SubRange &SR, unsigned Reg) { void LiveIntervals::extendToIndices(LiveRange &LR, ArrayRef<SlotIndex> Indices, ArrayRef<SlotIndex> Undefs) { - assert(LRCalc && "LRCalc not initialized."); - LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); + assert(LICalc && "LICalc not initialized."); + LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); for (SlotIndex Idx : Indices) - LRCalc->extend(LR, Idx, /*PhysReg=*/0, Undefs); + LICalc->extend(LR, Idx, /*PhysReg=*/0, Undefs); } void LiveIntervals::pruneValue(LiveRange &LR, SlotIndex Kill, @@ -1013,6 +1011,20 @@ public: } } updateRange(LI, Reg, LaneBitmask::getNone()); + // If main range has a hole and we are moving a subrange use across + // the hole updateRange() cannot properly handle it since it only + // gets the LiveRange and not the whole LiveInterval. As a result + // we may end up with a main range not covering all subranges. + // This is extremely rare case, so let's check and reconstruct the + // main range. + for (LiveInterval::SubRange &S : LI.subranges()) { + if (LI.covers(S)) + continue; + LI.clear(); + LIS.constructMainRangeFromSubranges(LI); + break; + } + continue; } @@ -1344,7 +1356,7 @@ private: OldIdxOut->start = NewIdxDef; OldIdxVNI->def = NewIdxDef; if (OldIdxIn != E && SlotIndex::isEarlierInstr(NewIdx, OldIdxIn->end)) - OldIdxIn->end = NewIdx.getRegSlot(); + OldIdxIn->end = NewIdxDef; } } else if (OldIdxIn != E && SlotIndex::isEarlierInstr(NewIdxOut->start, NewIdx) @@ -1480,13 +1492,43 @@ void LiveIntervals::handleMove(MachineInstr &MI, bool UpdateFlags) { HME.updateAllRanges(&MI); } -void LiveIntervals::handleMoveIntoBundle(MachineInstr &MI, - MachineInstr &BundleStart, - bool UpdateFlags) { - SlotIndex OldIndex = Indexes->getInstructionIndex(MI); - SlotIndex NewIndex = Indexes->getInstructionIndex(BundleStart); - HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags); - HME.updateAllRanges(&MI); +void LiveIntervals::handleMoveIntoNewBundle(MachineInstr &BundleStart, + bool UpdateFlags) { + assert((BundleStart.getOpcode() == TargetOpcode::BUNDLE) && + "Bundle start is not a bundle"); + SmallVector<SlotIndex, 16> ToProcess; + const SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(BundleStart); + auto BundleEnd = getBundleEnd(BundleStart.getIterator()); + + auto I = BundleStart.getIterator(); + I++; + while (I != BundleEnd) { + if (!Indexes->hasIndex(*I)) + continue; + SlotIndex OldIndex = Indexes->getInstructionIndex(*I, true); + ToProcess.push_back(OldIndex); + Indexes->removeMachineInstrFromMaps(*I, true); + I++; + } + for (SlotIndex OldIndex : ToProcess) { + HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags); + HME.updateAllRanges(&BundleStart); + } + + // Fix up dead defs + const SlotIndex Index = getInstructionIndex(BundleStart); + for (unsigned Idx = 0, E = BundleStart.getNumOperands(); Idx != E; ++Idx) { + MachineOperand &MO = BundleStart.getOperand(Idx); + if (!MO.isReg()) + continue; + Register Reg = MO.getReg(); + if (Reg.isVirtual() && hasInterval(Reg) && !MO.isUndef()) { + LiveInterval &LI = getInterval(Reg); + LiveQueryResult LRQ = LI.Query(Index); + if (LRQ.isDeadDef()) + MO.setIsDead(); + } + } } void LiveIntervals::repairOldRegInRange(const MachineBasicBlock::iterator Begin, @@ -1587,7 +1629,7 @@ void LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB, MachineBasicBlock::iterator Begin, MachineBasicBlock::iterator End, - ArrayRef<unsigned> OrigRegs) { + ArrayRef<Register> OrigRegs) { // Find anchor points, which are at the beginning/end of blocks or at // instructions that already have indexes. while (Begin != MBB->begin() && !Indexes->hasIndex(*Begin)) @@ -1618,8 +1660,8 @@ LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB, } } - for (unsigned Reg : OrigRegs) { - if (!Register::isVirtualRegister(Reg)) + for (Register Reg : OrigRegs) { + if (!Reg.isVirtual()) continue; LiveInterval &LI = getInterval(Reg); @@ -1678,7 +1720,7 @@ void LiveIntervals::splitSeparateComponents(LiveInterval &LI, } void LiveIntervals::constructMainRangeFromSubranges(LiveInterval &LI) { - assert(LRCalc && "LRCalc not initialized."); - LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); - LRCalc->constructMainRangeFromSubranges(LI); + assert(LICalc && "LICalc not initialized."); + LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); + LICalc->constructMainRangeFromSubranges(LI); } |