1f842297dSMatthias Braun //===- LiveIntervals.cpp - Live Interval Analysis -------------------------===// 2f842297dSMatthias Braun // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6f842297dSMatthias Braun // 7f842297dSMatthias Braun //===----------------------------------------------------------------------===// 8f842297dSMatthias Braun // 9f842297dSMatthias Braun /// \file This file implements the LiveInterval analysis pass which is used 10f842297dSMatthias Braun /// by the Linear Scan Register allocator. This pass linearizes the 11f842297dSMatthias Braun /// basic blocks of the function in DFS order and computes live intervals for 12f842297dSMatthias Braun /// each virtual and physical register. 13f842297dSMatthias Braun // 14f842297dSMatthias Braun //===----------------------------------------------------------------------===// 15f842297dSMatthias Braun 16f842297dSMatthias Braun #include "llvm/CodeGen/LiveIntervals.h" 17f842297dSMatthias Braun #include "llvm/ADT/ArrayRef.h" 18f842297dSMatthias Braun #include "llvm/ADT/DepthFirstIterator.h" 19f842297dSMatthias Braun #include "llvm/ADT/SmallPtrSet.h" 20f842297dSMatthias Braun #include "llvm/ADT/SmallVector.h" 21f842297dSMatthias Braun #include "llvm/ADT/iterator_range.h" 22f842297dSMatthias Braun #include "llvm/Analysis/AliasAnalysis.h" 23f842297dSMatthias Braun #include "llvm/CodeGen/LiveInterval.h" 24ea11f472SMarcello Maggioni #include "llvm/CodeGen/LiveIntervalCalc.h" 25f842297dSMatthias Braun #include "llvm/CodeGen/LiveVariables.h" 26f842297dSMatthias Braun #include "llvm/CodeGen/MachineBasicBlock.h" 27f842297dSMatthias Braun #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" 28f842297dSMatthias Braun #include "llvm/CodeGen/MachineDominators.h" 29f842297dSMatthias Braun #include "llvm/CodeGen/MachineFunction.h" 30f842297dSMatthias Braun #include "llvm/CodeGen/MachineInstr.h" 31f842297dSMatthias Braun #include "llvm/CodeGen/MachineInstrBundle.h" 32f842297dSMatthias Braun #include "llvm/CodeGen/MachineOperand.h" 33f842297dSMatthias Braun #include "llvm/CodeGen/MachineRegisterInfo.h" 34f842297dSMatthias Braun #include "llvm/CodeGen/Passes.h" 35f842297dSMatthias Braun #include "llvm/CodeGen/SlotIndexes.h" 36f842297dSMatthias Braun #include "llvm/CodeGen/TargetRegisterInfo.h" 37f842297dSMatthias Braun #include "llvm/CodeGen/TargetSubtargetInfo.h" 38f842297dSMatthias Braun #include "llvm/CodeGen/VirtRegMap.h" 39432a3883SNico Weber #include "llvm/Config/llvm-config.h" 40*9ed8e0caSdfukalov #include "llvm/IR/InstrTypes.h" 41f842297dSMatthias Braun #include "llvm/MC/LaneBitmask.h" 42f842297dSMatthias Braun #include "llvm/MC/MCRegisterInfo.h" 43f842297dSMatthias Braun #include "llvm/Pass.h" 44f842297dSMatthias Braun #include "llvm/Support/BlockFrequency.h" 45f842297dSMatthias Braun #include "llvm/Support/CommandLine.h" 46f842297dSMatthias Braun #include "llvm/Support/Compiler.h" 47f842297dSMatthias Braun #include "llvm/Support/Debug.h" 48f842297dSMatthias Braun #include "llvm/Support/MathExtras.h" 49f842297dSMatthias Braun #include "llvm/Support/raw_ostream.h" 50f842297dSMatthias Braun #include <algorithm> 51f842297dSMatthias Braun #include <cassert> 52f842297dSMatthias Braun #include <cstdint> 53f842297dSMatthias Braun #include <iterator> 54f842297dSMatthias Braun #include <tuple> 55f842297dSMatthias Braun #include <utility> 56f842297dSMatthias Braun 57f842297dSMatthias Braun using namespace llvm; 58f842297dSMatthias Braun 59f842297dSMatthias Braun #define DEBUG_TYPE "regalloc" 60f842297dSMatthias Braun 61f842297dSMatthias Braun char LiveIntervals::ID = 0; 62f842297dSMatthias Braun char &llvm::LiveIntervalsID = LiveIntervals::ID; 63f842297dSMatthias Braun INITIALIZE_PASS_BEGIN(LiveIntervals, "liveintervals", 64f842297dSMatthias Braun "Live Interval Analysis", false, false) 65f842297dSMatthias Braun INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) 66f842297dSMatthias Braun INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) 67f842297dSMatthias Braun INITIALIZE_PASS_DEPENDENCY(SlotIndexes) 68f842297dSMatthias Braun INITIALIZE_PASS_END(LiveIntervals, "liveintervals", 69f842297dSMatthias Braun "Live Interval Analysis", false, false) 70f842297dSMatthias Braun 71f842297dSMatthias Braun #ifndef NDEBUG 72f842297dSMatthias Braun static cl::opt<bool> EnablePrecomputePhysRegs( 73f842297dSMatthias Braun "precompute-phys-liveness", cl::Hidden, 74f842297dSMatthias Braun cl::desc("Eagerly compute live intervals for all physreg units.")); 75f842297dSMatthias Braun #else 76f842297dSMatthias Braun static bool EnablePrecomputePhysRegs = false; 77f842297dSMatthias Braun #endif // NDEBUG 78f842297dSMatthias Braun 79f842297dSMatthias Braun namespace llvm { 80f842297dSMatthias Braun 81f842297dSMatthias Braun cl::opt<bool> UseSegmentSetForPhysRegs( 82f842297dSMatthias Braun "use-segment-set-for-physregs", cl::Hidden, cl::init(true), 83f842297dSMatthias Braun cl::desc( 84f842297dSMatthias Braun "Use segment set for the computation of the live ranges of physregs.")); 85f842297dSMatthias Braun 86f842297dSMatthias Braun } // end namespace llvm 87f842297dSMatthias Braun 88f842297dSMatthias Braun void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const { 89f842297dSMatthias Braun AU.setPreservesCFG(); 90f842297dSMatthias Braun AU.addRequired<AAResultsWrapperPass>(); 91f842297dSMatthias Braun AU.addPreserved<AAResultsWrapperPass>(); 92f842297dSMatthias Braun AU.addPreserved<LiveVariables>(); 93f842297dSMatthias Braun AU.addPreservedID(MachineLoopInfoID); 94f842297dSMatthias Braun AU.addRequiredTransitiveID(MachineDominatorsID); 95f842297dSMatthias Braun AU.addPreservedID(MachineDominatorsID); 96f842297dSMatthias Braun AU.addPreserved<SlotIndexes>(); 97f842297dSMatthias Braun AU.addRequiredTransitive<SlotIndexes>(); 98f842297dSMatthias Braun MachineFunctionPass::getAnalysisUsage(AU); 99f842297dSMatthias Braun } 100f842297dSMatthias Braun 101f842297dSMatthias Braun LiveIntervals::LiveIntervals() : MachineFunctionPass(ID) { 102f842297dSMatthias Braun initializeLiveIntervalsPass(*PassRegistry::getPassRegistry()); 103f842297dSMatthias Braun } 104f842297dSMatthias Braun 105ea11f472SMarcello Maggioni LiveIntervals::~LiveIntervals() { delete LICalc; } 106f842297dSMatthias Braun 107f842297dSMatthias Braun void LiveIntervals::releaseMemory() { 108f842297dSMatthias Braun // Free the live intervals themselves. 109f842297dSMatthias Braun for (unsigned i = 0, e = VirtRegIntervals.size(); i != e; ++i) 1102bea69bfSDaniel Sanders delete VirtRegIntervals[Register::index2VirtReg(i)]; 111f842297dSMatthias Braun VirtRegIntervals.clear(); 112f842297dSMatthias Braun RegMaskSlots.clear(); 113f842297dSMatthias Braun RegMaskBits.clear(); 114f842297dSMatthias Braun RegMaskBlocks.clear(); 115f842297dSMatthias Braun 116f842297dSMatthias Braun for (LiveRange *LR : RegUnitRanges) 117f842297dSMatthias Braun delete LR; 118f842297dSMatthias Braun RegUnitRanges.clear(); 119f842297dSMatthias Braun 120f842297dSMatthias Braun // Release VNInfo memory regions, VNInfo objects don't need to be dtor'd. 121f842297dSMatthias Braun VNInfoAllocator.Reset(); 122f842297dSMatthias Braun } 123f842297dSMatthias Braun 124f842297dSMatthias Braun bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) { 125f842297dSMatthias Braun MF = &fn; 126f842297dSMatthias Braun MRI = &MF->getRegInfo(); 127f842297dSMatthias Braun TRI = MF->getSubtarget().getRegisterInfo(); 128f842297dSMatthias Braun TII = MF->getSubtarget().getInstrInfo(); 129f842297dSMatthias Braun AA = &getAnalysis<AAResultsWrapperPass>().getAAResults(); 130f842297dSMatthias Braun Indexes = &getAnalysis<SlotIndexes>(); 131f842297dSMatthias Braun DomTree = &getAnalysis<MachineDominatorTree>(); 132f842297dSMatthias Braun 133ea11f472SMarcello Maggioni if (!LICalc) 134ea11f472SMarcello Maggioni LICalc = new LiveIntervalCalc(); 135f842297dSMatthias Braun 136f842297dSMatthias Braun // Allocate space for all virtual registers. 137f842297dSMatthias Braun VirtRegIntervals.resize(MRI->getNumVirtRegs()); 138f842297dSMatthias Braun 139f842297dSMatthias Braun computeVirtRegs(); 140f842297dSMatthias Braun computeRegMasks(); 141f842297dSMatthias Braun computeLiveInRegUnits(); 142f842297dSMatthias Braun 143f842297dSMatthias Braun if (EnablePrecomputePhysRegs) { 144f842297dSMatthias Braun // For stress testing, precompute live ranges of all physical register 145f842297dSMatthias Braun // units, including reserved registers. 146f842297dSMatthias Braun for (unsigned i = 0, e = TRI->getNumRegUnits(); i != e; ++i) 147f842297dSMatthias Braun getRegUnit(i); 148f842297dSMatthias Braun } 149d34e60caSNicola Zaghen LLVM_DEBUG(dump()); 150f842297dSMatthias Braun return true; 151f842297dSMatthias Braun } 152f842297dSMatthias Braun 153f842297dSMatthias Braun void LiveIntervals::print(raw_ostream &OS, const Module* ) const { 154f842297dSMatthias Braun OS << "********** INTERVALS **********\n"; 155f842297dSMatthias Braun 156f842297dSMatthias Braun // Dump the regunits. 157f842297dSMatthias Braun for (unsigned Unit = 0, UnitE = RegUnitRanges.size(); Unit != UnitE; ++Unit) 158f842297dSMatthias Braun if (LiveRange *LR = RegUnitRanges[Unit]) 159f842297dSMatthias Braun OS << printRegUnit(Unit, TRI) << ' ' << *LR << '\n'; 160f842297dSMatthias Braun 161f842297dSMatthias Braun // Dump the virtregs. 162f842297dSMatthias Braun for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) { 163b68994bdSGaurav Jain Register Reg = Register::index2VirtReg(i); 164f842297dSMatthias Braun if (hasInterval(Reg)) 165f842297dSMatthias Braun OS << getInterval(Reg) << '\n'; 166f842297dSMatthias Braun } 167f842297dSMatthias Braun 168f842297dSMatthias Braun OS << "RegMasks:"; 169f842297dSMatthias Braun for (SlotIndex Idx : RegMaskSlots) 170f842297dSMatthias Braun OS << ' ' << Idx; 171f842297dSMatthias Braun OS << '\n'; 172f842297dSMatthias Braun 173f842297dSMatthias Braun printInstrs(OS); 174f842297dSMatthias Braun } 175f842297dSMatthias Braun 176f842297dSMatthias Braun void LiveIntervals::printInstrs(raw_ostream &OS) const { 177f842297dSMatthias Braun OS << "********** MACHINEINSTRS **********\n"; 178f842297dSMatthias Braun MF->print(OS, Indexes); 179f842297dSMatthias Braun } 180f842297dSMatthias Braun 181f842297dSMatthias Braun #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 182f842297dSMatthias Braun LLVM_DUMP_METHOD void LiveIntervals::dumpInstrs() const { 183f842297dSMatthias Braun printInstrs(dbgs()); 184f842297dSMatthias Braun } 185f842297dSMatthias Braun #endif 186f842297dSMatthias Braun 187b68994bdSGaurav Jain LiveInterval *LiveIntervals::createInterval(Register reg) { 1882bea69bfSDaniel Sanders float Weight = Register::isPhysicalRegister(reg) ? huge_valf : 0.0F; 189f842297dSMatthias Braun return new LiveInterval(reg, Weight); 190f842297dSMatthias Braun } 191f842297dSMatthias Braun 192f842297dSMatthias Braun /// Compute the live interval of a virtual register, based on defs and uses. 19343144ffaSKrzysztof Parzyszek bool LiveIntervals::computeVirtRegInterval(LiveInterval &LI) { 194ea11f472SMarcello Maggioni assert(LICalc && "LICalc not initialized."); 195f842297dSMatthias Braun assert(LI.empty() && "Should only compute empty intervals."); 196ea11f472SMarcello Maggioni LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); 1976e85c3d5SMircea Trofin LICalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.reg())); 19843144ffaSKrzysztof Parzyszek return computeDeadValues(LI, nullptr); 199f842297dSMatthias Braun } 200f842297dSMatthias Braun 201f842297dSMatthias Braun void LiveIntervals::computeVirtRegs() { 202f842297dSMatthias Braun for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) { 203b68994bdSGaurav Jain Register Reg = Register::index2VirtReg(i); 204f842297dSMatthias Braun if (MRI->reg_nodbg_empty(Reg)) 205f842297dSMatthias Braun continue; 20643144ffaSKrzysztof Parzyszek LiveInterval &LI = createEmptyInterval(Reg); 20743144ffaSKrzysztof Parzyszek bool NeedSplit = computeVirtRegInterval(LI); 20843144ffaSKrzysztof Parzyszek if (NeedSplit) { 20943144ffaSKrzysztof Parzyszek SmallVector<LiveInterval*, 8> SplitLIs; 21043144ffaSKrzysztof Parzyszek splitSeparateComponents(LI, SplitLIs); 21143144ffaSKrzysztof Parzyszek } 212f842297dSMatthias Braun } 213f842297dSMatthias Braun } 214f842297dSMatthias Braun 215f842297dSMatthias Braun void LiveIntervals::computeRegMasks() { 216f842297dSMatthias Braun RegMaskBlocks.resize(MF->getNumBlockIDs()); 217f842297dSMatthias Braun 218f842297dSMatthias Braun // Find all instructions with regmask operands. 219f842297dSMatthias Braun for (const MachineBasicBlock &MBB : *MF) { 220f842297dSMatthias Braun std::pair<unsigned, unsigned> &RMB = RegMaskBlocks[MBB.getNumber()]; 221f842297dSMatthias Braun RMB.first = RegMaskSlots.size(); 222f842297dSMatthias Braun 223f842297dSMatthias Braun // Some block starts, such as EH funclets, create masks. 224f842297dSMatthias Braun if (const uint32_t *Mask = MBB.getBeginClobberMask(TRI)) { 225f842297dSMatthias Braun RegMaskSlots.push_back(Indexes->getMBBStartIdx(&MBB)); 226f842297dSMatthias Braun RegMaskBits.push_back(Mask); 227f842297dSMatthias Braun } 228f842297dSMatthias Braun 229f13beac5SSander de Smalen // Unwinders may clobber additional registers. 230f13beac5SSander de Smalen // FIXME: This functionality can possibly be merged into 231f13beac5SSander de Smalen // MachineBasicBlock::getBeginClobberMask(). 232f13beac5SSander de Smalen if (MBB.isEHPad()) 233f13beac5SSander de Smalen if (auto *Mask = TRI->getCustomEHPadPreservedMask(*MBB.getParent())) { 234f13beac5SSander de Smalen RegMaskSlots.push_back(Indexes->getMBBStartIdx(&MBB)); 235f13beac5SSander de Smalen RegMaskBits.push_back(Mask); 236f13beac5SSander de Smalen } 237f13beac5SSander de Smalen 238f842297dSMatthias Braun for (const MachineInstr &MI : MBB) { 239f842297dSMatthias Braun for (const MachineOperand &MO : MI.operands()) { 240f842297dSMatthias Braun if (!MO.isRegMask()) 241f842297dSMatthias Braun continue; 242f842297dSMatthias Braun RegMaskSlots.push_back(Indexes->getInstructionIndex(MI).getRegSlot()); 243f842297dSMatthias Braun RegMaskBits.push_back(MO.getRegMask()); 244f842297dSMatthias Braun } 245f842297dSMatthias Braun } 246f842297dSMatthias Braun 247f842297dSMatthias Braun // Some block ends, such as funclet returns, create masks. Put the mask on 248f842297dSMatthias Braun // the last instruction of the block, because MBB slot index intervals are 249f842297dSMatthias Braun // half-open. 250f842297dSMatthias Braun if (const uint32_t *Mask = MBB.getEndClobberMask(TRI)) { 251f842297dSMatthias Braun assert(!MBB.empty() && "empty return block?"); 252f842297dSMatthias Braun RegMaskSlots.push_back( 253f842297dSMatthias Braun Indexes->getInstructionIndex(MBB.back()).getRegSlot()); 254f842297dSMatthias Braun RegMaskBits.push_back(Mask); 255f842297dSMatthias Braun } 256f842297dSMatthias Braun 257f842297dSMatthias Braun // Compute the number of register mask instructions in this block. 258f842297dSMatthias Braun RMB.second = RegMaskSlots.size() - RMB.first; 259f842297dSMatthias Braun } 260f842297dSMatthias Braun } 261f842297dSMatthias Braun 262f842297dSMatthias Braun //===----------------------------------------------------------------------===// 263f842297dSMatthias Braun // Register Unit Liveness 264f842297dSMatthias Braun //===----------------------------------------------------------------------===// 265f842297dSMatthias Braun // 266f842297dSMatthias Braun // Fixed interference typically comes from ABI boundaries: Function arguments 267f842297dSMatthias Braun // and return values are passed in fixed registers, and so are exception 268f842297dSMatthias Braun // pointers entering landing pads. Certain instructions require values to be 269f842297dSMatthias Braun // present in specific registers. That is also represented through fixed 270f842297dSMatthias Braun // interference. 271f842297dSMatthias Braun // 272f842297dSMatthias Braun 273f842297dSMatthias Braun /// Compute the live range of a register unit, based on the uses and defs of 274f842297dSMatthias Braun /// aliasing registers. The range should be empty, or contain only dead 275f842297dSMatthias Braun /// phi-defs from ABI blocks. 276f842297dSMatthias Braun void LiveIntervals::computeRegUnitRange(LiveRange &LR, unsigned Unit) { 277ea11f472SMarcello Maggioni assert(LICalc && "LICalc not initialized."); 278ea11f472SMarcello Maggioni LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); 279f842297dSMatthias Braun 280f842297dSMatthias Braun // The physregs aliasing Unit are the roots and their super-registers. 281f842297dSMatthias Braun // Create all values as dead defs before extending to uses. Note that roots 282f842297dSMatthias Braun // may share super-registers. That's OK because createDeadDefs() is 283f842297dSMatthias Braun // idempotent. It is very rare for a register unit to have multiple roots, so 284f842297dSMatthias Braun // uniquing super-registers is probably not worthwhile. 285f842297dSMatthias Braun bool IsReserved = false; 286f842297dSMatthias Braun for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) { 287f842297dSMatthias Braun bool IsRootReserved = true; 288f842297dSMatthias Braun for (MCSuperRegIterator Super(*Root, TRI, /*IncludeSelf=*/true); 289f842297dSMatthias Braun Super.isValid(); ++Super) { 290b68994bdSGaurav Jain MCRegister Reg = *Super; 291f842297dSMatthias Braun if (!MRI->reg_empty(Reg)) 292ea11f472SMarcello Maggioni LICalc->createDeadDefs(LR, Reg); 293f842297dSMatthias Braun // A register unit is considered reserved if all its roots and all their 294f842297dSMatthias Braun // super registers are reserved. 295f842297dSMatthias Braun if (!MRI->isReserved(Reg)) 296f842297dSMatthias Braun IsRootReserved = false; 297f842297dSMatthias Braun } 298f842297dSMatthias Braun IsReserved |= IsRootReserved; 299f842297dSMatthias Braun } 300f842297dSMatthias Braun assert(IsReserved == MRI->isReservedRegUnit(Unit) && 301f842297dSMatthias Braun "reserved computation mismatch"); 302f842297dSMatthias Braun 303f842297dSMatthias Braun // Now extend LR to reach all uses. 304f842297dSMatthias Braun // Ignore uses of reserved registers. We only track defs of those. 305f842297dSMatthias Braun if (!IsReserved) { 306f842297dSMatthias Braun for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) { 307f842297dSMatthias Braun for (MCSuperRegIterator Super(*Root, TRI, /*IncludeSelf=*/true); 308f842297dSMatthias Braun Super.isValid(); ++Super) { 309b68994bdSGaurav Jain MCRegister Reg = *Super; 310f842297dSMatthias Braun if (!MRI->reg_empty(Reg)) 311ea11f472SMarcello Maggioni LICalc->extendToUses(LR, Reg); 312f842297dSMatthias Braun } 313f842297dSMatthias Braun } 314f842297dSMatthias Braun } 315f842297dSMatthias Braun 316f842297dSMatthias Braun // Flush the segment set to the segment vector. 317f842297dSMatthias Braun if (UseSegmentSetForPhysRegs) 318f842297dSMatthias Braun LR.flushSegmentSet(); 319f842297dSMatthias Braun } 320f842297dSMatthias Braun 321f842297dSMatthias Braun /// Precompute the live ranges of any register units that are live-in to an ABI 322f842297dSMatthias Braun /// block somewhere. Register values can appear without a corresponding def when 323f842297dSMatthias Braun /// entering the entry block or a landing pad. 324f842297dSMatthias Braun void LiveIntervals::computeLiveInRegUnits() { 325f842297dSMatthias Braun RegUnitRanges.resize(TRI->getNumRegUnits()); 326d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Computing live-in reg-units in ABI blocks.\n"); 327f842297dSMatthias Braun 328f842297dSMatthias Braun // Keep track of the live range sets allocated. 329f842297dSMatthias Braun SmallVector<unsigned, 8> NewRanges; 330f842297dSMatthias Braun 331f842297dSMatthias Braun // Check all basic blocks for live-ins. 332f842297dSMatthias Braun for (const MachineBasicBlock &MBB : *MF) { 333f842297dSMatthias Braun // We only care about ABI blocks: Entry + landing pads. 334f842297dSMatthias Braun if ((&MBB != &MF->front() && !MBB.isEHPad()) || MBB.livein_empty()) 335f842297dSMatthias Braun continue; 336f842297dSMatthias Braun 337f842297dSMatthias Braun // Create phi-defs at Begin for all live-in registers. 338f842297dSMatthias Braun SlotIndex Begin = Indexes->getMBBStartIdx(&MBB); 339d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << Begin << "\t" << printMBBReference(MBB)); 340f842297dSMatthias Braun for (const auto &LI : MBB.liveins()) { 341f842297dSMatthias Braun for (MCRegUnitIterator Units(LI.PhysReg, TRI); Units.isValid(); ++Units) { 342f842297dSMatthias Braun unsigned Unit = *Units; 343f842297dSMatthias Braun LiveRange *LR = RegUnitRanges[Unit]; 344f842297dSMatthias Braun if (!LR) { 345f842297dSMatthias Braun // Use segment set to speed-up initial computation of the live range. 346f842297dSMatthias Braun LR = RegUnitRanges[Unit] = new LiveRange(UseSegmentSetForPhysRegs); 347f842297dSMatthias Braun NewRanges.push_back(Unit); 348f842297dSMatthias Braun } 349f842297dSMatthias Braun VNInfo *VNI = LR->createDeadDef(Begin, getVNInfoAllocator()); 350f842297dSMatthias Braun (void)VNI; 351d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << ' ' << printRegUnit(Unit, TRI) << '#' << VNI->id); 352f842297dSMatthias Braun } 353f842297dSMatthias Braun } 354d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << '\n'); 355f842297dSMatthias Braun } 356d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Created " << NewRanges.size() << " new intervals.\n"); 357f842297dSMatthias Braun 358f842297dSMatthias Braun // Compute the 'normal' part of the ranges. 359f842297dSMatthias Braun for (unsigned Unit : NewRanges) 360f842297dSMatthias Braun computeRegUnitRange(*RegUnitRanges[Unit], Unit); 361f842297dSMatthias Braun } 362f842297dSMatthias Braun 363f842297dSMatthias Braun static void createSegmentsForValues(LiveRange &LR, 364f842297dSMatthias Braun iterator_range<LiveInterval::vni_iterator> VNIs) { 365f842297dSMatthias Braun for (VNInfo *VNI : VNIs) { 366f842297dSMatthias Braun if (VNI->isUnused()) 367f842297dSMatthias Braun continue; 368f842297dSMatthias Braun SlotIndex Def = VNI->def; 369f842297dSMatthias Braun LR.addSegment(LiveRange::Segment(Def, Def.getDeadSlot(), VNI)); 370f842297dSMatthias Braun } 371f842297dSMatthias Braun } 372f842297dSMatthias Braun 37370f02702SKrzysztof Parzyszek void LiveIntervals::extendSegmentsToUses(LiveRange &Segments, 374f842297dSMatthias Braun ShrinkToUsesWorkList &WorkList, 375b68994bdSGaurav Jain Register Reg, LaneBitmask LaneMask) { 376f842297dSMatthias Braun // Keep track of the PHIs that are in use. 377f842297dSMatthias Braun SmallPtrSet<VNInfo*, 8> UsedPHIs; 378f842297dSMatthias Braun // Blocks that have already been added to WorkList as live-out. 379f842297dSMatthias Braun SmallPtrSet<const MachineBasicBlock*, 16> LiveOut; 380f842297dSMatthias Braun 38170f02702SKrzysztof Parzyszek auto getSubRange = [](const LiveInterval &I, LaneBitmask M) 38270f02702SKrzysztof Parzyszek -> const LiveRange& { 38370f02702SKrzysztof Parzyszek if (M.none()) 38470f02702SKrzysztof Parzyszek return I; 38570f02702SKrzysztof Parzyszek for (const LiveInterval::SubRange &SR : I.subranges()) { 38670f02702SKrzysztof Parzyszek if ((SR.LaneMask & M).any()) { 38770f02702SKrzysztof Parzyszek assert(SR.LaneMask == M && "Expecting lane masks to match exactly"); 38870f02702SKrzysztof Parzyszek return SR; 38970f02702SKrzysztof Parzyszek } 39070f02702SKrzysztof Parzyszek } 39170f02702SKrzysztof Parzyszek llvm_unreachable("Subrange for mask not found"); 39270f02702SKrzysztof Parzyszek }; 39370f02702SKrzysztof Parzyszek 39470f02702SKrzysztof Parzyszek const LiveInterval &LI = getInterval(Reg); 39570f02702SKrzysztof Parzyszek const LiveRange &OldRange = getSubRange(LI, LaneMask); 39670f02702SKrzysztof Parzyszek 397f842297dSMatthias Braun // Extend intervals to reach all uses in WorkList. 398f842297dSMatthias Braun while (!WorkList.empty()) { 399f842297dSMatthias Braun SlotIndex Idx = WorkList.back().first; 400f842297dSMatthias Braun VNInfo *VNI = WorkList.back().second; 401f842297dSMatthias Braun WorkList.pop_back(); 40270f02702SKrzysztof Parzyszek const MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Idx.getPrevSlot()); 40370f02702SKrzysztof Parzyszek SlotIndex BlockStart = Indexes->getMBBStartIdx(MBB); 404f842297dSMatthias Braun 405f842297dSMatthias Braun // Extend the live range for VNI to be live at Idx. 40670f02702SKrzysztof Parzyszek if (VNInfo *ExtVNI = Segments.extendInBlock(BlockStart, Idx)) { 407f842297dSMatthias Braun assert(ExtVNI == VNI && "Unexpected existing value number"); 408f842297dSMatthias Braun (void)ExtVNI; 409f842297dSMatthias Braun // Is this a PHIDef we haven't seen before? 410f842297dSMatthias Braun if (!VNI->isPHIDef() || VNI->def != BlockStart || 411f842297dSMatthias Braun !UsedPHIs.insert(VNI).second) 412f842297dSMatthias Braun continue; 413f842297dSMatthias Braun // The PHI is live, make sure the predecessors are live-out. 414f842297dSMatthias Braun for (const MachineBasicBlock *Pred : MBB->predecessors()) { 415f842297dSMatthias Braun if (!LiveOut.insert(Pred).second) 416f842297dSMatthias Braun continue; 41770f02702SKrzysztof Parzyszek SlotIndex Stop = Indexes->getMBBEndIdx(Pred); 418f842297dSMatthias Braun // A predecessor is not required to have a live-out value for a PHI. 419f842297dSMatthias Braun if (VNInfo *PVNI = OldRange.getVNInfoBefore(Stop)) 420f842297dSMatthias Braun WorkList.push_back(std::make_pair(Stop, PVNI)); 421f842297dSMatthias Braun } 422f842297dSMatthias Braun continue; 423f842297dSMatthias Braun } 424f842297dSMatthias Braun 425f842297dSMatthias Braun // VNI is live-in to MBB. 426d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << " live-in at " << BlockStart << '\n'); 42770f02702SKrzysztof Parzyszek Segments.addSegment(LiveRange::Segment(BlockStart, Idx, VNI)); 428f842297dSMatthias Braun 429f842297dSMatthias Braun // Make sure VNI is live-out from the predecessors. 430f842297dSMatthias Braun for (const MachineBasicBlock *Pred : MBB->predecessors()) { 431f842297dSMatthias Braun if (!LiveOut.insert(Pred).second) 432f842297dSMatthias Braun continue; 43370f02702SKrzysztof Parzyszek SlotIndex Stop = Indexes->getMBBEndIdx(Pred); 43470f02702SKrzysztof Parzyszek if (VNInfo *OldVNI = OldRange.getVNInfoBefore(Stop)) { 43570f02702SKrzysztof Parzyszek assert(OldVNI == VNI && "Wrong value out of predecessor"); 4369f199ebeSKrzysztof Parzyszek (void)OldVNI; 437f842297dSMatthias Braun WorkList.push_back(std::make_pair(Stop, VNI)); 43870f02702SKrzysztof Parzyszek } else { 43970f02702SKrzysztof Parzyszek #ifndef NDEBUG 44070f02702SKrzysztof Parzyszek // There was no old VNI. Verify that Stop is jointly dominated 44170f02702SKrzysztof Parzyszek // by <undef>s for this live range. 44270f02702SKrzysztof Parzyszek assert(LaneMask.any() && 44370f02702SKrzysztof Parzyszek "Missing value out of predecessor for main range"); 44470f02702SKrzysztof Parzyszek SmallVector<SlotIndex,8> Undefs; 44570f02702SKrzysztof Parzyszek LI.computeSubRangeUndefs(Undefs, LaneMask, *MRI, *Indexes); 44670f02702SKrzysztof Parzyszek assert(LiveRangeCalc::isJointlyDominated(Pred, Undefs, *Indexes) && 44770f02702SKrzysztof Parzyszek "Missing value out of predecessor for subrange"); 44870f02702SKrzysztof Parzyszek #endif 44970f02702SKrzysztof Parzyszek } 450f842297dSMatthias Braun } 451f842297dSMatthias Braun } 452f842297dSMatthias Braun } 453f842297dSMatthias Braun 454f842297dSMatthias Braun bool LiveIntervals::shrinkToUses(LiveInterval *li, 455f842297dSMatthias Braun SmallVectorImpl<MachineInstr*> *dead) { 456d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Shrink: " << *li << '\n'); 4576e85c3d5SMircea Trofin assert(Register::isVirtualRegister(li->reg()) && 4582bea69bfSDaniel Sanders "Can only shrink virtual registers"); 459f842297dSMatthias Braun 460f842297dSMatthias Braun // Shrink subregister live ranges. 461f842297dSMatthias Braun bool NeedsCleanup = false; 462f842297dSMatthias Braun for (LiveInterval::SubRange &S : li->subranges()) { 4636e85c3d5SMircea Trofin shrinkToUses(S, li->reg()); 464f842297dSMatthias Braun if (S.empty()) 465f842297dSMatthias Braun NeedsCleanup = true; 466f842297dSMatthias Braun } 467f842297dSMatthias Braun if (NeedsCleanup) 468f842297dSMatthias Braun li->removeEmptySubRanges(); 469f842297dSMatthias Braun 470f842297dSMatthias Braun // Find all the values used, including PHI kills. 471f842297dSMatthias Braun ShrinkToUsesWorkList WorkList; 472f842297dSMatthias Braun 4736e85c3d5SMircea Trofin // Visit all instructions reading li->reg(). 474b68994bdSGaurav Jain Register Reg = li->reg(); 475f842297dSMatthias Braun for (MachineInstr &UseMI : MRI->reg_instructions(Reg)) { 476f842297dSMatthias Braun if (UseMI.isDebugValue() || !UseMI.readsVirtualRegister(Reg)) 477f842297dSMatthias Braun continue; 478f842297dSMatthias Braun SlotIndex Idx = getInstructionIndex(UseMI).getRegSlot(); 479f842297dSMatthias Braun LiveQueryResult LRQ = li->Query(Idx); 480f842297dSMatthias Braun VNInfo *VNI = LRQ.valueIn(); 481f842297dSMatthias Braun if (!VNI) { 482f842297dSMatthias Braun // This shouldn't happen: readsVirtualRegister returns true, but there is 483f842297dSMatthias Braun // no live value. It is likely caused by a target getting <undef> flags 484f842297dSMatthias Braun // wrong. 485d34e60caSNicola Zaghen LLVM_DEBUG( 486d34e60caSNicola Zaghen dbgs() << Idx << '\t' << UseMI 487f842297dSMatthias Braun << "Warning: Instr claims to read non-existent value in " 488f842297dSMatthias Braun << *li << '\n'); 489f842297dSMatthias Braun continue; 490f842297dSMatthias Braun } 491f842297dSMatthias Braun // Special case: An early-clobber tied operand reads and writes the 492f842297dSMatthias Braun // register one slot early. 493f842297dSMatthias Braun if (VNInfo *DefVNI = LRQ.valueDefined()) 494f842297dSMatthias Braun Idx = DefVNI->def; 495f842297dSMatthias Braun 496f842297dSMatthias Braun WorkList.push_back(std::make_pair(Idx, VNI)); 497f842297dSMatthias Braun } 498f842297dSMatthias Braun 499f842297dSMatthias Braun // Create new live ranges with only minimal live segments per def. 500f842297dSMatthias Braun LiveRange NewLR; 501f842297dSMatthias Braun createSegmentsForValues(NewLR, make_range(li->vni_begin(), li->vni_end())); 50270f02702SKrzysztof Parzyszek extendSegmentsToUses(NewLR, WorkList, Reg, LaneBitmask::getNone()); 503f842297dSMatthias Braun 504f842297dSMatthias Braun // Move the trimmed segments back. 505f842297dSMatthias Braun li->segments.swap(NewLR.segments); 506f842297dSMatthias Braun 507f842297dSMatthias Braun // Handle dead values. 508f842297dSMatthias Braun bool CanSeparate = computeDeadValues(*li, dead); 509d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Shrunk: " << *li << '\n'); 510f842297dSMatthias Braun return CanSeparate; 511f842297dSMatthias Braun } 512f842297dSMatthias Braun 513f842297dSMatthias Braun bool LiveIntervals::computeDeadValues(LiveInterval &LI, 514f842297dSMatthias Braun SmallVectorImpl<MachineInstr*> *dead) { 515f842297dSMatthias Braun bool MayHaveSplitComponents = false; 51643144ffaSKrzysztof Parzyszek bool HaveDeadDef = false; 51743144ffaSKrzysztof Parzyszek 518f842297dSMatthias Braun for (VNInfo *VNI : LI.valnos) { 519f842297dSMatthias Braun if (VNI->isUnused()) 520f842297dSMatthias Braun continue; 521f842297dSMatthias Braun SlotIndex Def = VNI->def; 522f842297dSMatthias Braun LiveRange::iterator I = LI.FindSegmentContaining(Def); 523f842297dSMatthias Braun assert(I != LI.end() && "Missing segment for VNI"); 524f842297dSMatthias Braun 525f842297dSMatthias Braun // Is the register live before? Otherwise we may have to add a read-undef 526f842297dSMatthias Braun // flag for subregister defs. 527b68994bdSGaurav Jain Register VReg = LI.reg(); 528f842297dSMatthias Braun if (MRI->shouldTrackSubRegLiveness(VReg)) { 529f842297dSMatthias Braun if ((I == LI.begin() || std::prev(I)->end < Def) && !VNI->isPHIDef()) { 530f842297dSMatthias Braun MachineInstr *MI = getInstructionFromIndex(Def); 531f842297dSMatthias Braun MI->setRegisterDefReadUndef(VReg); 532f842297dSMatthias Braun } 533f842297dSMatthias Braun } 534f842297dSMatthias Braun 535f842297dSMatthias Braun if (I->end != Def.getDeadSlot()) 536f842297dSMatthias Braun continue; 537f842297dSMatthias Braun if (VNI->isPHIDef()) { 538f842297dSMatthias Braun // This is a dead PHI. Remove it. 539f842297dSMatthias Braun VNI->markUnused(); 540f842297dSMatthias Braun LI.removeSegment(I); 541d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Dead PHI at " << Def << " may separate interval\n"); 542f842297dSMatthias Braun MayHaveSplitComponents = true; 543f842297dSMatthias Braun } else { 544f842297dSMatthias Braun // This is a dead def. Make sure the instruction knows. 545f842297dSMatthias Braun MachineInstr *MI = getInstructionFromIndex(Def); 546f842297dSMatthias Braun assert(MI && "No instruction defining live value"); 5476e85c3d5SMircea Trofin MI->addRegisterDead(LI.reg(), TRI); 54843144ffaSKrzysztof Parzyszek if (HaveDeadDef) 54943144ffaSKrzysztof Parzyszek MayHaveSplitComponents = true; 55043144ffaSKrzysztof Parzyszek HaveDeadDef = true; 55143144ffaSKrzysztof Parzyszek 552f842297dSMatthias Braun if (dead && MI->allDefsAreDead()) { 553d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "All defs dead: " << Def << '\t' << *MI); 554f842297dSMatthias Braun dead->push_back(MI); 555f842297dSMatthias Braun } 556f842297dSMatthias Braun } 557f842297dSMatthias Braun } 558f842297dSMatthias Braun return MayHaveSplitComponents; 559f842297dSMatthias Braun } 560f842297dSMatthias Braun 561b68994bdSGaurav Jain void LiveIntervals::shrinkToUses(LiveInterval::SubRange &SR, Register Reg) { 562d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Shrink: " << SR << '\n'); 5632bea69bfSDaniel Sanders assert(Register::isVirtualRegister(Reg) && 5642bea69bfSDaniel Sanders "Can only shrink virtual registers"); 565f842297dSMatthias Braun // Find all the values used, including PHI kills. 566f842297dSMatthias Braun ShrinkToUsesWorkList WorkList; 567f842297dSMatthias Braun 568f842297dSMatthias Braun // Visit all instructions reading Reg. 569f842297dSMatthias Braun SlotIndex LastIdx; 570f842297dSMatthias Braun for (MachineOperand &MO : MRI->use_nodbg_operands(Reg)) { 571f842297dSMatthias Braun // Skip "undef" uses. 572f842297dSMatthias Braun if (!MO.readsReg()) 573f842297dSMatthias Braun continue; 574f842297dSMatthias Braun // Maybe the operand is for a subregister we don't care about. 575f842297dSMatthias Braun unsigned SubReg = MO.getSubReg(); 576f842297dSMatthias Braun if (SubReg != 0) { 577f842297dSMatthias Braun LaneBitmask LaneMask = TRI->getSubRegIndexLaneMask(SubReg); 578f842297dSMatthias Braun if ((LaneMask & SR.LaneMask).none()) 579f842297dSMatthias Braun continue; 580f842297dSMatthias Braun } 581f842297dSMatthias Braun // We only need to visit each instruction once. 582f842297dSMatthias Braun MachineInstr *UseMI = MO.getParent(); 583f842297dSMatthias Braun SlotIndex Idx = getInstructionIndex(*UseMI).getRegSlot(); 584f842297dSMatthias Braun if (Idx == LastIdx) 585f842297dSMatthias Braun continue; 586f842297dSMatthias Braun LastIdx = Idx; 587f842297dSMatthias Braun 588f842297dSMatthias Braun LiveQueryResult LRQ = SR.Query(Idx); 589f842297dSMatthias Braun VNInfo *VNI = LRQ.valueIn(); 590f842297dSMatthias Braun // For Subranges it is possible that only undef values are left in that 591f842297dSMatthias Braun // part of the subregister, so there is no real liverange at the use 592f842297dSMatthias Braun if (!VNI) 593f842297dSMatthias Braun continue; 594f842297dSMatthias Braun 595f842297dSMatthias Braun // Special case: An early-clobber tied operand reads and writes the 596f842297dSMatthias Braun // register one slot early. 597f842297dSMatthias Braun if (VNInfo *DefVNI = LRQ.valueDefined()) 598f842297dSMatthias Braun Idx = DefVNI->def; 599f842297dSMatthias Braun 600f842297dSMatthias Braun WorkList.push_back(std::make_pair(Idx, VNI)); 601f842297dSMatthias Braun } 602f842297dSMatthias Braun 603f842297dSMatthias Braun // Create a new live ranges with only minimal live segments per def. 604f842297dSMatthias Braun LiveRange NewLR; 605f842297dSMatthias Braun createSegmentsForValues(NewLR, make_range(SR.vni_begin(), SR.vni_end())); 60670f02702SKrzysztof Parzyszek extendSegmentsToUses(NewLR, WorkList, Reg, SR.LaneMask); 607f842297dSMatthias Braun 608f842297dSMatthias Braun // Move the trimmed ranges back. 609f842297dSMatthias Braun SR.segments.swap(NewLR.segments); 610f842297dSMatthias Braun 611f842297dSMatthias Braun // Remove dead PHI value numbers 612f842297dSMatthias Braun for (VNInfo *VNI : SR.valnos) { 613f842297dSMatthias Braun if (VNI->isUnused()) 614f842297dSMatthias Braun continue; 615f842297dSMatthias Braun const LiveRange::Segment *Segment = SR.getSegmentContaining(VNI->def); 616f842297dSMatthias Braun assert(Segment != nullptr && "Missing segment for VNI"); 617f842297dSMatthias Braun if (Segment->end != VNI->def.getDeadSlot()) 618f842297dSMatthias Braun continue; 619f842297dSMatthias Braun if (VNI->isPHIDef()) { 620f842297dSMatthias Braun // This is a dead PHI. Remove it. 621d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Dead PHI at " << VNI->def 622d34e60caSNicola Zaghen << " may separate interval\n"); 623f842297dSMatthias Braun VNI->markUnused(); 624f842297dSMatthias Braun SR.removeSegment(*Segment); 625f842297dSMatthias Braun } 626f842297dSMatthias Braun } 627f842297dSMatthias Braun 628d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Shrunk: " << SR << '\n'); 629f842297dSMatthias Braun } 630f842297dSMatthias Braun 631f842297dSMatthias Braun void LiveIntervals::extendToIndices(LiveRange &LR, 632f842297dSMatthias Braun ArrayRef<SlotIndex> Indices, 633f842297dSMatthias Braun ArrayRef<SlotIndex> Undefs) { 634ea11f472SMarcello Maggioni assert(LICalc && "LICalc not initialized."); 635ea11f472SMarcello Maggioni LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); 636f842297dSMatthias Braun for (SlotIndex Idx : Indices) 637ea11f472SMarcello Maggioni LICalc->extend(LR, Idx, /*PhysReg=*/0, Undefs); 638f842297dSMatthias Braun } 639f842297dSMatthias Braun 640f842297dSMatthias Braun void LiveIntervals::pruneValue(LiveRange &LR, SlotIndex Kill, 641f842297dSMatthias Braun SmallVectorImpl<SlotIndex> *EndPoints) { 642f842297dSMatthias Braun LiveQueryResult LRQ = LR.Query(Kill); 643f842297dSMatthias Braun VNInfo *VNI = LRQ.valueOutOrDead(); 644f842297dSMatthias Braun if (!VNI) 645f842297dSMatthias Braun return; 646f842297dSMatthias Braun 647f842297dSMatthias Braun MachineBasicBlock *KillMBB = Indexes->getMBBFromIndex(Kill); 648f842297dSMatthias Braun SlotIndex MBBEnd = Indexes->getMBBEndIdx(KillMBB); 649f842297dSMatthias Braun 650f842297dSMatthias Braun // If VNI isn't live out from KillMBB, the value is trivially pruned. 651f842297dSMatthias Braun if (LRQ.endPoint() < MBBEnd) { 652f842297dSMatthias Braun LR.removeSegment(Kill, LRQ.endPoint()); 653f842297dSMatthias Braun if (EndPoints) EndPoints->push_back(LRQ.endPoint()); 654f842297dSMatthias Braun return; 655f842297dSMatthias Braun } 656f842297dSMatthias Braun 657f842297dSMatthias Braun // VNI is live out of KillMBB. 658f842297dSMatthias Braun LR.removeSegment(Kill, MBBEnd); 659f842297dSMatthias Braun if (EndPoints) EndPoints->push_back(MBBEnd); 660f842297dSMatthias Braun 661f842297dSMatthias Braun // Find all blocks that are reachable from KillMBB without leaving VNI's live 662f842297dSMatthias Braun // range. It is possible that KillMBB itself is reachable, so start a DFS 663f842297dSMatthias Braun // from each successor. 664f842297dSMatthias Braun using VisitedTy = df_iterator_default_set<MachineBasicBlock*,9>; 665f842297dSMatthias Braun VisitedTy Visited; 666f842297dSMatthias Braun for (MachineBasicBlock *Succ : KillMBB->successors()) { 667f842297dSMatthias Braun for (df_ext_iterator<MachineBasicBlock*, VisitedTy> 668f842297dSMatthias Braun I = df_ext_begin(Succ, Visited), E = df_ext_end(Succ, Visited); 669f842297dSMatthias Braun I != E;) { 670f842297dSMatthias Braun MachineBasicBlock *MBB = *I; 671f842297dSMatthias Braun 672f842297dSMatthias Braun // Check if VNI is live in to MBB. 673f842297dSMatthias Braun SlotIndex MBBStart, MBBEnd; 674f842297dSMatthias Braun std::tie(MBBStart, MBBEnd) = Indexes->getMBBRange(MBB); 675f842297dSMatthias Braun LiveQueryResult LRQ = LR.Query(MBBStart); 676f842297dSMatthias Braun if (LRQ.valueIn() != VNI) { 677f842297dSMatthias Braun // This block isn't part of the VNI segment. Prune the search. 678f842297dSMatthias Braun I.skipChildren(); 679f842297dSMatthias Braun continue; 680f842297dSMatthias Braun } 681f842297dSMatthias Braun 682f842297dSMatthias Braun // Prune the search if VNI is killed in MBB. 683f842297dSMatthias Braun if (LRQ.endPoint() < MBBEnd) { 684f842297dSMatthias Braun LR.removeSegment(MBBStart, LRQ.endPoint()); 685f842297dSMatthias Braun if (EndPoints) EndPoints->push_back(LRQ.endPoint()); 686f842297dSMatthias Braun I.skipChildren(); 687f842297dSMatthias Braun continue; 688f842297dSMatthias Braun } 689f842297dSMatthias Braun 690f842297dSMatthias Braun // VNI is live through MBB. 691f842297dSMatthias Braun LR.removeSegment(MBBStart, MBBEnd); 692f842297dSMatthias Braun if (EndPoints) EndPoints->push_back(MBBEnd); 693f842297dSMatthias Braun ++I; 694f842297dSMatthias Braun } 695f842297dSMatthias Braun } 696f842297dSMatthias Braun } 697f842297dSMatthias Braun 698f842297dSMatthias Braun //===----------------------------------------------------------------------===// 699f842297dSMatthias Braun // Register allocator hooks. 700f842297dSMatthias Braun // 701f842297dSMatthias Braun 702f842297dSMatthias Braun void LiveIntervals::addKillFlags(const VirtRegMap *VRM) { 703f842297dSMatthias Braun // Keep track of regunit ranges. 704f842297dSMatthias Braun SmallVector<std::pair<const LiveRange*, LiveRange::const_iterator>, 8> RU; 705f842297dSMatthias Braun // Keep track of subregister ranges. 706f842297dSMatthias Braun SmallVector<std::pair<const LiveInterval::SubRange*, 707f842297dSMatthias Braun LiveRange::const_iterator>, 4> SRs; 708f842297dSMatthias Braun 709f842297dSMatthias Braun for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) { 710b68994bdSGaurav Jain Register Reg = Register::index2VirtReg(i); 711f842297dSMatthias Braun if (MRI->reg_nodbg_empty(Reg)) 712f842297dSMatthias Braun continue; 713f842297dSMatthias Braun const LiveInterval &LI = getInterval(Reg); 714f842297dSMatthias Braun if (LI.empty()) 715f842297dSMatthias Braun continue; 716f842297dSMatthias Braun 717f842297dSMatthias Braun // Find the regunit intervals for the assigned register. They may overlap 718f842297dSMatthias Braun // the virtual register live range, cancelling any kills. 719f842297dSMatthias Braun RU.clear(); 720f842297dSMatthias Braun for (MCRegUnitIterator Unit(VRM->getPhys(Reg), TRI); Unit.isValid(); 721f842297dSMatthias Braun ++Unit) { 722f842297dSMatthias Braun const LiveRange &RURange = getRegUnit(*Unit); 723f842297dSMatthias Braun if (RURange.empty()) 724f842297dSMatthias Braun continue; 725f842297dSMatthias Braun RU.push_back(std::make_pair(&RURange, RURange.find(LI.begin()->end))); 726f842297dSMatthias Braun } 727f842297dSMatthias Braun 728f842297dSMatthias Braun if (MRI->subRegLivenessEnabled()) { 729f842297dSMatthias Braun SRs.clear(); 730f842297dSMatthias Braun for (const LiveInterval::SubRange &SR : LI.subranges()) { 731f842297dSMatthias Braun SRs.push_back(std::make_pair(&SR, SR.find(LI.begin()->end))); 732f842297dSMatthias Braun } 733f842297dSMatthias Braun } 734f842297dSMatthias Braun 735f842297dSMatthias Braun // Every instruction that kills Reg corresponds to a segment range end 736f842297dSMatthias Braun // point. 737f842297dSMatthias Braun for (LiveInterval::const_iterator RI = LI.begin(), RE = LI.end(); RI != RE; 738f842297dSMatthias Braun ++RI) { 739f842297dSMatthias Braun // A block index indicates an MBB edge. 740f842297dSMatthias Braun if (RI->end.isBlock()) 741f842297dSMatthias Braun continue; 742f842297dSMatthias Braun MachineInstr *MI = getInstructionFromIndex(RI->end); 743f842297dSMatthias Braun if (!MI) 744f842297dSMatthias Braun continue; 745f842297dSMatthias Braun 746f842297dSMatthias Braun // Check if any of the regunits are live beyond the end of RI. That could 747f842297dSMatthias Braun // happen when a physreg is defined as a copy of a virtreg: 748f842297dSMatthias Braun // 749f842297dSMatthias Braun // %eax = COPY %5 750f842297dSMatthias Braun // FOO %5 <--- MI, cancel kill because %eax is live. 751f842297dSMatthias Braun // BAR killed %eax 752f842297dSMatthias Braun // 753f842297dSMatthias Braun // There should be no kill flag on FOO when %5 is rewritten as %eax. 754f842297dSMatthias Braun for (auto &RUP : RU) { 755f842297dSMatthias Braun const LiveRange &RURange = *RUP.first; 756f842297dSMatthias Braun LiveRange::const_iterator &I = RUP.second; 757f842297dSMatthias Braun if (I == RURange.end()) 758f842297dSMatthias Braun continue; 759f842297dSMatthias Braun I = RURange.advanceTo(I, RI->end); 760f842297dSMatthias Braun if (I == RURange.end() || I->start >= RI->end) 761f842297dSMatthias Braun continue; 762f842297dSMatthias Braun // I is overlapping RI. 763f842297dSMatthias Braun goto CancelKill; 764f842297dSMatthias Braun } 765f842297dSMatthias Braun 766f842297dSMatthias Braun if (MRI->subRegLivenessEnabled()) { 767f842297dSMatthias Braun // When reading a partial undefined value we must not add a kill flag. 768f842297dSMatthias Braun // The regalloc might have used the undef lane for something else. 769f842297dSMatthias Braun // Example: 770f842297dSMatthias Braun // %1 = ... ; R32: %1 771f842297dSMatthias Braun // %2:high16 = ... ; R64: %2 772f842297dSMatthias Braun // = read killed %2 ; R64: %2 773f842297dSMatthias Braun // = read %1 ; R32: %1 774f842297dSMatthias Braun // The <kill> flag is correct for %2, but the register allocator may 775f842297dSMatthias Braun // assign R0L to %1, and R0 to %2 because the low 32bits of R0 776f842297dSMatthias Braun // are actually never written by %2. After assignment the <kill> 777f842297dSMatthias Braun // flag at the read instruction is invalid. 778f842297dSMatthias Braun LaneBitmask DefinedLanesMask; 779f842297dSMatthias Braun if (!SRs.empty()) { 780f842297dSMatthias Braun // Compute a mask of lanes that are defined. 781f842297dSMatthias Braun DefinedLanesMask = LaneBitmask::getNone(); 782f842297dSMatthias Braun for (auto &SRP : SRs) { 783f842297dSMatthias Braun const LiveInterval::SubRange &SR = *SRP.first; 784f842297dSMatthias Braun LiveRange::const_iterator &I = SRP.second; 785f842297dSMatthias Braun if (I == SR.end()) 786f842297dSMatthias Braun continue; 787f842297dSMatthias Braun I = SR.advanceTo(I, RI->end); 788f842297dSMatthias Braun if (I == SR.end() || I->start >= RI->end) 789f842297dSMatthias Braun continue; 790f842297dSMatthias Braun // I is overlapping RI 791f842297dSMatthias Braun DefinedLanesMask |= SR.LaneMask; 792f842297dSMatthias Braun } 793f842297dSMatthias Braun } else 794f842297dSMatthias Braun DefinedLanesMask = LaneBitmask::getAll(); 795f842297dSMatthias Braun 796f842297dSMatthias Braun bool IsFullWrite = false; 797f842297dSMatthias Braun for (const MachineOperand &MO : MI->operands()) { 798f842297dSMatthias Braun if (!MO.isReg() || MO.getReg() != Reg) 799f842297dSMatthias Braun continue; 800f842297dSMatthias Braun if (MO.isUse()) { 801f842297dSMatthias Braun // Reading any undefined lanes? 802f842297dSMatthias Braun LaneBitmask UseMask = TRI->getSubRegIndexLaneMask(MO.getSubReg()); 803f842297dSMatthias Braun if ((UseMask & ~DefinedLanesMask).any()) 804f842297dSMatthias Braun goto CancelKill; 805f842297dSMatthias Braun } else if (MO.getSubReg() == 0) { 806f842297dSMatthias Braun // Writing to the full register? 807f842297dSMatthias Braun assert(MO.isDef()); 808f842297dSMatthias Braun IsFullWrite = true; 809f842297dSMatthias Braun } 810f842297dSMatthias Braun } 811f842297dSMatthias Braun 812f842297dSMatthias Braun // If an instruction writes to a subregister, a new segment starts in 813f842297dSMatthias Braun // the LiveInterval. But as this is only overriding part of the register 814f842297dSMatthias Braun // adding kill-flags is not correct here after registers have been 815f842297dSMatthias Braun // assigned. 816f842297dSMatthias Braun if (!IsFullWrite) { 817f842297dSMatthias Braun // Next segment has to be adjacent in the subregister write case. 818f842297dSMatthias Braun LiveRange::const_iterator N = std::next(RI); 819f842297dSMatthias Braun if (N != LI.end() && N->start == RI->end) 820f842297dSMatthias Braun goto CancelKill; 821f842297dSMatthias Braun } 822f842297dSMatthias Braun } 823f842297dSMatthias Braun 824f842297dSMatthias Braun MI->addRegisterKilled(Reg, nullptr); 825f842297dSMatthias Braun continue; 826f842297dSMatthias Braun CancelKill: 827f842297dSMatthias Braun MI->clearRegisterKills(Reg, nullptr); 828f842297dSMatthias Braun } 829f842297dSMatthias Braun } 830f842297dSMatthias Braun } 831f842297dSMatthias Braun 832f842297dSMatthias Braun MachineBasicBlock* 833f842297dSMatthias Braun LiveIntervals::intervalIsInOneMBB(const LiveInterval &LI) const { 834f842297dSMatthias Braun // A local live range must be fully contained inside the block, meaning it is 835f842297dSMatthias Braun // defined and killed at instructions, not at block boundaries. It is not 836bcadfee2SHiroshi Inoue // live in or out of any block. 837f842297dSMatthias Braun // 838f842297dSMatthias Braun // It is technically possible to have a PHI-defined live range identical to a 839f842297dSMatthias Braun // single block, but we are going to return false in that case. 840f842297dSMatthias Braun 841f842297dSMatthias Braun SlotIndex Start = LI.beginIndex(); 842f842297dSMatthias Braun if (Start.isBlock()) 843f842297dSMatthias Braun return nullptr; 844f842297dSMatthias Braun 845f842297dSMatthias Braun SlotIndex Stop = LI.endIndex(); 846f842297dSMatthias Braun if (Stop.isBlock()) 847f842297dSMatthias Braun return nullptr; 848f842297dSMatthias Braun 849f842297dSMatthias Braun // getMBBFromIndex doesn't need to search the MBB table when both indexes 850f842297dSMatthias Braun // belong to proper instructions. 851f842297dSMatthias Braun MachineBasicBlock *MBB1 = Indexes->getMBBFromIndex(Start); 852f842297dSMatthias Braun MachineBasicBlock *MBB2 = Indexes->getMBBFromIndex(Stop); 853f842297dSMatthias Braun return MBB1 == MBB2 ? MBB1 : nullptr; 854f842297dSMatthias Braun } 855f842297dSMatthias Braun 856f842297dSMatthias Braun bool 857f842297dSMatthias Braun LiveIntervals::hasPHIKill(const LiveInterval &LI, const VNInfo *VNI) const { 858f842297dSMatthias Braun for (const VNInfo *PHI : LI.valnos) { 859f842297dSMatthias Braun if (PHI->isUnused() || !PHI->isPHIDef()) 860f842297dSMatthias Braun continue; 861f842297dSMatthias Braun const MachineBasicBlock *PHIMBB = getMBBFromIndex(PHI->def); 862f842297dSMatthias Braun // Conservatively return true instead of scanning huge predecessor lists. 863f842297dSMatthias Braun if (PHIMBB->pred_size() > 100) 864f842297dSMatthias Braun return true; 865f842297dSMatthias Braun for (const MachineBasicBlock *Pred : PHIMBB->predecessors()) 866f842297dSMatthias Braun if (VNI == LI.getVNInfoBefore(Indexes->getMBBEndIdx(Pred))) 867f842297dSMatthias Braun return true; 868f842297dSMatthias Braun } 869f842297dSMatthias Braun return false; 870f842297dSMatthias Braun } 871f842297dSMatthias Braun 872f842297dSMatthias Braun float LiveIntervals::getSpillWeight(bool isDef, bool isUse, 873f842297dSMatthias Braun const MachineBlockFrequencyInfo *MBFI, 874f842297dSMatthias Braun const MachineInstr &MI) { 875f842297dSMatthias Braun return getSpillWeight(isDef, isUse, MBFI, MI.getParent()); 876f842297dSMatthias Braun } 877f842297dSMatthias Braun 878f842297dSMatthias Braun float LiveIntervals::getSpillWeight(bool isDef, bool isUse, 879f842297dSMatthias Braun const MachineBlockFrequencyInfo *MBFI, 880f842297dSMatthias Braun const MachineBasicBlock *MBB) { 881302e91baSMircea Trofin return (isDef + isUse) * MBFI->getBlockFreqRelativeToEntryBlock(MBB); 882f842297dSMatthias Braun } 883f842297dSMatthias Braun 884f842297dSMatthias Braun LiveRange::Segment 885b68994bdSGaurav Jain LiveIntervals::addSegmentToEndOfBlock(Register Reg, MachineInstr &startInst) { 886b68994bdSGaurav Jain LiveInterval &Interval = createEmptyInterval(Reg); 887f842297dSMatthias Braun VNInfo *VN = Interval.getNextValue( 888f842297dSMatthias Braun SlotIndex(getInstructionIndex(startInst).getRegSlot()), 889f842297dSMatthias Braun getVNInfoAllocator()); 890f842297dSMatthias Braun LiveRange::Segment S(SlotIndex(getInstructionIndex(startInst).getRegSlot()), 891f842297dSMatthias Braun getMBBEndIdx(startInst.getParent()), VN); 892f842297dSMatthias Braun Interval.addSegment(S); 893f842297dSMatthias Braun 894f842297dSMatthias Braun return S; 895f842297dSMatthias Braun } 896f842297dSMatthias Braun 897f842297dSMatthias Braun //===----------------------------------------------------------------------===// 898f842297dSMatthias Braun // Register mask functions 899f842297dSMatthias Braun //===----------------------------------------------------------------------===// 900f842297dSMatthias Braun 901f842297dSMatthias Braun bool LiveIntervals::checkRegMaskInterference(LiveInterval &LI, 902f842297dSMatthias Braun BitVector &UsableRegs) { 903f842297dSMatthias Braun if (LI.empty()) 904f842297dSMatthias Braun return false; 905f842297dSMatthias Braun LiveInterval::iterator LiveI = LI.begin(), LiveE = LI.end(); 906f842297dSMatthias Braun 907f842297dSMatthias Braun // Use a smaller arrays for local live ranges. 908f842297dSMatthias Braun ArrayRef<SlotIndex> Slots; 909f842297dSMatthias Braun ArrayRef<const uint32_t*> Bits; 910f842297dSMatthias Braun if (MachineBasicBlock *MBB = intervalIsInOneMBB(LI)) { 911f842297dSMatthias Braun Slots = getRegMaskSlotsInBlock(MBB->getNumber()); 912f842297dSMatthias Braun Bits = getRegMaskBitsInBlock(MBB->getNumber()); 913f842297dSMatthias Braun } else { 914f842297dSMatthias Braun Slots = getRegMaskSlots(); 915f842297dSMatthias Braun Bits = getRegMaskBits(); 916f842297dSMatthias Braun } 917f842297dSMatthias Braun 918f842297dSMatthias Braun // We are going to enumerate all the register mask slots contained in LI. 919f842297dSMatthias Braun // Start with a binary search of RegMaskSlots to find a starting point. 920dc8de603SFangrui Song ArrayRef<SlotIndex>::iterator SlotI = llvm::lower_bound(Slots, LiveI->start); 921f842297dSMatthias Braun ArrayRef<SlotIndex>::iterator SlotE = Slots.end(); 922f842297dSMatthias Braun 923f842297dSMatthias Braun // No slots in range, LI begins after the last call. 924f842297dSMatthias Braun if (SlotI == SlotE) 925f842297dSMatthias Braun return false; 926f842297dSMatthias Braun 927f842297dSMatthias Braun bool Found = false; 928f842297dSMatthias Braun while (true) { 929f842297dSMatthias Braun assert(*SlotI >= LiveI->start); 930f842297dSMatthias Braun // Loop over all slots overlapping this segment. 931f842297dSMatthias Braun while (*SlotI < LiveI->end) { 932f842297dSMatthias Braun // *SlotI overlaps LI. Collect mask bits. 933f842297dSMatthias Braun if (!Found) { 934f842297dSMatthias Braun // This is the first overlap. Initialize UsableRegs to all ones. 935f842297dSMatthias Braun UsableRegs.clear(); 936f842297dSMatthias Braun UsableRegs.resize(TRI->getNumRegs(), true); 937f842297dSMatthias Braun Found = true; 938f842297dSMatthias Braun } 939f842297dSMatthias Braun // Remove usable registers clobbered by this mask. 940f842297dSMatthias Braun UsableRegs.clearBitsNotInMask(Bits[SlotI-Slots.begin()]); 941f842297dSMatthias Braun if (++SlotI == SlotE) 942f842297dSMatthias Braun return Found; 943f842297dSMatthias Braun } 944f842297dSMatthias Braun // *SlotI is beyond the current LI segment. 945f842297dSMatthias Braun LiveI = LI.advanceTo(LiveI, *SlotI); 946f842297dSMatthias Braun if (LiveI == LiveE) 947f842297dSMatthias Braun return Found; 948f842297dSMatthias Braun // Advance SlotI until it overlaps. 949f842297dSMatthias Braun while (*SlotI < LiveI->start) 950f842297dSMatthias Braun if (++SlotI == SlotE) 951f842297dSMatthias Braun return Found; 952f842297dSMatthias Braun } 953f842297dSMatthias Braun } 954f842297dSMatthias Braun 955f842297dSMatthias Braun //===----------------------------------------------------------------------===// 956f842297dSMatthias Braun // IntervalUpdate class. 957f842297dSMatthias Braun //===----------------------------------------------------------------------===// 958f842297dSMatthias Braun 959f842297dSMatthias Braun /// Toolkit used by handleMove to trim or extend live intervals. 960f842297dSMatthias Braun class LiveIntervals::HMEditor { 961f842297dSMatthias Braun private: 962f842297dSMatthias Braun LiveIntervals& LIS; 963f842297dSMatthias Braun const MachineRegisterInfo& MRI; 964f842297dSMatthias Braun const TargetRegisterInfo& TRI; 965f842297dSMatthias Braun SlotIndex OldIdx; 966f842297dSMatthias Braun SlotIndex NewIdx; 967f842297dSMatthias Braun SmallPtrSet<LiveRange*, 8> Updated; 968f842297dSMatthias Braun bool UpdateFlags; 969f842297dSMatthias Braun 970f842297dSMatthias Braun public: 971f842297dSMatthias Braun HMEditor(LiveIntervals& LIS, const MachineRegisterInfo& MRI, 972f842297dSMatthias Braun const TargetRegisterInfo& TRI, 973f842297dSMatthias Braun SlotIndex OldIdx, SlotIndex NewIdx, bool UpdateFlags) 974f842297dSMatthias Braun : LIS(LIS), MRI(MRI), TRI(TRI), OldIdx(OldIdx), NewIdx(NewIdx), 975f842297dSMatthias Braun UpdateFlags(UpdateFlags) {} 976f842297dSMatthias Braun 977f842297dSMatthias Braun // FIXME: UpdateFlags is a workaround that creates live intervals for all 978f842297dSMatthias Braun // physregs, even those that aren't needed for regalloc, in order to update 979f842297dSMatthias Braun // kill flags. This is wasteful. Eventually, LiveVariables will strip all kill 980f842297dSMatthias Braun // flags, and postRA passes will use a live register utility instead. 981f842297dSMatthias Braun LiveRange *getRegUnitLI(unsigned Unit) { 982f842297dSMatthias Braun if (UpdateFlags && !MRI.isReservedRegUnit(Unit)) 983f842297dSMatthias Braun return &LIS.getRegUnit(Unit); 984f842297dSMatthias Braun return LIS.getCachedRegUnit(Unit); 985f842297dSMatthias Braun } 986f842297dSMatthias Braun 987f842297dSMatthias Braun /// Update all live ranges touched by MI, assuming a move from OldIdx to 988f842297dSMatthias Braun /// NewIdx. 989f842297dSMatthias Braun void updateAllRanges(MachineInstr *MI) { 990d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "handleMove " << OldIdx << " -> " << NewIdx << ": " 991d34e60caSNicola Zaghen << *MI); 992f842297dSMatthias Braun bool hasRegMask = false; 993f842297dSMatthias Braun for (MachineOperand &MO : MI->operands()) { 994f842297dSMatthias Braun if (MO.isRegMask()) 995f842297dSMatthias Braun hasRegMask = true; 996f842297dSMatthias Braun if (!MO.isReg()) 997f842297dSMatthias Braun continue; 998f842297dSMatthias Braun if (MO.isUse()) { 999f842297dSMatthias Braun if (!MO.readsReg()) 1000f842297dSMatthias Braun continue; 1001f842297dSMatthias Braun // Aggressively clear all kill flags. 1002f842297dSMatthias Braun // They are reinserted by VirtRegRewriter. 1003f842297dSMatthias Braun MO.setIsKill(false); 1004f842297dSMatthias Braun } 1005f842297dSMatthias Braun 10060c476111SDaniel Sanders Register Reg = MO.getReg(); 1007f842297dSMatthias Braun if (!Reg) 1008f842297dSMatthias Braun continue; 10092bea69bfSDaniel Sanders if (Register::isVirtualRegister(Reg)) { 1010f842297dSMatthias Braun LiveInterval &LI = LIS.getInterval(Reg); 1011f842297dSMatthias Braun if (LI.hasSubRanges()) { 1012f842297dSMatthias Braun unsigned SubReg = MO.getSubReg(); 1013f842297dSMatthias Braun LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg) 1014f842297dSMatthias Braun : MRI.getMaxLaneMaskForVReg(Reg); 1015f842297dSMatthias Braun for (LiveInterval::SubRange &S : LI.subranges()) { 1016f842297dSMatthias Braun if ((S.LaneMask & LaneMask).none()) 1017f842297dSMatthias Braun continue; 1018f842297dSMatthias Braun updateRange(S, Reg, S.LaneMask); 1019f842297dSMatthias Braun } 1020f842297dSMatthias Braun } 1021f842297dSMatthias Braun updateRange(LI, Reg, LaneBitmask::getNone()); 10227c038726SStanislav Mekhanoshin // If main range has a hole and we are moving a subrange use across 10237c038726SStanislav Mekhanoshin // the hole updateRange() cannot properly handle it since it only 10247c038726SStanislav Mekhanoshin // gets the LiveRange and not the whole LiveInterval. As a result 10257c038726SStanislav Mekhanoshin // we may end up with a main range not covering all subranges. 10267c038726SStanislav Mekhanoshin // This is extremely rare case, so let's check and reconstruct the 10277c038726SStanislav Mekhanoshin // main range. 10287c038726SStanislav Mekhanoshin for (LiveInterval::SubRange &S : LI.subranges()) { 10297c038726SStanislav Mekhanoshin if (LI.covers(S)) 10307c038726SStanislav Mekhanoshin continue; 10317c038726SStanislav Mekhanoshin LI.clear(); 10327c038726SStanislav Mekhanoshin LIS.constructMainRangeFromSubranges(LI); 10337c038726SStanislav Mekhanoshin break; 10347c038726SStanislav Mekhanoshin } 10357c038726SStanislav Mekhanoshin 1036f842297dSMatthias Braun continue; 1037f842297dSMatthias Braun } 1038f842297dSMatthias Braun 1039f842297dSMatthias Braun // For physregs, only update the regunits that actually have a 1040f842297dSMatthias Braun // precomputed live range. 10414cfc4025SMircea Trofin for (MCRegUnitIterator Units(Reg.asMCReg(), &TRI); Units.isValid(); 10424cfc4025SMircea Trofin ++Units) 1043f842297dSMatthias Braun if (LiveRange *LR = getRegUnitLI(*Units)) 1044f842297dSMatthias Braun updateRange(*LR, *Units, LaneBitmask::getNone()); 1045f842297dSMatthias Braun } 1046f842297dSMatthias Braun if (hasRegMask) 1047f842297dSMatthias Braun updateRegMaskSlots(); 1048f842297dSMatthias Braun } 1049f842297dSMatthias Braun 1050f842297dSMatthias Braun private: 1051f842297dSMatthias Braun /// Update a single live range, assuming an instruction has been moved from 1052f842297dSMatthias Braun /// OldIdx to NewIdx. 1053b68994bdSGaurav Jain void updateRange(LiveRange &LR, Register Reg, LaneBitmask LaneMask) { 1054f842297dSMatthias Braun if (!Updated.insert(&LR).second) 1055f842297dSMatthias Braun return; 1056d34e60caSNicola Zaghen LLVM_DEBUG({ 1057f842297dSMatthias Braun dbgs() << " "; 10582bea69bfSDaniel Sanders if (Register::isVirtualRegister(Reg)) { 1059f842297dSMatthias Braun dbgs() << printReg(Reg); 1060f842297dSMatthias Braun if (LaneMask.any()) 1061f842297dSMatthias Braun dbgs() << " L" << PrintLaneMask(LaneMask); 1062f842297dSMatthias Braun } else { 1063f842297dSMatthias Braun dbgs() << printRegUnit(Reg, &TRI); 1064f842297dSMatthias Braun } 1065f842297dSMatthias Braun dbgs() << ":\t" << LR << '\n'; 1066f842297dSMatthias Braun }); 1067f842297dSMatthias Braun if (SlotIndex::isEarlierInstr(OldIdx, NewIdx)) 1068f842297dSMatthias Braun handleMoveDown(LR); 1069f842297dSMatthias Braun else 1070f842297dSMatthias Braun handleMoveUp(LR, Reg, LaneMask); 1071d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << " -->\t" << LR << '\n'); 1072f842297dSMatthias Braun LR.verify(); 1073f842297dSMatthias Braun } 1074f842297dSMatthias Braun 1075f842297dSMatthias Braun /// Update LR to reflect an instruction has been moved downwards from OldIdx 1076f842297dSMatthias Braun /// to NewIdx (OldIdx < NewIdx). 1077f842297dSMatthias Braun void handleMoveDown(LiveRange &LR) { 1078f842297dSMatthias Braun LiveRange::iterator E = LR.end(); 1079f842297dSMatthias Braun // Segment going into OldIdx. 1080f842297dSMatthias Braun LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex()); 1081f842297dSMatthias Braun 1082f842297dSMatthias Braun // No value live before or after OldIdx? Nothing to do. 1083f842297dSMatthias Braun if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start)) 1084f842297dSMatthias Braun return; 1085f842297dSMatthias Braun 1086f842297dSMatthias Braun LiveRange::iterator OldIdxOut; 1087f842297dSMatthias Braun // Do we have a value live-in to OldIdx? 1088f842297dSMatthias Braun if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) { 1089f842297dSMatthias Braun // If the live-in value already extends to NewIdx, there is nothing to do. 1090f842297dSMatthias Braun if (SlotIndex::isEarlierEqualInstr(NewIdx, OldIdxIn->end)) 1091f842297dSMatthias Braun return; 1092f842297dSMatthias Braun // Aggressively remove all kill flags from the old kill point. 1093f842297dSMatthias Braun // Kill flags shouldn't be used while live intervals exist, they will be 1094f842297dSMatthias Braun // reinserted by VirtRegRewriter. 1095f842297dSMatthias Braun if (MachineInstr *KillMI = LIS.getInstructionFromIndex(OldIdxIn->end)) 10961b819645SFlorian Hahn for (MachineOperand &MOP : mi_bundle_ops(*KillMI)) 10971b819645SFlorian Hahn if (MOP.isReg() && MOP.isUse()) 10981b819645SFlorian Hahn MOP.setIsKill(false); 1099f842297dSMatthias Braun 1100f842297dSMatthias Braun // Is there a def before NewIdx which is not OldIdx? 1101f842297dSMatthias Braun LiveRange::iterator Next = std::next(OldIdxIn); 1102f842297dSMatthias Braun if (Next != E && !SlotIndex::isSameInstr(OldIdx, Next->start) && 1103f842297dSMatthias Braun SlotIndex::isEarlierInstr(Next->start, NewIdx)) { 1104f842297dSMatthias Braun // If we are here then OldIdx was just a use but not a def. We only have 1105f842297dSMatthias Braun // to ensure liveness extends to NewIdx. 1106f842297dSMatthias Braun LiveRange::iterator NewIdxIn = 1107f842297dSMatthias Braun LR.advanceTo(Next, NewIdx.getBaseIndex()); 1108f842297dSMatthias Braun // Extend the segment before NewIdx if necessary. 1109f842297dSMatthias Braun if (NewIdxIn == E || 1110f842297dSMatthias Braun !SlotIndex::isEarlierInstr(NewIdxIn->start, NewIdx)) { 1111f842297dSMatthias Braun LiveRange::iterator Prev = std::prev(NewIdxIn); 1112f842297dSMatthias Braun Prev->end = NewIdx.getRegSlot(); 1113f842297dSMatthias Braun } 1114f842297dSMatthias Braun // Extend OldIdxIn. 1115f842297dSMatthias Braun OldIdxIn->end = Next->start; 1116f842297dSMatthias Braun return; 1117f842297dSMatthias Braun } 1118f842297dSMatthias Braun 1119f842297dSMatthias Braun // Adjust OldIdxIn->end to reach NewIdx. This may temporarily make LR 1120f842297dSMatthias Braun // invalid by overlapping ranges. 1121f842297dSMatthias Braun bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end); 1122f842297dSMatthias Braun OldIdxIn->end = NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber()); 1123f842297dSMatthias Braun // If this was not a kill, then there was no def and we're done. 1124f842297dSMatthias Braun if (!isKill) 1125f842297dSMatthias Braun return; 1126f842297dSMatthias Braun 1127f842297dSMatthias Braun // Did we have a Def at OldIdx? 1128f842297dSMatthias Braun OldIdxOut = Next; 1129f842297dSMatthias Braun if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start)) 1130f842297dSMatthias Braun return; 1131f842297dSMatthias Braun } else { 1132f842297dSMatthias Braun OldIdxOut = OldIdxIn; 1133f842297dSMatthias Braun } 1134f842297dSMatthias Braun 1135f842297dSMatthias Braun // If we are here then there is a Definition at OldIdx. OldIdxOut points 1136f842297dSMatthias Braun // to the segment starting there. 1137f842297dSMatthias Braun assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) && 1138f842297dSMatthias Braun "No def?"); 1139f842297dSMatthias Braun VNInfo *OldIdxVNI = OldIdxOut->valno; 1140f842297dSMatthias Braun assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def"); 1141f842297dSMatthias Braun 1142f842297dSMatthias Braun // If the defined value extends beyond NewIdx, just move the beginning 1143f842297dSMatthias Braun // of the segment to NewIdx. 1144f842297dSMatthias Braun SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber()); 1145f842297dSMatthias Braun if (SlotIndex::isEarlierInstr(NewIdxDef, OldIdxOut->end)) { 1146f842297dSMatthias Braun OldIdxVNI->def = NewIdxDef; 1147f842297dSMatthias Braun OldIdxOut->start = OldIdxVNI->def; 1148f842297dSMatthias Braun return; 1149f842297dSMatthias Braun } 1150f842297dSMatthias Braun 1151f842297dSMatthias Braun // If we are here then we have a Definition at OldIdx which ends before 1152f842297dSMatthias Braun // NewIdx. 1153f842297dSMatthias Braun 1154f842297dSMatthias Braun // Is there an existing Def at NewIdx? 1155f842297dSMatthias Braun LiveRange::iterator AfterNewIdx 1156f842297dSMatthias Braun = LR.advanceTo(OldIdxOut, NewIdx.getRegSlot()); 1157f842297dSMatthias Braun bool OldIdxDefIsDead = OldIdxOut->end.isDead(); 1158f842297dSMatthias Braun if (!OldIdxDefIsDead && 1159f842297dSMatthias Braun SlotIndex::isEarlierInstr(OldIdxOut->end, NewIdxDef)) { 1160f842297dSMatthias Braun // OldIdx is not a dead def, and NewIdxDef is inside a new interval. 1161f842297dSMatthias Braun VNInfo *DefVNI; 1162f842297dSMatthias Braun if (OldIdxOut != LR.begin() && 1163f842297dSMatthias Braun !SlotIndex::isEarlierInstr(std::prev(OldIdxOut)->end, 1164f842297dSMatthias Braun OldIdxOut->start)) { 1165f842297dSMatthias Braun // There is no gap between OldIdxOut and its predecessor anymore, 1166f842297dSMatthias Braun // merge them. 1167f842297dSMatthias Braun LiveRange::iterator IPrev = std::prev(OldIdxOut); 1168f842297dSMatthias Braun DefVNI = OldIdxVNI; 1169f842297dSMatthias Braun IPrev->end = OldIdxOut->end; 1170f842297dSMatthias Braun } else { 1171f842297dSMatthias Braun // The value is live in to OldIdx 1172f842297dSMatthias Braun LiveRange::iterator INext = std::next(OldIdxOut); 1173f842297dSMatthias Braun assert(INext != E && "Must have following segment"); 1174f842297dSMatthias Braun // We merge OldIdxOut and its successor. As we're dealing with subreg 1175f842297dSMatthias Braun // reordering, there is always a successor to OldIdxOut in the same BB 1176f842297dSMatthias Braun // We don't need INext->valno anymore and will reuse for the new segment 1177f842297dSMatthias Braun // we create later. 1178f842297dSMatthias Braun DefVNI = OldIdxVNI; 1179f842297dSMatthias Braun INext->start = OldIdxOut->end; 1180f842297dSMatthias Braun INext->valno->def = INext->start; 1181f842297dSMatthias Braun } 1182f842297dSMatthias Braun // If NewIdx is behind the last segment, extend that and append a new one. 1183f842297dSMatthias Braun if (AfterNewIdx == E) { 1184f842297dSMatthias Braun // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up 1185f842297dSMatthias Braun // one position. 1186f842297dSMatthias Braun // |- ?/OldIdxOut -| |- X0 -| ... |- Xn -| end 1187f842297dSMatthias Braun // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS -| end 1188f842297dSMatthias Braun std::copy(std::next(OldIdxOut), E, OldIdxOut); 1189f842297dSMatthias Braun // The last segment is undefined now, reuse it for a dead def. 1190f842297dSMatthias Braun LiveRange::iterator NewSegment = std::prev(E); 1191f842297dSMatthias Braun *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(), 1192f842297dSMatthias Braun DefVNI); 1193f842297dSMatthias Braun DefVNI->def = NewIdxDef; 1194f842297dSMatthias Braun 1195f842297dSMatthias Braun LiveRange::iterator Prev = std::prev(NewSegment); 1196f842297dSMatthias Braun Prev->end = NewIdxDef; 1197f842297dSMatthias Braun } else { 1198f842297dSMatthias Braun // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up 1199f842297dSMatthias Braun // one position. 1200f842297dSMatthias Braun // |- ?/OldIdxOut -| |- X0 -| ... |- Xn/AfterNewIdx -| |- Next -| 1201f842297dSMatthias Braun // => |- X0/OldIdxOut -| ... |- Xn -| |- Xn/AfterNewIdx -| |- Next -| 1202f842297dSMatthias Braun std::copy(std::next(OldIdxOut), std::next(AfterNewIdx), OldIdxOut); 1203f842297dSMatthias Braun LiveRange::iterator Prev = std::prev(AfterNewIdx); 1204f842297dSMatthias Braun // We have two cases: 1205f842297dSMatthias Braun if (SlotIndex::isEarlierInstr(Prev->start, NewIdxDef)) { 1206f842297dSMatthias Braun // Case 1: NewIdx is inside a liverange. Split this liverange at 1207f842297dSMatthias Braun // NewIdxDef into the segment "Prev" followed by "NewSegment". 1208f842297dSMatthias Braun LiveRange::iterator NewSegment = AfterNewIdx; 1209f842297dSMatthias Braun *NewSegment = LiveRange::Segment(NewIdxDef, Prev->end, Prev->valno); 1210f842297dSMatthias Braun Prev->valno->def = NewIdxDef; 1211f842297dSMatthias Braun 1212f842297dSMatthias Braun *Prev = LiveRange::Segment(Prev->start, NewIdxDef, DefVNI); 1213f842297dSMatthias Braun DefVNI->def = Prev->start; 1214f842297dSMatthias Braun } else { 1215f842297dSMatthias Braun // Case 2: NewIdx is in a lifetime hole. Keep AfterNewIdx as is and 1216f842297dSMatthias Braun // turn Prev into a segment from NewIdx to AfterNewIdx->start. 1217f842297dSMatthias Braun *Prev = LiveRange::Segment(NewIdxDef, AfterNewIdx->start, DefVNI); 1218f842297dSMatthias Braun DefVNI->def = NewIdxDef; 1219f842297dSMatthias Braun assert(DefVNI != AfterNewIdx->valno); 1220f842297dSMatthias Braun } 1221f842297dSMatthias Braun } 1222f842297dSMatthias Braun return; 1223f842297dSMatthias Braun } 1224f842297dSMatthias Braun 1225f842297dSMatthias Braun if (AfterNewIdx != E && 1226f842297dSMatthias Braun SlotIndex::isSameInstr(AfterNewIdx->start, NewIdxDef)) { 1227f842297dSMatthias Braun // There is an existing def at NewIdx. The def at OldIdx is coalesced into 1228f842297dSMatthias Braun // that value. 1229f842297dSMatthias Braun assert(AfterNewIdx->valno != OldIdxVNI && "Multiple defs of value?"); 1230f842297dSMatthias Braun LR.removeValNo(OldIdxVNI); 1231f842297dSMatthias Braun } else { 1232f842297dSMatthias Braun // There was no existing def at NewIdx. We need to create a dead def 1233f842297dSMatthias Braun // at NewIdx. Shift segments over the old OldIdxOut segment, this frees 1234f842297dSMatthias Braun // a new segment at the place where we want to construct the dead def. 1235f842297dSMatthias Braun // |- OldIdxOut -| |- X0 -| ... |- Xn -| |- AfterNewIdx -| 1236f842297dSMatthias Braun // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS. -| |- AfterNewIdx -| 1237f842297dSMatthias Braun assert(AfterNewIdx != OldIdxOut && "Inconsistent iterators"); 1238f842297dSMatthias Braun std::copy(std::next(OldIdxOut), AfterNewIdx, OldIdxOut); 1239f842297dSMatthias Braun // We can reuse OldIdxVNI now. 1240f842297dSMatthias Braun LiveRange::iterator NewSegment = std::prev(AfterNewIdx); 1241f842297dSMatthias Braun VNInfo *NewSegmentVNI = OldIdxVNI; 1242f842297dSMatthias Braun NewSegmentVNI->def = NewIdxDef; 1243f842297dSMatthias Braun *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(), 1244f842297dSMatthias Braun NewSegmentVNI); 1245f842297dSMatthias Braun } 1246f842297dSMatthias Braun } 1247f842297dSMatthias Braun 1248f842297dSMatthias Braun /// Update LR to reflect an instruction has been moved upwards from OldIdx 1249f842297dSMatthias Braun /// to NewIdx (NewIdx < OldIdx). 1250b68994bdSGaurav Jain void handleMoveUp(LiveRange &LR, Register Reg, LaneBitmask LaneMask) { 1251f842297dSMatthias Braun LiveRange::iterator E = LR.end(); 1252f842297dSMatthias Braun // Segment going into OldIdx. 1253f842297dSMatthias Braun LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex()); 1254f842297dSMatthias Braun 1255f842297dSMatthias Braun // No value live before or after OldIdx? Nothing to do. 1256f842297dSMatthias Braun if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start)) 1257f842297dSMatthias Braun return; 1258f842297dSMatthias Braun 1259f842297dSMatthias Braun LiveRange::iterator OldIdxOut; 1260f842297dSMatthias Braun // Do we have a value live-in to OldIdx? 1261f842297dSMatthias Braun if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) { 1262f842297dSMatthias Braun // If the live-in value isn't killed here, then we have no Def at 1263f842297dSMatthias Braun // OldIdx, moreover the value must be live at NewIdx so there is nothing 1264f842297dSMatthias Braun // to do. 1265f842297dSMatthias Braun bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end); 1266f842297dSMatthias Braun if (!isKill) 1267f842297dSMatthias Braun return; 1268f842297dSMatthias Braun 1269f842297dSMatthias Braun // At this point we have to move OldIdxIn->end back to the nearest 1270f842297dSMatthias Braun // previous use or (dead-)def but no further than NewIdx. 1271f842297dSMatthias Braun SlotIndex DefBeforeOldIdx 1272f842297dSMatthias Braun = std::max(OldIdxIn->start.getDeadSlot(), 1273f842297dSMatthias Braun NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber())); 1274f842297dSMatthias Braun OldIdxIn->end = findLastUseBefore(DefBeforeOldIdx, Reg, LaneMask); 1275f842297dSMatthias Braun 1276f842297dSMatthias Braun // Did we have a Def at OldIdx? If not we are done now. 1277f842297dSMatthias Braun OldIdxOut = std::next(OldIdxIn); 1278f842297dSMatthias Braun if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start)) 1279f842297dSMatthias Braun return; 1280f842297dSMatthias Braun } else { 1281f842297dSMatthias Braun OldIdxOut = OldIdxIn; 1282f842297dSMatthias Braun OldIdxIn = OldIdxOut != LR.begin() ? std::prev(OldIdxOut) : E; 1283f842297dSMatthias Braun } 1284f842297dSMatthias Braun 1285f842297dSMatthias Braun // If we are here then there is a Definition at OldIdx. OldIdxOut points 1286f842297dSMatthias Braun // to the segment starting there. 1287f842297dSMatthias Braun assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) && 1288f842297dSMatthias Braun "No def?"); 1289f842297dSMatthias Braun VNInfo *OldIdxVNI = OldIdxOut->valno; 1290f842297dSMatthias Braun assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def"); 1291f842297dSMatthias Braun bool OldIdxDefIsDead = OldIdxOut->end.isDead(); 1292f842297dSMatthias Braun 1293f842297dSMatthias Braun // Is there an existing def at NewIdx? 1294f842297dSMatthias Braun SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber()); 1295f842297dSMatthias Braun LiveRange::iterator NewIdxOut = LR.find(NewIdx.getRegSlot()); 1296f842297dSMatthias Braun if (SlotIndex::isSameInstr(NewIdxOut->start, NewIdx)) { 1297f842297dSMatthias Braun assert(NewIdxOut->valno != OldIdxVNI && 1298f842297dSMatthias Braun "Same value defined more than once?"); 1299f842297dSMatthias Braun // If OldIdx was a dead def remove it. 1300f842297dSMatthias Braun if (!OldIdxDefIsDead) { 1301f842297dSMatthias Braun // Remove segment starting at NewIdx and move begin of OldIdxOut to 1302f842297dSMatthias Braun // NewIdx so it can take its place. 1303f842297dSMatthias Braun OldIdxVNI->def = NewIdxDef; 1304f842297dSMatthias Braun OldIdxOut->start = NewIdxDef; 1305f842297dSMatthias Braun LR.removeValNo(NewIdxOut->valno); 1306f842297dSMatthias Braun } else { 1307f842297dSMatthias Braun // Simply remove the dead def at OldIdx. 1308f842297dSMatthias Braun LR.removeValNo(OldIdxVNI); 1309f842297dSMatthias Braun } 1310f842297dSMatthias Braun } else { 1311f842297dSMatthias Braun // Previously nothing was live after NewIdx, so all we have to do now is 1312f842297dSMatthias Braun // move the begin of OldIdxOut to NewIdx. 1313f842297dSMatthias Braun if (!OldIdxDefIsDead) { 1314f842297dSMatthias Braun // Do we have any intermediate Defs between OldIdx and NewIdx? 1315f842297dSMatthias Braun if (OldIdxIn != E && 1316f842297dSMatthias Braun SlotIndex::isEarlierInstr(NewIdxDef, OldIdxIn->start)) { 1317f842297dSMatthias Braun // OldIdx is not a dead def and NewIdx is before predecessor start. 1318f842297dSMatthias Braun LiveRange::iterator NewIdxIn = NewIdxOut; 1319f842297dSMatthias Braun assert(NewIdxIn == LR.find(NewIdx.getBaseIndex())); 1320f842297dSMatthias Braun const SlotIndex SplitPos = NewIdxDef; 1321f842297dSMatthias Braun OldIdxVNI = OldIdxIn->valno; 1322f842297dSMatthias Braun 1323d4274f01SMatt Arsenault SlotIndex NewDefEndPoint = std::next(NewIdxIn)->end; 1324d4274f01SMatt Arsenault LiveRange::iterator Prev = std::prev(OldIdxIn); 1325d4274f01SMatt Arsenault if (OldIdxIn != LR.begin() && 1326d4274f01SMatt Arsenault SlotIndex::isEarlierInstr(NewIdx, Prev->end)) { 1327d4274f01SMatt Arsenault // If the segment before OldIdx read a value defined earlier than 1328d4274f01SMatt Arsenault // NewIdx, the moved instruction also reads and forwards that 1329d4274f01SMatt Arsenault // value. Extend the lifetime of the new def point. 1330d4274f01SMatt Arsenault 1331d4274f01SMatt Arsenault // Extend to where the previous range started, unless there is 1332d4274f01SMatt Arsenault // another redef first. 1333d4274f01SMatt Arsenault NewDefEndPoint = std::min(OldIdxIn->start, 1334d4274f01SMatt Arsenault std::next(NewIdxOut)->start); 1335d4274f01SMatt Arsenault } 1336d4274f01SMatt Arsenault 1337f842297dSMatthias Braun // Merge the OldIdxIn and OldIdxOut segments into OldIdxOut. 1338f842297dSMatthias Braun OldIdxOut->valno->def = OldIdxIn->start; 1339f842297dSMatthias Braun *OldIdxOut = LiveRange::Segment(OldIdxIn->start, OldIdxOut->end, 1340f842297dSMatthias Braun OldIdxOut->valno); 1341f842297dSMatthias Braun // OldIdxIn and OldIdxVNI are now undef and can be overridden. 1342f842297dSMatthias Braun // We Slide [NewIdxIn, OldIdxIn) down one position. 1343f842297dSMatthias Braun // |- X0/NewIdxIn -| ... |- Xn-1 -||- Xn/OldIdxIn -||- OldIdxOut -| 1344f842297dSMatthias Braun // => |- undef/NexIdxIn -| |- X0 -| ... |- Xn-1 -| |- Xn/OldIdxOut -| 1345f842297dSMatthias Braun std::copy_backward(NewIdxIn, OldIdxIn, OldIdxOut); 1346f842297dSMatthias Braun // NewIdxIn is now considered undef so we can reuse it for the moved 1347f842297dSMatthias Braun // value. 1348f842297dSMatthias Braun LiveRange::iterator NewSegment = NewIdxIn; 1349f842297dSMatthias Braun LiveRange::iterator Next = std::next(NewSegment); 1350f842297dSMatthias Braun if (SlotIndex::isEarlierInstr(Next->start, NewIdx)) { 1351f842297dSMatthias Braun // There is no gap between NewSegment and its predecessor. 1352f842297dSMatthias Braun *NewSegment = LiveRange::Segment(Next->start, SplitPos, 1353f842297dSMatthias Braun Next->valno); 1354d4274f01SMatt Arsenault 1355d4274f01SMatt Arsenault *Next = LiveRange::Segment(SplitPos, NewDefEndPoint, OldIdxVNI); 1356f842297dSMatthias Braun Next->valno->def = SplitPos; 1357f842297dSMatthias Braun } else { 1358f842297dSMatthias Braun // There is a gap between NewSegment and its predecessor 1359f842297dSMatthias Braun // Value becomes live in. 1360f842297dSMatthias Braun *NewSegment = LiveRange::Segment(SplitPos, Next->start, OldIdxVNI); 1361f842297dSMatthias Braun NewSegment->valno->def = SplitPos; 1362f842297dSMatthias Braun } 1363f842297dSMatthias Braun } else { 1364f842297dSMatthias Braun // Leave the end point of a live def. 1365f842297dSMatthias Braun OldIdxOut->start = NewIdxDef; 1366f842297dSMatthias Braun OldIdxVNI->def = NewIdxDef; 1367f842297dSMatthias Braun if (OldIdxIn != E && SlotIndex::isEarlierInstr(NewIdx, OldIdxIn->end)) 13687cdf4326SJay Foad OldIdxIn->end = NewIdxDef; 1369f842297dSMatthias Braun } 1370f40707a2STim Renouf } else if (OldIdxIn != E 1371f40707a2STim Renouf && SlotIndex::isEarlierInstr(NewIdxOut->start, NewIdx) 1372f40707a2STim Renouf && SlotIndex::isEarlierInstr(NewIdx, NewIdxOut->end)) { 1373f40707a2STim Renouf // OldIdxVNI is a dead def that has been moved into the middle of 1374f40707a2STim Renouf // another value in LR. That can happen when LR is a whole register, 1375f40707a2STim Renouf // but the dead def is a write to a subreg that is dead at NewIdx. 1376f40707a2STim Renouf // The dead def may have been moved across other values 1377f40707a2STim Renouf // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut) 1378f40707a2STim Renouf // down one position. 1379f40707a2STim Renouf // |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - | 1380f40707a2STim Renouf // => |- X0/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -| 1381f40707a2STim Renouf std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut)); 1382f40707a2STim Renouf // Modify the segment at NewIdxOut and the following segment to meet at 1383f40707a2STim Renouf // the point of the dead def, with the following segment getting 1384f40707a2STim Renouf // OldIdxVNI as its value number. 1385f40707a2STim Renouf *NewIdxOut = LiveRange::Segment( 1386f40707a2STim Renouf NewIdxOut->start, NewIdxDef.getRegSlot(), NewIdxOut->valno); 1387f40707a2STim Renouf *(NewIdxOut + 1) = LiveRange::Segment( 1388f40707a2STim Renouf NewIdxDef.getRegSlot(), (NewIdxOut + 1)->end, OldIdxVNI); 1389f40707a2STim Renouf OldIdxVNI->def = NewIdxDef; 1390f40707a2STim Renouf // Modify subsequent segments to be defined by the moved def OldIdxVNI. 1391f40707a2STim Renouf for (auto Idx = NewIdxOut + 2; Idx <= OldIdxOut; ++Idx) 1392f40707a2STim Renouf Idx->valno = OldIdxVNI; 1393f40707a2STim Renouf // Aggressively remove all dead flags from the former dead definition. 1394f40707a2STim Renouf // Kill/dead flags shouldn't be used while live intervals exist; they 1395f40707a2STim Renouf // will be reinserted by VirtRegRewriter. 1396f40707a2STim Renouf if (MachineInstr *KillMI = LIS.getInstructionFromIndex(NewIdx)) 1397f40707a2STim Renouf for (MIBundleOperands MO(*KillMI); MO.isValid(); ++MO) 1398f40707a2STim Renouf if (MO->isReg() && !MO->isUse()) 1399f40707a2STim Renouf MO->setIsDead(false); 1400f842297dSMatthias Braun } else { 1401f842297dSMatthias Braun // OldIdxVNI is a dead def. It may have been moved across other values 1402f842297dSMatthias Braun // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut) 1403f842297dSMatthias Braun // down one position. 1404f842297dSMatthias Braun // |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - | 1405f842297dSMatthias Braun // => |- undef/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -| 1406f842297dSMatthias Braun std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut)); 1407f842297dSMatthias Braun // OldIdxVNI can be reused now to build a new dead def segment. 1408f842297dSMatthias Braun LiveRange::iterator NewSegment = NewIdxOut; 1409f842297dSMatthias Braun VNInfo *NewSegmentVNI = OldIdxVNI; 1410f842297dSMatthias Braun *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(), 1411f842297dSMatthias Braun NewSegmentVNI); 1412f842297dSMatthias Braun NewSegmentVNI->def = NewIdxDef; 1413f842297dSMatthias Braun } 1414f842297dSMatthias Braun } 1415f842297dSMatthias Braun } 1416f842297dSMatthias Braun 1417f842297dSMatthias Braun void updateRegMaskSlots() { 1418f842297dSMatthias Braun SmallVectorImpl<SlotIndex>::iterator RI = 1419dc8de603SFangrui Song llvm::lower_bound(LIS.RegMaskSlots, OldIdx); 1420f842297dSMatthias Braun assert(RI != LIS.RegMaskSlots.end() && *RI == OldIdx.getRegSlot() && 1421f842297dSMatthias Braun "No RegMask at OldIdx."); 1422f842297dSMatthias Braun *RI = NewIdx.getRegSlot(); 1423f842297dSMatthias Braun assert((RI == LIS.RegMaskSlots.begin() || 1424f842297dSMatthias Braun SlotIndex::isEarlierInstr(*std::prev(RI), *RI)) && 1425f842297dSMatthias Braun "Cannot move regmask instruction above another call"); 1426f842297dSMatthias Braun assert((std::next(RI) == LIS.RegMaskSlots.end() || 1427f842297dSMatthias Braun SlotIndex::isEarlierInstr(*RI, *std::next(RI))) && 1428f842297dSMatthias Braun "Cannot move regmask instruction below another call"); 1429f842297dSMatthias Braun } 1430f842297dSMatthias Braun 1431f842297dSMatthias Braun // Return the last use of reg between NewIdx and OldIdx. 1432b68994bdSGaurav Jain SlotIndex findLastUseBefore(SlotIndex Before, Register Reg, 1433f842297dSMatthias Braun LaneBitmask LaneMask) { 14342bea69bfSDaniel Sanders if (Register::isVirtualRegister(Reg)) { 1435f842297dSMatthias Braun SlotIndex LastUse = Before; 1436f842297dSMatthias Braun for (MachineOperand &MO : MRI.use_nodbg_operands(Reg)) { 1437f842297dSMatthias Braun if (MO.isUndef()) 1438f842297dSMatthias Braun continue; 1439f842297dSMatthias Braun unsigned SubReg = MO.getSubReg(); 1440f842297dSMatthias Braun if (SubReg != 0 && LaneMask.any() 1441f842297dSMatthias Braun && (TRI.getSubRegIndexLaneMask(SubReg) & LaneMask).none()) 1442f842297dSMatthias Braun continue; 1443f842297dSMatthias Braun 1444f842297dSMatthias Braun const MachineInstr &MI = *MO.getParent(); 1445f842297dSMatthias Braun SlotIndex InstSlot = LIS.getSlotIndexes()->getInstructionIndex(MI); 1446f842297dSMatthias Braun if (InstSlot > LastUse && InstSlot < OldIdx) 1447f842297dSMatthias Braun LastUse = InstSlot.getRegSlot(); 1448f842297dSMatthias Braun } 1449f842297dSMatthias Braun return LastUse; 1450f842297dSMatthias Braun } 1451f842297dSMatthias Braun 1452f842297dSMatthias Braun // This is a regunit interval, so scanning the use list could be very 1453f842297dSMatthias Braun // expensive. Scan upwards from OldIdx instead. 1454f842297dSMatthias Braun assert(Before < OldIdx && "Expected upwards move"); 1455f842297dSMatthias Braun SlotIndexes *Indexes = LIS.getSlotIndexes(); 1456f842297dSMatthias Braun MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Before); 1457f842297dSMatthias Braun 1458f842297dSMatthias Braun // OldIdx may not correspond to an instruction any longer, so set MII to 1459f842297dSMatthias Braun // point to the next instruction after OldIdx, or MBB->end(). 1460f842297dSMatthias Braun MachineBasicBlock::iterator MII = MBB->end(); 1461f842297dSMatthias Braun if (MachineInstr *MI = Indexes->getInstructionFromIndex( 1462f842297dSMatthias Braun Indexes->getNextNonNullIndex(OldIdx))) 1463f842297dSMatthias Braun if (MI->getParent() == MBB) 1464f842297dSMatthias Braun MII = MI; 1465f842297dSMatthias Braun 1466f842297dSMatthias Braun MachineBasicBlock::iterator Begin = MBB->begin(); 1467f842297dSMatthias Braun while (MII != Begin) { 1468801bf7ebSShiva Chen if ((--MII)->isDebugInstr()) 1469f842297dSMatthias Braun continue; 1470f842297dSMatthias Braun SlotIndex Idx = Indexes->getInstructionIndex(*MII); 1471f842297dSMatthias Braun 1472f842297dSMatthias Braun // Stop searching when Before is reached. 1473f842297dSMatthias Braun if (!SlotIndex::isEarlierInstr(Before, Idx)) 1474f842297dSMatthias Braun return Before; 1475f842297dSMatthias Braun 1476f842297dSMatthias Braun // Check if MII uses Reg. 1477f842297dSMatthias Braun for (MIBundleOperands MO(*MII); MO.isValid(); ++MO) 1478f842297dSMatthias Braun if (MO->isReg() && !MO->isUndef() && 14792bea69bfSDaniel Sanders Register::isPhysicalRegister(MO->getReg()) && 1480f842297dSMatthias Braun TRI.hasRegUnit(MO->getReg(), Reg)) 1481f842297dSMatthias Braun return Idx.getRegSlot(); 1482f842297dSMatthias Braun } 1483f842297dSMatthias Braun // Didn't reach Before. It must be the first instruction in the block. 1484f842297dSMatthias Braun return Before; 1485f842297dSMatthias Braun } 1486f842297dSMatthias Braun }; 1487f842297dSMatthias Braun 1488f842297dSMatthias Braun void LiveIntervals::handleMove(MachineInstr &MI, bool UpdateFlags) { 1489c14334e9SMatt Arsenault // It is fine to move a bundle as a whole, but not an individual instruction 1490c14334e9SMatt Arsenault // inside it. 1491c14334e9SMatt Arsenault assert((!MI.isBundled() || MI.getOpcode() == TargetOpcode::BUNDLE) && 1492c14334e9SMatt Arsenault "Cannot move instruction in bundle"); 1493f842297dSMatthias Braun SlotIndex OldIndex = Indexes->getInstructionIndex(MI); 1494f842297dSMatthias Braun Indexes->removeMachineInstrFromMaps(MI); 1495f842297dSMatthias Braun SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(MI); 1496f842297dSMatthias Braun assert(getMBBStartIdx(MI.getParent()) <= OldIndex && 1497f842297dSMatthias Braun OldIndex < getMBBEndIdx(MI.getParent()) && 1498f842297dSMatthias Braun "Cannot handle moves across basic block boundaries."); 1499f842297dSMatthias Braun 1500f842297dSMatthias Braun HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags); 1501f842297dSMatthias Braun HME.updateAllRanges(&MI); 1502f842297dSMatthias Braun } 1503f842297dSMatthias Braun 150443e2460aSCarl Ritson void LiveIntervals::handleMoveIntoNewBundle(MachineInstr &BundleStart, 1505f842297dSMatthias Braun bool UpdateFlags) { 150643e2460aSCarl Ritson assert((BundleStart.getOpcode() == TargetOpcode::BUNDLE) && 150743e2460aSCarl Ritson "Bundle start is not a bundle"); 150843e2460aSCarl Ritson SmallVector<SlotIndex, 16> ToProcess; 150943e2460aSCarl Ritson const SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(BundleStart); 151043e2460aSCarl Ritson auto BundleEnd = getBundleEnd(BundleStart.getIterator()); 151143e2460aSCarl Ritson 151243e2460aSCarl Ritson auto I = BundleStart.getIterator(); 151343e2460aSCarl Ritson I++; 151443e2460aSCarl Ritson while (I != BundleEnd) { 151543e2460aSCarl Ritson if (!Indexes->hasIndex(*I)) 151643e2460aSCarl Ritson continue; 151743e2460aSCarl Ritson SlotIndex OldIndex = Indexes->getInstructionIndex(*I, true); 151843e2460aSCarl Ritson ToProcess.push_back(OldIndex); 151943e2460aSCarl Ritson Indexes->removeMachineInstrFromMaps(*I, true); 152043e2460aSCarl Ritson I++; 152143e2460aSCarl Ritson } 152243e2460aSCarl Ritson for (SlotIndex OldIndex : ToProcess) { 1523f842297dSMatthias Braun HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags); 152443e2460aSCarl Ritson HME.updateAllRanges(&BundleStart); 152543e2460aSCarl Ritson } 152643e2460aSCarl Ritson 152743e2460aSCarl Ritson // Fix up dead defs 152843e2460aSCarl Ritson const SlotIndex Index = getInstructionIndex(BundleStart); 152943e2460aSCarl Ritson for (unsigned Idx = 0, E = BundleStart.getNumOperands(); Idx != E; ++Idx) { 153043e2460aSCarl Ritson MachineOperand &MO = BundleStart.getOperand(Idx); 153143e2460aSCarl Ritson if (!MO.isReg()) 153243e2460aSCarl Ritson continue; 153343e2460aSCarl Ritson Register Reg = MO.getReg(); 153443e2460aSCarl Ritson if (Reg.isVirtual() && hasInterval(Reg) && !MO.isUndef()) { 153543e2460aSCarl Ritson LiveInterval &LI = getInterval(Reg); 153643e2460aSCarl Ritson LiveQueryResult LRQ = LI.Query(Index); 153743e2460aSCarl Ritson if (LRQ.isDeadDef()) 153843e2460aSCarl Ritson MO.setIsDead(); 153943e2460aSCarl Ritson } 154043e2460aSCarl Ritson } 1541f842297dSMatthias Braun } 1542f842297dSMatthias Braun 1543f842297dSMatthias Braun void LiveIntervals::repairOldRegInRange(const MachineBasicBlock::iterator Begin, 1544f842297dSMatthias Braun const MachineBasicBlock::iterator End, 1545b68994bdSGaurav Jain const SlotIndex EndIdx, LiveRange &LR, 1546b68994bdSGaurav Jain const Register Reg, 1547f842297dSMatthias Braun LaneBitmask LaneMask) { 1548b68994bdSGaurav Jain LiveInterval::iterator LII = LR.find(EndIdx); 1549f842297dSMatthias Braun SlotIndex lastUseIdx; 1550f842297dSMatthias Braun if (LII == LR.begin()) { 1551f842297dSMatthias Braun // This happens when the function is called for a subregister that only 1552f842297dSMatthias Braun // occurs _after_ the range that is to be repaired. 1553f842297dSMatthias Braun return; 1554f842297dSMatthias Braun } 1555b68994bdSGaurav Jain if (LII != LR.end() && LII->start < EndIdx) 1556f842297dSMatthias Braun lastUseIdx = LII->end; 1557f842297dSMatthias Braun else 1558f842297dSMatthias Braun --LII; 1559f842297dSMatthias Braun 1560f842297dSMatthias Braun for (MachineBasicBlock::iterator I = End; I != Begin;) { 1561f842297dSMatthias Braun --I; 1562f842297dSMatthias Braun MachineInstr &MI = *I; 1563801bf7ebSShiva Chen if (MI.isDebugInstr()) 1564f842297dSMatthias Braun continue; 1565f842297dSMatthias Braun 1566f842297dSMatthias Braun SlotIndex instrIdx = getInstructionIndex(MI); 1567f842297dSMatthias Braun bool isStartValid = getInstructionFromIndex(LII->start); 1568f842297dSMatthias Braun bool isEndValid = getInstructionFromIndex(LII->end); 1569f842297dSMatthias Braun 1570f842297dSMatthias Braun // FIXME: This doesn't currently handle early-clobber or multiple removed 1571f842297dSMatthias Braun // defs inside of the region to repair. 1572f842297dSMatthias Braun for (MachineInstr::mop_iterator OI = MI.operands_begin(), 1573f842297dSMatthias Braun OE = MI.operands_end(); 1574f842297dSMatthias Braun OI != OE; ++OI) { 1575f842297dSMatthias Braun const MachineOperand &MO = *OI; 1576f842297dSMatthias Braun if (!MO.isReg() || MO.getReg() != Reg) 1577f842297dSMatthias Braun continue; 1578f842297dSMatthias Braun 1579f842297dSMatthias Braun unsigned SubReg = MO.getSubReg(); 1580f842297dSMatthias Braun LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg); 1581f842297dSMatthias Braun if ((Mask & LaneMask).none()) 1582f842297dSMatthias Braun continue; 1583f842297dSMatthias Braun 1584f842297dSMatthias Braun if (MO.isDef()) { 1585f842297dSMatthias Braun if (!isStartValid) { 1586f842297dSMatthias Braun if (LII->end.isDead()) { 1587f842297dSMatthias Braun SlotIndex prevStart; 1588f842297dSMatthias Braun if (LII != LR.begin()) 1589f842297dSMatthias Braun prevStart = std::prev(LII)->start; 1590f842297dSMatthias Braun 1591f842297dSMatthias Braun // FIXME: This could be more efficient if there was a 1592f842297dSMatthias Braun // removeSegment method that returned an iterator. 1593f842297dSMatthias Braun LR.removeSegment(*LII, true); 1594f842297dSMatthias Braun if (prevStart.isValid()) 1595f842297dSMatthias Braun LII = LR.find(prevStart); 1596f842297dSMatthias Braun else 1597f842297dSMatthias Braun LII = LR.begin(); 1598f842297dSMatthias Braun } else { 1599f842297dSMatthias Braun LII->start = instrIdx.getRegSlot(); 1600f842297dSMatthias Braun LII->valno->def = instrIdx.getRegSlot(); 1601f842297dSMatthias Braun if (MO.getSubReg() && !MO.isUndef()) 1602f842297dSMatthias Braun lastUseIdx = instrIdx.getRegSlot(); 1603f842297dSMatthias Braun else 1604f842297dSMatthias Braun lastUseIdx = SlotIndex(); 1605f842297dSMatthias Braun continue; 1606f842297dSMatthias Braun } 1607f842297dSMatthias Braun } 1608f842297dSMatthias Braun 1609f842297dSMatthias Braun if (!lastUseIdx.isValid()) { 1610f842297dSMatthias Braun VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator); 1611f842297dSMatthias Braun LiveRange::Segment S(instrIdx.getRegSlot(), 1612f842297dSMatthias Braun instrIdx.getDeadSlot(), VNI); 1613f842297dSMatthias Braun LII = LR.addSegment(S); 1614f842297dSMatthias Braun } else if (LII->start != instrIdx.getRegSlot()) { 1615f842297dSMatthias Braun VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator); 1616f842297dSMatthias Braun LiveRange::Segment S(instrIdx.getRegSlot(), lastUseIdx, VNI); 1617f842297dSMatthias Braun LII = LR.addSegment(S); 1618f842297dSMatthias Braun } 1619f842297dSMatthias Braun 1620f842297dSMatthias Braun if (MO.getSubReg() && !MO.isUndef()) 1621f842297dSMatthias Braun lastUseIdx = instrIdx.getRegSlot(); 1622f842297dSMatthias Braun else 1623f842297dSMatthias Braun lastUseIdx = SlotIndex(); 1624f842297dSMatthias Braun } else if (MO.isUse()) { 1625f842297dSMatthias Braun // FIXME: This should probably be handled outside of this branch, 1626f842297dSMatthias Braun // either as part of the def case (for defs inside of the region) or 1627f842297dSMatthias Braun // after the loop over the region. 1628f842297dSMatthias Braun if (!isEndValid && !LII->end.isBlock()) 1629f842297dSMatthias Braun LII->end = instrIdx.getRegSlot(); 1630f842297dSMatthias Braun if (!lastUseIdx.isValid()) 1631f842297dSMatthias Braun lastUseIdx = instrIdx.getRegSlot(); 1632f842297dSMatthias Braun } 1633f842297dSMatthias Braun } 1634f842297dSMatthias Braun } 1635f842297dSMatthias Braun } 1636f842297dSMatthias Braun 1637f842297dSMatthias Braun void 1638f842297dSMatthias Braun LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB, 1639f842297dSMatthias Braun MachineBasicBlock::iterator Begin, 1640f842297dSMatthias Braun MachineBasicBlock::iterator End, 1641ca0ace72SMatt Arsenault ArrayRef<Register> OrigRegs) { 1642f842297dSMatthias Braun // Find anchor points, which are at the beginning/end of blocks or at 1643f842297dSMatthias Braun // instructions that already have indexes. 1644f842297dSMatthias Braun while (Begin != MBB->begin() && !Indexes->hasIndex(*Begin)) 1645f842297dSMatthias Braun --Begin; 1646f842297dSMatthias Braun while (End != MBB->end() && !Indexes->hasIndex(*End)) 1647f842297dSMatthias Braun ++End; 1648f842297dSMatthias Braun 1649b68994bdSGaurav Jain SlotIndex EndIdx; 1650f842297dSMatthias Braun if (End == MBB->end()) 1651b68994bdSGaurav Jain EndIdx = getMBBEndIdx(MBB).getPrevSlot(); 1652f842297dSMatthias Braun else 1653b68994bdSGaurav Jain EndIdx = getInstructionIndex(*End); 1654f842297dSMatthias Braun 1655f842297dSMatthias Braun Indexes->repairIndexesInRange(MBB, Begin, End); 1656f842297dSMatthias Braun 1657f842297dSMatthias Braun for (MachineBasicBlock::iterator I = End; I != Begin;) { 1658f842297dSMatthias Braun --I; 1659f842297dSMatthias Braun MachineInstr &MI = *I; 1660801bf7ebSShiva Chen if (MI.isDebugInstr()) 1661f842297dSMatthias Braun continue; 1662f842297dSMatthias Braun for (MachineInstr::const_mop_iterator MOI = MI.operands_begin(), 1663f842297dSMatthias Braun MOE = MI.operands_end(); 1664f842297dSMatthias Braun MOI != MOE; ++MOI) { 16652bea69bfSDaniel Sanders if (MOI->isReg() && Register::isVirtualRegister(MOI->getReg()) && 1666f842297dSMatthias Braun !hasInterval(MOI->getReg())) { 1667f842297dSMatthias Braun createAndComputeVirtRegInterval(MOI->getReg()); 1668f842297dSMatthias Braun } 1669f842297dSMatthias Braun } 1670f842297dSMatthias Braun } 1671f842297dSMatthias Braun 1672ca0ace72SMatt Arsenault for (Register Reg : OrigRegs) { 1673ca0ace72SMatt Arsenault if (!Reg.isVirtual()) 1674f842297dSMatthias Braun continue; 1675f842297dSMatthias Braun 1676f842297dSMatthias Braun LiveInterval &LI = getInterval(Reg); 1677f842297dSMatthias Braun // FIXME: Should we support undefs that gain defs? 1678f842297dSMatthias Braun if (!LI.hasAtLeastOneValue()) 1679f842297dSMatthias Braun continue; 1680f842297dSMatthias Braun 1681f842297dSMatthias Braun for (LiveInterval::SubRange &S : LI.subranges()) 1682b68994bdSGaurav Jain repairOldRegInRange(Begin, End, EndIdx, S, Reg, S.LaneMask); 1683f842297dSMatthias Braun 1684b68994bdSGaurav Jain repairOldRegInRange(Begin, End, EndIdx, LI, Reg); 1685f842297dSMatthias Braun } 1686f842297dSMatthias Braun } 1687f842297dSMatthias Braun 16884cfc4025SMircea Trofin void LiveIntervals::removePhysRegDefAt(MCRegister Reg, SlotIndex Pos) { 1689f842297dSMatthias Braun for (MCRegUnitIterator Unit(Reg, TRI); Unit.isValid(); ++Unit) { 1690f842297dSMatthias Braun if (LiveRange *LR = getCachedRegUnit(*Unit)) 1691f842297dSMatthias Braun if (VNInfo *VNI = LR->getVNInfoAt(Pos)) 1692f842297dSMatthias Braun LR->removeValNo(VNI); 1693f842297dSMatthias Braun } 1694f842297dSMatthias Braun } 1695f842297dSMatthias Braun 1696f842297dSMatthias Braun void LiveIntervals::removeVRegDefAt(LiveInterval &LI, SlotIndex Pos) { 1697f842297dSMatthias Braun // LI may not have the main range computed yet, but its subranges may 1698f842297dSMatthias Braun // be present. 1699f842297dSMatthias Braun VNInfo *VNI = LI.getVNInfoAt(Pos); 1700f842297dSMatthias Braun if (VNI != nullptr) { 1701f842297dSMatthias Braun assert(VNI->def.getBaseIndex() == Pos.getBaseIndex()); 1702f842297dSMatthias Braun LI.removeValNo(VNI); 1703f842297dSMatthias Braun } 1704f842297dSMatthias Braun 1705f842297dSMatthias Braun // Also remove the value defined in subranges. 1706f842297dSMatthias Braun for (LiveInterval::SubRange &S : LI.subranges()) { 1707f842297dSMatthias Braun if (VNInfo *SVNI = S.getVNInfoAt(Pos)) 1708f842297dSMatthias Braun if (SVNI->def.getBaseIndex() == Pos.getBaseIndex()) 1709f842297dSMatthias Braun S.removeValNo(SVNI); 1710f842297dSMatthias Braun } 1711f842297dSMatthias Braun LI.removeEmptySubRanges(); 1712f842297dSMatthias Braun } 1713f842297dSMatthias Braun 1714f842297dSMatthias Braun void LiveIntervals::splitSeparateComponents(LiveInterval &LI, 1715f842297dSMatthias Braun SmallVectorImpl<LiveInterval*> &SplitLIs) { 1716f842297dSMatthias Braun ConnectedVNInfoEqClasses ConEQ(*this); 1717f842297dSMatthias Braun unsigned NumComp = ConEQ.Classify(LI); 1718f842297dSMatthias Braun if (NumComp <= 1) 1719f842297dSMatthias Braun return; 1720d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << " Split " << NumComp << " components: " << LI << '\n'); 1721b68994bdSGaurav Jain Register Reg = LI.reg(); 1722f842297dSMatthias Braun const TargetRegisterClass *RegClass = MRI->getRegClass(Reg); 1723f842297dSMatthias Braun for (unsigned I = 1; I < NumComp; ++I) { 17240c476111SDaniel Sanders Register NewVReg = MRI->createVirtualRegister(RegClass); 1725f842297dSMatthias Braun LiveInterval &NewLI = createEmptyInterval(NewVReg); 1726f842297dSMatthias Braun SplitLIs.push_back(&NewLI); 1727f842297dSMatthias Braun } 1728f842297dSMatthias Braun ConEQ.Distribute(LI, SplitLIs.data(), *MRI); 1729f842297dSMatthias Braun } 1730f842297dSMatthias Braun 1731f842297dSMatthias Braun void LiveIntervals::constructMainRangeFromSubranges(LiveInterval &LI) { 1732ea11f472SMarcello Maggioni assert(LICalc && "LICalc not initialized."); 1733ea11f472SMarcello Maggioni LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); 1734ea11f472SMarcello Maggioni LICalc->constructMainRangeFromSubranges(LI); 1735f842297dSMatthias Braun } 1736