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