109467b48Spatrick //===- LiveIntervals.cpp - Live Interval Analysis -------------------------===//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick //
909467b48Spatrick /// \file This file implements the LiveInterval analysis pass which is used
1009467b48Spatrick /// by the Linear Scan Register allocator. This pass linearizes the
1109467b48Spatrick /// basic blocks of the function in DFS order and computes live intervals for
1209467b48Spatrick /// each virtual and physical register.
1309467b48Spatrick //
1409467b48Spatrick //===----------------------------------------------------------------------===//
1509467b48Spatrick 
1609467b48Spatrick #include "llvm/CodeGen/LiveIntervals.h"
1709467b48Spatrick #include "llvm/ADT/ArrayRef.h"
1809467b48Spatrick #include "llvm/ADT/DepthFirstIterator.h"
1909467b48Spatrick #include "llvm/ADT/SmallPtrSet.h"
2009467b48Spatrick #include "llvm/ADT/SmallVector.h"
2109467b48Spatrick #include "llvm/ADT/iterator_range.h"
2209467b48Spatrick #include "llvm/CodeGen/LiveInterval.h"
23097a140dSpatrick #include "llvm/CodeGen/LiveIntervalCalc.h"
2409467b48Spatrick #include "llvm/CodeGen/LiveVariables.h"
2509467b48Spatrick #include "llvm/CodeGen/MachineBasicBlock.h"
2609467b48Spatrick #include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
2709467b48Spatrick #include "llvm/CodeGen/MachineDominators.h"
2809467b48Spatrick #include "llvm/CodeGen/MachineFunction.h"
2909467b48Spatrick #include "llvm/CodeGen/MachineInstr.h"
3009467b48Spatrick #include "llvm/CodeGen/MachineInstrBundle.h"
3109467b48Spatrick #include "llvm/CodeGen/MachineOperand.h"
3209467b48Spatrick #include "llvm/CodeGen/MachineRegisterInfo.h"
3309467b48Spatrick #include "llvm/CodeGen/Passes.h"
3409467b48Spatrick #include "llvm/CodeGen/SlotIndexes.h"
35*d415bd75Srobert #include "llvm/CodeGen/StackMaps.h"
3609467b48Spatrick #include "llvm/CodeGen/TargetRegisterInfo.h"
3709467b48Spatrick #include "llvm/CodeGen/TargetSubtargetInfo.h"
3809467b48Spatrick #include "llvm/CodeGen/VirtRegMap.h"
3909467b48Spatrick #include "llvm/Config/llvm-config.h"
4073471bf0Spatrick #include "llvm/IR/Statepoint.h"
4109467b48Spatrick #include "llvm/MC/LaneBitmask.h"
4209467b48Spatrick #include "llvm/MC/MCRegisterInfo.h"
4309467b48Spatrick #include "llvm/Pass.h"
4409467b48Spatrick #include "llvm/Support/CommandLine.h"
4509467b48Spatrick #include "llvm/Support/Compiler.h"
4609467b48Spatrick #include "llvm/Support/Debug.h"
4709467b48Spatrick #include "llvm/Support/MathExtras.h"
4809467b48Spatrick #include "llvm/Support/raw_ostream.h"
4909467b48Spatrick #include <algorithm>
5009467b48Spatrick #include <cassert>
5109467b48Spatrick #include <cstdint>
5209467b48Spatrick #include <iterator>
5309467b48Spatrick #include <tuple>
5409467b48Spatrick #include <utility>
5509467b48Spatrick 
5609467b48Spatrick using namespace llvm;
5709467b48Spatrick 
5809467b48Spatrick #define DEBUG_TYPE "regalloc"
5909467b48Spatrick 
6009467b48Spatrick char LiveIntervals::ID = 0;
6109467b48Spatrick char &llvm::LiveIntervalsID = LiveIntervals::ID;
62*d415bd75Srobert INITIALIZE_PASS_BEGIN(LiveIntervals, "liveintervals", "Live Interval Analysis",
63*d415bd75Srobert                       false, false)
6409467b48Spatrick INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
6509467b48Spatrick INITIALIZE_PASS_DEPENDENCY(SlotIndexes)
6609467b48Spatrick INITIALIZE_PASS_END(LiveIntervals, "liveintervals",
6709467b48Spatrick                 "Live Interval Analysis", false, false)
6809467b48Spatrick 
6909467b48Spatrick #ifndef NDEBUG
7009467b48Spatrick static cl::opt<bool> EnablePrecomputePhysRegs(
7109467b48Spatrick   "precompute-phys-liveness", cl::Hidden,
7209467b48Spatrick   cl::desc("Eagerly compute live intervals for all physreg units."));
7309467b48Spatrick #else
7409467b48Spatrick static bool EnablePrecomputePhysRegs = false;
7509467b48Spatrick #endif // NDEBUG
7609467b48Spatrick 
7709467b48Spatrick namespace llvm {
7809467b48Spatrick 
7909467b48Spatrick cl::opt<bool> UseSegmentSetForPhysRegs(
8009467b48Spatrick     "use-segment-set-for-physregs", cl::Hidden, cl::init(true),
8109467b48Spatrick     cl::desc(
8209467b48Spatrick         "Use segment set for the computation of the live ranges of physregs."));
8309467b48Spatrick 
8409467b48Spatrick } // end namespace llvm
8509467b48Spatrick 
getAnalysisUsage(AnalysisUsage & AU) const8609467b48Spatrick void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const {
8709467b48Spatrick   AU.setPreservesCFG();
8809467b48Spatrick   AU.addPreserved<LiveVariables>();
8909467b48Spatrick   AU.addPreservedID(MachineLoopInfoID);
9009467b48Spatrick   AU.addRequiredTransitiveID(MachineDominatorsID);
9109467b48Spatrick   AU.addPreservedID(MachineDominatorsID);
9209467b48Spatrick   AU.addPreserved<SlotIndexes>();
9309467b48Spatrick   AU.addRequiredTransitive<SlotIndexes>();
9409467b48Spatrick   MachineFunctionPass::getAnalysisUsage(AU);
9509467b48Spatrick }
9609467b48Spatrick 
LiveIntervals()9709467b48Spatrick LiveIntervals::LiveIntervals() : MachineFunctionPass(ID) {
9809467b48Spatrick   initializeLiveIntervalsPass(*PassRegistry::getPassRegistry());
9909467b48Spatrick }
10009467b48Spatrick 
~LiveIntervals()101097a140dSpatrick LiveIntervals::~LiveIntervals() { delete LICalc; }
10209467b48Spatrick 
releaseMemory()10309467b48Spatrick void LiveIntervals::releaseMemory() {
10409467b48Spatrick   // Free the live intervals themselves.
10509467b48Spatrick   for (unsigned i = 0, e = VirtRegIntervals.size(); i != e; ++i)
10609467b48Spatrick     delete VirtRegIntervals[Register::index2VirtReg(i)];
10709467b48Spatrick   VirtRegIntervals.clear();
10809467b48Spatrick   RegMaskSlots.clear();
10909467b48Spatrick   RegMaskBits.clear();
11009467b48Spatrick   RegMaskBlocks.clear();
11109467b48Spatrick 
11209467b48Spatrick   for (LiveRange *LR : RegUnitRanges)
11309467b48Spatrick     delete LR;
11409467b48Spatrick   RegUnitRanges.clear();
11509467b48Spatrick 
11609467b48Spatrick   // Release VNInfo memory regions, VNInfo objects don't need to be dtor'd.
11709467b48Spatrick   VNInfoAllocator.Reset();
11809467b48Spatrick }
11909467b48Spatrick 
runOnMachineFunction(MachineFunction & fn)12009467b48Spatrick bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
12109467b48Spatrick   MF = &fn;
12209467b48Spatrick   MRI = &MF->getRegInfo();
12309467b48Spatrick   TRI = MF->getSubtarget().getRegisterInfo();
12409467b48Spatrick   TII = MF->getSubtarget().getInstrInfo();
12509467b48Spatrick   Indexes = &getAnalysis<SlotIndexes>();
12609467b48Spatrick   DomTree = &getAnalysis<MachineDominatorTree>();
12709467b48Spatrick 
128097a140dSpatrick   if (!LICalc)
129097a140dSpatrick     LICalc = new LiveIntervalCalc();
13009467b48Spatrick 
13109467b48Spatrick   // Allocate space for all virtual registers.
13209467b48Spatrick   VirtRegIntervals.resize(MRI->getNumVirtRegs());
13309467b48Spatrick 
13409467b48Spatrick   computeVirtRegs();
13509467b48Spatrick   computeRegMasks();
13609467b48Spatrick   computeLiveInRegUnits();
13709467b48Spatrick 
13809467b48Spatrick   if (EnablePrecomputePhysRegs) {
13909467b48Spatrick     // For stress testing, precompute live ranges of all physical register
14009467b48Spatrick     // units, including reserved registers.
14109467b48Spatrick     for (unsigned i = 0, e = TRI->getNumRegUnits(); i != e; ++i)
14209467b48Spatrick       getRegUnit(i);
14309467b48Spatrick   }
14409467b48Spatrick   LLVM_DEBUG(dump());
145*d415bd75Srobert   return false;
14609467b48Spatrick }
14709467b48Spatrick 
print(raw_ostream & OS,const Module *) const14809467b48Spatrick void LiveIntervals::print(raw_ostream &OS, const Module* ) const {
14909467b48Spatrick   OS << "********** INTERVALS **********\n";
15009467b48Spatrick 
15109467b48Spatrick   // Dump the regunits.
15209467b48Spatrick   for (unsigned Unit = 0, UnitE = RegUnitRanges.size(); Unit != UnitE; ++Unit)
15309467b48Spatrick     if (LiveRange *LR = RegUnitRanges[Unit])
15409467b48Spatrick       OS << printRegUnit(Unit, TRI) << ' ' << *LR << '\n';
15509467b48Spatrick 
15609467b48Spatrick   // Dump the virtregs.
15709467b48Spatrick   for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
15873471bf0Spatrick     Register Reg = Register::index2VirtReg(i);
15909467b48Spatrick     if (hasInterval(Reg))
16009467b48Spatrick       OS << getInterval(Reg) << '\n';
16109467b48Spatrick   }
16209467b48Spatrick 
16309467b48Spatrick   OS << "RegMasks:";
16409467b48Spatrick   for (SlotIndex Idx : RegMaskSlots)
16509467b48Spatrick     OS << ' ' << Idx;
16609467b48Spatrick   OS << '\n';
16709467b48Spatrick 
16809467b48Spatrick   printInstrs(OS);
16909467b48Spatrick }
17009467b48Spatrick 
printInstrs(raw_ostream & OS) const17109467b48Spatrick void LiveIntervals::printInstrs(raw_ostream &OS) const {
17209467b48Spatrick   OS << "********** MACHINEINSTRS **********\n";
17309467b48Spatrick   MF->print(OS, Indexes);
17409467b48Spatrick }
17509467b48Spatrick 
17609467b48Spatrick #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dumpInstrs() const17709467b48Spatrick LLVM_DUMP_METHOD void LiveIntervals::dumpInstrs() const {
17809467b48Spatrick   printInstrs(dbgs());
17909467b48Spatrick }
18009467b48Spatrick #endif
18109467b48Spatrick 
createInterval(Register reg)18273471bf0Spatrick LiveInterval *LiveIntervals::createInterval(Register reg) {
183*d415bd75Srobert   float Weight = reg.isPhysical() ? huge_valf : 0.0F;
18409467b48Spatrick   return new LiveInterval(reg, Weight);
18509467b48Spatrick }
18609467b48Spatrick 
18709467b48Spatrick /// Compute the live interval of a virtual register, based on defs and uses.
computeVirtRegInterval(LiveInterval & LI)18809467b48Spatrick bool LiveIntervals::computeVirtRegInterval(LiveInterval &LI) {
189097a140dSpatrick   assert(LICalc && "LICalc not initialized.");
19009467b48Spatrick   assert(LI.empty() && "Should only compute empty intervals.");
191097a140dSpatrick   LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
19273471bf0Spatrick   LICalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.reg()));
19309467b48Spatrick   return computeDeadValues(LI, nullptr);
19409467b48Spatrick }
19509467b48Spatrick 
computeVirtRegs()19609467b48Spatrick void LiveIntervals::computeVirtRegs() {
19709467b48Spatrick   for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
19873471bf0Spatrick     Register Reg = Register::index2VirtReg(i);
19909467b48Spatrick     if (MRI->reg_nodbg_empty(Reg))
20009467b48Spatrick       continue;
20109467b48Spatrick     LiveInterval &LI = createEmptyInterval(Reg);
20209467b48Spatrick     bool NeedSplit = computeVirtRegInterval(LI);
20309467b48Spatrick     if (NeedSplit) {
20409467b48Spatrick       SmallVector<LiveInterval*, 8> SplitLIs;
20509467b48Spatrick       splitSeparateComponents(LI, SplitLIs);
20609467b48Spatrick     }
20709467b48Spatrick   }
20809467b48Spatrick }
20909467b48Spatrick 
computeRegMasks()21009467b48Spatrick void LiveIntervals::computeRegMasks() {
21109467b48Spatrick   RegMaskBlocks.resize(MF->getNumBlockIDs());
21209467b48Spatrick 
21309467b48Spatrick   // Find all instructions with regmask operands.
21409467b48Spatrick   for (const MachineBasicBlock &MBB : *MF) {
21509467b48Spatrick     std::pair<unsigned, unsigned> &RMB = RegMaskBlocks[MBB.getNumber()];
21609467b48Spatrick     RMB.first = RegMaskSlots.size();
21709467b48Spatrick 
21809467b48Spatrick     // Some block starts, such as EH funclets, create masks.
21909467b48Spatrick     if (const uint32_t *Mask = MBB.getBeginClobberMask(TRI)) {
22009467b48Spatrick       RegMaskSlots.push_back(Indexes->getMBBStartIdx(&MBB));
22109467b48Spatrick       RegMaskBits.push_back(Mask);
22209467b48Spatrick     }
22309467b48Spatrick 
22473471bf0Spatrick     // Unwinders may clobber additional registers.
22573471bf0Spatrick     // FIXME: This functionality can possibly be merged into
22673471bf0Spatrick     // MachineBasicBlock::getBeginClobberMask().
22773471bf0Spatrick     if (MBB.isEHPad())
22873471bf0Spatrick       if (auto *Mask = TRI->getCustomEHPadPreservedMask(*MBB.getParent())) {
22973471bf0Spatrick         RegMaskSlots.push_back(Indexes->getMBBStartIdx(&MBB));
23073471bf0Spatrick         RegMaskBits.push_back(Mask);
23173471bf0Spatrick       }
23273471bf0Spatrick 
23309467b48Spatrick     for (const MachineInstr &MI : MBB) {
23409467b48Spatrick       for (const MachineOperand &MO : MI.operands()) {
23509467b48Spatrick         if (!MO.isRegMask())
23609467b48Spatrick           continue;
23709467b48Spatrick         RegMaskSlots.push_back(Indexes->getInstructionIndex(MI).getRegSlot());
23809467b48Spatrick         RegMaskBits.push_back(MO.getRegMask());
23909467b48Spatrick       }
24009467b48Spatrick     }
24109467b48Spatrick 
24209467b48Spatrick     // Some block ends, such as funclet returns, create masks. Put the mask on
24309467b48Spatrick     // the last instruction of the block, because MBB slot index intervals are
24409467b48Spatrick     // half-open.
24509467b48Spatrick     if (const uint32_t *Mask = MBB.getEndClobberMask(TRI)) {
24609467b48Spatrick       assert(!MBB.empty() && "empty return block?");
24709467b48Spatrick       RegMaskSlots.push_back(
24809467b48Spatrick           Indexes->getInstructionIndex(MBB.back()).getRegSlot());
24909467b48Spatrick       RegMaskBits.push_back(Mask);
25009467b48Spatrick     }
25109467b48Spatrick 
25209467b48Spatrick     // Compute the number of register mask instructions in this block.
25309467b48Spatrick     RMB.second = RegMaskSlots.size() - RMB.first;
25409467b48Spatrick   }
25509467b48Spatrick }
25609467b48Spatrick 
25709467b48Spatrick //===----------------------------------------------------------------------===//
25809467b48Spatrick //                           Register Unit Liveness
25909467b48Spatrick //===----------------------------------------------------------------------===//
26009467b48Spatrick //
26109467b48Spatrick // Fixed interference typically comes from ABI boundaries: Function arguments
26209467b48Spatrick // and return values are passed in fixed registers, and so are exception
26309467b48Spatrick // pointers entering landing pads. Certain instructions require values to be
26409467b48Spatrick // present in specific registers. That is also represented through fixed
26509467b48Spatrick // interference.
26609467b48Spatrick //
26709467b48Spatrick 
26809467b48Spatrick /// Compute the live range of a register unit, based on the uses and defs of
26909467b48Spatrick /// aliasing registers.  The range should be empty, or contain only dead
27009467b48Spatrick /// phi-defs from ABI blocks.
computeRegUnitRange(LiveRange & LR,unsigned Unit)27109467b48Spatrick void LiveIntervals::computeRegUnitRange(LiveRange &LR, unsigned Unit) {
272097a140dSpatrick   assert(LICalc && "LICalc not initialized.");
273097a140dSpatrick   LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
27409467b48Spatrick 
27509467b48Spatrick   // The physregs aliasing Unit are the roots and their super-registers.
27609467b48Spatrick   // Create all values as dead defs before extending to uses. Note that roots
27709467b48Spatrick   // may share super-registers. That's OK because createDeadDefs() is
27809467b48Spatrick   // idempotent. It is very rare for a register unit to have multiple roots, so
27909467b48Spatrick   // uniquing super-registers is probably not worthwhile.
28009467b48Spatrick   bool IsReserved = false;
28109467b48Spatrick   for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
28209467b48Spatrick     bool IsRootReserved = true;
28309467b48Spatrick     for (MCSuperRegIterator Super(*Root, TRI, /*IncludeSelf=*/true);
28409467b48Spatrick          Super.isValid(); ++Super) {
28573471bf0Spatrick       MCRegister Reg = *Super;
28609467b48Spatrick       if (!MRI->reg_empty(Reg))
287097a140dSpatrick         LICalc->createDeadDefs(LR, Reg);
28809467b48Spatrick       // A register unit is considered reserved if all its roots and all their
28909467b48Spatrick       // super registers are reserved.
29009467b48Spatrick       if (!MRI->isReserved(Reg))
29109467b48Spatrick         IsRootReserved = false;
29209467b48Spatrick     }
29309467b48Spatrick     IsReserved |= IsRootReserved;
29409467b48Spatrick   }
29509467b48Spatrick   assert(IsReserved == MRI->isReservedRegUnit(Unit) &&
29609467b48Spatrick          "reserved computation mismatch");
29709467b48Spatrick 
29809467b48Spatrick   // Now extend LR to reach all uses.
29909467b48Spatrick   // Ignore uses of reserved registers. We only track defs of those.
30009467b48Spatrick   if (!IsReserved) {
30109467b48Spatrick     for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
30209467b48Spatrick       for (MCSuperRegIterator Super(*Root, TRI, /*IncludeSelf=*/true);
30309467b48Spatrick            Super.isValid(); ++Super) {
30473471bf0Spatrick         MCRegister Reg = *Super;
30509467b48Spatrick         if (!MRI->reg_empty(Reg))
306097a140dSpatrick           LICalc->extendToUses(LR, Reg);
30709467b48Spatrick       }
30809467b48Spatrick     }
30909467b48Spatrick   }
31009467b48Spatrick 
31109467b48Spatrick   // Flush the segment set to the segment vector.
31209467b48Spatrick   if (UseSegmentSetForPhysRegs)
31309467b48Spatrick     LR.flushSegmentSet();
31409467b48Spatrick }
31509467b48Spatrick 
31609467b48Spatrick /// Precompute the live ranges of any register units that are live-in to an ABI
31709467b48Spatrick /// block somewhere. Register values can appear without a corresponding def when
31809467b48Spatrick /// entering the entry block or a landing pad.
computeLiveInRegUnits()31909467b48Spatrick void LiveIntervals::computeLiveInRegUnits() {
32009467b48Spatrick   RegUnitRanges.resize(TRI->getNumRegUnits());
32109467b48Spatrick   LLVM_DEBUG(dbgs() << "Computing live-in reg-units in ABI blocks.\n");
32209467b48Spatrick 
32309467b48Spatrick   // Keep track of the live range sets allocated.
32409467b48Spatrick   SmallVector<unsigned, 8> NewRanges;
32509467b48Spatrick 
32609467b48Spatrick   // Check all basic blocks for live-ins.
32709467b48Spatrick   for (const MachineBasicBlock &MBB : *MF) {
32809467b48Spatrick     // We only care about ABI blocks: Entry + landing pads.
32909467b48Spatrick     if ((&MBB != &MF->front() && !MBB.isEHPad()) || MBB.livein_empty())
33009467b48Spatrick       continue;
33109467b48Spatrick 
33209467b48Spatrick     // Create phi-defs at Begin for all live-in registers.
33309467b48Spatrick     SlotIndex Begin = Indexes->getMBBStartIdx(&MBB);
33409467b48Spatrick     LLVM_DEBUG(dbgs() << Begin << "\t" << printMBBReference(MBB));
33509467b48Spatrick     for (const auto &LI : MBB.liveins()) {
33609467b48Spatrick       for (MCRegUnitIterator Units(LI.PhysReg, TRI); Units.isValid(); ++Units) {
33709467b48Spatrick         unsigned Unit = *Units;
33809467b48Spatrick         LiveRange *LR = RegUnitRanges[Unit];
33909467b48Spatrick         if (!LR) {
34009467b48Spatrick           // Use segment set to speed-up initial computation of the live range.
34109467b48Spatrick           LR = RegUnitRanges[Unit] = new LiveRange(UseSegmentSetForPhysRegs);
34209467b48Spatrick           NewRanges.push_back(Unit);
34309467b48Spatrick         }
34409467b48Spatrick         VNInfo *VNI = LR->createDeadDef(Begin, getVNInfoAllocator());
34509467b48Spatrick         (void)VNI;
34609467b48Spatrick         LLVM_DEBUG(dbgs() << ' ' << printRegUnit(Unit, TRI) << '#' << VNI->id);
34709467b48Spatrick       }
34809467b48Spatrick     }
34909467b48Spatrick     LLVM_DEBUG(dbgs() << '\n');
35009467b48Spatrick   }
35109467b48Spatrick   LLVM_DEBUG(dbgs() << "Created " << NewRanges.size() << " new intervals.\n");
35209467b48Spatrick 
35309467b48Spatrick   // Compute the 'normal' part of the ranges.
35409467b48Spatrick   for (unsigned Unit : NewRanges)
35509467b48Spatrick     computeRegUnitRange(*RegUnitRanges[Unit], Unit);
35609467b48Spatrick }
35709467b48Spatrick 
createSegmentsForValues(LiveRange & LR,iterator_range<LiveInterval::vni_iterator> VNIs)35809467b48Spatrick static void createSegmentsForValues(LiveRange &LR,
35909467b48Spatrick     iterator_range<LiveInterval::vni_iterator> VNIs) {
36009467b48Spatrick   for (VNInfo *VNI : VNIs) {
36109467b48Spatrick     if (VNI->isUnused())
36209467b48Spatrick       continue;
36309467b48Spatrick     SlotIndex Def = VNI->def;
36409467b48Spatrick     LR.addSegment(LiveRange::Segment(Def, Def.getDeadSlot(), VNI));
36509467b48Spatrick   }
36609467b48Spatrick }
36709467b48Spatrick 
extendSegmentsToUses(LiveRange & Segments,ShrinkToUsesWorkList & WorkList,Register Reg,LaneBitmask LaneMask)36809467b48Spatrick void LiveIntervals::extendSegmentsToUses(LiveRange &Segments,
36909467b48Spatrick                                          ShrinkToUsesWorkList &WorkList,
37073471bf0Spatrick                                          Register Reg, LaneBitmask LaneMask) {
37109467b48Spatrick   // Keep track of the PHIs that are in use.
37209467b48Spatrick   SmallPtrSet<VNInfo*, 8> UsedPHIs;
37309467b48Spatrick   // Blocks that have already been added to WorkList as live-out.
37409467b48Spatrick   SmallPtrSet<const MachineBasicBlock*, 16> LiveOut;
37509467b48Spatrick 
37609467b48Spatrick   auto getSubRange = [](const LiveInterval &I, LaneBitmask M)
37709467b48Spatrick         -> const LiveRange& {
37809467b48Spatrick     if (M.none())
37909467b48Spatrick       return I;
38009467b48Spatrick     for (const LiveInterval::SubRange &SR : I.subranges()) {
38109467b48Spatrick       if ((SR.LaneMask & M).any()) {
38209467b48Spatrick         assert(SR.LaneMask == M && "Expecting lane masks to match exactly");
38309467b48Spatrick         return SR;
38409467b48Spatrick       }
38509467b48Spatrick     }
38609467b48Spatrick     llvm_unreachable("Subrange for mask not found");
38709467b48Spatrick   };
38809467b48Spatrick 
38909467b48Spatrick   const LiveInterval &LI = getInterval(Reg);
39009467b48Spatrick   const LiveRange &OldRange = getSubRange(LI, LaneMask);
39109467b48Spatrick 
39209467b48Spatrick   // Extend intervals to reach all uses in WorkList.
39309467b48Spatrick   while (!WorkList.empty()) {
39409467b48Spatrick     SlotIndex Idx = WorkList.back().first;
39509467b48Spatrick     VNInfo *VNI = WorkList.back().second;
39609467b48Spatrick     WorkList.pop_back();
39709467b48Spatrick     const MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Idx.getPrevSlot());
39809467b48Spatrick     SlotIndex BlockStart = Indexes->getMBBStartIdx(MBB);
39909467b48Spatrick 
40009467b48Spatrick     // Extend the live range for VNI to be live at Idx.
40109467b48Spatrick     if (VNInfo *ExtVNI = Segments.extendInBlock(BlockStart, Idx)) {
40209467b48Spatrick       assert(ExtVNI == VNI && "Unexpected existing value number");
40309467b48Spatrick       (void)ExtVNI;
40409467b48Spatrick       // Is this a PHIDef we haven't seen before?
40509467b48Spatrick       if (!VNI->isPHIDef() || VNI->def != BlockStart ||
40609467b48Spatrick           !UsedPHIs.insert(VNI).second)
40709467b48Spatrick         continue;
40809467b48Spatrick       // The PHI is live, make sure the predecessors are live-out.
40909467b48Spatrick       for (const MachineBasicBlock *Pred : MBB->predecessors()) {
41009467b48Spatrick         if (!LiveOut.insert(Pred).second)
41109467b48Spatrick           continue;
41209467b48Spatrick         SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
41309467b48Spatrick         // A predecessor is not required to have a live-out value for a PHI.
41409467b48Spatrick         if (VNInfo *PVNI = OldRange.getVNInfoBefore(Stop))
41509467b48Spatrick           WorkList.push_back(std::make_pair(Stop, PVNI));
41609467b48Spatrick       }
41709467b48Spatrick       continue;
41809467b48Spatrick     }
41909467b48Spatrick 
42009467b48Spatrick     // VNI is live-in to MBB.
42109467b48Spatrick     LLVM_DEBUG(dbgs() << " live-in at " << BlockStart << '\n');
42209467b48Spatrick     Segments.addSegment(LiveRange::Segment(BlockStart, Idx, VNI));
42309467b48Spatrick 
42409467b48Spatrick     // Make sure VNI is live-out from the predecessors.
42509467b48Spatrick     for (const MachineBasicBlock *Pred : MBB->predecessors()) {
42609467b48Spatrick       if (!LiveOut.insert(Pred).second)
42709467b48Spatrick         continue;
42809467b48Spatrick       SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
42909467b48Spatrick       if (VNInfo *OldVNI = OldRange.getVNInfoBefore(Stop)) {
43009467b48Spatrick         assert(OldVNI == VNI && "Wrong value out of predecessor");
43109467b48Spatrick         (void)OldVNI;
43209467b48Spatrick         WorkList.push_back(std::make_pair(Stop, VNI));
43309467b48Spatrick       } else {
43409467b48Spatrick #ifndef NDEBUG
43509467b48Spatrick         // There was no old VNI. Verify that Stop is jointly dominated
43609467b48Spatrick         // by <undef>s for this live range.
43709467b48Spatrick         assert(LaneMask.any() &&
43809467b48Spatrick                "Missing value out of predecessor for main range");
43909467b48Spatrick         SmallVector<SlotIndex,8> Undefs;
44009467b48Spatrick         LI.computeSubRangeUndefs(Undefs, LaneMask, *MRI, *Indexes);
44109467b48Spatrick         assert(LiveRangeCalc::isJointlyDominated(Pred, Undefs, *Indexes) &&
44209467b48Spatrick                "Missing value out of predecessor for subrange");
44309467b48Spatrick #endif
44409467b48Spatrick       }
44509467b48Spatrick     }
44609467b48Spatrick   }
44709467b48Spatrick }
44809467b48Spatrick 
shrinkToUses(LiveInterval * li,SmallVectorImpl<MachineInstr * > * dead)44909467b48Spatrick bool LiveIntervals::shrinkToUses(LiveInterval *li,
45009467b48Spatrick                                  SmallVectorImpl<MachineInstr*> *dead) {
45109467b48Spatrick   LLVM_DEBUG(dbgs() << "Shrink: " << *li << '\n');
452*d415bd75Srobert   assert(li->reg().isVirtual() && "Can only shrink virtual registers");
45309467b48Spatrick 
45409467b48Spatrick   // Shrink subregister live ranges.
45509467b48Spatrick   bool NeedsCleanup = false;
45609467b48Spatrick   for (LiveInterval::SubRange &S : li->subranges()) {
45773471bf0Spatrick     shrinkToUses(S, li->reg());
45809467b48Spatrick     if (S.empty())
45909467b48Spatrick       NeedsCleanup = true;
46009467b48Spatrick   }
46109467b48Spatrick   if (NeedsCleanup)
46209467b48Spatrick     li->removeEmptySubRanges();
46309467b48Spatrick 
46409467b48Spatrick   // Find all the values used, including PHI kills.
46509467b48Spatrick   ShrinkToUsesWorkList WorkList;
46609467b48Spatrick 
46773471bf0Spatrick   // Visit all instructions reading li->reg().
46873471bf0Spatrick   Register Reg = li->reg();
46909467b48Spatrick   for (MachineInstr &UseMI : MRI->reg_instructions(Reg)) {
47073471bf0Spatrick     if (UseMI.isDebugInstr() || !UseMI.readsVirtualRegister(Reg))
47109467b48Spatrick       continue;
47209467b48Spatrick     SlotIndex Idx = getInstructionIndex(UseMI).getRegSlot();
47309467b48Spatrick     LiveQueryResult LRQ = li->Query(Idx);
47409467b48Spatrick     VNInfo *VNI = LRQ.valueIn();
47509467b48Spatrick     if (!VNI) {
47609467b48Spatrick       // This shouldn't happen: readsVirtualRegister returns true, but there is
47709467b48Spatrick       // no live value. It is likely caused by a target getting <undef> flags
47809467b48Spatrick       // wrong.
47909467b48Spatrick       LLVM_DEBUG(
48009467b48Spatrick           dbgs() << Idx << '\t' << UseMI
48109467b48Spatrick                  << "Warning: Instr claims to read non-existent value in "
48209467b48Spatrick                  << *li << '\n');
48309467b48Spatrick       continue;
48409467b48Spatrick     }
48509467b48Spatrick     // Special case: An early-clobber tied operand reads and writes the
48609467b48Spatrick     // register one slot early.
48709467b48Spatrick     if (VNInfo *DefVNI = LRQ.valueDefined())
48809467b48Spatrick       Idx = DefVNI->def;
48909467b48Spatrick 
49009467b48Spatrick     WorkList.push_back(std::make_pair(Idx, VNI));
49109467b48Spatrick   }
49209467b48Spatrick 
49309467b48Spatrick   // Create new live ranges with only minimal live segments per def.
49409467b48Spatrick   LiveRange NewLR;
495*d415bd75Srobert   createSegmentsForValues(NewLR, li->vnis());
49609467b48Spatrick   extendSegmentsToUses(NewLR, WorkList, Reg, LaneBitmask::getNone());
49709467b48Spatrick 
49809467b48Spatrick   // Move the trimmed segments back.
49909467b48Spatrick   li->segments.swap(NewLR.segments);
50009467b48Spatrick 
50109467b48Spatrick   // Handle dead values.
50209467b48Spatrick   bool CanSeparate = computeDeadValues(*li, dead);
50309467b48Spatrick   LLVM_DEBUG(dbgs() << "Shrunk: " << *li << '\n');
50409467b48Spatrick   return CanSeparate;
50509467b48Spatrick }
50609467b48Spatrick 
computeDeadValues(LiveInterval & LI,SmallVectorImpl<MachineInstr * > * dead)50709467b48Spatrick bool LiveIntervals::computeDeadValues(LiveInterval &LI,
50809467b48Spatrick                                       SmallVectorImpl<MachineInstr*> *dead) {
50909467b48Spatrick   bool MayHaveSplitComponents = false;
51009467b48Spatrick 
51109467b48Spatrick   for (VNInfo *VNI : LI.valnos) {
51209467b48Spatrick     if (VNI->isUnused())
51309467b48Spatrick       continue;
51409467b48Spatrick     SlotIndex Def = VNI->def;
51509467b48Spatrick     LiveRange::iterator I = LI.FindSegmentContaining(Def);
51609467b48Spatrick     assert(I != LI.end() && "Missing segment for VNI");
51709467b48Spatrick 
51809467b48Spatrick     // Is the register live before? Otherwise we may have to add a read-undef
51909467b48Spatrick     // flag for subregister defs.
52073471bf0Spatrick     Register VReg = LI.reg();
52109467b48Spatrick     if (MRI->shouldTrackSubRegLiveness(VReg)) {
52209467b48Spatrick       if ((I == LI.begin() || std::prev(I)->end < Def) && !VNI->isPHIDef()) {
52309467b48Spatrick         MachineInstr *MI = getInstructionFromIndex(Def);
52409467b48Spatrick         MI->setRegisterDefReadUndef(VReg);
52509467b48Spatrick       }
52609467b48Spatrick     }
52709467b48Spatrick 
52809467b48Spatrick     if (I->end != Def.getDeadSlot())
52909467b48Spatrick       continue;
53009467b48Spatrick     if (VNI->isPHIDef()) {
53109467b48Spatrick       // This is a dead PHI. Remove it.
53209467b48Spatrick       VNI->markUnused();
53309467b48Spatrick       LI.removeSegment(I);
53409467b48Spatrick       LLVM_DEBUG(dbgs() << "Dead PHI at " << Def << " may separate interval\n");
53509467b48Spatrick     } else {
53609467b48Spatrick       // This is a dead def. Make sure the instruction knows.
53709467b48Spatrick       MachineInstr *MI = getInstructionFromIndex(Def);
53809467b48Spatrick       assert(MI && "No instruction defining live value");
53973471bf0Spatrick       MI->addRegisterDead(LI.reg(), TRI);
54009467b48Spatrick 
54109467b48Spatrick       if (dead && MI->allDefsAreDead()) {
54209467b48Spatrick         LLVM_DEBUG(dbgs() << "All defs dead: " << Def << '\t' << *MI);
54309467b48Spatrick         dead->push_back(MI);
54409467b48Spatrick       }
54509467b48Spatrick     }
546*d415bd75Srobert     MayHaveSplitComponents = true;
54709467b48Spatrick   }
54809467b48Spatrick   return MayHaveSplitComponents;
54909467b48Spatrick }
55009467b48Spatrick 
shrinkToUses(LiveInterval::SubRange & SR,Register Reg)55173471bf0Spatrick void LiveIntervals::shrinkToUses(LiveInterval::SubRange &SR, Register Reg) {
55209467b48Spatrick   LLVM_DEBUG(dbgs() << "Shrink: " << SR << '\n');
553*d415bd75Srobert   assert(Reg.isVirtual() && "Can only shrink virtual registers");
55409467b48Spatrick   // Find all the values used, including PHI kills.
55509467b48Spatrick   ShrinkToUsesWorkList WorkList;
55609467b48Spatrick 
55709467b48Spatrick   // Visit all instructions reading Reg.
55809467b48Spatrick   SlotIndex LastIdx;
55909467b48Spatrick   for (MachineOperand &MO : MRI->use_nodbg_operands(Reg)) {
56009467b48Spatrick     // Skip "undef" uses.
56109467b48Spatrick     if (!MO.readsReg())
56209467b48Spatrick       continue;
56309467b48Spatrick     // Maybe the operand is for a subregister we don't care about.
56409467b48Spatrick     unsigned SubReg = MO.getSubReg();
56509467b48Spatrick     if (SubReg != 0) {
56609467b48Spatrick       LaneBitmask LaneMask = TRI->getSubRegIndexLaneMask(SubReg);
56709467b48Spatrick       if ((LaneMask & SR.LaneMask).none())
56809467b48Spatrick         continue;
56909467b48Spatrick     }
57009467b48Spatrick     // We only need to visit each instruction once.
57109467b48Spatrick     MachineInstr *UseMI = MO.getParent();
57209467b48Spatrick     SlotIndex Idx = getInstructionIndex(*UseMI).getRegSlot();
57309467b48Spatrick     if (Idx == LastIdx)
57409467b48Spatrick       continue;
57509467b48Spatrick     LastIdx = Idx;
57609467b48Spatrick 
57709467b48Spatrick     LiveQueryResult LRQ = SR.Query(Idx);
57809467b48Spatrick     VNInfo *VNI = LRQ.valueIn();
57909467b48Spatrick     // For Subranges it is possible that only undef values are left in that
58009467b48Spatrick     // part of the subregister, so there is no real liverange at the use
58109467b48Spatrick     if (!VNI)
58209467b48Spatrick       continue;
58309467b48Spatrick 
58409467b48Spatrick     // Special case: An early-clobber tied operand reads and writes the
58509467b48Spatrick     // register one slot early.
58609467b48Spatrick     if (VNInfo *DefVNI = LRQ.valueDefined())
58709467b48Spatrick       Idx = DefVNI->def;
58809467b48Spatrick 
58909467b48Spatrick     WorkList.push_back(std::make_pair(Idx, VNI));
59009467b48Spatrick   }
59109467b48Spatrick 
59209467b48Spatrick   // Create a new live ranges with only minimal live segments per def.
59309467b48Spatrick   LiveRange NewLR;
594*d415bd75Srobert   createSegmentsForValues(NewLR, SR.vnis());
59509467b48Spatrick   extendSegmentsToUses(NewLR, WorkList, Reg, SR.LaneMask);
59609467b48Spatrick 
59709467b48Spatrick   // Move the trimmed ranges back.
59809467b48Spatrick   SR.segments.swap(NewLR.segments);
59909467b48Spatrick 
60009467b48Spatrick   // Remove dead PHI value numbers
60109467b48Spatrick   for (VNInfo *VNI : SR.valnos) {
60209467b48Spatrick     if (VNI->isUnused())
60309467b48Spatrick       continue;
60409467b48Spatrick     const LiveRange::Segment *Segment = SR.getSegmentContaining(VNI->def);
60509467b48Spatrick     assert(Segment != nullptr && "Missing segment for VNI");
60609467b48Spatrick     if (Segment->end != VNI->def.getDeadSlot())
60709467b48Spatrick       continue;
60809467b48Spatrick     if (VNI->isPHIDef()) {
60909467b48Spatrick       // This is a dead PHI. Remove it.
61009467b48Spatrick       LLVM_DEBUG(dbgs() << "Dead PHI at " << VNI->def
61109467b48Spatrick                         << " may separate interval\n");
61209467b48Spatrick       VNI->markUnused();
61309467b48Spatrick       SR.removeSegment(*Segment);
61409467b48Spatrick     }
61509467b48Spatrick   }
61609467b48Spatrick 
61709467b48Spatrick   LLVM_DEBUG(dbgs() << "Shrunk: " << SR << '\n');
61809467b48Spatrick }
61909467b48Spatrick 
extendToIndices(LiveRange & LR,ArrayRef<SlotIndex> Indices,ArrayRef<SlotIndex> Undefs)62009467b48Spatrick void LiveIntervals::extendToIndices(LiveRange &LR,
62109467b48Spatrick                                     ArrayRef<SlotIndex> Indices,
62209467b48Spatrick                                     ArrayRef<SlotIndex> Undefs) {
623097a140dSpatrick   assert(LICalc && "LICalc not initialized.");
624097a140dSpatrick   LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
62509467b48Spatrick   for (SlotIndex Idx : Indices)
626097a140dSpatrick     LICalc->extend(LR, Idx, /*PhysReg=*/0, Undefs);
62709467b48Spatrick }
62809467b48Spatrick 
pruneValue(LiveRange & LR,SlotIndex Kill,SmallVectorImpl<SlotIndex> * EndPoints)62909467b48Spatrick void LiveIntervals::pruneValue(LiveRange &LR, SlotIndex Kill,
63009467b48Spatrick                                SmallVectorImpl<SlotIndex> *EndPoints) {
63109467b48Spatrick   LiveQueryResult LRQ = LR.Query(Kill);
63209467b48Spatrick   VNInfo *VNI = LRQ.valueOutOrDead();
63309467b48Spatrick   if (!VNI)
63409467b48Spatrick     return;
63509467b48Spatrick 
63609467b48Spatrick   MachineBasicBlock *KillMBB = Indexes->getMBBFromIndex(Kill);
63709467b48Spatrick   SlotIndex MBBEnd = Indexes->getMBBEndIdx(KillMBB);
63809467b48Spatrick 
63909467b48Spatrick   // If VNI isn't live out from KillMBB, the value is trivially pruned.
64009467b48Spatrick   if (LRQ.endPoint() < MBBEnd) {
64109467b48Spatrick     LR.removeSegment(Kill, LRQ.endPoint());
64209467b48Spatrick     if (EndPoints) EndPoints->push_back(LRQ.endPoint());
64309467b48Spatrick     return;
64409467b48Spatrick   }
64509467b48Spatrick 
64609467b48Spatrick   // VNI is live out of KillMBB.
64709467b48Spatrick   LR.removeSegment(Kill, MBBEnd);
64809467b48Spatrick   if (EndPoints) EndPoints->push_back(MBBEnd);
64909467b48Spatrick 
65009467b48Spatrick   // Find all blocks that are reachable from KillMBB without leaving VNI's live
65109467b48Spatrick   // range. It is possible that KillMBB itself is reachable, so start a DFS
65209467b48Spatrick   // from each successor.
65309467b48Spatrick   using VisitedTy = df_iterator_default_set<MachineBasicBlock*,9>;
65409467b48Spatrick   VisitedTy Visited;
65509467b48Spatrick   for (MachineBasicBlock *Succ : KillMBB->successors()) {
65609467b48Spatrick     for (df_ext_iterator<MachineBasicBlock*, VisitedTy>
65709467b48Spatrick          I = df_ext_begin(Succ, Visited), E = df_ext_end(Succ, Visited);
65809467b48Spatrick          I != E;) {
65909467b48Spatrick       MachineBasicBlock *MBB = *I;
66009467b48Spatrick 
66109467b48Spatrick       // Check if VNI is live in to MBB.
66209467b48Spatrick       SlotIndex MBBStart, MBBEnd;
66309467b48Spatrick       std::tie(MBBStart, MBBEnd) = Indexes->getMBBRange(MBB);
66409467b48Spatrick       LiveQueryResult LRQ = LR.Query(MBBStart);
66509467b48Spatrick       if (LRQ.valueIn() != VNI) {
66609467b48Spatrick         // This block isn't part of the VNI segment. Prune the search.
66709467b48Spatrick         I.skipChildren();
66809467b48Spatrick         continue;
66909467b48Spatrick       }
67009467b48Spatrick 
67109467b48Spatrick       // Prune the search if VNI is killed in MBB.
67209467b48Spatrick       if (LRQ.endPoint() < MBBEnd) {
67309467b48Spatrick         LR.removeSegment(MBBStart, LRQ.endPoint());
67409467b48Spatrick         if (EndPoints) EndPoints->push_back(LRQ.endPoint());
67509467b48Spatrick         I.skipChildren();
67609467b48Spatrick         continue;
67709467b48Spatrick       }
67809467b48Spatrick 
67909467b48Spatrick       // VNI is live through MBB.
68009467b48Spatrick       LR.removeSegment(MBBStart, MBBEnd);
68109467b48Spatrick       if (EndPoints) EndPoints->push_back(MBBEnd);
68209467b48Spatrick       ++I;
68309467b48Spatrick     }
68409467b48Spatrick   }
68509467b48Spatrick }
68609467b48Spatrick 
68709467b48Spatrick //===----------------------------------------------------------------------===//
68809467b48Spatrick // Register allocator hooks.
68909467b48Spatrick //
69009467b48Spatrick 
addKillFlags(const VirtRegMap * VRM)69109467b48Spatrick void LiveIntervals::addKillFlags(const VirtRegMap *VRM) {
69209467b48Spatrick   // Keep track of regunit ranges.
69309467b48Spatrick   SmallVector<std::pair<const LiveRange*, LiveRange::const_iterator>, 8> RU;
69409467b48Spatrick 
69509467b48Spatrick   for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
69673471bf0Spatrick     Register Reg = Register::index2VirtReg(i);
69709467b48Spatrick     if (MRI->reg_nodbg_empty(Reg))
69809467b48Spatrick       continue;
69909467b48Spatrick     const LiveInterval &LI = getInterval(Reg);
70009467b48Spatrick     if (LI.empty())
70109467b48Spatrick       continue;
70209467b48Spatrick 
70373471bf0Spatrick     // Target may have not allocated this yet.
70473471bf0Spatrick     Register PhysReg = VRM->getPhys(Reg);
70573471bf0Spatrick     if (!PhysReg)
70673471bf0Spatrick       continue;
70773471bf0Spatrick 
70809467b48Spatrick     // Find the regunit intervals for the assigned register. They may overlap
70909467b48Spatrick     // the virtual register live range, cancelling any kills.
71009467b48Spatrick     RU.clear();
71173471bf0Spatrick     for (MCRegUnitIterator Unit(PhysReg, TRI); Unit.isValid();
71209467b48Spatrick          ++Unit) {
71309467b48Spatrick       const LiveRange &RURange = getRegUnit(*Unit);
71409467b48Spatrick       if (RURange.empty())
71509467b48Spatrick         continue;
71609467b48Spatrick       RU.push_back(std::make_pair(&RURange, RURange.find(LI.begin()->end)));
71709467b48Spatrick     }
71809467b48Spatrick     // Every instruction that kills Reg corresponds to a segment range end
71909467b48Spatrick     // point.
72009467b48Spatrick     for (LiveInterval::const_iterator RI = LI.begin(), RE = LI.end(); RI != RE;
72109467b48Spatrick          ++RI) {
72209467b48Spatrick       // A block index indicates an MBB edge.
72309467b48Spatrick       if (RI->end.isBlock())
72409467b48Spatrick         continue;
72509467b48Spatrick       MachineInstr *MI = getInstructionFromIndex(RI->end);
72609467b48Spatrick       if (!MI)
72709467b48Spatrick         continue;
72809467b48Spatrick 
72909467b48Spatrick       // Check if any of the regunits are live beyond the end of RI. That could
73009467b48Spatrick       // happen when a physreg is defined as a copy of a virtreg:
73109467b48Spatrick       //
73209467b48Spatrick       //   %eax = COPY %5
73309467b48Spatrick       //   FOO %5             <--- MI, cancel kill because %eax is live.
73409467b48Spatrick       //   BAR killed %eax
73509467b48Spatrick       //
73609467b48Spatrick       // There should be no kill flag on FOO when %5 is rewritten as %eax.
73709467b48Spatrick       for (auto &RUP : RU) {
73809467b48Spatrick         const LiveRange &RURange = *RUP.first;
73909467b48Spatrick         LiveRange::const_iterator &I = RUP.second;
74009467b48Spatrick         if (I == RURange.end())
74109467b48Spatrick           continue;
74209467b48Spatrick         I = RURange.advanceTo(I, RI->end);
74309467b48Spatrick         if (I == RURange.end() || I->start >= RI->end)
74409467b48Spatrick           continue;
74509467b48Spatrick         // I is overlapping RI.
74609467b48Spatrick         goto CancelKill;
74709467b48Spatrick       }
74809467b48Spatrick 
74909467b48Spatrick       if (MRI->subRegLivenessEnabled()) {
75009467b48Spatrick         // When reading a partial undefined value we must not add a kill flag.
75109467b48Spatrick         // The regalloc might have used the undef lane for something else.
75209467b48Spatrick         // Example:
75309467b48Spatrick         //     %1 = ...                  ; R32: %1
75409467b48Spatrick         //     %2:high16 = ...           ; R64: %2
75509467b48Spatrick         //        = read killed %2        ; R64: %2
75609467b48Spatrick         //        = read %1              ; R32: %1
75709467b48Spatrick         // The <kill> flag is correct for %2, but the register allocator may
75809467b48Spatrick         // assign R0L to %1, and R0 to %2 because the low 32bits of R0
75909467b48Spatrick         // are actually never written by %2. After assignment the <kill>
76009467b48Spatrick         // flag at the read instruction is invalid.
76109467b48Spatrick         LaneBitmask DefinedLanesMask;
76273471bf0Spatrick         if (LI.hasSubRanges()) {
76309467b48Spatrick           // Compute a mask of lanes that are defined.
76409467b48Spatrick           DefinedLanesMask = LaneBitmask::getNone();
76573471bf0Spatrick           for (const LiveInterval::SubRange &SR : LI.subranges())
76673471bf0Spatrick             for (const LiveRange::Segment &Segment : SR.segments) {
76773471bf0Spatrick               if (Segment.start >= RI->end)
76873471bf0Spatrick                 break;
76973471bf0Spatrick               if (Segment.end == RI->end) {
77009467b48Spatrick                 DefinedLanesMask |= SR.LaneMask;
77173471bf0Spatrick                 break;
77273471bf0Spatrick               }
77309467b48Spatrick             }
77409467b48Spatrick         } else
77509467b48Spatrick           DefinedLanesMask = LaneBitmask::getAll();
77609467b48Spatrick 
77709467b48Spatrick         bool IsFullWrite = false;
77809467b48Spatrick         for (const MachineOperand &MO : MI->operands()) {
77909467b48Spatrick           if (!MO.isReg() || MO.getReg() != Reg)
78009467b48Spatrick             continue;
78109467b48Spatrick           if (MO.isUse()) {
78209467b48Spatrick             // Reading any undefined lanes?
78373471bf0Spatrick             unsigned SubReg = MO.getSubReg();
78473471bf0Spatrick             LaneBitmask UseMask = SubReg ? TRI->getSubRegIndexLaneMask(SubReg)
78573471bf0Spatrick                                          : MRI->getMaxLaneMaskForVReg(Reg);
78609467b48Spatrick             if ((UseMask & ~DefinedLanesMask).any())
78709467b48Spatrick               goto CancelKill;
78809467b48Spatrick           } else if (MO.getSubReg() == 0) {
78909467b48Spatrick             // Writing to the full register?
79009467b48Spatrick             assert(MO.isDef());
79109467b48Spatrick             IsFullWrite = true;
79209467b48Spatrick           }
79309467b48Spatrick         }
79409467b48Spatrick 
79509467b48Spatrick         // If an instruction writes to a subregister, a new segment starts in
79609467b48Spatrick         // the LiveInterval. But as this is only overriding part of the register
79709467b48Spatrick         // adding kill-flags is not correct here after registers have been
79809467b48Spatrick         // assigned.
79909467b48Spatrick         if (!IsFullWrite) {
80009467b48Spatrick           // Next segment has to be adjacent in the subregister write case.
80109467b48Spatrick           LiveRange::const_iterator N = std::next(RI);
80209467b48Spatrick           if (N != LI.end() && N->start == RI->end)
80309467b48Spatrick             goto CancelKill;
80409467b48Spatrick         }
80509467b48Spatrick       }
80609467b48Spatrick 
80709467b48Spatrick       MI->addRegisterKilled(Reg, nullptr);
80809467b48Spatrick       continue;
80909467b48Spatrick CancelKill:
81009467b48Spatrick       MI->clearRegisterKills(Reg, nullptr);
81109467b48Spatrick     }
81209467b48Spatrick   }
81309467b48Spatrick }
81409467b48Spatrick 
81509467b48Spatrick MachineBasicBlock*
intervalIsInOneMBB(const LiveInterval & LI) const81609467b48Spatrick LiveIntervals::intervalIsInOneMBB(const LiveInterval &LI) const {
817*d415bd75Srobert   assert(!LI.empty() && "LiveInterval is empty.");
818*d415bd75Srobert 
81909467b48Spatrick   // A local live range must be fully contained inside the block, meaning it is
82009467b48Spatrick   // defined and killed at instructions, not at block boundaries. It is not
82109467b48Spatrick   // live in or out of any block.
82209467b48Spatrick   //
82309467b48Spatrick   // It is technically possible to have a PHI-defined live range identical to a
82409467b48Spatrick   // single block, but we are going to return false in that case.
82509467b48Spatrick 
82609467b48Spatrick   SlotIndex Start = LI.beginIndex();
82709467b48Spatrick   if (Start.isBlock())
82809467b48Spatrick     return nullptr;
82909467b48Spatrick 
83009467b48Spatrick   SlotIndex Stop = LI.endIndex();
83109467b48Spatrick   if (Stop.isBlock())
83209467b48Spatrick     return nullptr;
83309467b48Spatrick 
83409467b48Spatrick   // getMBBFromIndex doesn't need to search the MBB table when both indexes
83509467b48Spatrick   // belong to proper instructions.
83609467b48Spatrick   MachineBasicBlock *MBB1 = Indexes->getMBBFromIndex(Start);
83709467b48Spatrick   MachineBasicBlock *MBB2 = Indexes->getMBBFromIndex(Stop);
83809467b48Spatrick   return MBB1 == MBB2 ? MBB1 : nullptr;
83909467b48Spatrick }
84009467b48Spatrick 
84109467b48Spatrick bool
hasPHIKill(const LiveInterval & LI,const VNInfo * VNI) const84209467b48Spatrick LiveIntervals::hasPHIKill(const LiveInterval &LI, const VNInfo *VNI) const {
84309467b48Spatrick   for (const VNInfo *PHI : LI.valnos) {
84409467b48Spatrick     if (PHI->isUnused() || !PHI->isPHIDef())
84509467b48Spatrick       continue;
84609467b48Spatrick     const MachineBasicBlock *PHIMBB = getMBBFromIndex(PHI->def);
84709467b48Spatrick     // Conservatively return true instead of scanning huge predecessor lists.
84809467b48Spatrick     if (PHIMBB->pred_size() > 100)
84909467b48Spatrick       return true;
85009467b48Spatrick     for (const MachineBasicBlock *Pred : PHIMBB->predecessors())
85109467b48Spatrick       if (VNI == LI.getVNInfoBefore(Indexes->getMBBEndIdx(Pred)))
85209467b48Spatrick         return true;
85309467b48Spatrick   }
85409467b48Spatrick   return false;
85509467b48Spatrick }
85609467b48Spatrick 
getSpillWeight(bool isDef,bool isUse,const MachineBlockFrequencyInfo * MBFI,const MachineInstr & MI)85709467b48Spatrick float LiveIntervals::getSpillWeight(bool isDef, bool isUse,
85809467b48Spatrick                                     const MachineBlockFrequencyInfo *MBFI,
85909467b48Spatrick                                     const MachineInstr &MI) {
86009467b48Spatrick   return getSpillWeight(isDef, isUse, MBFI, MI.getParent());
86109467b48Spatrick }
86209467b48Spatrick 
getSpillWeight(bool isDef,bool isUse,const MachineBlockFrequencyInfo * MBFI,const MachineBasicBlock * MBB)86309467b48Spatrick float LiveIntervals::getSpillWeight(bool isDef, bool isUse,
86409467b48Spatrick                                     const MachineBlockFrequencyInfo *MBFI,
86509467b48Spatrick                                     const MachineBasicBlock *MBB) {
86673471bf0Spatrick   return (isDef + isUse) * MBFI->getBlockFreqRelativeToEntryBlock(MBB);
86709467b48Spatrick }
86809467b48Spatrick 
86909467b48Spatrick LiveRange::Segment
addSegmentToEndOfBlock(Register Reg,MachineInstr & startInst)87073471bf0Spatrick LiveIntervals::addSegmentToEndOfBlock(Register Reg, MachineInstr &startInst) {
87173471bf0Spatrick   LiveInterval &Interval = createEmptyInterval(Reg);
87209467b48Spatrick   VNInfo *VN = Interval.getNextValue(
87309467b48Spatrick       SlotIndex(getInstructionIndex(startInst).getRegSlot()),
87409467b48Spatrick       getVNInfoAllocator());
87509467b48Spatrick   LiveRange::Segment S(SlotIndex(getInstructionIndex(startInst).getRegSlot()),
87609467b48Spatrick                        getMBBEndIdx(startInst.getParent()), VN);
87709467b48Spatrick   Interval.addSegment(S);
87809467b48Spatrick 
87909467b48Spatrick   return S;
88009467b48Spatrick }
88109467b48Spatrick 
88209467b48Spatrick //===----------------------------------------------------------------------===//
88309467b48Spatrick //                          Register mask functions
88409467b48Spatrick //===----------------------------------------------------------------------===//
88573471bf0Spatrick /// Check whether use of reg in MI is live-through. Live-through means that
88673471bf0Spatrick /// the value is alive on exit from Machine instruction. The example of such
88773471bf0Spatrick /// use is a deopt value in statepoint instruction.
hasLiveThroughUse(const MachineInstr * MI,Register Reg)88873471bf0Spatrick static bool hasLiveThroughUse(const MachineInstr *MI, Register Reg) {
88973471bf0Spatrick   if (MI->getOpcode() != TargetOpcode::STATEPOINT)
89073471bf0Spatrick     return false;
89173471bf0Spatrick   StatepointOpers SO(MI);
89273471bf0Spatrick   if (SO.getFlags() & (uint64_t)StatepointFlags::DeoptLiveIn)
89373471bf0Spatrick     return false;
89473471bf0Spatrick   for (unsigned Idx = SO.getNumDeoptArgsIdx(), E = SO.getNumGCPtrIdx(); Idx < E;
89573471bf0Spatrick        ++Idx) {
89673471bf0Spatrick     const MachineOperand &MO = MI->getOperand(Idx);
89773471bf0Spatrick     if (MO.isReg() && MO.getReg() == Reg)
89873471bf0Spatrick       return true;
89973471bf0Spatrick   }
90073471bf0Spatrick   return false;
90173471bf0Spatrick }
90209467b48Spatrick 
checkRegMaskInterference(const LiveInterval & LI,BitVector & UsableRegs)903*d415bd75Srobert bool LiveIntervals::checkRegMaskInterference(const LiveInterval &LI,
90409467b48Spatrick                                              BitVector &UsableRegs) {
90509467b48Spatrick   if (LI.empty())
90609467b48Spatrick     return false;
907*d415bd75Srobert   LiveInterval::const_iterator LiveI = LI.begin(), LiveE = LI.end();
90809467b48Spatrick 
90909467b48Spatrick   // Use a smaller arrays for local live ranges.
91009467b48Spatrick   ArrayRef<SlotIndex> Slots;
91109467b48Spatrick   ArrayRef<const uint32_t*> Bits;
91209467b48Spatrick   if (MachineBasicBlock *MBB = intervalIsInOneMBB(LI)) {
91309467b48Spatrick     Slots = getRegMaskSlotsInBlock(MBB->getNumber());
91409467b48Spatrick     Bits = getRegMaskBitsInBlock(MBB->getNumber());
91509467b48Spatrick   } else {
91609467b48Spatrick     Slots = getRegMaskSlots();
91709467b48Spatrick     Bits = getRegMaskBits();
91809467b48Spatrick   }
91909467b48Spatrick 
92009467b48Spatrick   // We are going to enumerate all the register mask slots contained in LI.
92109467b48Spatrick   // Start with a binary search of RegMaskSlots to find a starting point.
92209467b48Spatrick   ArrayRef<SlotIndex>::iterator SlotI = llvm::lower_bound(Slots, LiveI->start);
92309467b48Spatrick   ArrayRef<SlotIndex>::iterator SlotE = Slots.end();
92409467b48Spatrick 
92509467b48Spatrick   // No slots in range, LI begins after the last call.
92609467b48Spatrick   if (SlotI == SlotE)
92709467b48Spatrick     return false;
92809467b48Spatrick 
92909467b48Spatrick   bool Found = false;
93073471bf0Spatrick   // Utility to union regmasks.
93173471bf0Spatrick   auto unionBitMask = [&](unsigned Idx) {
93209467b48Spatrick       if (!Found) {
93309467b48Spatrick         // This is the first overlap. Initialize UsableRegs to all ones.
93409467b48Spatrick         UsableRegs.clear();
93509467b48Spatrick         UsableRegs.resize(TRI->getNumRegs(), true);
93609467b48Spatrick         Found = true;
93709467b48Spatrick       }
93809467b48Spatrick       // Remove usable registers clobbered by this mask.
93973471bf0Spatrick       UsableRegs.clearBitsNotInMask(Bits[Idx]);
94073471bf0Spatrick   };
94173471bf0Spatrick   while (true) {
94273471bf0Spatrick     assert(*SlotI >= LiveI->start);
94373471bf0Spatrick     // Loop over all slots overlapping this segment.
94473471bf0Spatrick     while (*SlotI < LiveI->end) {
94573471bf0Spatrick       // *SlotI overlaps LI. Collect mask bits.
94673471bf0Spatrick       unionBitMask(SlotI - Slots.begin());
94709467b48Spatrick       if (++SlotI == SlotE)
94809467b48Spatrick         return Found;
94909467b48Spatrick     }
95073471bf0Spatrick     // If segment ends with live-through use we need to collect its regmask.
95173471bf0Spatrick     if (*SlotI == LiveI->end)
95273471bf0Spatrick       if (MachineInstr *MI = getInstructionFromIndex(*SlotI))
95373471bf0Spatrick         if (hasLiveThroughUse(MI, LI.reg()))
95473471bf0Spatrick           unionBitMask(SlotI++ - Slots.begin());
95509467b48Spatrick     // *SlotI is beyond the current LI segment.
95673471bf0Spatrick     // Special advance implementation to not miss next LiveI->end.
95773471bf0Spatrick     if (++LiveI == LiveE || SlotI == SlotE || *SlotI > LI.endIndex())
95809467b48Spatrick       return Found;
95973471bf0Spatrick     while (LiveI->end < *SlotI)
96073471bf0Spatrick       ++LiveI;
96109467b48Spatrick     // Advance SlotI until it overlaps.
96209467b48Spatrick     while (*SlotI < LiveI->start)
96309467b48Spatrick       if (++SlotI == SlotE)
96409467b48Spatrick         return Found;
96509467b48Spatrick   }
96609467b48Spatrick }
96709467b48Spatrick 
96809467b48Spatrick //===----------------------------------------------------------------------===//
96909467b48Spatrick //                         IntervalUpdate class.
97009467b48Spatrick //===----------------------------------------------------------------------===//
97109467b48Spatrick 
97209467b48Spatrick /// Toolkit used by handleMove to trim or extend live intervals.
97309467b48Spatrick class LiveIntervals::HMEditor {
97409467b48Spatrick private:
97509467b48Spatrick   LiveIntervals& LIS;
97609467b48Spatrick   const MachineRegisterInfo& MRI;
97709467b48Spatrick   const TargetRegisterInfo& TRI;
97809467b48Spatrick   SlotIndex OldIdx;
97909467b48Spatrick   SlotIndex NewIdx;
98009467b48Spatrick   SmallPtrSet<LiveRange*, 8> Updated;
98109467b48Spatrick   bool UpdateFlags;
98209467b48Spatrick 
98309467b48Spatrick public:
HMEditor(LiveIntervals & LIS,const MachineRegisterInfo & MRI,const TargetRegisterInfo & TRI,SlotIndex OldIdx,SlotIndex NewIdx,bool UpdateFlags)98409467b48Spatrick   HMEditor(LiveIntervals& LIS, const MachineRegisterInfo& MRI,
98509467b48Spatrick            const TargetRegisterInfo& TRI,
98609467b48Spatrick            SlotIndex OldIdx, SlotIndex NewIdx, bool UpdateFlags)
98709467b48Spatrick     : LIS(LIS), MRI(MRI), TRI(TRI), OldIdx(OldIdx), NewIdx(NewIdx),
98809467b48Spatrick       UpdateFlags(UpdateFlags) {}
98909467b48Spatrick 
99009467b48Spatrick   // FIXME: UpdateFlags is a workaround that creates live intervals for all
99109467b48Spatrick   // physregs, even those that aren't needed for regalloc, in order to update
99209467b48Spatrick   // kill flags. This is wasteful. Eventually, LiveVariables will strip all kill
99309467b48Spatrick   // flags, and postRA passes will use a live register utility instead.
getRegUnitLI(unsigned Unit)99409467b48Spatrick   LiveRange *getRegUnitLI(unsigned Unit) {
99509467b48Spatrick     if (UpdateFlags && !MRI.isReservedRegUnit(Unit))
99609467b48Spatrick       return &LIS.getRegUnit(Unit);
99709467b48Spatrick     return LIS.getCachedRegUnit(Unit);
99809467b48Spatrick   }
99909467b48Spatrick 
100009467b48Spatrick   /// Update all live ranges touched by MI, assuming a move from OldIdx to
100109467b48Spatrick   /// NewIdx.
updateAllRanges(MachineInstr * MI)100209467b48Spatrick   void updateAllRanges(MachineInstr *MI) {
100309467b48Spatrick     LLVM_DEBUG(dbgs() << "handleMove " << OldIdx << " -> " << NewIdx << ": "
100409467b48Spatrick                       << *MI);
100509467b48Spatrick     bool hasRegMask = false;
100609467b48Spatrick     for (MachineOperand &MO : MI->operands()) {
100709467b48Spatrick       if (MO.isRegMask())
100809467b48Spatrick         hasRegMask = true;
100909467b48Spatrick       if (!MO.isReg())
101009467b48Spatrick         continue;
101109467b48Spatrick       if (MO.isUse()) {
101209467b48Spatrick         if (!MO.readsReg())
101309467b48Spatrick           continue;
101409467b48Spatrick         // Aggressively clear all kill flags.
101509467b48Spatrick         // They are reinserted by VirtRegRewriter.
101609467b48Spatrick         MO.setIsKill(false);
101709467b48Spatrick       }
101809467b48Spatrick 
101909467b48Spatrick       Register Reg = MO.getReg();
102009467b48Spatrick       if (!Reg)
102109467b48Spatrick         continue;
1022*d415bd75Srobert       if (Reg.isVirtual()) {
102309467b48Spatrick         LiveInterval &LI = LIS.getInterval(Reg);
102409467b48Spatrick         if (LI.hasSubRanges()) {
102509467b48Spatrick           unsigned SubReg = MO.getSubReg();
102609467b48Spatrick           LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
102709467b48Spatrick                                         : MRI.getMaxLaneMaskForVReg(Reg);
102809467b48Spatrick           for (LiveInterval::SubRange &S : LI.subranges()) {
102909467b48Spatrick             if ((S.LaneMask & LaneMask).none())
103009467b48Spatrick               continue;
103109467b48Spatrick             updateRange(S, Reg, S.LaneMask);
103209467b48Spatrick           }
103309467b48Spatrick         }
103409467b48Spatrick         updateRange(LI, Reg, LaneBitmask::getNone());
1035097a140dSpatrick         // If main range has a hole and we are moving a subrange use across
1036097a140dSpatrick         // the hole updateRange() cannot properly handle it since it only
1037097a140dSpatrick         // gets the LiveRange and not the whole LiveInterval. As a result
1038097a140dSpatrick         // we may end up with a main range not covering all subranges.
1039097a140dSpatrick         // This is extremely rare case, so let's check and reconstruct the
1040097a140dSpatrick         // main range.
1041*d415bd75Srobert         if (LI.hasSubRanges()) {
1042*d415bd75Srobert           unsigned SubReg = MO.getSubReg();
1043*d415bd75Srobert           LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
1044*d415bd75Srobert                                         : MRI.getMaxLaneMaskForVReg(Reg);
1045097a140dSpatrick           for (LiveInterval::SubRange &S : LI.subranges()) {
1046*d415bd75Srobert             if ((S.LaneMask & LaneMask).none() || LI.covers(S))
1047097a140dSpatrick               continue;
1048097a140dSpatrick             LI.clear();
1049097a140dSpatrick             LIS.constructMainRangeFromSubranges(LI);
1050097a140dSpatrick             break;
1051097a140dSpatrick           }
1052*d415bd75Srobert         }
1053097a140dSpatrick 
105409467b48Spatrick         continue;
105509467b48Spatrick       }
105609467b48Spatrick 
105709467b48Spatrick       // For physregs, only update the regunits that actually have a
105809467b48Spatrick       // precomputed live range.
105973471bf0Spatrick       for (MCRegUnitIterator Units(Reg.asMCReg(), &TRI); Units.isValid();
106073471bf0Spatrick            ++Units)
106109467b48Spatrick         if (LiveRange *LR = getRegUnitLI(*Units))
106209467b48Spatrick           updateRange(*LR, *Units, LaneBitmask::getNone());
106309467b48Spatrick     }
106409467b48Spatrick     if (hasRegMask)
106509467b48Spatrick       updateRegMaskSlots();
106609467b48Spatrick   }
106709467b48Spatrick 
106809467b48Spatrick private:
106909467b48Spatrick   /// Update a single live range, assuming an instruction has been moved from
107009467b48Spatrick   /// OldIdx to NewIdx.
updateRange(LiveRange & LR,Register Reg,LaneBitmask LaneMask)107173471bf0Spatrick   void updateRange(LiveRange &LR, Register Reg, LaneBitmask LaneMask) {
107209467b48Spatrick     if (!Updated.insert(&LR).second)
107309467b48Spatrick       return;
107409467b48Spatrick     LLVM_DEBUG({
107509467b48Spatrick       dbgs() << "     ";
1076*d415bd75Srobert       if (Reg.isVirtual()) {
107709467b48Spatrick         dbgs() << printReg(Reg);
107809467b48Spatrick         if (LaneMask.any())
107909467b48Spatrick           dbgs() << " L" << PrintLaneMask(LaneMask);
108009467b48Spatrick       } else {
108109467b48Spatrick         dbgs() << printRegUnit(Reg, &TRI);
108209467b48Spatrick       }
108309467b48Spatrick       dbgs() << ":\t" << LR << '\n';
108409467b48Spatrick     });
108509467b48Spatrick     if (SlotIndex::isEarlierInstr(OldIdx, NewIdx))
108609467b48Spatrick       handleMoveDown(LR);
108709467b48Spatrick     else
108809467b48Spatrick       handleMoveUp(LR, Reg, LaneMask);
108909467b48Spatrick     LLVM_DEBUG(dbgs() << "        -->\t" << LR << '\n');
109009467b48Spatrick     LR.verify();
109109467b48Spatrick   }
109209467b48Spatrick 
109309467b48Spatrick   /// Update LR to reflect an instruction has been moved downwards from OldIdx
109409467b48Spatrick   /// to NewIdx (OldIdx < NewIdx).
handleMoveDown(LiveRange & LR)109509467b48Spatrick   void handleMoveDown(LiveRange &LR) {
109609467b48Spatrick     LiveRange::iterator E = LR.end();
109709467b48Spatrick     // Segment going into OldIdx.
109809467b48Spatrick     LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex());
109909467b48Spatrick 
110009467b48Spatrick     // No value live before or after OldIdx? Nothing to do.
110109467b48Spatrick     if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start))
110209467b48Spatrick       return;
110309467b48Spatrick 
110409467b48Spatrick     LiveRange::iterator OldIdxOut;
110509467b48Spatrick     // Do we have a value live-in to OldIdx?
110609467b48Spatrick     if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) {
110709467b48Spatrick       // If the live-in value already extends to NewIdx, there is nothing to do.
110809467b48Spatrick       if (SlotIndex::isEarlierEqualInstr(NewIdx, OldIdxIn->end))
110909467b48Spatrick         return;
111009467b48Spatrick       // Aggressively remove all kill flags from the old kill point.
111109467b48Spatrick       // Kill flags shouldn't be used while live intervals exist, they will be
111209467b48Spatrick       // reinserted by VirtRegRewriter.
111309467b48Spatrick       if (MachineInstr *KillMI = LIS.getInstructionFromIndex(OldIdxIn->end))
111409467b48Spatrick         for (MachineOperand &MOP : mi_bundle_ops(*KillMI))
111509467b48Spatrick           if (MOP.isReg() && MOP.isUse())
111609467b48Spatrick             MOP.setIsKill(false);
111709467b48Spatrick 
111809467b48Spatrick       // Is there a def before NewIdx which is not OldIdx?
111909467b48Spatrick       LiveRange::iterator Next = std::next(OldIdxIn);
112009467b48Spatrick       if (Next != E && !SlotIndex::isSameInstr(OldIdx, Next->start) &&
112109467b48Spatrick           SlotIndex::isEarlierInstr(Next->start, NewIdx)) {
112209467b48Spatrick         // If we are here then OldIdx was just a use but not a def. We only have
112309467b48Spatrick         // to ensure liveness extends to NewIdx.
112409467b48Spatrick         LiveRange::iterator NewIdxIn =
112509467b48Spatrick           LR.advanceTo(Next, NewIdx.getBaseIndex());
112609467b48Spatrick         // Extend the segment before NewIdx if necessary.
112709467b48Spatrick         if (NewIdxIn == E ||
112809467b48Spatrick             !SlotIndex::isEarlierInstr(NewIdxIn->start, NewIdx)) {
112909467b48Spatrick           LiveRange::iterator Prev = std::prev(NewIdxIn);
113009467b48Spatrick           Prev->end = NewIdx.getRegSlot();
113109467b48Spatrick         }
113209467b48Spatrick         // Extend OldIdxIn.
113309467b48Spatrick         OldIdxIn->end = Next->start;
113409467b48Spatrick         return;
113509467b48Spatrick       }
113609467b48Spatrick 
113709467b48Spatrick       // Adjust OldIdxIn->end to reach NewIdx. This may temporarily make LR
113809467b48Spatrick       // invalid by overlapping ranges.
113909467b48Spatrick       bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end);
114009467b48Spatrick       OldIdxIn->end = NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber());
114109467b48Spatrick       // If this was not a kill, then there was no def and we're done.
114209467b48Spatrick       if (!isKill)
114309467b48Spatrick         return;
114409467b48Spatrick 
114509467b48Spatrick       // Did we have a Def at OldIdx?
114609467b48Spatrick       OldIdxOut = Next;
114709467b48Spatrick       if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start))
114809467b48Spatrick         return;
114909467b48Spatrick     } else {
115009467b48Spatrick       OldIdxOut = OldIdxIn;
115109467b48Spatrick     }
115209467b48Spatrick 
115309467b48Spatrick     // If we are here then there is a Definition at OldIdx. OldIdxOut points
115409467b48Spatrick     // to the segment starting there.
115509467b48Spatrick     assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) &&
115609467b48Spatrick            "No def?");
115709467b48Spatrick     VNInfo *OldIdxVNI = OldIdxOut->valno;
115809467b48Spatrick     assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def");
115909467b48Spatrick 
116009467b48Spatrick     // If the defined value extends beyond NewIdx, just move the beginning
116109467b48Spatrick     // of the segment to NewIdx.
116209467b48Spatrick     SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber());
116309467b48Spatrick     if (SlotIndex::isEarlierInstr(NewIdxDef, OldIdxOut->end)) {
116409467b48Spatrick       OldIdxVNI->def = NewIdxDef;
116509467b48Spatrick       OldIdxOut->start = OldIdxVNI->def;
116609467b48Spatrick       return;
116709467b48Spatrick     }
116809467b48Spatrick 
116909467b48Spatrick     // If we are here then we have a Definition at OldIdx which ends before
117009467b48Spatrick     // NewIdx.
117109467b48Spatrick 
117209467b48Spatrick     // Is there an existing Def at NewIdx?
117309467b48Spatrick     LiveRange::iterator AfterNewIdx
117409467b48Spatrick       = LR.advanceTo(OldIdxOut, NewIdx.getRegSlot());
117509467b48Spatrick     bool OldIdxDefIsDead = OldIdxOut->end.isDead();
117609467b48Spatrick     if (!OldIdxDefIsDead &&
117709467b48Spatrick         SlotIndex::isEarlierInstr(OldIdxOut->end, NewIdxDef)) {
117809467b48Spatrick       // OldIdx is not a dead def, and NewIdxDef is inside a new interval.
117909467b48Spatrick       VNInfo *DefVNI;
118009467b48Spatrick       if (OldIdxOut != LR.begin() &&
118109467b48Spatrick           !SlotIndex::isEarlierInstr(std::prev(OldIdxOut)->end,
118209467b48Spatrick                                      OldIdxOut->start)) {
118309467b48Spatrick         // There is no gap between OldIdxOut and its predecessor anymore,
118409467b48Spatrick         // merge them.
118509467b48Spatrick         LiveRange::iterator IPrev = std::prev(OldIdxOut);
118609467b48Spatrick         DefVNI = OldIdxVNI;
118709467b48Spatrick         IPrev->end = OldIdxOut->end;
118809467b48Spatrick       } else {
118909467b48Spatrick         // The value is live in to OldIdx
119009467b48Spatrick         LiveRange::iterator INext = std::next(OldIdxOut);
119109467b48Spatrick         assert(INext != E && "Must have following segment");
119209467b48Spatrick         // We merge OldIdxOut and its successor. As we're dealing with subreg
119309467b48Spatrick         // reordering, there is always a successor to OldIdxOut in the same BB
119409467b48Spatrick         // We don't need INext->valno anymore and will reuse for the new segment
119509467b48Spatrick         // we create later.
119609467b48Spatrick         DefVNI = OldIdxVNI;
119709467b48Spatrick         INext->start = OldIdxOut->end;
119809467b48Spatrick         INext->valno->def = INext->start;
119909467b48Spatrick       }
120009467b48Spatrick       // If NewIdx is behind the last segment, extend that and append a new one.
120109467b48Spatrick       if (AfterNewIdx == E) {
120209467b48Spatrick         // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up
120309467b48Spatrick         // one position.
120409467b48Spatrick         //    |-  ?/OldIdxOut -| |- X0 -| ... |- Xn -| end
120509467b48Spatrick         // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS -| end
120609467b48Spatrick         std::copy(std::next(OldIdxOut), E, OldIdxOut);
120709467b48Spatrick         // The last segment is undefined now, reuse it for a dead def.
120809467b48Spatrick         LiveRange::iterator NewSegment = std::prev(E);
120909467b48Spatrick         *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
121009467b48Spatrick                                          DefVNI);
121109467b48Spatrick         DefVNI->def = NewIdxDef;
121209467b48Spatrick 
121309467b48Spatrick         LiveRange::iterator Prev = std::prev(NewSegment);
121409467b48Spatrick         Prev->end = NewIdxDef;
121509467b48Spatrick       } else {
121609467b48Spatrick         // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up
121709467b48Spatrick         // one position.
121809467b48Spatrick         //    |-  ?/OldIdxOut -| |- X0 -| ... |- Xn/AfterNewIdx -| |- Next -|
121909467b48Spatrick         // => |- X0/OldIdxOut -| ... |- Xn -| |- Xn/AfterNewIdx -| |- Next -|
122009467b48Spatrick         std::copy(std::next(OldIdxOut), std::next(AfterNewIdx), OldIdxOut);
122109467b48Spatrick         LiveRange::iterator Prev = std::prev(AfterNewIdx);
122209467b48Spatrick         // We have two cases:
122309467b48Spatrick         if (SlotIndex::isEarlierInstr(Prev->start, NewIdxDef)) {
122409467b48Spatrick           // Case 1: NewIdx is inside a liverange. Split this liverange at
122509467b48Spatrick           // NewIdxDef into the segment "Prev" followed by "NewSegment".
122609467b48Spatrick           LiveRange::iterator NewSegment = AfterNewIdx;
122709467b48Spatrick           *NewSegment = LiveRange::Segment(NewIdxDef, Prev->end, Prev->valno);
122809467b48Spatrick           Prev->valno->def = NewIdxDef;
122909467b48Spatrick 
123009467b48Spatrick           *Prev = LiveRange::Segment(Prev->start, NewIdxDef, DefVNI);
123109467b48Spatrick           DefVNI->def = Prev->start;
123209467b48Spatrick         } else {
123309467b48Spatrick           // Case 2: NewIdx is in a lifetime hole. Keep AfterNewIdx as is and
123409467b48Spatrick           // turn Prev into a segment from NewIdx to AfterNewIdx->start.
123509467b48Spatrick           *Prev = LiveRange::Segment(NewIdxDef, AfterNewIdx->start, DefVNI);
123609467b48Spatrick           DefVNI->def = NewIdxDef;
123709467b48Spatrick           assert(DefVNI != AfterNewIdx->valno);
123809467b48Spatrick         }
123909467b48Spatrick       }
124009467b48Spatrick       return;
124109467b48Spatrick     }
124209467b48Spatrick 
124309467b48Spatrick     if (AfterNewIdx != E &&
124409467b48Spatrick         SlotIndex::isSameInstr(AfterNewIdx->start, NewIdxDef)) {
124509467b48Spatrick       // There is an existing def at NewIdx. The def at OldIdx is coalesced into
124609467b48Spatrick       // that value.
124709467b48Spatrick       assert(AfterNewIdx->valno != OldIdxVNI && "Multiple defs of value?");
124809467b48Spatrick       LR.removeValNo(OldIdxVNI);
124909467b48Spatrick     } else {
125009467b48Spatrick       // There was no existing def at NewIdx. We need to create a dead def
125109467b48Spatrick       // at NewIdx. Shift segments over the old OldIdxOut segment, this frees
125209467b48Spatrick       // a new segment at the place where we want to construct the dead def.
125309467b48Spatrick       //    |- OldIdxOut -| |- X0 -| ... |- Xn -| |- AfterNewIdx -|
125409467b48Spatrick       // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS. -| |- AfterNewIdx -|
125509467b48Spatrick       assert(AfterNewIdx != OldIdxOut && "Inconsistent iterators");
125609467b48Spatrick       std::copy(std::next(OldIdxOut), AfterNewIdx, OldIdxOut);
125709467b48Spatrick       // We can reuse OldIdxVNI now.
125809467b48Spatrick       LiveRange::iterator NewSegment = std::prev(AfterNewIdx);
125909467b48Spatrick       VNInfo *NewSegmentVNI = OldIdxVNI;
126009467b48Spatrick       NewSegmentVNI->def = NewIdxDef;
126109467b48Spatrick       *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
126209467b48Spatrick                                        NewSegmentVNI);
126309467b48Spatrick     }
126409467b48Spatrick   }
126509467b48Spatrick 
126609467b48Spatrick   /// Update LR to reflect an instruction has been moved upwards from OldIdx
126709467b48Spatrick   /// to NewIdx (NewIdx < OldIdx).
handleMoveUp(LiveRange & LR,Register Reg,LaneBitmask LaneMask)126873471bf0Spatrick   void handleMoveUp(LiveRange &LR, Register Reg, LaneBitmask LaneMask) {
126909467b48Spatrick     LiveRange::iterator E = LR.end();
127009467b48Spatrick     // Segment going into OldIdx.
127109467b48Spatrick     LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex());
127209467b48Spatrick 
127309467b48Spatrick     // No value live before or after OldIdx? Nothing to do.
127409467b48Spatrick     if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start))
127509467b48Spatrick       return;
127609467b48Spatrick 
127709467b48Spatrick     LiveRange::iterator OldIdxOut;
127809467b48Spatrick     // Do we have a value live-in to OldIdx?
127909467b48Spatrick     if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) {
128009467b48Spatrick       // If the live-in value isn't killed here, then we have no Def at
128109467b48Spatrick       // OldIdx, moreover the value must be live at NewIdx so there is nothing
128209467b48Spatrick       // to do.
128309467b48Spatrick       bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end);
128409467b48Spatrick       if (!isKill)
128509467b48Spatrick         return;
128609467b48Spatrick 
128709467b48Spatrick       // At this point we have to move OldIdxIn->end back to the nearest
128809467b48Spatrick       // previous use or (dead-)def but no further than NewIdx.
128909467b48Spatrick       SlotIndex DefBeforeOldIdx
129009467b48Spatrick         = std::max(OldIdxIn->start.getDeadSlot(),
129109467b48Spatrick                    NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber()));
129209467b48Spatrick       OldIdxIn->end = findLastUseBefore(DefBeforeOldIdx, Reg, LaneMask);
129309467b48Spatrick 
129409467b48Spatrick       // Did we have a Def at OldIdx? If not we are done now.
129509467b48Spatrick       OldIdxOut = std::next(OldIdxIn);
129609467b48Spatrick       if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start))
129709467b48Spatrick         return;
129809467b48Spatrick     } else {
129909467b48Spatrick       OldIdxOut = OldIdxIn;
130009467b48Spatrick       OldIdxIn = OldIdxOut != LR.begin() ? std::prev(OldIdxOut) : E;
130109467b48Spatrick     }
130209467b48Spatrick 
130309467b48Spatrick     // If we are here then there is a Definition at OldIdx. OldIdxOut points
130409467b48Spatrick     // to the segment starting there.
130509467b48Spatrick     assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) &&
130609467b48Spatrick            "No def?");
130709467b48Spatrick     VNInfo *OldIdxVNI = OldIdxOut->valno;
130809467b48Spatrick     assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def");
130909467b48Spatrick     bool OldIdxDefIsDead = OldIdxOut->end.isDead();
131009467b48Spatrick 
131109467b48Spatrick     // Is there an existing def at NewIdx?
131209467b48Spatrick     SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber());
131309467b48Spatrick     LiveRange::iterator NewIdxOut = LR.find(NewIdx.getRegSlot());
131409467b48Spatrick     if (SlotIndex::isSameInstr(NewIdxOut->start, NewIdx)) {
131509467b48Spatrick       assert(NewIdxOut->valno != OldIdxVNI &&
131609467b48Spatrick              "Same value defined more than once?");
131709467b48Spatrick       // If OldIdx was a dead def remove it.
131809467b48Spatrick       if (!OldIdxDefIsDead) {
131909467b48Spatrick         // Remove segment starting at NewIdx and move begin of OldIdxOut to
132009467b48Spatrick         // NewIdx so it can take its place.
132109467b48Spatrick         OldIdxVNI->def = NewIdxDef;
132209467b48Spatrick         OldIdxOut->start = NewIdxDef;
132309467b48Spatrick         LR.removeValNo(NewIdxOut->valno);
132409467b48Spatrick       } else {
132509467b48Spatrick         // Simply remove the dead def at OldIdx.
132609467b48Spatrick         LR.removeValNo(OldIdxVNI);
132709467b48Spatrick       }
132809467b48Spatrick     } else {
132909467b48Spatrick       // Previously nothing was live after NewIdx, so all we have to do now is
133009467b48Spatrick       // move the begin of OldIdxOut to NewIdx.
133109467b48Spatrick       if (!OldIdxDefIsDead) {
133209467b48Spatrick         // Do we have any intermediate Defs between OldIdx and NewIdx?
133309467b48Spatrick         if (OldIdxIn != E &&
133409467b48Spatrick             SlotIndex::isEarlierInstr(NewIdxDef, OldIdxIn->start)) {
133509467b48Spatrick           // OldIdx is not a dead def and NewIdx is before predecessor start.
133609467b48Spatrick           LiveRange::iterator NewIdxIn = NewIdxOut;
133709467b48Spatrick           assert(NewIdxIn == LR.find(NewIdx.getBaseIndex()));
133809467b48Spatrick           const SlotIndex SplitPos = NewIdxDef;
133909467b48Spatrick           OldIdxVNI = OldIdxIn->valno;
134009467b48Spatrick 
134109467b48Spatrick           SlotIndex NewDefEndPoint = std::next(NewIdxIn)->end;
134209467b48Spatrick           LiveRange::iterator Prev = std::prev(OldIdxIn);
134309467b48Spatrick           if (OldIdxIn != LR.begin() &&
134409467b48Spatrick               SlotIndex::isEarlierInstr(NewIdx, Prev->end)) {
134509467b48Spatrick             // If the segment before OldIdx read a value defined earlier than
134609467b48Spatrick             // NewIdx, the moved instruction also reads and forwards that
134709467b48Spatrick             // value. Extend the lifetime of the new def point.
134809467b48Spatrick 
134909467b48Spatrick             // Extend to where the previous range started, unless there is
135009467b48Spatrick             // another redef first.
135109467b48Spatrick             NewDefEndPoint = std::min(OldIdxIn->start,
135209467b48Spatrick                                       std::next(NewIdxOut)->start);
135309467b48Spatrick           }
135409467b48Spatrick 
135509467b48Spatrick           // Merge the OldIdxIn and OldIdxOut segments into OldIdxOut.
135609467b48Spatrick           OldIdxOut->valno->def = OldIdxIn->start;
135709467b48Spatrick           *OldIdxOut = LiveRange::Segment(OldIdxIn->start, OldIdxOut->end,
135809467b48Spatrick                                           OldIdxOut->valno);
135909467b48Spatrick           // OldIdxIn and OldIdxVNI are now undef and can be overridden.
136009467b48Spatrick           // We Slide [NewIdxIn, OldIdxIn) down one position.
136109467b48Spatrick           //    |- X0/NewIdxIn -| ... |- Xn-1 -||- Xn/OldIdxIn -||- OldIdxOut -|
136209467b48Spatrick           // => |- undef/NexIdxIn -| |- X0 -| ... |- Xn-1 -| |- Xn/OldIdxOut -|
136309467b48Spatrick           std::copy_backward(NewIdxIn, OldIdxIn, OldIdxOut);
136409467b48Spatrick           // NewIdxIn is now considered undef so we can reuse it for the moved
136509467b48Spatrick           // value.
136609467b48Spatrick           LiveRange::iterator NewSegment = NewIdxIn;
136709467b48Spatrick           LiveRange::iterator Next = std::next(NewSegment);
136809467b48Spatrick           if (SlotIndex::isEarlierInstr(Next->start, NewIdx)) {
136909467b48Spatrick             // There is no gap between NewSegment and its predecessor.
137009467b48Spatrick             *NewSegment = LiveRange::Segment(Next->start, SplitPos,
137109467b48Spatrick                                              Next->valno);
137209467b48Spatrick 
137309467b48Spatrick             *Next = LiveRange::Segment(SplitPos, NewDefEndPoint, OldIdxVNI);
137409467b48Spatrick             Next->valno->def = SplitPos;
137509467b48Spatrick           } else {
137609467b48Spatrick             // There is a gap between NewSegment and its predecessor
137709467b48Spatrick             // Value becomes live in.
137809467b48Spatrick             *NewSegment = LiveRange::Segment(SplitPos, Next->start, OldIdxVNI);
137909467b48Spatrick             NewSegment->valno->def = SplitPos;
138009467b48Spatrick           }
138109467b48Spatrick         } else {
138209467b48Spatrick           // Leave the end point of a live def.
138309467b48Spatrick           OldIdxOut->start = NewIdxDef;
138409467b48Spatrick           OldIdxVNI->def = NewIdxDef;
138509467b48Spatrick           if (OldIdxIn != E && SlotIndex::isEarlierInstr(NewIdx, OldIdxIn->end))
1386097a140dSpatrick             OldIdxIn->end = NewIdxDef;
138709467b48Spatrick         }
138809467b48Spatrick       } else if (OldIdxIn != E
138909467b48Spatrick           && SlotIndex::isEarlierInstr(NewIdxOut->start, NewIdx)
139009467b48Spatrick           && SlotIndex::isEarlierInstr(NewIdx, NewIdxOut->end)) {
139109467b48Spatrick         // OldIdxVNI is a dead def that has been moved into the middle of
139209467b48Spatrick         // another value in LR. That can happen when LR is a whole register,
139309467b48Spatrick         // but the dead def is a write to a subreg that is dead at NewIdx.
139409467b48Spatrick         // The dead def may have been moved across other values
139509467b48Spatrick         // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut)
139609467b48Spatrick         // down one position.
139709467b48Spatrick         //    |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - |
139809467b48Spatrick         // => |- X0/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -|
139909467b48Spatrick         std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
140009467b48Spatrick         // Modify the segment at NewIdxOut and the following segment to meet at
140109467b48Spatrick         // the point of the dead def, with the following segment getting
140209467b48Spatrick         // OldIdxVNI as its value number.
140309467b48Spatrick         *NewIdxOut = LiveRange::Segment(
140409467b48Spatrick             NewIdxOut->start, NewIdxDef.getRegSlot(), NewIdxOut->valno);
140509467b48Spatrick         *(NewIdxOut + 1) = LiveRange::Segment(
140609467b48Spatrick             NewIdxDef.getRegSlot(), (NewIdxOut + 1)->end, OldIdxVNI);
140709467b48Spatrick         OldIdxVNI->def = NewIdxDef;
140809467b48Spatrick         // Modify subsequent segments to be defined by the moved def OldIdxVNI.
1409*d415bd75Srobert         for (auto *Idx = NewIdxOut + 2; Idx <= OldIdxOut; ++Idx)
141009467b48Spatrick           Idx->valno = OldIdxVNI;
141109467b48Spatrick         // Aggressively remove all dead flags from the former dead definition.
141209467b48Spatrick         // Kill/dead flags shouldn't be used while live intervals exist; they
141309467b48Spatrick         // will be reinserted by VirtRegRewriter.
141409467b48Spatrick         if (MachineInstr *KillMI = LIS.getInstructionFromIndex(NewIdx))
141509467b48Spatrick           for (MIBundleOperands MO(*KillMI); MO.isValid(); ++MO)
141609467b48Spatrick             if (MO->isReg() && !MO->isUse())
141709467b48Spatrick               MO->setIsDead(false);
141809467b48Spatrick       } else {
141909467b48Spatrick         // OldIdxVNI is a dead def. It may have been moved across other values
142009467b48Spatrick         // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut)
142109467b48Spatrick         // down one position.
142209467b48Spatrick         //    |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - |
142309467b48Spatrick         // => |- undef/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -|
142409467b48Spatrick         std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
142509467b48Spatrick         // OldIdxVNI can be reused now to build a new dead def segment.
142609467b48Spatrick         LiveRange::iterator NewSegment = NewIdxOut;
142709467b48Spatrick         VNInfo *NewSegmentVNI = OldIdxVNI;
142809467b48Spatrick         *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
142909467b48Spatrick                                          NewSegmentVNI);
143009467b48Spatrick         NewSegmentVNI->def = NewIdxDef;
143109467b48Spatrick       }
143209467b48Spatrick     }
143309467b48Spatrick   }
143409467b48Spatrick 
updateRegMaskSlots()143509467b48Spatrick   void updateRegMaskSlots() {
143609467b48Spatrick     SmallVectorImpl<SlotIndex>::iterator RI =
143709467b48Spatrick         llvm::lower_bound(LIS.RegMaskSlots, OldIdx);
143809467b48Spatrick     assert(RI != LIS.RegMaskSlots.end() && *RI == OldIdx.getRegSlot() &&
143909467b48Spatrick            "No RegMask at OldIdx.");
144009467b48Spatrick     *RI = NewIdx.getRegSlot();
144109467b48Spatrick     assert((RI == LIS.RegMaskSlots.begin() ||
144209467b48Spatrick             SlotIndex::isEarlierInstr(*std::prev(RI), *RI)) &&
144309467b48Spatrick            "Cannot move regmask instruction above another call");
144409467b48Spatrick     assert((std::next(RI) == LIS.RegMaskSlots.end() ||
144509467b48Spatrick             SlotIndex::isEarlierInstr(*RI, *std::next(RI))) &&
144609467b48Spatrick            "Cannot move regmask instruction below another call");
144709467b48Spatrick   }
144809467b48Spatrick 
144909467b48Spatrick   // Return the last use of reg between NewIdx and OldIdx.
findLastUseBefore(SlotIndex Before,Register Reg,LaneBitmask LaneMask)145073471bf0Spatrick   SlotIndex findLastUseBefore(SlotIndex Before, Register Reg,
145109467b48Spatrick                               LaneBitmask LaneMask) {
1452*d415bd75Srobert     if (Reg.isVirtual()) {
145309467b48Spatrick       SlotIndex LastUse = Before;
145409467b48Spatrick       for (MachineOperand &MO : MRI.use_nodbg_operands(Reg)) {
145509467b48Spatrick         if (MO.isUndef())
145609467b48Spatrick           continue;
145709467b48Spatrick         unsigned SubReg = MO.getSubReg();
145809467b48Spatrick         if (SubReg != 0 && LaneMask.any()
145909467b48Spatrick             && (TRI.getSubRegIndexLaneMask(SubReg) & LaneMask).none())
146009467b48Spatrick           continue;
146109467b48Spatrick 
146209467b48Spatrick         const MachineInstr &MI = *MO.getParent();
146309467b48Spatrick         SlotIndex InstSlot = LIS.getSlotIndexes()->getInstructionIndex(MI);
146409467b48Spatrick         if (InstSlot > LastUse && InstSlot < OldIdx)
146509467b48Spatrick           LastUse = InstSlot.getRegSlot();
146609467b48Spatrick       }
146709467b48Spatrick       return LastUse;
146809467b48Spatrick     }
146909467b48Spatrick 
147009467b48Spatrick     // This is a regunit interval, so scanning the use list could be very
147109467b48Spatrick     // expensive. Scan upwards from OldIdx instead.
147209467b48Spatrick     assert(Before < OldIdx && "Expected upwards move");
147309467b48Spatrick     SlotIndexes *Indexes = LIS.getSlotIndexes();
147409467b48Spatrick     MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Before);
147509467b48Spatrick 
147609467b48Spatrick     // OldIdx may not correspond to an instruction any longer, so set MII to
147709467b48Spatrick     // point to the next instruction after OldIdx, or MBB->end().
147809467b48Spatrick     MachineBasicBlock::iterator MII = MBB->end();
147909467b48Spatrick     if (MachineInstr *MI = Indexes->getInstructionFromIndex(
148009467b48Spatrick                            Indexes->getNextNonNullIndex(OldIdx)))
148109467b48Spatrick       if (MI->getParent() == MBB)
148209467b48Spatrick         MII = MI;
148309467b48Spatrick 
148409467b48Spatrick     MachineBasicBlock::iterator Begin = MBB->begin();
148509467b48Spatrick     while (MII != Begin) {
148673471bf0Spatrick       if ((--MII)->isDebugOrPseudoInstr())
148709467b48Spatrick         continue;
148809467b48Spatrick       SlotIndex Idx = Indexes->getInstructionIndex(*MII);
148909467b48Spatrick 
149009467b48Spatrick       // Stop searching when Before is reached.
149109467b48Spatrick       if (!SlotIndex::isEarlierInstr(Before, Idx))
149209467b48Spatrick         return Before;
149309467b48Spatrick 
149409467b48Spatrick       // Check if MII uses Reg.
149509467b48Spatrick       for (MIBundleOperands MO(*MII); MO.isValid(); ++MO)
1496*d415bd75Srobert         if (MO->isReg() && !MO->isUndef() && MO->getReg().isPhysical() &&
149709467b48Spatrick             TRI.hasRegUnit(MO->getReg(), Reg))
149809467b48Spatrick           return Idx.getRegSlot();
149909467b48Spatrick     }
150009467b48Spatrick     // Didn't reach Before. It must be the first instruction in the block.
150109467b48Spatrick     return Before;
150209467b48Spatrick   }
150309467b48Spatrick };
150409467b48Spatrick 
handleMove(MachineInstr & MI,bool UpdateFlags)150509467b48Spatrick void LiveIntervals::handleMove(MachineInstr &MI, bool UpdateFlags) {
150609467b48Spatrick   // It is fine to move a bundle as a whole, but not an individual instruction
150709467b48Spatrick   // inside it.
150809467b48Spatrick   assert((!MI.isBundled() || MI.getOpcode() == TargetOpcode::BUNDLE) &&
150909467b48Spatrick          "Cannot move instruction in bundle");
151009467b48Spatrick   SlotIndex OldIndex = Indexes->getInstructionIndex(MI);
151109467b48Spatrick   Indexes->removeMachineInstrFromMaps(MI);
151209467b48Spatrick   SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(MI);
151309467b48Spatrick   assert(getMBBStartIdx(MI.getParent()) <= OldIndex &&
151409467b48Spatrick          OldIndex < getMBBEndIdx(MI.getParent()) &&
151509467b48Spatrick          "Cannot handle moves across basic block boundaries.");
151609467b48Spatrick 
151709467b48Spatrick   HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
151809467b48Spatrick   HME.updateAllRanges(&MI);
151909467b48Spatrick }
152009467b48Spatrick 
handleMoveIntoNewBundle(MachineInstr & BundleStart,bool UpdateFlags)1521097a140dSpatrick void LiveIntervals::handleMoveIntoNewBundle(MachineInstr &BundleStart,
152209467b48Spatrick                                             bool UpdateFlags) {
1523097a140dSpatrick   assert((BundleStart.getOpcode() == TargetOpcode::BUNDLE) &&
1524097a140dSpatrick          "Bundle start is not a bundle");
1525097a140dSpatrick   SmallVector<SlotIndex, 16> ToProcess;
1526097a140dSpatrick   const SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(BundleStart);
1527097a140dSpatrick   auto BundleEnd = getBundleEnd(BundleStart.getIterator());
1528097a140dSpatrick 
1529097a140dSpatrick   auto I = BundleStart.getIterator();
1530097a140dSpatrick   I++;
1531097a140dSpatrick   while (I != BundleEnd) {
1532097a140dSpatrick     if (!Indexes->hasIndex(*I))
1533097a140dSpatrick       continue;
1534097a140dSpatrick     SlotIndex OldIndex = Indexes->getInstructionIndex(*I, true);
1535097a140dSpatrick     ToProcess.push_back(OldIndex);
1536097a140dSpatrick     Indexes->removeMachineInstrFromMaps(*I, true);
1537097a140dSpatrick     I++;
1538097a140dSpatrick   }
1539097a140dSpatrick   for (SlotIndex OldIndex : ToProcess) {
154009467b48Spatrick     HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
1541097a140dSpatrick     HME.updateAllRanges(&BundleStart);
1542097a140dSpatrick   }
1543097a140dSpatrick 
1544097a140dSpatrick   // Fix up dead defs
1545097a140dSpatrick   const SlotIndex Index = getInstructionIndex(BundleStart);
1546097a140dSpatrick   for (unsigned Idx = 0, E = BundleStart.getNumOperands(); Idx != E; ++Idx) {
1547097a140dSpatrick     MachineOperand &MO = BundleStart.getOperand(Idx);
1548097a140dSpatrick     if (!MO.isReg())
1549097a140dSpatrick       continue;
1550097a140dSpatrick     Register Reg = MO.getReg();
1551097a140dSpatrick     if (Reg.isVirtual() && hasInterval(Reg) && !MO.isUndef()) {
1552097a140dSpatrick       LiveInterval &LI = getInterval(Reg);
1553097a140dSpatrick       LiveQueryResult LRQ = LI.Query(Index);
1554097a140dSpatrick       if (LRQ.isDeadDef())
1555097a140dSpatrick         MO.setIsDead();
1556097a140dSpatrick     }
1557097a140dSpatrick   }
155809467b48Spatrick }
155909467b48Spatrick 
repairOldRegInRange(const MachineBasicBlock::iterator Begin,const MachineBasicBlock::iterator End,const SlotIndex EndIdx,LiveRange & LR,const Register Reg,LaneBitmask LaneMask)156009467b48Spatrick void LiveIntervals::repairOldRegInRange(const MachineBasicBlock::iterator Begin,
156109467b48Spatrick                                         const MachineBasicBlock::iterator End,
156273471bf0Spatrick                                         const SlotIndex EndIdx, LiveRange &LR,
156373471bf0Spatrick                                         const Register Reg,
156409467b48Spatrick                                         LaneBitmask LaneMask) {
156573471bf0Spatrick   LiveInterval::iterator LII = LR.find(EndIdx);
156609467b48Spatrick   SlotIndex lastUseIdx;
1567*d415bd75Srobert   if (LII != LR.end() && LII->start < EndIdx) {
156809467b48Spatrick     lastUseIdx = LII->end;
1569*d415bd75Srobert   } else if (LII == LR.begin()) {
1570*d415bd75Srobert     // We may not have a liverange at all if this is a subregister untouched
1571*d415bd75Srobert     // between \p Begin and \p End.
1572*d415bd75Srobert   } else {
157309467b48Spatrick     --LII;
1574*d415bd75Srobert   }
157509467b48Spatrick 
157609467b48Spatrick   for (MachineBasicBlock::iterator I = End; I != Begin;) {
157709467b48Spatrick     --I;
157809467b48Spatrick     MachineInstr &MI = *I;
157973471bf0Spatrick     if (MI.isDebugOrPseudoInstr())
158009467b48Spatrick       continue;
158109467b48Spatrick 
158209467b48Spatrick     SlotIndex instrIdx = getInstructionIndex(MI);
158309467b48Spatrick     bool isStartValid = getInstructionFromIndex(LII->start);
158409467b48Spatrick     bool isEndValid = getInstructionFromIndex(LII->end);
158509467b48Spatrick 
158609467b48Spatrick     // FIXME: This doesn't currently handle early-clobber or multiple removed
158709467b48Spatrick     // defs inside of the region to repair.
1588*d415bd75Srobert     for (const MachineOperand &MO : MI.operands()) {
158909467b48Spatrick       if (!MO.isReg() || MO.getReg() != Reg)
159009467b48Spatrick         continue;
159109467b48Spatrick 
159209467b48Spatrick       unsigned SubReg = MO.getSubReg();
159309467b48Spatrick       LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
159409467b48Spatrick       if ((Mask & LaneMask).none())
159509467b48Spatrick         continue;
159609467b48Spatrick 
159709467b48Spatrick       if (MO.isDef()) {
159809467b48Spatrick         if (!isStartValid) {
159909467b48Spatrick           if (LII->end.isDead()) {
1600*d415bd75Srobert             LII = LR.removeSegment(LII, true);
160109467b48Spatrick             if (LII != LR.begin())
1602*d415bd75Srobert               --LII;
160309467b48Spatrick           } else {
160409467b48Spatrick             LII->start = instrIdx.getRegSlot();
160509467b48Spatrick             LII->valno->def = instrIdx.getRegSlot();
160609467b48Spatrick             if (MO.getSubReg() && !MO.isUndef())
160709467b48Spatrick               lastUseIdx = instrIdx.getRegSlot();
160809467b48Spatrick             else
160909467b48Spatrick               lastUseIdx = SlotIndex();
161009467b48Spatrick             continue;
161109467b48Spatrick           }
161209467b48Spatrick         }
161309467b48Spatrick 
161409467b48Spatrick         if (!lastUseIdx.isValid()) {
161509467b48Spatrick           VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator);
161609467b48Spatrick           LiveRange::Segment S(instrIdx.getRegSlot(),
161709467b48Spatrick                                instrIdx.getDeadSlot(), VNI);
161809467b48Spatrick           LII = LR.addSegment(S);
161909467b48Spatrick         } else if (LII->start != instrIdx.getRegSlot()) {
162009467b48Spatrick           VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator);
162109467b48Spatrick           LiveRange::Segment S(instrIdx.getRegSlot(), lastUseIdx, VNI);
162209467b48Spatrick           LII = LR.addSegment(S);
162309467b48Spatrick         }
162409467b48Spatrick 
162509467b48Spatrick         if (MO.getSubReg() && !MO.isUndef())
162609467b48Spatrick           lastUseIdx = instrIdx.getRegSlot();
162709467b48Spatrick         else
162809467b48Spatrick           lastUseIdx = SlotIndex();
162909467b48Spatrick       } else if (MO.isUse()) {
163009467b48Spatrick         // FIXME: This should probably be handled outside of this branch,
163109467b48Spatrick         // either as part of the def case (for defs inside of the region) or
163209467b48Spatrick         // after the loop over the region.
163309467b48Spatrick         if (!isEndValid && !LII->end.isBlock())
163409467b48Spatrick           LII->end = instrIdx.getRegSlot();
163509467b48Spatrick         if (!lastUseIdx.isValid())
163609467b48Spatrick           lastUseIdx = instrIdx.getRegSlot();
163709467b48Spatrick       }
163809467b48Spatrick     }
163909467b48Spatrick   }
1640*d415bd75Srobert 
1641*d415bd75Srobert   bool isStartValid = getInstructionFromIndex(LII->start);
1642*d415bd75Srobert   if (!isStartValid && LII->end.isDead())
1643*d415bd75Srobert     LR.removeSegment(*LII, true);
164409467b48Spatrick }
164509467b48Spatrick 
164609467b48Spatrick void
repairIntervalsInRange(MachineBasicBlock * MBB,MachineBasicBlock::iterator Begin,MachineBasicBlock::iterator End,ArrayRef<Register> OrigRegs)164709467b48Spatrick LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB,
164809467b48Spatrick                                       MachineBasicBlock::iterator Begin,
164909467b48Spatrick                                       MachineBasicBlock::iterator End,
1650097a140dSpatrick                                       ArrayRef<Register> OrigRegs) {
165109467b48Spatrick   // Find anchor points, which are at the beginning/end of blocks or at
165209467b48Spatrick   // instructions that already have indexes.
1653*d415bd75Srobert   while (Begin != MBB->begin() && !Indexes->hasIndex(*std::prev(Begin)))
165409467b48Spatrick     --Begin;
165509467b48Spatrick   while (End != MBB->end() && !Indexes->hasIndex(*End))
165609467b48Spatrick     ++End;
165709467b48Spatrick 
165873471bf0Spatrick   SlotIndex EndIdx;
165909467b48Spatrick   if (End == MBB->end())
166073471bf0Spatrick     EndIdx = getMBBEndIdx(MBB).getPrevSlot();
166109467b48Spatrick   else
166273471bf0Spatrick     EndIdx = getInstructionIndex(*End);
166309467b48Spatrick 
166409467b48Spatrick   Indexes->repairIndexesInRange(MBB, Begin, End);
166509467b48Spatrick 
1666*d415bd75Srobert   // Make sure a live interval exists for all register operands in the range.
1667*d415bd75Srobert   SmallVector<Register> RegsToRepair(OrigRegs.begin(), OrigRegs.end());
166809467b48Spatrick   for (MachineBasicBlock::iterator I = End; I != Begin;) {
166909467b48Spatrick     --I;
167009467b48Spatrick     MachineInstr &MI = *I;
167173471bf0Spatrick     if (MI.isDebugOrPseudoInstr())
167209467b48Spatrick       continue;
1673*d415bd75Srobert     for (const MachineOperand &MO : MI.operands()) {
1674*d415bd75Srobert       if (MO.isReg() && MO.getReg().isVirtual()) {
1675*d415bd75Srobert         Register Reg = MO.getReg();
1676*d415bd75Srobert         // If the new instructions refer to subregs but the old instructions did
1677*d415bd75Srobert         // not, throw away any old live interval so it will be recomputed with
1678*d415bd75Srobert         // subranges.
1679*d415bd75Srobert         if (MO.getSubReg() && hasInterval(Reg) &&
1680*d415bd75Srobert             !getInterval(Reg).hasSubRanges() &&
1681*d415bd75Srobert             MRI->shouldTrackSubRegLiveness(Reg))
1682*d415bd75Srobert           removeInterval(Reg);
1683*d415bd75Srobert         if (!hasInterval(Reg)) {
1684*d415bd75Srobert           createAndComputeVirtRegInterval(Reg);
1685*d415bd75Srobert           // Don't bother to repair a freshly calculated live interval.
1686*d415bd75Srobert           erase_value(RegsToRepair, Reg);
1687*d415bd75Srobert         }
168809467b48Spatrick       }
168909467b48Spatrick     }
169009467b48Spatrick   }
169109467b48Spatrick 
1692*d415bd75Srobert   for (Register Reg : RegsToRepair) {
1693097a140dSpatrick     if (!Reg.isVirtual())
169409467b48Spatrick       continue;
169509467b48Spatrick 
169609467b48Spatrick     LiveInterval &LI = getInterval(Reg);
169709467b48Spatrick     // FIXME: Should we support undefs that gain defs?
169809467b48Spatrick     if (!LI.hasAtLeastOneValue())
169909467b48Spatrick       continue;
170009467b48Spatrick 
170109467b48Spatrick     for (LiveInterval::SubRange &S : LI.subranges())
170273471bf0Spatrick       repairOldRegInRange(Begin, End, EndIdx, S, Reg, S.LaneMask);
1703*d415bd75Srobert     LI.removeEmptySubRanges();
170409467b48Spatrick 
170573471bf0Spatrick     repairOldRegInRange(Begin, End, EndIdx, LI, Reg);
170609467b48Spatrick   }
170709467b48Spatrick }
170809467b48Spatrick 
removePhysRegDefAt(MCRegister Reg,SlotIndex Pos)170973471bf0Spatrick void LiveIntervals::removePhysRegDefAt(MCRegister Reg, SlotIndex Pos) {
171009467b48Spatrick   for (MCRegUnitIterator Unit(Reg, TRI); Unit.isValid(); ++Unit) {
171109467b48Spatrick     if (LiveRange *LR = getCachedRegUnit(*Unit))
171209467b48Spatrick       if (VNInfo *VNI = LR->getVNInfoAt(Pos))
171309467b48Spatrick         LR->removeValNo(VNI);
171409467b48Spatrick   }
171509467b48Spatrick }
171609467b48Spatrick 
removeVRegDefAt(LiveInterval & LI,SlotIndex Pos)171709467b48Spatrick void LiveIntervals::removeVRegDefAt(LiveInterval &LI, SlotIndex Pos) {
171809467b48Spatrick   // LI may not have the main range computed yet, but its subranges may
171909467b48Spatrick   // be present.
172009467b48Spatrick   VNInfo *VNI = LI.getVNInfoAt(Pos);
172109467b48Spatrick   if (VNI != nullptr) {
172209467b48Spatrick     assert(VNI->def.getBaseIndex() == Pos.getBaseIndex());
172309467b48Spatrick     LI.removeValNo(VNI);
172409467b48Spatrick   }
172509467b48Spatrick 
172609467b48Spatrick   // Also remove the value defined in subranges.
172709467b48Spatrick   for (LiveInterval::SubRange &S : LI.subranges()) {
172809467b48Spatrick     if (VNInfo *SVNI = S.getVNInfoAt(Pos))
172909467b48Spatrick       if (SVNI->def.getBaseIndex() == Pos.getBaseIndex())
173009467b48Spatrick         S.removeValNo(SVNI);
173109467b48Spatrick   }
173209467b48Spatrick   LI.removeEmptySubRanges();
173309467b48Spatrick }
173409467b48Spatrick 
splitSeparateComponents(LiveInterval & LI,SmallVectorImpl<LiveInterval * > & SplitLIs)173509467b48Spatrick void LiveIntervals::splitSeparateComponents(LiveInterval &LI,
173609467b48Spatrick     SmallVectorImpl<LiveInterval*> &SplitLIs) {
173709467b48Spatrick   ConnectedVNInfoEqClasses ConEQ(*this);
173809467b48Spatrick   unsigned NumComp = ConEQ.Classify(LI);
173909467b48Spatrick   if (NumComp <= 1)
174009467b48Spatrick     return;
174109467b48Spatrick   LLVM_DEBUG(dbgs() << "  Split " << NumComp << " components: " << LI << '\n');
174273471bf0Spatrick   Register Reg = LI.reg();
174309467b48Spatrick   for (unsigned I = 1; I < NumComp; ++I) {
1744*d415bd75Srobert     Register NewVReg = MRI->cloneVirtualRegister(Reg);
174509467b48Spatrick     LiveInterval &NewLI = createEmptyInterval(NewVReg);
174609467b48Spatrick     SplitLIs.push_back(&NewLI);
174709467b48Spatrick   }
174809467b48Spatrick   ConEQ.Distribute(LI, SplitLIs.data(), *MRI);
174909467b48Spatrick }
175009467b48Spatrick 
constructMainRangeFromSubranges(LiveInterval & LI)175109467b48Spatrick void LiveIntervals::constructMainRangeFromSubranges(LiveInterval &LI) {
1752097a140dSpatrick   assert(LICalc && "LICalc not initialized.");
1753097a140dSpatrick   LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
1754097a140dSpatrick   LICalc->constructMainRangeFromSubranges(LI);
175509467b48Spatrick }
1756