1f842297dSMatthias Braun //===- LiveIntervals.cpp - Live Interval Analysis -------------------------===// 2f842297dSMatthias Braun // 3f842297dSMatthias Braun // The LLVM Compiler Infrastructure 4f842297dSMatthias Braun // 5f842297dSMatthias Braun // This file is distributed under the University of Illinois Open Source 6f842297dSMatthias Braun // License. See LICENSE.TXT for details. 7f842297dSMatthias Braun // 8f842297dSMatthias Braun //===----------------------------------------------------------------------===// 9f842297dSMatthias Braun // 10f842297dSMatthias Braun /// \file This file implements the LiveInterval analysis pass which is used 11f842297dSMatthias Braun /// by the Linear Scan Register allocator. This pass linearizes the 12f842297dSMatthias Braun /// basic blocks of the function in DFS order and computes live intervals for 13f842297dSMatthias Braun /// each virtual and physical register. 14f842297dSMatthias Braun // 15f842297dSMatthias Braun //===----------------------------------------------------------------------===// 16f842297dSMatthias Braun 17f842297dSMatthias Braun #include "llvm/CodeGen/LiveIntervals.h" 18f842297dSMatthias Braun #include "LiveRangeCalc.h" 19f842297dSMatthias Braun #include "llvm/ADT/ArrayRef.h" 20f842297dSMatthias Braun #include "llvm/ADT/DepthFirstIterator.h" 21f842297dSMatthias Braun #include "llvm/ADT/SmallPtrSet.h" 22f842297dSMatthias Braun #include "llvm/ADT/SmallVector.h" 23f842297dSMatthias Braun #include "llvm/ADT/iterator_range.h" 24f842297dSMatthias Braun #include "llvm/Analysis/AliasAnalysis.h" 25f842297dSMatthias Braun #include "llvm/CodeGen/LiveInterval.h" 26f842297dSMatthias Braun #include "llvm/CodeGen/LiveVariables.h" 27f842297dSMatthias Braun #include "llvm/CodeGen/MachineBasicBlock.h" 28f842297dSMatthias Braun #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" 29f842297dSMatthias Braun #include "llvm/CodeGen/MachineDominators.h" 30f842297dSMatthias Braun #include "llvm/CodeGen/MachineFunction.h" 31f842297dSMatthias Braun #include "llvm/CodeGen/MachineInstr.h" 32f842297dSMatthias Braun #include "llvm/CodeGen/MachineInstrBundle.h" 33f842297dSMatthias Braun #include "llvm/CodeGen/MachineOperand.h" 34f842297dSMatthias Braun #include "llvm/CodeGen/MachineRegisterInfo.h" 35f842297dSMatthias Braun #include "llvm/CodeGen/Passes.h" 36f842297dSMatthias Braun #include "llvm/CodeGen/SlotIndexes.h" 37f842297dSMatthias Braun #include "llvm/CodeGen/TargetRegisterInfo.h" 38f842297dSMatthias Braun #include "llvm/CodeGen/TargetSubtargetInfo.h" 39f842297dSMatthias Braun #include "llvm/CodeGen/VirtRegMap.h" 40432a3883SNico Weber #include "llvm/Config/llvm-config.h" 41f842297dSMatthias Braun #include "llvm/MC/LaneBitmask.h" 42f842297dSMatthias Braun #include "llvm/MC/MCRegisterInfo.h" 43f842297dSMatthias Braun #include "llvm/Pass.h" 44f842297dSMatthias Braun #include "llvm/Support/BlockFrequency.h" 45f842297dSMatthias Braun #include "llvm/Support/CommandLine.h" 46f842297dSMatthias Braun #include "llvm/Support/Compiler.h" 47f842297dSMatthias Braun #include "llvm/Support/Debug.h" 48f842297dSMatthias Braun #include "llvm/Support/MathExtras.h" 49f842297dSMatthias Braun #include "llvm/Support/raw_ostream.h" 50f842297dSMatthias Braun #include <algorithm> 51f842297dSMatthias Braun #include <cassert> 52f842297dSMatthias Braun #include <cstdint> 53f842297dSMatthias Braun #include <iterator> 54f842297dSMatthias Braun #include <tuple> 55f842297dSMatthias Braun #include <utility> 56f842297dSMatthias Braun 57f842297dSMatthias Braun using namespace llvm; 58f842297dSMatthias Braun 59f842297dSMatthias Braun #define DEBUG_TYPE "regalloc" 60f842297dSMatthias Braun 61f842297dSMatthias Braun char LiveIntervals::ID = 0; 62f842297dSMatthias Braun char &llvm::LiveIntervalsID = LiveIntervals::ID; 63f842297dSMatthias Braun INITIALIZE_PASS_BEGIN(LiveIntervals, "liveintervals", 64f842297dSMatthias Braun "Live Interval Analysis", false, false) 65f842297dSMatthias Braun INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) 66f842297dSMatthias Braun INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) 67f842297dSMatthias Braun INITIALIZE_PASS_DEPENDENCY(SlotIndexes) 68f842297dSMatthias Braun INITIALIZE_PASS_END(LiveIntervals, "liveintervals", 69f842297dSMatthias Braun "Live Interval Analysis", false, false) 70f842297dSMatthias Braun 71f842297dSMatthias Braun #ifndef NDEBUG 72f842297dSMatthias Braun static cl::opt<bool> EnablePrecomputePhysRegs( 73f842297dSMatthias Braun "precompute-phys-liveness", cl::Hidden, 74f842297dSMatthias Braun cl::desc("Eagerly compute live intervals for all physreg units.")); 75f842297dSMatthias Braun #else 76f842297dSMatthias Braun static bool EnablePrecomputePhysRegs = false; 77f842297dSMatthias Braun #endif // NDEBUG 78f842297dSMatthias Braun 79f842297dSMatthias Braun namespace llvm { 80f842297dSMatthias Braun 81f842297dSMatthias Braun cl::opt<bool> UseSegmentSetForPhysRegs( 82f842297dSMatthias Braun "use-segment-set-for-physregs", cl::Hidden, cl::init(true), 83f842297dSMatthias Braun cl::desc( 84f842297dSMatthias Braun "Use segment set for the computation of the live ranges of physregs.")); 85f842297dSMatthias Braun 86f842297dSMatthias Braun } // end namespace llvm 87f842297dSMatthias Braun 88f842297dSMatthias Braun void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const { 89f842297dSMatthias Braun AU.setPreservesCFG(); 90f842297dSMatthias Braun AU.addRequired<AAResultsWrapperPass>(); 91f842297dSMatthias Braun AU.addPreserved<AAResultsWrapperPass>(); 92f842297dSMatthias Braun AU.addPreserved<LiveVariables>(); 93f842297dSMatthias Braun AU.addPreservedID(MachineLoopInfoID); 94f842297dSMatthias Braun AU.addRequiredTransitiveID(MachineDominatorsID); 95f842297dSMatthias Braun AU.addPreservedID(MachineDominatorsID); 96f842297dSMatthias Braun AU.addPreserved<SlotIndexes>(); 97f842297dSMatthias Braun AU.addRequiredTransitive<SlotIndexes>(); 98f842297dSMatthias Braun MachineFunctionPass::getAnalysisUsage(AU); 99f842297dSMatthias Braun } 100f842297dSMatthias Braun 101f842297dSMatthias Braun LiveIntervals::LiveIntervals() : MachineFunctionPass(ID) { 102f842297dSMatthias Braun initializeLiveIntervalsPass(*PassRegistry::getPassRegistry()); 103f842297dSMatthias Braun } 104f842297dSMatthias Braun 105f842297dSMatthias Braun LiveIntervals::~LiveIntervals() { 106f842297dSMatthias Braun delete LRCalc; 107f842297dSMatthias Braun } 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) 112f842297dSMatthias Braun delete VirtRegIntervals[TargetRegisterInfo::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 135f842297dSMatthias Braun if (!LRCalc) 136f842297dSMatthias Braun LRCalc = new LiveRangeCalc(); 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 } 151f842297dSMatthias Braun 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) { 165f842297dSMatthias Braun unsigned Reg = TargetRegisterInfo::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 189f842297dSMatthias Braun LiveInterval* LiveIntervals::createInterval(unsigned reg) { 190f842297dSMatthias Braun float Weight = TargetRegisterInfo::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. 195f842297dSMatthias Braun void LiveIntervals::computeVirtRegInterval(LiveInterval &LI) { 196f842297dSMatthias Braun assert(LRCalc && "LRCalc not initialized."); 197f842297dSMatthias Braun assert(LI.empty() && "Should only compute empty intervals."); 198f842297dSMatthias Braun LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); 199f842297dSMatthias Braun LRCalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.reg)); 200f842297dSMatthias Braun computeDeadValues(LI, nullptr); 201f842297dSMatthias Braun } 202f842297dSMatthias Braun 203f842297dSMatthias Braun void LiveIntervals::computeVirtRegs() { 204f842297dSMatthias Braun for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) { 205f842297dSMatthias Braun unsigned Reg = TargetRegisterInfo::index2VirtReg(i); 206f842297dSMatthias Braun if (MRI->reg_nodbg_empty(Reg)) 207f842297dSMatthias Braun continue; 208f842297dSMatthias Braun createAndComputeVirtRegInterval(Reg); 209f842297dSMatthias Braun } 210f842297dSMatthias Braun } 211f842297dSMatthias Braun 212f842297dSMatthias Braun void LiveIntervals::computeRegMasks() { 213f842297dSMatthias Braun RegMaskBlocks.resize(MF->getNumBlockIDs()); 214f842297dSMatthias Braun 215f842297dSMatthias Braun // Find all instructions with regmask operands. 216f842297dSMatthias Braun for (const MachineBasicBlock &MBB : *MF) { 217f842297dSMatthias Braun std::pair<unsigned, unsigned> &RMB = RegMaskBlocks[MBB.getNumber()]; 218f842297dSMatthias Braun RMB.first = RegMaskSlots.size(); 219f842297dSMatthias Braun 220f842297dSMatthias Braun // Some block starts, such as EH funclets, create masks. 221f842297dSMatthias Braun if (const uint32_t *Mask = MBB.getBeginClobberMask(TRI)) { 222f842297dSMatthias Braun RegMaskSlots.push_back(Indexes->getMBBStartIdx(&MBB)); 223f842297dSMatthias Braun RegMaskBits.push_back(Mask); 224f842297dSMatthias Braun } 225f842297dSMatthias Braun 226f842297dSMatthias Braun for (const MachineInstr &MI : MBB) { 227f842297dSMatthias Braun for (const MachineOperand &MO : MI.operands()) { 228f842297dSMatthias Braun if (!MO.isRegMask()) 229f842297dSMatthias Braun continue; 230f842297dSMatthias Braun RegMaskSlots.push_back(Indexes->getInstructionIndex(MI).getRegSlot()); 231f842297dSMatthias Braun RegMaskBits.push_back(MO.getRegMask()); 232f842297dSMatthias Braun } 233f842297dSMatthias Braun } 234f842297dSMatthias Braun 235f842297dSMatthias Braun // Some block ends, such as funclet returns, create masks. Put the mask on 236f842297dSMatthias Braun // the last instruction of the block, because MBB slot index intervals are 237f842297dSMatthias Braun // half-open. 238f842297dSMatthias Braun if (const uint32_t *Mask = MBB.getEndClobberMask(TRI)) { 239f842297dSMatthias Braun assert(!MBB.empty() && "empty return block?"); 240f842297dSMatthias Braun RegMaskSlots.push_back( 241f842297dSMatthias Braun Indexes->getInstructionIndex(MBB.back()).getRegSlot()); 242f842297dSMatthias Braun RegMaskBits.push_back(Mask); 243f842297dSMatthias Braun } 244f842297dSMatthias Braun 245f842297dSMatthias Braun // Compute the number of register mask instructions in this block. 246f842297dSMatthias Braun RMB.second = RegMaskSlots.size() - RMB.first; 247f842297dSMatthias Braun } 248f842297dSMatthias Braun } 249f842297dSMatthias Braun 250f842297dSMatthias Braun //===----------------------------------------------------------------------===// 251f842297dSMatthias Braun // Register Unit Liveness 252f842297dSMatthias Braun //===----------------------------------------------------------------------===// 253f842297dSMatthias Braun // 254f842297dSMatthias Braun // Fixed interference typically comes from ABI boundaries: Function arguments 255f842297dSMatthias Braun // and return values are passed in fixed registers, and so are exception 256f842297dSMatthias Braun // pointers entering landing pads. Certain instructions require values to be 257f842297dSMatthias Braun // present in specific registers. That is also represented through fixed 258f842297dSMatthias Braun // interference. 259f842297dSMatthias Braun // 260f842297dSMatthias Braun 261f842297dSMatthias Braun /// Compute the live range of a register unit, based on the uses and defs of 262f842297dSMatthias Braun /// aliasing registers. The range should be empty, or contain only dead 263f842297dSMatthias Braun /// phi-defs from ABI blocks. 264f842297dSMatthias Braun void LiveIntervals::computeRegUnitRange(LiveRange &LR, unsigned Unit) { 265f842297dSMatthias Braun assert(LRCalc && "LRCalc not initialized."); 266f842297dSMatthias Braun LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); 267f842297dSMatthias Braun 268f842297dSMatthias Braun // The physregs aliasing Unit are the roots and their super-registers. 269f842297dSMatthias Braun // Create all values as dead defs before extending to uses. Note that roots 270f842297dSMatthias Braun // may share super-registers. That's OK because createDeadDefs() is 271f842297dSMatthias Braun // idempotent. It is very rare for a register unit to have multiple roots, so 272f842297dSMatthias Braun // uniquing super-registers is probably not worthwhile. 273f842297dSMatthias Braun bool IsReserved = false; 274f842297dSMatthias Braun for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) { 275f842297dSMatthias Braun bool IsRootReserved = true; 276f842297dSMatthias Braun for (MCSuperRegIterator Super(*Root, TRI, /*IncludeSelf=*/true); 277f842297dSMatthias Braun Super.isValid(); ++Super) { 278f842297dSMatthias Braun unsigned Reg = *Super; 279f842297dSMatthias Braun if (!MRI->reg_empty(Reg)) 280f842297dSMatthias Braun LRCalc->createDeadDefs(LR, Reg); 281f842297dSMatthias Braun // A register unit is considered reserved if all its roots and all their 282f842297dSMatthias Braun // super registers are reserved. 283f842297dSMatthias Braun if (!MRI->isReserved(Reg)) 284f842297dSMatthias Braun IsRootReserved = false; 285f842297dSMatthias Braun } 286f842297dSMatthias Braun IsReserved |= IsRootReserved; 287f842297dSMatthias Braun } 288f842297dSMatthias Braun assert(IsReserved == MRI->isReservedRegUnit(Unit) && 289f842297dSMatthias Braun "reserved computation mismatch"); 290f842297dSMatthias Braun 291f842297dSMatthias Braun // Now extend LR to reach all uses. 292f842297dSMatthias Braun // Ignore uses of reserved registers. We only track defs of those. 293f842297dSMatthias Braun if (!IsReserved) { 294f842297dSMatthias Braun for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) { 295f842297dSMatthias Braun for (MCSuperRegIterator Super(*Root, TRI, /*IncludeSelf=*/true); 296f842297dSMatthias Braun Super.isValid(); ++Super) { 297f842297dSMatthias Braun unsigned Reg = *Super; 298f842297dSMatthias Braun if (!MRI->reg_empty(Reg)) 299f842297dSMatthias Braun LRCalc->extendToUses(LR, Reg); 300f842297dSMatthias Braun } 301f842297dSMatthias Braun } 302f842297dSMatthias Braun } 303f842297dSMatthias Braun 304f842297dSMatthias Braun // Flush the segment set to the segment vector. 305f842297dSMatthias Braun if (UseSegmentSetForPhysRegs) 306f842297dSMatthias Braun LR.flushSegmentSet(); 307f842297dSMatthias Braun } 308f842297dSMatthias Braun 309f842297dSMatthias Braun /// Precompute the live ranges of any register units that are live-in to an ABI 310f842297dSMatthias Braun /// block somewhere. Register values can appear without a corresponding def when 311f842297dSMatthias Braun /// entering the entry block or a landing pad. 312f842297dSMatthias Braun void LiveIntervals::computeLiveInRegUnits() { 313f842297dSMatthias Braun RegUnitRanges.resize(TRI->getNumRegUnits()); 314f842297dSMatthias Braun DEBUG(dbgs() << "Computing live-in reg-units in ABI blocks.\n"); 315f842297dSMatthias Braun 316f842297dSMatthias Braun // Keep track of the live range sets allocated. 317f842297dSMatthias Braun SmallVector<unsigned, 8> NewRanges; 318f842297dSMatthias Braun 319f842297dSMatthias Braun // Check all basic blocks for live-ins. 320f842297dSMatthias Braun for (const MachineBasicBlock &MBB : *MF) { 321f842297dSMatthias Braun // We only care about ABI blocks: Entry + landing pads. 322f842297dSMatthias Braun if ((&MBB != &MF->front() && !MBB.isEHPad()) || MBB.livein_empty()) 323f842297dSMatthias Braun continue; 324f842297dSMatthias Braun 325f842297dSMatthias Braun // Create phi-defs at Begin for all live-in registers. 326f842297dSMatthias Braun SlotIndex Begin = Indexes->getMBBStartIdx(&MBB); 327f842297dSMatthias Braun DEBUG(dbgs() << Begin << "\t" << printMBBReference(MBB)); 328f842297dSMatthias Braun for (const auto &LI : MBB.liveins()) { 329f842297dSMatthias Braun for (MCRegUnitIterator Units(LI.PhysReg, TRI); Units.isValid(); ++Units) { 330f842297dSMatthias Braun unsigned Unit = *Units; 331f842297dSMatthias Braun LiveRange *LR = RegUnitRanges[Unit]; 332f842297dSMatthias Braun if (!LR) { 333f842297dSMatthias Braun // Use segment set to speed-up initial computation of the live range. 334f842297dSMatthias Braun LR = RegUnitRanges[Unit] = new LiveRange(UseSegmentSetForPhysRegs); 335f842297dSMatthias Braun NewRanges.push_back(Unit); 336f842297dSMatthias Braun } 337f842297dSMatthias Braun VNInfo *VNI = LR->createDeadDef(Begin, getVNInfoAllocator()); 338f842297dSMatthias Braun (void)VNI; 339f842297dSMatthias Braun DEBUG(dbgs() << ' ' << printRegUnit(Unit, TRI) << '#' << VNI->id); 340f842297dSMatthias Braun } 341f842297dSMatthias Braun } 342f842297dSMatthias Braun DEBUG(dbgs() << '\n'); 343f842297dSMatthias Braun } 344f842297dSMatthias Braun DEBUG(dbgs() << "Created " << NewRanges.size() << " new intervals.\n"); 345f842297dSMatthias Braun 346f842297dSMatthias Braun // Compute the 'normal' part of the ranges. 347f842297dSMatthias Braun for (unsigned Unit : NewRanges) 348f842297dSMatthias Braun computeRegUnitRange(*RegUnitRanges[Unit], Unit); 349f842297dSMatthias Braun } 350f842297dSMatthias Braun 351f842297dSMatthias Braun static void createSegmentsForValues(LiveRange &LR, 352f842297dSMatthias Braun iterator_range<LiveInterval::vni_iterator> VNIs) { 353f842297dSMatthias Braun for (VNInfo *VNI : VNIs) { 354f842297dSMatthias Braun if (VNI->isUnused()) 355f842297dSMatthias Braun continue; 356f842297dSMatthias Braun SlotIndex Def = VNI->def; 357f842297dSMatthias Braun LR.addSegment(LiveRange::Segment(Def, Def.getDeadSlot(), VNI)); 358f842297dSMatthias Braun } 359f842297dSMatthias Braun } 360f842297dSMatthias Braun 361f842297dSMatthias Braun using ShrinkToUsesWorkList = SmallVector<std::pair<SlotIndex, VNInfo*>, 16>; 362f842297dSMatthias Braun 363f842297dSMatthias Braun static void extendSegmentsToUses(LiveRange &LR, const SlotIndexes &Indexes, 364f842297dSMatthias Braun ShrinkToUsesWorkList &WorkList, 365f842297dSMatthias Braun const LiveRange &OldRange) { 366f842297dSMatthias Braun // Keep track of the PHIs that are in use. 367f842297dSMatthias Braun SmallPtrSet<VNInfo*, 8> UsedPHIs; 368f842297dSMatthias Braun // Blocks that have already been added to WorkList as live-out. 369f842297dSMatthias Braun SmallPtrSet<const MachineBasicBlock*, 16> LiveOut; 370f842297dSMatthias Braun 371f842297dSMatthias Braun // Extend intervals to reach all uses in WorkList. 372f842297dSMatthias Braun while (!WorkList.empty()) { 373f842297dSMatthias Braun SlotIndex Idx = WorkList.back().first; 374f842297dSMatthias Braun VNInfo *VNI = WorkList.back().second; 375f842297dSMatthias Braun WorkList.pop_back(); 376f842297dSMatthias Braun const MachineBasicBlock *MBB = Indexes.getMBBFromIndex(Idx.getPrevSlot()); 377f842297dSMatthias Braun SlotIndex BlockStart = Indexes.getMBBStartIdx(MBB); 378f842297dSMatthias Braun 379f842297dSMatthias Braun // Extend the live range for VNI to be live at Idx. 380f842297dSMatthias Braun if (VNInfo *ExtVNI = LR.extendInBlock(BlockStart, Idx)) { 381f842297dSMatthias Braun assert(ExtVNI == VNI && "Unexpected existing value number"); 382f842297dSMatthias Braun (void)ExtVNI; 383f842297dSMatthias Braun // Is this a PHIDef we haven't seen before? 384f842297dSMatthias Braun if (!VNI->isPHIDef() || VNI->def != BlockStart || 385f842297dSMatthias Braun !UsedPHIs.insert(VNI).second) 386f842297dSMatthias Braun continue; 387f842297dSMatthias Braun // The PHI is live, make sure the predecessors are live-out. 388f842297dSMatthias Braun for (const MachineBasicBlock *Pred : MBB->predecessors()) { 389f842297dSMatthias Braun if (!LiveOut.insert(Pred).second) 390f842297dSMatthias Braun continue; 391f842297dSMatthias Braun SlotIndex Stop = Indexes.getMBBEndIdx(Pred); 392f842297dSMatthias Braun // A predecessor is not required to have a live-out value for a PHI. 393f842297dSMatthias Braun if (VNInfo *PVNI = OldRange.getVNInfoBefore(Stop)) 394f842297dSMatthias Braun WorkList.push_back(std::make_pair(Stop, PVNI)); 395f842297dSMatthias Braun } 396f842297dSMatthias Braun continue; 397f842297dSMatthias Braun } 398f842297dSMatthias Braun 399f842297dSMatthias Braun // VNI is live-in to MBB. 400f842297dSMatthias Braun DEBUG(dbgs() << " live-in at " << BlockStart << '\n'); 401f842297dSMatthias Braun LR.addSegment(LiveRange::Segment(BlockStart, Idx, VNI)); 402f842297dSMatthias Braun 403f842297dSMatthias Braun // Make sure VNI is live-out from the predecessors. 404f842297dSMatthias Braun for (const MachineBasicBlock *Pred : MBB->predecessors()) { 405f842297dSMatthias Braun if (!LiveOut.insert(Pred).second) 406f842297dSMatthias Braun continue; 407f842297dSMatthias Braun SlotIndex Stop = Indexes.getMBBEndIdx(Pred); 408f842297dSMatthias Braun assert(OldRange.getVNInfoBefore(Stop) == VNI && 409f842297dSMatthias Braun "Wrong value out of predecessor"); 410f842297dSMatthias Braun WorkList.push_back(std::make_pair(Stop, VNI)); 411f842297dSMatthias Braun } 412f842297dSMatthias Braun } 413f842297dSMatthias Braun } 414f842297dSMatthias Braun 415f842297dSMatthias Braun bool LiveIntervals::shrinkToUses(LiveInterval *li, 416f842297dSMatthias Braun SmallVectorImpl<MachineInstr*> *dead) { 417f842297dSMatthias Braun DEBUG(dbgs() << "Shrink: " << *li << '\n'); 418f842297dSMatthias Braun assert(TargetRegisterInfo::isVirtualRegister(li->reg) 419f842297dSMatthias Braun && "Can only shrink virtual registers"); 420f842297dSMatthias Braun 421f842297dSMatthias Braun // Shrink subregister live ranges. 422f842297dSMatthias Braun bool NeedsCleanup = false; 423f842297dSMatthias Braun for (LiveInterval::SubRange &S : li->subranges()) { 424f842297dSMatthias Braun shrinkToUses(S, li->reg); 425f842297dSMatthias Braun if (S.empty()) 426f842297dSMatthias Braun NeedsCleanup = true; 427f842297dSMatthias Braun } 428f842297dSMatthias Braun if (NeedsCleanup) 429f842297dSMatthias Braun li->removeEmptySubRanges(); 430f842297dSMatthias Braun 431f842297dSMatthias Braun // Find all the values used, including PHI kills. 432f842297dSMatthias Braun ShrinkToUsesWorkList WorkList; 433f842297dSMatthias Braun 434f842297dSMatthias Braun // Visit all instructions reading li->reg. 435f842297dSMatthias Braun unsigned Reg = li->reg; 436f842297dSMatthias Braun for (MachineInstr &UseMI : MRI->reg_instructions(Reg)) { 437f842297dSMatthias Braun if (UseMI.isDebugValue() || !UseMI.readsVirtualRegister(Reg)) 438f842297dSMatthias Braun continue; 439f842297dSMatthias Braun SlotIndex Idx = getInstructionIndex(UseMI).getRegSlot(); 440f842297dSMatthias Braun LiveQueryResult LRQ = li->Query(Idx); 441f842297dSMatthias Braun VNInfo *VNI = LRQ.valueIn(); 442f842297dSMatthias Braun if (!VNI) { 443f842297dSMatthias Braun // This shouldn't happen: readsVirtualRegister returns true, but there is 444f842297dSMatthias Braun // no live value. It is likely caused by a target getting <undef> flags 445f842297dSMatthias Braun // wrong. 446f842297dSMatthias Braun DEBUG(dbgs() << Idx << '\t' << UseMI 447f842297dSMatthias Braun << "Warning: Instr claims to read non-existent value in " 448f842297dSMatthias Braun << *li << '\n'); 449f842297dSMatthias Braun continue; 450f842297dSMatthias Braun } 451f842297dSMatthias Braun // Special case: An early-clobber tied operand reads and writes the 452f842297dSMatthias Braun // register one slot early. 453f842297dSMatthias Braun if (VNInfo *DefVNI = LRQ.valueDefined()) 454f842297dSMatthias Braun Idx = DefVNI->def; 455f842297dSMatthias Braun 456f842297dSMatthias Braun WorkList.push_back(std::make_pair(Idx, VNI)); 457f842297dSMatthias Braun } 458f842297dSMatthias Braun 459f842297dSMatthias Braun // Create new live ranges with only minimal live segments per def. 460f842297dSMatthias Braun LiveRange NewLR; 461f842297dSMatthias Braun createSegmentsForValues(NewLR, make_range(li->vni_begin(), li->vni_end())); 462f842297dSMatthias Braun extendSegmentsToUses(NewLR, *Indexes, WorkList, *li); 463f842297dSMatthias Braun 464f842297dSMatthias Braun // Move the trimmed segments back. 465f842297dSMatthias Braun li->segments.swap(NewLR.segments); 466f842297dSMatthias Braun 467f842297dSMatthias Braun // Handle dead values. 468f842297dSMatthias Braun bool CanSeparate = computeDeadValues(*li, dead); 469f842297dSMatthias Braun DEBUG(dbgs() << "Shrunk: " << *li << '\n'); 470f842297dSMatthias Braun return CanSeparate; 471f842297dSMatthias Braun } 472f842297dSMatthias Braun 473f842297dSMatthias Braun bool LiveIntervals::computeDeadValues(LiveInterval &LI, 474f842297dSMatthias Braun SmallVectorImpl<MachineInstr*> *dead) { 475f842297dSMatthias Braun bool MayHaveSplitComponents = false; 476f842297dSMatthias Braun for (VNInfo *VNI : LI.valnos) { 477f842297dSMatthias Braun if (VNI->isUnused()) 478f842297dSMatthias Braun continue; 479f842297dSMatthias Braun SlotIndex Def = VNI->def; 480f842297dSMatthias Braun LiveRange::iterator I = LI.FindSegmentContaining(Def); 481f842297dSMatthias Braun assert(I != LI.end() && "Missing segment for VNI"); 482f842297dSMatthias Braun 483f842297dSMatthias Braun // Is the register live before? Otherwise we may have to add a read-undef 484f842297dSMatthias Braun // flag for subregister defs. 485f842297dSMatthias Braun unsigned VReg = LI.reg; 486f842297dSMatthias Braun if (MRI->shouldTrackSubRegLiveness(VReg)) { 487f842297dSMatthias Braun if ((I == LI.begin() || std::prev(I)->end < Def) && !VNI->isPHIDef()) { 488f842297dSMatthias Braun MachineInstr *MI = getInstructionFromIndex(Def); 489f842297dSMatthias Braun MI->setRegisterDefReadUndef(VReg); 490f842297dSMatthias Braun } 491f842297dSMatthias Braun } 492f842297dSMatthias Braun 493f842297dSMatthias Braun if (I->end != Def.getDeadSlot()) 494f842297dSMatthias Braun continue; 495f842297dSMatthias Braun if (VNI->isPHIDef()) { 496f842297dSMatthias Braun // This is a dead PHI. Remove it. 497f842297dSMatthias Braun VNI->markUnused(); 498f842297dSMatthias Braun LI.removeSegment(I); 499f842297dSMatthias Braun DEBUG(dbgs() << "Dead PHI at " << Def << " may separate interval\n"); 500f842297dSMatthias Braun MayHaveSplitComponents = true; 501f842297dSMatthias Braun } else { 502f842297dSMatthias Braun // This is a dead def. Make sure the instruction knows. 503f842297dSMatthias Braun MachineInstr *MI = getInstructionFromIndex(Def); 504f842297dSMatthias Braun assert(MI && "No instruction defining live value"); 505f842297dSMatthias Braun MI->addRegisterDead(LI.reg, TRI); 506f842297dSMatthias Braun if (dead && MI->allDefsAreDead()) { 507f842297dSMatthias Braun DEBUG(dbgs() << "All defs dead: " << Def << '\t' << *MI); 508f842297dSMatthias Braun dead->push_back(MI); 509f842297dSMatthias Braun } 510f842297dSMatthias Braun } 511f842297dSMatthias Braun } 512f842297dSMatthias Braun return MayHaveSplitComponents; 513f842297dSMatthias Braun } 514f842297dSMatthias Braun 515f842297dSMatthias Braun void LiveIntervals::shrinkToUses(LiveInterval::SubRange &SR, unsigned Reg) { 516f842297dSMatthias Braun DEBUG(dbgs() << "Shrink: " << SR << '\n'); 517f842297dSMatthias Braun assert(TargetRegisterInfo::isVirtualRegister(Reg) 518f842297dSMatthias Braun && "Can only shrink virtual registers"); 519f842297dSMatthias Braun // Find all the values used, including PHI kills. 520f842297dSMatthias Braun ShrinkToUsesWorkList WorkList; 521f842297dSMatthias Braun 522f842297dSMatthias Braun // Visit all instructions reading Reg. 523f842297dSMatthias Braun SlotIndex LastIdx; 524f842297dSMatthias Braun for (MachineOperand &MO : MRI->use_nodbg_operands(Reg)) { 525f842297dSMatthias Braun // Skip "undef" uses. 526f842297dSMatthias Braun if (!MO.readsReg()) 527f842297dSMatthias Braun continue; 528f842297dSMatthias Braun // Maybe the operand is for a subregister we don't care about. 529f842297dSMatthias Braun unsigned SubReg = MO.getSubReg(); 530f842297dSMatthias Braun if (SubReg != 0) { 531f842297dSMatthias Braun LaneBitmask LaneMask = TRI->getSubRegIndexLaneMask(SubReg); 532f842297dSMatthias Braun if ((LaneMask & SR.LaneMask).none()) 533f842297dSMatthias Braun continue; 534f842297dSMatthias Braun } 535f842297dSMatthias Braun // We only need to visit each instruction once. 536f842297dSMatthias Braun MachineInstr *UseMI = MO.getParent(); 537f842297dSMatthias Braun SlotIndex Idx = getInstructionIndex(*UseMI).getRegSlot(); 538f842297dSMatthias Braun if (Idx == LastIdx) 539f842297dSMatthias Braun continue; 540f842297dSMatthias Braun LastIdx = Idx; 541f842297dSMatthias Braun 542f842297dSMatthias Braun LiveQueryResult LRQ = SR.Query(Idx); 543f842297dSMatthias Braun VNInfo *VNI = LRQ.valueIn(); 544f842297dSMatthias Braun // For Subranges it is possible that only undef values are left in that 545f842297dSMatthias Braun // part of the subregister, so there is no real liverange at the use 546f842297dSMatthias Braun if (!VNI) 547f842297dSMatthias Braun continue; 548f842297dSMatthias Braun 549f842297dSMatthias Braun // Special case: An early-clobber tied operand reads and writes the 550f842297dSMatthias Braun // register one slot early. 551f842297dSMatthias Braun if (VNInfo *DefVNI = LRQ.valueDefined()) 552f842297dSMatthias Braun Idx = DefVNI->def; 553f842297dSMatthias Braun 554f842297dSMatthias Braun WorkList.push_back(std::make_pair(Idx, VNI)); 555f842297dSMatthias Braun } 556f842297dSMatthias Braun 557f842297dSMatthias Braun // Create a new live ranges with only minimal live segments per def. 558f842297dSMatthias Braun LiveRange NewLR; 559f842297dSMatthias Braun createSegmentsForValues(NewLR, make_range(SR.vni_begin(), SR.vni_end())); 560f842297dSMatthias Braun extendSegmentsToUses(NewLR, *Indexes, WorkList, SR); 561f842297dSMatthias Braun 562f842297dSMatthias Braun // Move the trimmed ranges back. 563f842297dSMatthias Braun SR.segments.swap(NewLR.segments); 564f842297dSMatthias Braun 565f842297dSMatthias Braun // Remove dead PHI value numbers 566f842297dSMatthias Braun for (VNInfo *VNI : SR.valnos) { 567f842297dSMatthias Braun if (VNI->isUnused()) 568f842297dSMatthias Braun continue; 569f842297dSMatthias Braun const LiveRange::Segment *Segment = SR.getSegmentContaining(VNI->def); 570f842297dSMatthias Braun assert(Segment != nullptr && "Missing segment for VNI"); 571f842297dSMatthias Braun if (Segment->end != VNI->def.getDeadSlot()) 572f842297dSMatthias Braun continue; 573f842297dSMatthias Braun if (VNI->isPHIDef()) { 574f842297dSMatthias Braun // This is a dead PHI. Remove it. 575f842297dSMatthias Braun DEBUG(dbgs() << "Dead PHI at " << VNI->def << " may separate interval\n"); 576f842297dSMatthias Braun VNI->markUnused(); 577f842297dSMatthias Braun SR.removeSegment(*Segment); 578f842297dSMatthias Braun } 579f842297dSMatthias Braun } 580f842297dSMatthias Braun 581f842297dSMatthias Braun DEBUG(dbgs() << "Shrunk: " << SR << '\n'); 582f842297dSMatthias Braun } 583f842297dSMatthias Braun 584f842297dSMatthias Braun void LiveIntervals::extendToIndices(LiveRange &LR, 585f842297dSMatthias Braun ArrayRef<SlotIndex> Indices, 586f842297dSMatthias Braun ArrayRef<SlotIndex> Undefs) { 587f842297dSMatthias Braun assert(LRCalc && "LRCalc not initialized."); 588f842297dSMatthias Braun LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); 589f842297dSMatthias Braun for (SlotIndex Idx : Indices) 590f842297dSMatthias Braun LRCalc->extend(LR, Idx, /*PhysReg=*/0, Undefs); 591f842297dSMatthias Braun } 592f842297dSMatthias Braun 593f842297dSMatthias Braun void LiveIntervals::pruneValue(LiveRange &LR, SlotIndex Kill, 594f842297dSMatthias Braun SmallVectorImpl<SlotIndex> *EndPoints) { 595f842297dSMatthias Braun LiveQueryResult LRQ = LR.Query(Kill); 596f842297dSMatthias Braun VNInfo *VNI = LRQ.valueOutOrDead(); 597f842297dSMatthias Braun if (!VNI) 598f842297dSMatthias Braun return; 599f842297dSMatthias Braun 600f842297dSMatthias Braun MachineBasicBlock *KillMBB = Indexes->getMBBFromIndex(Kill); 601f842297dSMatthias Braun SlotIndex MBBEnd = Indexes->getMBBEndIdx(KillMBB); 602f842297dSMatthias Braun 603f842297dSMatthias Braun // If VNI isn't live out from KillMBB, the value is trivially pruned. 604f842297dSMatthias Braun if (LRQ.endPoint() < MBBEnd) { 605f842297dSMatthias Braun LR.removeSegment(Kill, LRQ.endPoint()); 606f842297dSMatthias Braun if (EndPoints) EndPoints->push_back(LRQ.endPoint()); 607f842297dSMatthias Braun return; 608f842297dSMatthias Braun } 609f842297dSMatthias Braun 610f842297dSMatthias Braun // VNI is live out of KillMBB. 611f842297dSMatthias Braun LR.removeSegment(Kill, MBBEnd); 612f842297dSMatthias Braun if (EndPoints) EndPoints->push_back(MBBEnd); 613f842297dSMatthias Braun 614f842297dSMatthias Braun // Find all blocks that are reachable from KillMBB without leaving VNI's live 615f842297dSMatthias Braun // range. It is possible that KillMBB itself is reachable, so start a DFS 616f842297dSMatthias Braun // from each successor. 617f842297dSMatthias Braun using VisitedTy = df_iterator_default_set<MachineBasicBlock*,9>; 618f842297dSMatthias Braun VisitedTy Visited; 619f842297dSMatthias Braun for (MachineBasicBlock *Succ : KillMBB->successors()) { 620f842297dSMatthias Braun for (df_ext_iterator<MachineBasicBlock*, VisitedTy> 621f842297dSMatthias Braun I = df_ext_begin(Succ, Visited), E = df_ext_end(Succ, Visited); 622f842297dSMatthias Braun I != E;) { 623f842297dSMatthias Braun MachineBasicBlock *MBB = *I; 624f842297dSMatthias Braun 625f842297dSMatthias Braun // Check if VNI is live in to MBB. 626f842297dSMatthias Braun SlotIndex MBBStart, MBBEnd; 627f842297dSMatthias Braun std::tie(MBBStart, MBBEnd) = Indexes->getMBBRange(MBB); 628f842297dSMatthias Braun LiveQueryResult LRQ = LR.Query(MBBStart); 629f842297dSMatthias Braun if (LRQ.valueIn() != VNI) { 630f842297dSMatthias Braun // This block isn't part of the VNI segment. Prune the search. 631f842297dSMatthias Braun I.skipChildren(); 632f842297dSMatthias Braun continue; 633f842297dSMatthias Braun } 634f842297dSMatthias Braun 635f842297dSMatthias Braun // Prune the search if VNI is killed in MBB. 636f842297dSMatthias Braun if (LRQ.endPoint() < MBBEnd) { 637f842297dSMatthias Braun LR.removeSegment(MBBStart, LRQ.endPoint()); 638f842297dSMatthias Braun if (EndPoints) EndPoints->push_back(LRQ.endPoint()); 639f842297dSMatthias Braun I.skipChildren(); 640f842297dSMatthias Braun continue; 641f842297dSMatthias Braun } 642f842297dSMatthias Braun 643f842297dSMatthias Braun // VNI is live through MBB. 644f842297dSMatthias Braun LR.removeSegment(MBBStart, MBBEnd); 645f842297dSMatthias Braun if (EndPoints) EndPoints->push_back(MBBEnd); 646f842297dSMatthias Braun ++I; 647f842297dSMatthias Braun } 648f842297dSMatthias Braun } 649f842297dSMatthias Braun } 650f842297dSMatthias Braun 651f842297dSMatthias Braun //===----------------------------------------------------------------------===// 652f842297dSMatthias Braun // Register allocator hooks. 653f842297dSMatthias Braun // 654f842297dSMatthias Braun 655f842297dSMatthias Braun void LiveIntervals::addKillFlags(const VirtRegMap *VRM) { 656f842297dSMatthias Braun // Keep track of regunit ranges. 657f842297dSMatthias Braun SmallVector<std::pair<const LiveRange*, LiveRange::const_iterator>, 8> RU; 658f842297dSMatthias Braun // Keep track of subregister ranges. 659f842297dSMatthias Braun SmallVector<std::pair<const LiveInterval::SubRange*, 660f842297dSMatthias Braun LiveRange::const_iterator>, 4> SRs; 661f842297dSMatthias Braun 662f842297dSMatthias Braun for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) { 663f842297dSMatthias Braun unsigned Reg = TargetRegisterInfo::index2VirtReg(i); 664f842297dSMatthias Braun if (MRI->reg_nodbg_empty(Reg)) 665f842297dSMatthias Braun continue; 666f842297dSMatthias Braun const LiveInterval &LI = getInterval(Reg); 667f842297dSMatthias Braun if (LI.empty()) 668f842297dSMatthias Braun continue; 669f842297dSMatthias Braun 670f842297dSMatthias Braun // Find the regunit intervals for the assigned register. They may overlap 671f842297dSMatthias Braun // the virtual register live range, cancelling any kills. 672f842297dSMatthias Braun RU.clear(); 673f842297dSMatthias Braun for (MCRegUnitIterator Unit(VRM->getPhys(Reg), TRI); Unit.isValid(); 674f842297dSMatthias Braun ++Unit) { 675f842297dSMatthias Braun const LiveRange &RURange = getRegUnit(*Unit); 676f842297dSMatthias Braun if (RURange.empty()) 677f842297dSMatthias Braun continue; 678f842297dSMatthias Braun RU.push_back(std::make_pair(&RURange, RURange.find(LI.begin()->end))); 679f842297dSMatthias Braun } 680f842297dSMatthias Braun 681f842297dSMatthias Braun if (MRI->subRegLivenessEnabled()) { 682f842297dSMatthias Braun SRs.clear(); 683f842297dSMatthias Braun for (const LiveInterval::SubRange &SR : LI.subranges()) { 684f842297dSMatthias Braun SRs.push_back(std::make_pair(&SR, SR.find(LI.begin()->end))); 685f842297dSMatthias Braun } 686f842297dSMatthias Braun } 687f842297dSMatthias Braun 688f842297dSMatthias Braun // Every instruction that kills Reg corresponds to a segment range end 689f842297dSMatthias Braun // point. 690f842297dSMatthias Braun for (LiveInterval::const_iterator RI = LI.begin(), RE = LI.end(); RI != RE; 691f842297dSMatthias Braun ++RI) { 692f842297dSMatthias Braun // A block index indicates an MBB edge. 693f842297dSMatthias Braun if (RI->end.isBlock()) 694f842297dSMatthias Braun continue; 695f842297dSMatthias Braun MachineInstr *MI = getInstructionFromIndex(RI->end); 696f842297dSMatthias Braun if (!MI) 697f842297dSMatthias Braun continue; 698f842297dSMatthias Braun 699f842297dSMatthias Braun // Check if any of the regunits are live beyond the end of RI. That could 700f842297dSMatthias Braun // happen when a physreg is defined as a copy of a virtreg: 701f842297dSMatthias Braun // 702f842297dSMatthias Braun // %eax = COPY %5 703f842297dSMatthias Braun // FOO %5 <--- MI, cancel kill because %eax is live. 704f842297dSMatthias Braun // BAR killed %eax 705f842297dSMatthias Braun // 706f842297dSMatthias Braun // There should be no kill flag on FOO when %5 is rewritten as %eax. 707f842297dSMatthias Braun for (auto &RUP : RU) { 708f842297dSMatthias Braun const LiveRange &RURange = *RUP.first; 709f842297dSMatthias Braun LiveRange::const_iterator &I = RUP.second; 710f842297dSMatthias Braun if (I == RURange.end()) 711f842297dSMatthias Braun continue; 712f842297dSMatthias Braun I = RURange.advanceTo(I, RI->end); 713f842297dSMatthias Braun if (I == RURange.end() || I->start >= RI->end) 714f842297dSMatthias Braun continue; 715f842297dSMatthias Braun // I is overlapping RI. 716f842297dSMatthias Braun goto CancelKill; 717f842297dSMatthias Braun } 718f842297dSMatthias Braun 719f842297dSMatthias Braun if (MRI->subRegLivenessEnabled()) { 720f842297dSMatthias Braun // When reading a partial undefined value we must not add a kill flag. 721f842297dSMatthias Braun // The regalloc might have used the undef lane for something else. 722f842297dSMatthias Braun // Example: 723f842297dSMatthias Braun // %1 = ... ; R32: %1 724f842297dSMatthias Braun // %2:high16 = ... ; R64: %2 725f842297dSMatthias Braun // = read killed %2 ; R64: %2 726f842297dSMatthias Braun // = read %1 ; R32: %1 727f842297dSMatthias Braun // The <kill> flag is correct for %2, but the register allocator may 728f842297dSMatthias Braun // assign R0L to %1, and R0 to %2 because the low 32bits of R0 729f842297dSMatthias Braun // are actually never written by %2. After assignment the <kill> 730f842297dSMatthias Braun // flag at the read instruction is invalid. 731f842297dSMatthias Braun LaneBitmask DefinedLanesMask; 732f842297dSMatthias Braun if (!SRs.empty()) { 733f842297dSMatthias Braun // Compute a mask of lanes that are defined. 734f842297dSMatthias Braun DefinedLanesMask = LaneBitmask::getNone(); 735f842297dSMatthias Braun for (auto &SRP : SRs) { 736f842297dSMatthias Braun const LiveInterval::SubRange &SR = *SRP.first; 737f842297dSMatthias Braun LiveRange::const_iterator &I = SRP.second; 738f842297dSMatthias Braun if (I == SR.end()) 739f842297dSMatthias Braun continue; 740f842297dSMatthias Braun I = SR.advanceTo(I, RI->end); 741f842297dSMatthias Braun if (I == SR.end() || I->start >= RI->end) 742f842297dSMatthias Braun continue; 743f842297dSMatthias Braun // I is overlapping RI 744f842297dSMatthias Braun DefinedLanesMask |= SR.LaneMask; 745f842297dSMatthias Braun } 746f842297dSMatthias Braun } else 747f842297dSMatthias Braun DefinedLanesMask = LaneBitmask::getAll(); 748f842297dSMatthias Braun 749f842297dSMatthias Braun bool IsFullWrite = false; 750f842297dSMatthias Braun for (const MachineOperand &MO : MI->operands()) { 751f842297dSMatthias Braun if (!MO.isReg() || MO.getReg() != Reg) 752f842297dSMatthias Braun continue; 753f842297dSMatthias Braun if (MO.isUse()) { 754f842297dSMatthias Braun // Reading any undefined lanes? 755f842297dSMatthias Braun LaneBitmask UseMask = TRI->getSubRegIndexLaneMask(MO.getSubReg()); 756f842297dSMatthias Braun if ((UseMask & ~DefinedLanesMask).any()) 757f842297dSMatthias Braun goto CancelKill; 758f842297dSMatthias Braun } else if (MO.getSubReg() == 0) { 759f842297dSMatthias Braun // Writing to the full register? 760f842297dSMatthias Braun assert(MO.isDef()); 761f842297dSMatthias Braun IsFullWrite = true; 762f842297dSMatthias Braun } 763f842297dSMatthias Braun } 764f842297dSMatthias Braun 765f842297dSMatthias Braun // If an instruction writes to a subregister, a new segment starts in 766f842297dSMatthias Braun // the LiveInterval. But as this is only overriding part of the register 767f842297dSMatthias Braun // adding kill-flags is not correct here after registers have been 768f842297dSMatthias Braun // assigned. 769f842297dSMatthias Braun if (!IsFullWrite) { 770f842297dSMatthias Braun // Next segment has to be adjacent in the subregister write case. 771f842297dSMatthias Braun LiveRange::const_iterator N = std::next(RI); 772f842297dSMatthias Braun if (N != LI.end() && N->start == RI->end) 773f842297dSMatthias Braun goto CancelKill; 774f842297dSMatthias Braun } 775f842297dSMatthias Braun } 776f842297dSMatthias Braun 777f842297dSMatthias Braun MI->addRegisterKilled(Reg, nullptr); 778f842297dSMatthias Braun continue; 779f842297dSMatthias Braun CancelKill: 780f842297dSMatthias Braun MI->clearRegisterKills(Reg, nullptr); 781f842297dSMatthias Braun } 782f842297dSMatthias Braun } 783f842297dSMatthias Braun } 784f842297dSMatthias Braun 785f842297dSMatthias Braun MachineBasicBlock* 786f842297dSMatthias Braun LiveIntervals::intervalIsInOneMBB(const LiveInterval &LI) const { 787f842297dSMatthias Braun // A local live range must be fully contained inside the block, meaning it is 788f842297dSMatthias Braun // defined and killed at instructions, not at block boundaries. It is not 789bcadfee2SHiroshi Inoue // live in or out of any block. 790f842297dSMatthias Braun // 791f842297dSMatthias Braun // It is technically possible to have a PHI-defined live range identical to a 792f842297dSMatthias Braun // single block, but we are going to return false in that case. 793f842297dSMatthias Braun 794f842297dSMatthias Braun SlotIndex Start = LI.beginIndex(); 795f842297dSMatthias Braun if (Start.isBlock()) 796f842297dSMatthias Braun return nullptr; 797f842297dSMatthias Braun 798f842297dSMatthias Braun SlotIndex Stop = LI.endIndex(); 799f842297dSMatthias Braun if (Stop.isBlock()) 800f842297dSMatthias Braun return nullptr; 801f842297dSMatthias Braun 802f842297dSMatthias Braun // getMBBFromIndex doesn't need to search the MBB table when both indexes 803f842297dSMatthias Braun // belong to proper instructions. 804f842297dSMatthias Braun MachineBasicBlock *MBB1 = Indexes->getMBBFromIndex(Start); 805f842297dSMatthias Braun MachineBasicBlock *MBB2 = Indexes->getMBBFromIndex(Stop); 806f842297dSMatthias Braun return MBB1 == MBB2 ? MBB1 : nullptr; 807f842297dSMatthias Braun } 808f842297dSMatthias Braun 809f842297dSMatthias Braun bool 810f842297dSMatthias Braun LiveIntervals::hasPHIKill(const LiveInterval &LI, const VNInfo *VNI) const { 811f842297dSMatthias Braun for (const VNInfo *PHI : LI.valnos) { 812f842297dSMatthias Braun if (PHI->isUnused() || !PHI->isPHIDef()) 813f842297dSMatthias Braun continue; 814f842297dSMatthias Braun const MachineBasicBlock *PHIMBB = getMBBFromIndex(PHI->def); 815f842297dSMatthias Braun // Conservatively return true instead of scanning huge predecessor lists. 816f842297dSMatthias Braun if (PHIMBB->pred_size() > 100) 817f842297dSMatthias Braun return true; 818f842297dSMatthias Braun for (const MachineBasicBlock *Pred : PHIMBB->predecessors()) 819f842297dSMatthias Braun if (VNI == LI.getVNInfoBefore(Indexes->getMBBEndIdx(Pred))) 820f842297dSMatthias Braun return true; 821f842297dSMatthias Braun } 822f842297dSMatthias Braun return false; 823f842297dSMatthias Braun } 824f842297dSMatthias Braun 825f842297dSMatthias Braun float LiveIntervals::getSpillWeight(bool isDef, bool isUse, 826f842297dSMatthias Braun const MachineBlockFrequencyInfo *MBFI, 827f842297dSMatthias Braun const MachineInstr &MI) { 828f842297dSMatthias Braun return getSpillWeight(isDef, isUse, MBFI, MI.getParent()); 829f842297dSMatthias Braun } 830f842297dSMatthias Braun 831f842297dSMatthias Braun float LiveIntervals::getSpillWeight(bool isDef, bool isUse, 832f842297dSMatthias Braun const MachineBlockFrequencyInfo *MBFI, 833f842297dSMatthias Braun const MachineBasicBlock *MBB) { 834f842297dSMatthias Braun BlockFrequency Freq = MBFI->getBlockFreq(MBB); 835f842297dSMatthias Braun const float Scale = 1.0f / MBFI->getEntryFreq(); 836f842297dSMatthias Braun return (isDef + isUse) * (Freq.getFrequency() * Scale); 837f842297dSMatthias Braun } 838f842297dSMatthias Braun 839f842297dSMatthias Braun LiveRange::Segment 840f842297dSMatthias Braun LiveIntervals::addSegmentToEndOfBlock(unsigned reg, MachineInstr &startInst) { 841f842297dSMatthias Braun LiveInterval& Interval = createEmptyInterval(reg); 842f842297dSMatthias Braun VNInfo *VN = Interval.getNextValue( 843f842297dSMatthias Braun SlotIndex(getInstructionIndex(startInst).getRegSlot()), 844f842297dSMatthias Braun getVNInfoAllocator()); 845f842297dSMatthias Braun LiveRange::Segment S(SlotIndex(getInstructionIndex(startInst).getRegSlot()), 846f842297dSMatthias Braun getMBBEndIdx(startInst.getParent()), VN); 847f842297dSMatthias Braun Interval.addSegment(S); 848f842297dSMatthias Braun 849f842297dSMatthias Braun return S; 850f842297dSMatthias Braun } 851f842297dSMatthias Braun 852f842297dSMatthias Braun //===----------------------------------------------------------------------===// 853f842297dSMatthias Braun // Register mask functions 854f842297dSMatthias Braun //===----------------------------------------------------------------------===// 855f842297dSMatthias Braun 856f842297dSMatthias Braun bool LiveIntervals::checkRegMaskInterference(LiveInterval &LI, 857f842297dSMatthias Braun BitVector &UsableRegs) { 858f842297dSMatthias Braun if (LI.empty()) 859f842297dSMatthias Braun return false; 860f842297dSMatthias Braun LiveInterval::iterator LiveI = LI.begin(), LiveE = LI.end(); 861f842297dSMatthias Braun 862f842297dSMatthias Braun // Use a smaller arrays for local live ranges. 863f842297dSMatthias Braun ArrayRef<SlotIndex> Slots; 864f842297dSMatthias Braun ArrayRef<const uint32_t*> Bits; 865f842297dSMatthias Braun if (MachineBasicBlock *MBB = intervalIsInOneMBB(LI)) { 866f842297dSMatthias Braun Slots = getRegMaskSlotsInBlock(MBB->getNumber()); 867f842297dSMatthias Braun Bits = getRegMaskBitsInBlock(MBB->getNumber()); 868f842297dSMatthias Braun } else { 869f842297dSMatthias Braun Slots = getRegMaskSlots(); 870f842297dSMatthias Braun Bits = getRegMaskBits(); 871f842297dSMatthias Braun } 872f842297dSMatthias Braun 873f842297dSMatthias Braun // We are going to enumerate all the register mask slots contained in LI. 874f842297dSMatthias Braun // Start with a binary search of RegMaskSlots to find a starting point. 875f842297dSMatthias Braun ArrayRef<SlotIndex>::iterator SlotI = 876f842297dSMatthias Braun std::lower_bound(Slots.begin(), Slots.end(), LiveI->start); 877f842297dSMatthias Braun ArrayRef<SlotIndex>::iterator SlotE = Slots.end(); 878f842297dSMatthias Braun 879f842297dSMatthias Braun // No slots in range, LI begins after the last call. 880f842297dSMatthias Braun if (SlotI == SlotE) 881f842297dSMatthias Braun return false; 882f842297dSMatthias Braun 883f842297dSMatthias Braun bool Found = false; 884f842297dSMatthias Braun while (true) { 885f842297dSMatthias Braun assert(*SlotI >= LiveI->start); 886f842297dSMatthias Braun // Loop over all slots overlapping this segment. 887f842297dSMatthias Braun while (*SlotI < LiveI->end) { 888f842297dSMatthias Braun // *SlotI overlaps LI. Collect mask bits. 889f842297dSMatthias Braun if (!Found) { 890f842297dSMatthias Braun // This is the first overlap. Initialize UsableRegs to all ones. 891f842297dSMatthias Braun UsableRegs.clear(); 892f842297dSMatthias Braun UsableRegs.resize(TRI->getNumRegs(), true); 893f842297dSMatthias Braun Found = true; 894f842297dSMatthias Braun } 895f842297dSMatthias Braun // Remove usable registers clobbered by this mask. 896f842297dSMatthias Braun UsableRegs.clearBitsNotInMask(Bits[SlotI-Slots.begin()]); 897f842297dSMatthias Braun if (++SlotI == SlotE) 898f842297dSMatthias Braun return Found; 899f842297dSMatthias Braun } 900f842297dSMatthias Braun // *SlotI is beyond the current LI segment. 901f842297dSMatthias Braun LiveI = LI.advanceTo(LiveI, *SlotI); 902f842297dSMatthias Braun if (LiveI == LiveE) 903f842297dSMatthias Braun return Found; 904f842297dSMatthias Braun // Advance SlotI until it overlaps. 905f842297dSMatthias Braun while (*SlotI < LiveI->start) 906f842297dSMatthias Braun if (++SlotI == SlotE) 907f842297dSMatthias Braun return Found; 908f842297dSMatthias Braun } 909f842297dSMatthias Braun } 910f842297dSMatthias Braun 911f842297dSMatthias Braun //===----------------------------------------------------------------------===// 912f842297dSMatthias Braun // IntervalUpdate class. 913f842297dSMatthias Braun //===----------------------------------------------------------------------===// 914f842297dSMatthias Braun 915f842297dSMatthias Braun /// Toolkit used by handleMove to trim or extend live intervals. 916f842297dSMatthias Braun class LiveIntervals::HMEditor { 917f842297dSMatthias Braun private: 918f842297dSMatthias Braun LiveIntervals& LIS; 919f842297dSMatthias Braun const MachineRegisterInfo& MRI; 920f842297dSMatthias Braun const TargetRegisterInfo& TRI; 921f842297dSMatthias Braun SlotIndex OldIdx; 922f842297dSMatthias Braun SlotIndex NewIdx; 923f842297dSMatthias Braun SmallPtrSet<LiveRange*, 8> Updated; 924f842297dSMatthias Braun bool UpdateFlags; 925f842297dSMatthias Braun 926f842297dSMatthias Braun public: 927f842297dSMatthias Braun HMEditor(LiveIntervals& LIS, const MachineRegisterInfo& MRI, 928f842297dSMatthias Braun const TargetRegisterInfo& TRI, 929f842297dSMatthias Braun SlotIndex OldIdx, SlotIndex NewIdx, bool UpdateFlags) 930f842297dSMatthias Braun : LIS(LIS), MRI(MRI), TRI(TRI), OldIdx(OldIdx), NewIdx(NewIdx), 931f842297dSMatthias Braun UpdateFlags(UpdateFlags) {} 932f842297dSMatthias Braun 933f842297dSMatthias Braun // FIXME: UpdateFlags is a workaround that creates live intervals for all 934f842297dSMatthias Braun // physregs, even those that aren't needed for regalloc, in order to update 935f842297dSMatthias Braun // kill flags. This is wasteful. Eventually, LiveVariables will strip all kill 936f842297dSMatthias Braun // flags, and postRA passes will use a live register utility instead. 937f842297dSMatthias Braun LiveRange *getRegUnitLI(unsigned Unit) { 938f842297dSMatthias Braun if (UpdateFlags && !MRI.isReservedRegUnit(Unit)) 939f842297dSMatthias Braun return &LIS.getRegUnit(Unit); 940f842297dSMatthias Braun return LIS.getCachedRegUnit(Unit); 941f842297dSMatthias Braun } 942f842297dSMatthias Braun 943f842297dSMatthias Braun /// Update all live ranges touched by MI, assuming a move from OldIdx to 944f842297dSMatthias Braun /// NewIdx. 945f842297dSMatthias Braun void updateAllRanges(MachineInstr *MI) { 946f842297dSMatthias Braun DEBUG(dbgs() << "handleMove " << OldIdx << " -> " << NewIdx << ": " << *MI); 947f842297dSMatthias Braun bool hasRegMask = false; 948f842297dSMatthias Braun for (MachineOperand &MO : MI->operands()) { 949f842297dSMatthias Braun if (MO.isRegMask()) 950f842297dSMatthias Braun hasRegMask = true; 951f842297dSMatthias Braun if (!MO.isReg()) 952f842297dSMatthias Braun continue; 953f842297dSMatthias Braun if (MO.isUse()) { 954f842297dSMatthias Braun if (!MO.readsReg()) 955f842297dSMatthias Braun continue; 956f842297dSMatthias Braun // Aggressively clear all kill flags. 957f842297dSMatthias Braun // They are reinserted by VirtRegRewriter. 958f842297dSMatthias Braun MO.setIsKill(false); 959f842297dSMatthias Braun } 960f842297dSMatthias Braun 961f842297dSMatthias Braun unsigned Reg = MO.getReg(); 962f842297dSMatthias Braun if (!Reg) 963f842297dSMatthias Braun continue; 964f842297dSMatthias Braun if (TargetRegisterInfo::isVirtualRegister(Reg)) { 965f842297dSMatthias Braun LiveInterval &LI = LIS.getInterval(Reg); 966f842297dSMatthias Braun if (LI.hasSubRanges()) { 967f842297dSMatthias Braun unsigned SubReg = MO.getSubReg(); 968f842297dSMatthias Braun LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg) 969f842297dSMatthias Braun : MRI.getMaxLaneMaskForVReg(Reg); 970f842297dSMatthias Braun for (LiveInterval::SubRange &S : LI.subranges()) { 971f842297dSMatthias Braun if ((S.LaneMask & LaneMask).none()) 972f842297dSMatthias Braun continue; 973f842297dSMatthias Braun updateRange(S, Reg, S.LaneMask); 974f842297dSMatthias Braun } 975f842297dSMatthias Braun } 976f842297dSMatthias Braun updateRange(LI, Reg, LaneBitmask::getNone()); 977f842297dSMatthias Braun continue; 978f842297dSMatthias Braun } 979f842297dSMatthias Braun 980f842297dSMatthias Braun // For physregs, only update the regunits that actually have a 981f842297dSMatthias Braun // precomputed live range. 982f842297dSMatthias Braun for (MCRegUnitIterator Units(Reg, &TRI); Units.isValid(); ++Units) 983f842297dSMatthias Braun if (LiveRange *LR = getRegUnitLI(*Units)) 984f842297dSMatthias Braun updateRange(*LR, *Units, LaneBitmask::getNone()); 985f842297dSMatthias Braun } 986f842297dSMatthias Braun if (hasRegMask) 987f842297dSMatthias Braun updateRegMaskSlots(); 988f842297dSMatthias Braun } 989f842297dSMatthias Braun 990f842297dSMatthias Braun private: 991f842297dSMatthias Braun /// Update a single live range, assuming an instruction has been moved from 992f842297dSMatthias Braun /// OldIdx to NewIdx. 993f842297dSMatthias Braun void updateRange(LiveRange &LR, unsigned Reg, LaneBitmask LaneMask) { 994f842297dSMatthias Braun if (!Updated.insert(&LR).second) 995f842297dSMatthias Braun return; 996f842297dSMatthias Braun DEBUG({ 997f842297dSMatthias Braun dbgs() << " "; 998f842297dSMatthias Braun if (TargetRegisterInfo::isVirtualRegister(Reg)) { 999f842297dSMatthias Braun dbgs() << printReg(Reg); 1000f842297dSMatthias Braun if (LaneMask.any()) 1001f842297dSMatthias Braun dbgs() << " L" << PrintLaneMask(LaneMask); 1002f842297dSMatthias Braun } else { 1003f842297dSMatthias Braun dbgs() << printRegUnit(Reg, &TRI); 1004f842297dSMatthias Braun } 1005f842297dSMatthias Braun dbgs() << ":\t" << LR << '\n'; 1006f842297dSMatthias Braun }); 1007f842297dSMatthias Braun if (SlotIndex::isEarlierInstr(OldIdx, NewIdx)) 1008f842297dSMatthias Braun handleMoveDown(LR); 1009f842297dSMatthias Braun else 1010f842297dSMatthias Braun handleMoveUp(LR, Reg, LaneMask); 1011f842297dSMatthias Braun DEBUG(dbgs() << " -->\t" << LR << '\n'); 1012f842297dSMatthias Braun LR.verify(); 1013f842297dSMatthias Braun } 1014f842297dSMatthias Braun 1015f842297dSMatthias Braun /// Update LR to reflect an instruction has been moved downwards from OldIdx 1016f842297dSMatthias Braun /// to NewIdx (OldIdx < NewIdx). 1017f842297dSMatthias Braun void handleMoveDown(LiveRange &LR) { 1018f842297dSMatthias Braun LiveRange::iterator E = LR.end(); 1019f842297dSMatthias Braun // Segment going into OldIdx. 1020f842297dSMatthias Braun LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex()); 1021f842297dSMatthias Braun 1022f842297dSMatthias Braun // No value live before or after OldIdx? Nothing to do. 1023f842297dSMatthias Braun if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start)) 1024f842297dSMatthias Braun return; 1025f842297dSMatthias Braun 1026f842297dSMatthias Braun LiveRange::iterator OldIdxOut; 1027f842297dSMatthias Braun // Do we have a value live-in to OldIdx? 1028f842297dSMatthias Braun if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) { 1029f842297dSMatthias Braun // If the live-in value already extends to NewIdx, there is nothing to do. 1030f842297dSMatthias Braun if (SlotIndex::isEarlierEqualInstr(NewIdx, OldIdxIn->end)) 1031f842297dSMatthias Braun return; 1032f842297dSMatthias Braun // Aggressively remove all kill flags from the old kill point. 1033f842297dSMatthias Braun // Kill flags shouldn't be used while live intervals exist, they will be 1034f842297dSMatthias Braun // reinserted by VirtRegRewriter. 1035f842297dSMatthias Braun if (MachineInstr *KillMI = LIS.getInstructionFromIndex(OldIdxIn->end)) 1036f842297dSMatthias Braun for (MIBundleOperands MO(*KillMI); MO.isValid(); ++MO) 1037f842297dSMatthias Braun if (MO->isReg() && MO->isUse()) 1038f842297dSMatthias Braun MO->setIsKill(false); 1039f842297dSMatthias Braun 1040f842297dSMatthias Braun // Is there a def before NewIdx which is not OldIdx? 1041f842297dSMatthias Braun LiveRange::iterator Next = std::next(OldIdxIn); 1042f842297dSMatthias Braun if (Next != E && !SlotIndex::isSameInstr(OldIdx, Next->start) && 1043f842297dSMatthias Braun SlotIndex::isEarlierInstr(Next->start, NewIdx)) { 1044f842297dSMatthias Braun // If we are here then OldIdx was just a use but not a def. We only have 1045f842297dSMatthias Braun // to ensure liveness extends to NewIdx. 1046f842297dSMatthias Braun LiveRange::iterator NewIdxIn = 1047f842297dSMatthias Braun LR.advanceTo(Next, NewIdx.getBaseIndex()); 1048f842297dSMatthias Braun // Extend the segment before NewIdx if necessary. 1049f842297dSMatthias Braun if (NewIdxIn == E || 1050f842297dSMatthias Braun !SlotIndex::isEarlierInstr(NewIdxIn->start, NewIdx)) { 1051f842297dSMatthias Braun LiveRange::iterator Prev = std::prev(NewIdxIn); 1052f842297dSMatthias Braun Prev->end = NewIdx.getRegSlot(); 1053f842297dSMatthias Braun } 1054f842297dSMatthias Braun // Extend OldIdxIn. 1055f842297dSMatthias Braun OldIdxIn->end = Next->start; 1056f842297dSMatthias Braun return; 1057f842297dSMatthias Braun } 1058f842297dSMatthias Braun 1059f842297dSMatthias Braun // Adjust OldIdxIn->end to reach NewIdx. This may temporarily make LR 1060f842297dSMatthias Braun // invalid by overlapping ranges. 1061f842297dSMatthias Braun bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end); 1062f842297dSMatthias Braun OldIdxIn->end = NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber()); 1063f842297dSMatthias Braun // If this was not a kill, then there was no def and we're done. 1064f842297dSMatthias Braun if (!isKill) 1065f842297dSMatthias Braun return; 1066f842297dSMatthias Braun 1067f842297dSMatthias Braun // Did we have a Def at OldIdx? 1068f842297dSMatthias Braun OldIdxOut = Next; 1069f842297dSMatthias Braun if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start)) 1070f842297dSMatthias Braun return; 1071f842297dSMatthias Braun } else { 1072f842297dSMatthias Braun OldIdxOut = OldIdxIn; 1073f842297dSMatthias Braun } 1074f842297dSMatthias Braun 1075f842297dSMatthias Braun // If we are here then there is a Definition at OldIdx. OldIdxOut points 1076f842297dSMatthias Braun // to the segment starting there. 1077f842297dSMatthias Braun assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) && 1078f842297dSMatthias Braun "No def?"); 1079f842297dSMatthias Braun VNInfo *OldIdxVNI = OldIdxOut->valno; 1080f842297dSMatthias Braun assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def"); 1081f842297dSMatthias Braun 1082f842297dSMatthias Braun // If the defined value extends beyond NewIdx, just move the beginning 1083f842297dSMatthias Braun // of the segment to NewIdx. 1084f842297dSMatthias Braun SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber()); 1085f842297dSMatthias Braun if (SlotIndex::isEarlierInstr(NewIdxDef, OldIdxOut->end)) { 1086f842297dSMatthias Braun OldIdxVNI->def = NewIdxDef; 1087f842297dSMatthias Braun OldIdxOut->start = OldIdxVNI->def; 1088f842297dSMatthias Braun return; 1089f842297dSMatthias Braun } 1090f842297dSMatthias Braun 1091f842297dSMatthias Braun // If we are here then we have a Definition at OldIdx which ends before 1092f842297dSMatthias Braun // NewIdx. 1093f842297dSMatthias Braun 1094f842297dSMatthias Braun // Is there an existing Def at NewIdx? 1095f842297dSMatthias Braun LiveRange::iterator AfterNewIdx 1096f842297dSMatthias Braun = LR.advanceTo(OldIdxOut, NewIdx.getRegSlot()); 1097f842297dSMatthias Braun bool OldIdxDefIsDead = OldIdxOut->end.isDead(); 1098f842297dSMatthias Braun if (!OldIdxDefIsDead && 1099f842297dSMatthias Braun SlotIndex::isEarlierInstr(OldIdxOut->end, NewIdxDef)) { 1100f842297dSMatthias Braun // OldIdx is not a dead def, and NewIdxDef is inside a new interval. 1101f842297dSMatthias Braun VNInfo *DefVNI; 1102f842297dSMatthias Braun if (OldIdxOut != LR.begin() && 1103f842297dSMatthias Braun !SlotIndex::isEarlierInstr(std::prev(OldIdxOut)->end, 1104f842297dSMatthias Braun OldIdxOut->start)) { 1105f842297dSMatthias Braun // There is no gap between OldIdxOut and its predecessor anymore, 1106f842297dSMatthias Braun // merge them. 1107f842297dSMatthias Braun LiveRange::iterator IPrev = std::prev(OldIdxOut); 1108f842297dSMatthias Braun DefVNI = OldIdxVNI; 1109f842297dSMatthias Braun IPrev->end = OldIdxOut->end; 1110f842297dSMatthias Braun } else { 1111f842297dSMatthias Braun // The value is live in to OldIdx 1112f842297dSMatthias Braun LiveRange::iterator INext = std::next(OldIdxOut); 1113f842297dSMatthias Braun assert(INext != E && "Must have following segment"); 1114f842297dSMatthias Braun // We merge OldIdxOut and its successor. As we're dealing with subreg 1115f842297dSMatthias Braun // reordering, there is always a successor to OldIdxOut in the same BB 1116f842297dSMatthias Braun // We don't need INext->valno anymore and will reuse for the new segment 1117f842297dSMatthias Braun // we create later. 1118f842297dSMatthias Braun DefVNI = OldIdxVNI; 1119f842297dSMatthias Braun INext->start = OldIdxOut->end; 1120f842297dSMatthias Braun INext->valno->def = INext->start; 1121f842297dSMatthias Braun } 1122f842297dSMatthias Braun // If NewIdx is behind the last segment, extend that and append a new one. 1123f842297dSMatthias Braun if (AfterNewIdx == E) { 1124f842297dSMatthias Braun // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up 1125f842297dSMatthias Braun // one position. 1126f842297dSMatthias Braun // |- ?/OldIdxOut -| |- X0 -| ... |- Xn -| end 1127f842297dSMatthias Braun // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS -| end 1128f842297dSMatthias Braun std::copy(std::next(OldIdxOut), E, OldIdxOut); 1129f842297dSMatthias Braun // The last segment is undefined now, reuse it for a dead def. 1130f842297dSMatthias Braun LiveRange::iterator NewSegment = std::prev(E); 1131f842297dSMatthias Braun *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(), 1132f842297dSMatthias Braun DefVNI); 1133f842297dSMatthias Braun DefVNI->def = NewIdxDef; 1134f842297dSMatthias Braun 1135f842297dSMatthias Braun LiveRange::iterator Prev = std::prev(NewSegment); 1136f842297dSMatthias Braun Prev->end = NewIdxDef; 1137f842297dSMatthias Braun } else { 1138f842297dSMatthias Braun // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up 1139f842297dSMatthias Braun // one position. 1140f842297dSMatthias Braun // |- ?/OldIdxOut -| |- X0 -| ... |- Xn/AfterNewIdx -| |- Next -| 1141f842297dSMatthias Braun // => |- X0/OldIdxOut -| ... |- Xn -| |- Xn/AfterNewIdx -| |- Next -| 1142f842297dSMatthias Braun std::copy(std::next(OldIdxOut), std::next(AfterNewIdx), OldIdxOut); 1143f842297dSMatthias Braun LiveRange::iterator Prev = std::prev(AfterNewIdx); 1144f842297dSMatthias Braun // We have two cases: 1145f842297dSMatthias Braun if (SlotIndex::isEarlierInstr(Prev->start, NewIdxDef)) { 1146f842297dSMatthias Braun // Case 1: NewIdx is inside a liverange. Split this liverange at 1147f842297dSMatthias Braun // NewIdxDef into the segment "Prev" followed by "NewSegment". 1148f842297dSMatthias Braun LiveRange::iterator NewSegment = AfterNewIdx; 1149f842297dSMatthias Braun *NewSegment = LiveRange::Segment(NewIdxDef, Prev->end, Prev->valno); 1150f842297dSMatthias Braun Prev->valno->def = NewIdxDef; 1151f842297dSMatthias Braun 1152f842297dSMatthias Braun *Prev = LiveRange::Segment(Prev->start, NewIdxDef, DefVNI); 1153f842297dSMatthias Braun DefVNI->def = Prev->start; 1154f842297dSMatthias Braun } else { 1155f842297dSMatthias Braun // Case 2: NewIdx is in a lifetime hole. Keep AfterNewIdx as is and 1156f842297dSMatthias Braun // turn Prev into a segment from NewIdx to AfterNewIdx->start. 1157f842297dSMatthias Braun *Prev = LiveRange::Segment(NewIdxDef, AfterNewIdx->start, DefVNI); 1158f842297dSMatthias Braun DefVNI->def = NewIdxDef; 1159f842297dSMatthias Braun assert(DefVNI != AfterNewIdx->valno); 1160f842297dSMatthias Braun } 1161f842297dSMatthias Braun } 1162f842297dSMatthias Braun return; 1163f842297dSMatthias Braun } 1164f842297dSMatthias Braun 1165f842297dSMatthias Braun if (AfterNewIdx != E && 1166f842297dSMatthias Braun SlotIndex::isSameInstr(AfterNewIdx->start, NewIdxDef)) { 1167f842297dSMatthias Braun // There is an existing def at NewIdx. The def at OldIdx is coalesced into 1168f842297dSMatthias Braun // that value. 1169f842297dSMatthias Braun assert(AfterNewIdx->valno != OldIdxVNI && "Multiple defs of value?"); 1170f842297dSMatthias Braun LR.removeValNo(OldIdxVNI); 1171f842297dSMatthias Braun } else { 1172f842297dSMatthias Braun // There was no existing def at NewIdx. We need to create a dead def 1173f842297dSMatthias Braun // at NewIdx. Shift segments over the old OldIdxOut segment, this frees 1174f842297dSMatthias Braun // a new segment at the place where we want to construct the dead def. 1175f842297dSMatthias Braun // |- OldIdxOut -| |- X0 -| ... |- Xn -| |- AfterNewIdx -| 1176f842297dSMatthias Braun // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS. -| |- AfterNewIdx -| 1177f842297dSMatthias Braun assert(AfterNewIdx != OldIdxOut && "Inconsistent iterators"); 1178f842297dSMatthias Braun std::copy(std::next(OldIdxOut), AfterNewIdx, OldIdxOut); 1179f842297dSMatthias Braun // We can reuse OldIdxVNI now. 1180f842297dSMatthias Braun LiveRange::iterator NewSegment = std::prev(AfterNewIdx); 1181f842297dSMatthias Braun VNInfo *NewSegmentVNI = OldIdxVNI; 1182f842297dSMatthias Braun NewSegmentVNI->def = NewIdxDef; 1183f842297dSMatthias Braun *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(), 1184f842297dSMatthias Braun NewSegmentVNI); 1185f842297dSMatthias Braun } 1186f842297dSMatthias Braun } 1187f842297dSMatthias Braun 1188f842297dSMatthias Braun /// Update LR to reflect an instruction has been moved upwards from OldIdx 1189f842297dSMatthias Braun /// to NewIdx (NewIdx < OldIdx). 1190f842297dSMatthias Braun void handleMoveUp(LiveRange &LR, unsigned Reg, LaneBitmask LaneMask) { 1191f842297dSMatthias Braun LiveRange::iterator E = LR.end(); 1192f842297dSMatthias Braun // Segment going into OldIdx. 1193f842297dSMatthias Braun LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex()); 1194f842297dSMatthias Braun 1195f842297dSMatthias Braun // No value live before or after OldIdx? Nothing to do. 1196f842297dSMatthias Braun if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start)) 1197f842297dSMatthias Braun return; 1198f842297dSMatthias Braun 1199f842297dSMatthias Braun LiveRange::iterator OldIdxOut; 1200f842297dSMatthias Braun // Do we have a value live-in to OldIdx? 1201f842297dSMatthias Braun if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) { 1202f842297dSMatthias Braun // If the live-in value isn't killed here, then we have no Def at 1203f842297dSMatthias Braun // OldIdx, moreover the value must be live at NewIdx so there is nothing 1204f842297dSMatthias Braun // to do. 1205f842297dSMatthias Braun bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end); 1206f842297dSMatthias Braun if (!isKill) 1207f842297dSMatthias Braun return; 1208f842297dSMatthias Braun 1209f842297dSMatthias Braun // At this point we have to move OldIdxIn->end back to the nearest 1210f842297dSMatthias Braun // previous use or (dead-)def but no further than NewIdx. 1211f842297dSMatthias Braun SlotIndex DefBeforeOldIdx 1212f842297dSMatthias Braun = std::max(OldIdxIn->start.getDeadSlot(), 1213f842297dSMatthias Braun NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber())); 1214f842297dSMatthias Braun OldIdxIn->end = findLastUseBefore(DefBeforeOldIdx, Reg, LaneMask); 1215f842297dSMatthias Braun 1216f842297dSMatthias Braun // Did we have a Def at OldIdx? If not we are done now. 1217f842297dSMatthias Braun OldIdxOut = std::next(OldIdxIn); 1218f842297dSMatthias Braun if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start)) 1219f842297dSMatthias Braun return; 1220f842297dSMatthias Braun } else { 1221f842297dSMatthias Braun OldIdxOut = OldIdxIn; 1222f842297dSMatthias Braun OldIdxIn = OldIdxOut != LR.begin() ? std::prev(OldIdxOut) : E; 1223f842297dSMatthias Braun } 1224f842297dSMatthias Braun 1225f842297dSMatthias Braun // If we are here then there is a Definition at OldIdx. OldIdxOut points 1226f842297dSMatthias Braun // to the segment starting there. 1227f842297dSMatthias Braun assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) && 1228f842297dSMatthias Braun "No def?"); 1229f842297dSMatthias Braun VNInfo *OldIdxVNI = OldIdxOut->valno; 1230f842297dSMatthias Braun assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def"); 1231f842297dSMatthias Braun bool OldIdxDefIsDead = OldIdxOut->end.isDead(); 1232f842297dSMatthias Braun 1233f842297dSMatthias Braun // Is there an existing def at NewIdx? 1234f842297dSMatthias Braun SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber()); 1235f842297dSMatthias Braun LiveRange::iterator NewIdxOut = LR.find(NewIdx.getRegSlot()); 1236f842297dSMatthias Braun if (SlotIndex::isSameInstr(NewIdxOut->start, NewIdx)) { 1237f842297dSMatthias Braun assert(NewIdxOut->valno != OldIdxVNI && 1238f842297dSMatthias Braun "Same value defined more than once?"); 1239f842297dSMatthias Braun // If OldIdx was a dead def remove it. 1240f842297dSMatthias Braun if (!OldIdxDefIsDead) { 1241f842297dSMatthias Braun // Remove segment starting at NewIdx and move begin of OldIdxOut to 1242f842297dSMatthias Braun // NewIdx so it can take its place. 1243f842297dSMatthias Braun OldIdxVNI->def = NewIdxDef; 1244f842297dSMatthias Braun OldIdxOut->start = NewIdxDef; 1245f842297dSMatthias Braun LR.removeValNo(NewIdxOut->valno); 1246f842297dSMatthias Braun } else { 1247f842297dSMatthias Braun // Simply remove the dead def at OldIdx. 1248f842297dSMatthias Braun LR.removeValNo(OldIdxVNI); 1249f842297dSMatthias Braun } 1250f842297dSMatthias Braun } else { 1251f842297dSMatthias Braun // Previously nothing was live after NewIdx, so all we have to do now is 1252f842297dSMatthias Braun // move the begin of OldIdxOut to NewIdx. 1253f842297dSMatthias Braun if (!OldIdxDefIsDead) { 1254f842297dSMatthias Braun // Do we have any intermediate Defs between OldIdx and NewIdx? 1255f842297dSMatthias Braun if (OldIdxIn != E && 1256f842297dSMatthias Braun SlotIndex::isEarlierInstr(NewIdxDef, OldIdxIn->start)) { 1257f842297dSMatthias Braun // OldIdx is not a dead def and NewIdx is before predecessor start. 1258f842297dSMatthias Braun LiveRange::iterator NewIdxIn = NewIdxOut; 1259f842297dSMatthias Braun assert(NewIdxIn == LR.find(NewIdx.getBaseIndex())); 1260f842297dSMatthias Braun const SlotIndex SplitPos = NewIdxDef; 1261f842297dSMatthias Braun OldIdxVNI = OldIdxIn->valno; 1262f842297dSMatthias Braun 1263f842297dSMatthias Braun // Merge the OldIdxIn and OldIdxOut segments into OldIdxOut. 1264f842297dSMatthias Braun OldIdxOut->valno->def = OldIdxIn->start; 1265f842297dSMatthias Braun *OldIdxOut = LiveRange::Segment(OldIdxIn->start, OldIdxOut->end, 1266f842297dSMatthias Braun OldIdxOut->valno); 1267f842297dSMatthias Braun // OldIdxIn and OldIdxVNI are now undef and can be overridden. 1268f842297dSMatthias Braun // We Slide [NewIdxIn, OldIdxIn) down one position. 1269f842297dSMatthias Braun // |- X0/NewIdxIn -| ... |- Xn-1 -||- Xn/OldIdxIn -||- OldIdxOut -| 1270f842297dSMatthias Braun // => |- undef/NexIdxIn -| |- X0 -| ... |- Xn-1 -| |- Xn/OldIdxOut -| 1271f842297dSMatthias Braun std::copy_backward(NewIdxIn, OldIdxIn, OldIdxOut); 1272f842297dSMatthias Braun // NewIdxIn is now considered undef so we can reuse it for the moved 1273f842297dSMatthias Braun // value. 1274f842297dSMatthias Braun LiveRange::iterator NewSegment = NewIdxIn; 1275f842297dSMatthias Braun LiveRange::iterator Next = std::next(NewSegment); 1276f842297dSMatthias Braun if (SlotIndex::isEarlierInstr(Next->start, NewIdx)) { 1277f842297dSMatthias Braun // There is no gap between NewSegment and its predecessor. 1278f842297dSMatthias Braun *NewSegment = LiveRange::Segment(Next->start, SplitPos, 1279f842297dSMatthias Braun Next->valno); 1280f842297dSMatthias Braun *Next = LiveRange::Segment(SplitPos, Next->end, OldIdxVNI); 1281f842297dSMatthias Braun Next->valno->def = SplitPos; 1282f842297dSMatthias Braun } else { 1283f842297dSMatthias Braun // There is a gap between NewSegment and its predecessor 1284f842297dSMatthias Braun // Value becomes live in. 1285f842297dSMatthias Braun *NewSegment = LiveRange::Segment(SplitPos, Next->start, OldIdxVNI); 1286f842297dSMatthias Braun NewSegment->valno->def = SplitPos; 1287f842297dSMatthias Braun } 1288f842297dSMatthias Braun } else { 1289f842297dSMatthias Braun // Leave the end point of a live def. 1290f842297dSMatthias Braun OldIdxOut->start = NewIdxDef; 1291f842297dSMatthias Braun OldIdxVNI->def = NewIdxDef; 1292f842297dSMatthias Braun if (OldIdxIn != E && SlotIndex::isEarlierInstr(NewIdx, OldIdxIn->end)) 1293f842297dSMatthias Braun OldIdxIn->end = NewIdx.getRegSlot(); 1294f842297dSMatthias Braun } 1295f40707a2STim Renouf } else if (OldIdxIn != E 1296f40707a2STim Renouf && SlotIndex::isEarlierInstr(NewIdxOut->start, NewIdx) 1297f40707a2STim Renouf && SlotIndex::isEarlierInstr(NewIdx, NewIdxOut->end)) { 1298f40707a2STim Renouf // OldIdxVNI is a dead def that has been moved into the middle of 1299f40707a2STim Renouf // another value in LR. That can happen when LR is a whole register, 1300f40707a2STim Renouf // but the dead def is a write to a subreg that is dead at NewIdx. 1301f40707a2STim Renouf // The dead def may have been moved across other values 1302f40707a2STim Renouf // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut) 1303f40707a2STim Renouf // down one position. 1304f40707a2STim Renouf // |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - | 1305f40707a2STim Renouf // => |- X0/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -| 1306f40707a2STim Renouf std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut)); 1307f40707a2STim Renouf // Modify the segment at NewIdxOut and the following segment to meet at 1308f40707a2STim Renouf // the point of the dead def, with the following segment getting 1309f40707a2STim Renouf // OldIdxVNI as its value number. 1310f40707a2STim Renouf *NewIdxOut = LiveRange::Segment( 1311f40707a2STim Renouf NewIdxOut->start, NewIdxDef.getRegSlot(), NewIdxOut->valno); 1312f40707a2STim Renouf *(NewIdxOut + 1) = LiveRange::Segment( 1313f40707a2STim Renouf NewIdxDef.getRegSlot(), (NewIdxOut + 1)->end, OldIdxVNI); 1314f40707a2STim Renouf OldIdxVNI->def = NewIdxDef; 1315f40707a2STim Renouf // Modify subsequent segments to be defined by the moved def OldIdxVNI. 1316f40707a2STim Renouf for (auto Idx = NewIdxOut + 2; Idx <= OldIdxOut; ++Idx) 1317f40707a2STim Renouf Idx->valno = OldIdxVNI; 1318f40707a2STim Renouf // Aggressively remove all dead flags from the former dead definition. 1319f40707a2STim Renouf // Kill/dead flags shouldn't be used while live intervals exist; they 1320f40707a2STim Renouf // will be reinserted by VirtRegRewriter. 1321f40707a2STim Renouf if (MachineInstr *KillMI = LIS.getInstructionFromIndex(NewIdx)) 1322f40707a2STim Renouf for (MIBundleOperands MO(*KillMI); MO.isValid(); ++MO) 1323f40707a2STim Renouf if (MO->isReg() && !MO->isUse()) 1324f40707a2STim Renouf MO->setIsDead(false); 1325f842297dSMatthias Braun } else { 1326f842297dSMatthias Braun // OldIdxVNI is a dead def. It may have been moved across other values 1327f842297dSMatthias Braun // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut) 1328f842297dSMatthias Braun // down one position. 1329f842297dSMatthias Braun // |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - | 1330f842297dSMatthias Braun // => |- undef/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -| 1331f842297dSMatthias Braun std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut)); 1332f842297dSMatthias Braun // OldIdxVNI can be reused now to build a new dead def segment. 1333f842297dSMatthias Braun LiveRange::iterator NewSegment = NewIdxOut; 1334f842297dSMatthias Braun VNInfo *NewSegmentVNI = OldIdxVNI; 1335f842297dSMatthias Braun *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(), 1336f842297dSMatthias Braun NewSegmentVNI); 1337f842297dSMatthias Braun NewSegmentVNI->def = NewIdxDef; 1338f842297dSMatthias Braun } 1339f842297dSMatthias Braun } 1340f842297dSMatthias Braun } 1341f842297dSMatthias Braun 1342f842297dSMatthias Braun void updateRegMaskSlots() { 1343f842297dSMatthias Braun SmallVectorImpl<SlotIndex>::iterator RI = 1344f842297dSMatthias Braun std::lower_bound(LIS.RegMaskSlots.begin(), LIS.RegMaskSlots.end(), 1345f842297dSMatthias Braun OldIdx); 1346f842297dSMatthias Braun assert(RI != LIS.RegMaskSlots.end() && *RI == OldIdx.getRegSlot() && 1347f842297dSMatthias Braun "No RegMask at OldIdx."); 1348f842297dSMatthias Braun *RI = NewIdx.getRegSlot(); 1349f842297dSMatthias Braun assert((RI == LIS.RegMaskSlots.begin() || 1350f842297dSMatthias Braun SlotIndex::isEarlierInstr(*std::prev(RI), *RI)) && 1351f842297dSMatthias Braun "Cannot move regmask instruction above another call"); 1352f842297dSMatthias Braun assert((std::next(RI) == LIS.RegMaskSlots.end() || 1353f842297dSMatthias Braun SlotIndex::isEarlierInstr(*RI, *std::next(RI))) && 1354f842297dSMatthias Braun "Cannot move regmask instruction below another call"); 1355f842297dSMatthias Braun } 1356f842297dSMatthias Braun 1357f842297dSMatthias Braun // Return the last use of reg between NewIdx and OldIdx. 1358f842297dSMatthias Braun SlotIndex findLastUseBefore(SlotIndex Before, unsigned Reg, 1359f842297dSMatthias Braun LaneBitmask LaneMask) { 1360f842297dSMatthias Braun if (TargetRegisterInfo::isVirtualRegister(Reg)) { 1361f842297dSMatthias Braun SlotIndex LastUse = Before; 1362f842297dSMatthias Braun for (MachineOperand &MO : MRI.use_nodbg_operands(Reg)) { 1363f842297dSMatthias Braun if (MO.isUndef()) 1364f842297dSMatthias Braun continue; 1365f842297dSMatthias Braun unsigned SubReg = MO.getSubReg(); 1366f842297dSMatthias Braun if (SubReg != 0 && LaneMask.any() 1367f842297dSMatthias Braun && (TRI.getSubRegIndexLaneMask(SubReg) & LaneMask).none()) 1368f842297dSMatthias Braun continue; 1369f842297dSMatthias Braun 1370f842297dSMatthias Braun const MachineInstr &MI = *MO.getParent(); 1371f842297dSMatthias Braun SlotIndex InstSlot = LIS.getSlotIndexes()->getInstructionIndex(MI); 1372f842297dSMatthias Braun if (InstSlot > LastUse && InstSlot < OldIdx) 1373f842297dSMatthias Braun LastUse = InstSlot.getRegSlot(); 1374f842297dSMatthias Braun } 1375f842297dSMatthias Braun return LastUse; 1376f842297dSMatthias Braun } 1377f842297dSMatthias Braun 1378f842297dSMatthias Braun // This is a regunit interval, so scanning the use list could be very 1379f842297dSMatthias Braun // expensive. Scan upwards from OldIdx instead. 1380f842297dSMatthias Braun assert(Before < OldIdx && "Expected upwards move"); 1381f842297dSMatthias Braun SlotIndexes *Indexes = LIS.getSlotIndexes(); 1382f842297dSMatthias Braun MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Before); 1383f842297dSMatthias Braun 1384f842297dSMatthias Braun // OldIdx may not correspond to an instruction any longer, so set MII to 1385f842297dSMatthias Braun // point to the next instruction after OldIdx, or MBB->end(). 1386f842297dSMatthias Braun MachineBasicBlock::iterator MII = MBB->end(); 1387f842297dSMatthias Braun if (MachineInstr *MI = Indexes->getInstructionFromIndex( 1388f842297dSMatthias Braun Indexes->getNextNonNullIndex(OldIdx))) 1389f842297dSMatthias Braun if (MI->getParent() == MBB) 1390f842297dSMatthias Braun MII = MI; 1391f842297dSMatthias Braun 1392f842297dSMatthias Braun MachineBasicBlock::iterator Begin = MBB->begin(); 1393f842297dSMatthias Braun while (MII != Begin) { 1394*801bf7ebSShiva Chen if ((--MII)->isDebugInstr()) 1395f842297dSMatthias Braun continue; 1396f842297dSMatthias Braun SlotIndex Idx = Indexes->getInstructionIndex(*MII); 1397f842297dSMatthias Braun 1398f842297dSMatthias Braun // Stop searching when Before is reached. 1399f842297dSMatthias Braun if (!SlotIndex::isEarlierInstr(Before, Idx)) 1400f842297dSMatthias Braun return Before; 1401f842297dSMatthias Braun 1402f842297dSMatthias Braun // Check if MII uses Reg. 1403f842297dSMatthias Braun for (MIBundleOperands MO(*MII); MO.isValid(); ++MO) 1404f842297dSMatthias Braun if (MO->isReg() && !MO->isUndef() && 1405f842297dSMatthias Braun TargetRegisterInfo::isPhysicalRegister(MO->getReg()) && 1406f842297dSMatthias Braun TRI.hasRegUnit(MO->getReg(), Reg)) 1407f842297dSMatthias Braun return Idx.getRegSlot(); 1408f842297dSMatthias Braun } 1409f842297dSMatthias Braun // Didn't reach Before. It must be the first instruction in the block. 1410f842297dSMatthias Braun return Before; 1411f842297dSMatthias Braun } 1412f842297dSMatthias Braun }; 1413f842297dSMatthias Braun 1414f842297dSMatthias Braun void LiveIntervals::handleMove(MachineInstr &MI, bool UpdateFlags) { 1415f842297dSMatthias Braun assert(!MI.isBundled() && "Can't handle bundled instructions yet."); 1416f842297dSMatthias Braun SlotIndex OldIndex = Indexes->getInstructionIndex(MI); 1417f842297dSMatthias Braun Indexes->removeMachineInstrFromMaps(MI); 1418f842297dSMatthias Braun SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(MI); 1419f842297dSMatthias Braun assert(getMBBStartIdx(MI.getParent()) <= OldIndex && 1420f842297dSMatthias Braun OldIndex < getMBBEndIdx(MI.getParent()) && 1421f842297dSMatthias Braun "Cannot handle moves across basic block boundaries."); 1422f842297dSMatthias Braun 1423f842297dSMatthias Braun HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags); 1424f842297dSMatthias Braun HME.updateAllRanges(&MI); 1425f842297dSMatthias Braun } 1426f842297dSMatthias Braun 1427f842297dSMatthias Braun void LiveIntervals::handleMoveIntoBundle(MachineInstr &MI, 1428f842297dSMatthias Braun MachineInstr &BundleStart, 1429f842297dSMatthias Braun bool UpdateFlags) { 1430f842297dSMatthias Braun SlotIndex OldIndex = Indexes->getInstructionIndex(MI); 1431f842297dSMatthias Braun SlotIndex NewIndex = Indexes->getInstructionIndex(BundleStart); 1432f842297dSMatthias Braun HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags); 1433f842297dSMatthias Braun HME.updateAllRanges(&MI); 1434f842297dSMatthias Braun } 1435f842297dSMatthias Braun 1436f842297dSMatthias Braun void LiveIntervals::repairOldRegInRange(const MachineBasicBlock::iterator Begin, 1437f842297dSMatthias Braun const MachineBasicBlock::iterator End, 1438f842297dSMatthias Braun const SlotIndex endIdx, 1439f842297dSMatthias Braun LiveRange &LR, const unsigned Reg, 1440f842297dSMatthias Braun LaneBitmask LaneMask) { 1441f842297dSMatthias Braun LiveInterval::iterator LII = LR.find(endIdx); 1442f842297dSMatthias Braun SlotIndex lastUseIdx; 1443f842297dSMatthias Braun if (LII == LR.begin()) { 1444f842297dSMatthias Braun // This happens when the function is called for a subregister that only 1445f842297dSMatthias Braun // occurs _after_ the range that is to be repaired. 1446f842297dSMatthias Braun return; 1447f842297dSMatthias Braun } 1448f842297dSMatthias Braun if (LII != LR.end() && LII->start < endIdx) 1449f842297dSMatthias Braun lastUseIdx = LII->end; 1450f842297dSMatthias Braun else 1451f842297dSMatthias Braun --LII; 1452f842297dSMatthias Braun 1453f842297dSMatthias Braun for (MachineBasicBlock::iterator I = End; I != Begin;) { 1454f842297dSMatthias Braun --I; 1455f842297dSMatthias Braun MachineInstr &MI = *I; 1456*801bf7ebSShiva Chen if (MI.isDebugInstr()) 1457f842297dSMatthias Braun continue; 1458f842297dSMatthias Braun 1459f842297dSMatthias Braun SlotIndex instrIdx = getInstructionIndex(MI); 1460f842297dSMatthias Braun bool isStartValid = getInstructionFromIndex(LII->start); 1461f842297dSMatthias Braun bool isEndValid = getInstructionFromIndex(LII->end); 1462f842297dSMatthias Braun 1463f842297dSMatthias Braun // FIXME: This doesn't currently handle early-clobber or multiple removed 1464f842297dSMatthias Braun // defs inside of the region to repair. 1465f842297dSMatthias Braun for (MachineInstr::mop_iterator OI = MI.operands_begin(), 1466f842297dSMatthias Braun OE = MI.operands_end(); 1467f842297dSMatthias Braun OI != OE; ++OI) { 1468f842297dSMatthias Braun const MachineOperand &MO = *OI; 1469f842297dSMatthias Braun if (!MO.isReg() || MO.getReg() != Reg) 1470f842297dSMatthias Braun continue; 1471f842297dSMatthias Braun 1472f842297dSMatthias Braun unsigned SubReg = MO.getSubReg(); 1473f842297dSMatthias Braun LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg); 1474f842297dSMatthias Braun if ((Mask & LaneMask).none()) 1475f842297dSMatthias Braun continue; 1476f842297dSMatthias Braun 1477f842297dSMatthias Braun if (MO.isDef()) { 1478f842297dSMatthias Braun if (!isStartValid) { 1479f842297dSMatthias Braun if (LII->end.isDead()) { 1480f842297dSMatthias Braun SlotIndex prevStart; 1481f842297dSMatthias Braun if (LII != LR.begin()) 1482f842297dSMatthias Braun prevStart = std::prev(LII)->start; 1483f842297dSMatthias Braun 1484f842297dSMatthias Braun // FIXME: This could be more efficient if there was a 1485f842297dSMatthias Braun // removeSegment method that returned an iterator. 1486f842297dSMatthias Braun LR.removeSegment(*LII, true); 1487f842297dSMatthias Braun if (prevStart.isValid()) 1488f842297dSMatthias Braun LII = LR.find(prevStart); 1489f842297dSMatthias Braun else 1490f842297dSMatthias Braun LII = LR.begin(); 1491f842297dSMatthias Braun } else { 1492f842297dSMatthias Braun LII->start = instrIdx.getRegSlot(); 1493f842297dSMatthias Braun LII->valno->def = instrIdx.getRegSlot(); 1494f842297dSMatthias Braun if (MO.getSubReg() && !MO.isUndef()) 1495f842297dSMatthias Braun lastUseIdx = instrIdx.getRegSlot(); 1496f842297dSMatthias Braun else 1497f842297dSMatthias Braun lastUseIdx = SlotIndex(); 1498f842297dSMatthias Braun continue; 1499f842297dSMatthias Braun } 1500f842297dSMatthias Braun } 1501f842297dSMatthias Braun 1502f842297dSMatthias Braun if (!lastUseIdx.isValid()) { 1503f842297dSMatthias Braun VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator); 1504f842297dSMatthias Braun LiveRange::Segment S(instrIdx.getRegSlot(), 1505f842297dSMatthias Braun instrIdx.getDeadSlot(), VNI); 1506f842297dSMatthias Braun LII = LR.addSegment(S); 1507f842297dSMatthias Braun } else if (LII->start != instrIdx.getRegSlot()) { 1508f842297dSMatthias Braun VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator); 1509f842297dSMatthias Braun LiveRange::Segment S(instrIdx.getRegSlot(), lastUseIdx, VNI); 1510f842297dSMatthias Braun LII = LR.addSegment(S); 1511f842297dSMatthias Braun } 1512f842297dSMatthias Braun 1513f842297dSMatthias Braun if (MO.getSubReg() && !MO.isUndef()) 1514f842297dSMatthias Braun lastUseIdx = instrIdx.getRegSlot(); 1515f842297dSMatthias Braun else 1516f842297dSMatthias Braun lastUseIdx = SlotIndex(); 1517f842297dSMatthias Braun } else if (MO.isUse()) { 1518f842297dSMatthias Braun // FIXME: This should probably be handled outside of this branch, 1519f842297dSMatthias Braun // either as part of the def case (for defs inside of the region) or 1520f842297dSMatthias Braun // after the loop over the region. 1521f842297dSMatthias Braun if (!isEndValid && !LII->end.isBlock()) 1522f842297dSMatthias Braun LII->end = instrIdx.getRegSlot(); 1523f842297dSMatthias Braun if (!lastUseIdx.isValid()) 1524f842297dSMatthias Braun lastUseIdx = instrIdx.getRegSlot(); 1525f842297dSMatthias Braun } 1526f842297dSMatthias Braun } 1527f842297dSMatthias Braun } 1528f842297dSMatthias Braun } 1529f842297dSMatthias Braun 1530f842297dSMatthias Braun void 1531f842297dSMatthias Braun LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB, 1532f842297dSMatthias Braun MachineBasicBlock::iterator Begin, 1533f842297dSMatthias Braun MachineBasicBlock::iterator End, 1534f842297dSMatthias Braun ArrayRef<unsigned> OrigRegs) { 1535f842297dSMatthias Braun // Find anchor points, which are at the beginning/end of blocks or at 1536f842297dSMatthias Braun // instructions that already have indexes. 1537f842297dSMatthias Braun while (Begin != MBB->begin() && !Indexes->hasIndex(*Begin)) 1538f842297dSMatthias Braun --Begin; 1539f842297dSMatthias Braun while (End != MBB->end() && !Indexes->hasIndex(*End)) 1540f842297dSMatthias Braun ++End; 1541f842297dSMatthias Braun 1542f842297dSMatthias Braun SlotIndex endIdx; 1543f842297dSMatthias Braun if (End == MBB->end()) 1544f842297dSMatthias Braun endIdx = getMBBEndIdx(MBB).getPrevSlot(); 1545f842297dSMatthias Braun else 1546f842297dSMatthias Braun endIdx = getInstructionIndex(*End); 1547f842297dSMatthias Braun 1548f842297dSMatthias Braun Indexes->repairIndexesInRange(MBB, Begin, End); 1549f842297dSMatthias Braun 1550f842297dSMatthias Braun for (MachineBasicBlock::iterator I = End; I != Begin;) { 1551f842297dSMatthias Braun --I; 1552f842297dSMatthias Braun MachineInstr &MI = *I; 1553*801bf7ebSShiva Chen if (MI.isDebugInstr()) 1554f842297dSMatthias Braun continue; 1555f842297dSMatthias Braun for (MachineInstr::const_mop_iterator MOI = MI.operands_begin(), 1556f842297dSMatthias Braun MOE = MI.operands_end(); 1557f842297dSMatthias Braun MOI != MOE; ++MOI) { 1558f842297dSMatthias Braun if (MOI->isReg() && 1559f842297dSMatthias Braun TargetRegisterInfo::isVirtualRegister(MOI->getReg()) && 1560f842297dSMatthias Braun !hasInterval(MOI->getReg())) { 1561f842297dSMatthias Braun createAndComputeVirtRegInterval(MOI->getReg()); 1562f842297dSMatthias Braun } 1563f842297dSMatthias Braun } 1564f842297dSMatthias Braun } 1565f842297dSMatthias Braun 1566f842297dSMatthias Braun for (unsigned Reg : OrigRegs) { 1567f842297dSMatthias Braun if (!TargetRegisterInfo::isVirtualRegister(Reg)) 1568f842297dSMatthias Braun continue; 1569f842297dSMatthias Braun 1570f842297dSMatthias Braun LiveInterval &LI = getInterval(Reg); 1571f842297dSMatthias Braun // FIXME: Should we support undefs that gain defs? 1572f842297dSMatthias Braun if (!LI.hasAtLeastOneValue()) 1573f842297dSMatthias Braun continue; 1574f842297dSMatthias Braun 1575f842297dSMatthias Braun for (LiveInterval::SubRange &S : LI.subranges()) 1576f842297dSMatthias Braun repairOldRegInRange(Begin, End, endIdx, S, Reg, S.LaneMask); 1577f842297dSMatthias Braun 1578f842297dSMatthias Braun repairOldRegInRange(Begin, End, endIdx, LI, Reg); 1579f842297dSMatthias Braun } 1580f842297dSMatthias Braun } 1581f842297dSMatthias Braun 1582f842297dSMatthias Braun void LiveIntervals::removePhysRegDefAt(unsigned Reg, SlotIndex Pos) { 1583f842297dSMatthias Braun for (MCRegUnitIterator Unit(Reg, TRI); Unit.isValid(); ++Unit) { 1584f842297dSMatthias Braun if (LiveRange *LR = getCachedRegUnit(*Unit)) 1585f842297dSMatthias Braun if (VNInfo *VNI = LR->getVNInfoAt(Pos)) 1586f842297dSMatthias Braun LR->removeValNo(VNI); 1587f842297dSMatthias Braun } 1588f842297dSMatthias Braun } 1589f842297dSMatthias Braun 1590f842297dSMatthias Braun void LiveIntervals::removeVRegDefAt(LiveInterval &LI, SlotIndex Pos) { 1591f842297dSMatthias Braun // LI may not have the main range computed yet, but its subranges may 1592f842297dSMatthias Braun // be present. 1593f842297dSMatthias Braun VNInfo *VNI = LI.getVNInfoAt(Pos); 1594f842297dSMatthias Braun if (VNI != nullptr) { 1595f842297dSMatthias Braun assert(VNI->def.getBaseIndex() == Pos.getBaseIndex()); 1596f842297dSMatthias Braun LI.removeValNo(VNI); 1597f842297dSMatthias Braun } 1598f842297dSMatthias Braun 1599f842297dSMatthias Braun // Also remove the value defined in subranges. 1600f842297dSMatthias Braun for (LiveInterval::SubRange &S : LI.subranges()) { 1601f842297dSMatthias Braun if (VNInfo *SVNI = S.getVNInfoAt(Pos)) 1602f842297dSMatthias Braun if (SVNI->def.getBaseIndex() == Pos.getBaseIndex()) 1603f842297dSMatthias Braun S.removeValNo(SVNI); 1604f842297dSMatthias Braun } 1605f842297dSMatthias Braun LI.removeEmptySubRanges(); 1606f842297dSMatthias Braun } 1607f842297dSMatthias Braun 1608f842297dSMatthias Braun void LiveIntervals::splitSeparateComponents(LiveInterval &LI, 1609f842297dSMatthias Braun SmallVectorImpl<LiveInterval*> &SplitLIs) { 1610f842297dSMatthias Braun ConnectedVNInfoEqClasses ConEQ(*this); 1611f842297dSMatthias Braun unsigned NumComp = ConEQ.Classify(LI); 1612f842297dSMatthias Braun if (NumComp <= 1) 1613f842297dSMatthias Braun return; 1614f842297dSMatthias Braun DEBUG(dbgs() << " Split " << NumComp << " components: " << LI << '\n'); 1615f842297dSMatthias Braun unsigned Reg = LI.reg; 1616f842297dSMatthias Braun const TargetRegisterClass *RegClass = MRI->getRegClass(Reg); 1617f842297dSMatthias Braun for (unsigned I = 1; I < NumComp; ++I) { 1618f842297dSMatthias Braun unsigned NewVReg = MRI->createVirtualRegister(RegClass); 1619f842297dSMatthias Braun LiveInterval &NewLI = createEmptyInterval(NewVReg); 1620f842297dSMatthias Braun SplitLIs.push_back(&NewLI); 1621f842297dSMatthias Braun } 1622f842297dSMatthias Braun ConEQ.Distribute(LI, SplitLIs.data(), *MRI); 1623f842297dSMatthias Braun } 1624f842297dSMatthias Braun 1625f842297dSMatthias Braun void LiveIntervals::constructMainRangeFromSubranges(LiveInterval &LI) { 1626f842297dSMatthias Braun assert(LRCalc && "LRCalc not initialized."); 1627f842297dSMatthias Braun LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); 1628f842297dSMatthias Braun LRCalc->constructMainRangeFromSubranges(LI); 1629f842297dSMatthias Braun } 1630