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