xref: /freebsd/contrib/llvm-project/llvm/include/llvm/CodeGen/LiveIntervals.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===- LiveIntervals.h - Live Interval Analysis -----------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// \file This file implements the LiveInterval analysis pass.  Given some
10 /// numbering of each the machine instructions (in this implemention depth-first
11 /// order) an interval [i, j) is said to be a live interval for register v if
12 /// there is no instruction with number j' > j such that v is live at j' and
13 /// there is no instruction with number i' < i such that v is live at i'. In
14 /// this implementation intervals can have holes, i.e. an interval might look
15 /// like [1,20), [50,65), [1000,1001).
16 //
17 //===----------------------------------------------------------------------===//
18 
19 #ifndef LLVM_CODEGEN_LIVEINTERVALS_H
20 #define LLVM_CODEGEN_LIVEINTERVALS_H
21 
22 #include "llvm/ADT/ArrayRef.h"
23 #include "llvm/ADT/IndexedMap.h"
24 #include "llvm/ADT/SmallVector.h"
25 #include "llvm/CodeGen/LiveInterval.h"
26 #include "llvm/CodeGen/LiveIntervalCalc.h"
27 #include "llvm/CodeGen/MachineBasicBlock.h"
28 #include "llvm/CodeGen/MachineFunctionPass.h"
29 #include "llvm/CodeGen/MachinePassManager.h"
30 #include "llvm/CodeGen/SlotIndexes.h"
31 #include "llvm/CodeGen/TargetRegisterInfo.h"
32 #include "llvm/MC/LaneBitmask.h"
33 #include "llvm/Support/CommandLine.h"
34 #include "llvm/Support/Compiler.h"
35 #include "llvm/Support/ErrorHandling.h"
36 #include <cassert>
37 #include <cstdint>
38 #include <utility>
39 
40 namespace llvm {
41 
42 LLVM_ABI extern cl::opt<bool> UseSegmentSetForPhysRegs;
43 
44 class BitVector;
45 class MachineBlockFrequencyInfo;
46 class MachineDominatorTree;
47 class MachineFunction;
48 class MachineInstr;
49 class MachineRegisterInfo;
50 class ProfileSummaryInfo;
51 class raw_ostream;
52 class TargetInstrInfo;
53 class VirtRegMap;
54 
55 class LiveIntervals {
56   friend class LiveIntervalsAnalysis;
57   friend class LiveIntervalsWrapperPass;
58 
59   MachineFunction *MF = nullptr;
60   MachineRegisterInfo *MRI = nullptr;
61   const TargetRegisterInfo *TRI = nullptr;
62   const TargetInstrInfo *TII = nullptr;
63   SlotIndexes *Indexes = nullptr;
64   MachineDominatorTree *DomTree = nullptr;
65   std::unique_ptr<LiveIntervalCalc> LICalc;
66 
67   /// Special pool allocator for VNInfo's (LiveInterval val#).
68   VNInfo::Allocator VNInfoAllocator;
69 
70   /// Live interval pointers for all the virtual registers.
71   IndexedMap<LiveInterval *, VirtReg2IndexFunctor> VirtRegIntervals;
72 
73   /// Sorted list of instructions with register mask operands. Always use the
74   /// 'r' slot, RegMasks are normal clobbers, not early clobbers.
75   SmallVector<SlotIndex, 8> RegMaskSlots;
76 
77   /// This vector is parallel to RegMaskSlots, it holds a pointer to the
78   /// corresponding register mask.  This pointer can be recomputed as:
79   ///
80   ///   MI = Indexes->getInstructionFromIndex(RegMaskSlot[N]);
81   ///   unsigned OpNum = findRegMaskOperand(MI);
82   ///   RegMaskBits[N] = MI->getOperand(OpNum).getRegMask();
83   ///
84   /// This is kept in a separate vector partly because some standard
85   /// libraries don't support lower_bound() with mixed objects, partly to
86   /// improve locality when searching in RegMaskSlots.
87   /// Also see the comment in LiveInterval::find().
88   SmallVector<const uint32_t *, 8> RegMaskBits;
89 
90   /// For each basic block number, keep (begin, size) pairs indexing into the
91   /// RegMaskSlots and RegMaskBits arrays.
92   /// Note that basic block numbers may not be layout contiguous, that's why
93   /// we can't just keep track of the first register mask in each basic
94   /// block.
95   SmallVector<std::pair<unsigned, unsigned>, 8> RegMaskBlocks;
96 
97   /// Keeps a live range set for each register unit to track fixed physreg
98   /// interference.
99   SmallVector<LiveRange *, 0> RegUnitRanges;
100 
101   // Can only be created from pass manager.
102   LiveIntervals() = default;
LiveIntervals(MachineFunction & MF,SlotIndexes & SI,MachineDominatorTree & DT)103   LiveIntervals(MachineFunction &MF, SlotIndexes &SI, MachineDominatorTree &DT)
104       : Indexes(&SI), DomTree(&DT) {
105     analyze(MF);
106   }
107 
108   LLVM_ABI void analyze(MachineFunction &MF);
109 
110   LLVM_ABI void clear();
111 
112 public:
113   LiveIntervals(LiveIntervals &&) = default;
114   LLVM_ABI ~LiveIntervals();
115 
116   LLVM_ABI bool invalidate(MachineFunction &MF, const PreservedAnalyses &PA,
117                            MachineFunctionAnalysisManager::Invalidator &Inv);
118 
119   /// Calculate the spill weight to assign to a single instruction.
120   /// If \p PSI is provided the calculation is altered for optsize functions.
121   LLVM_ABI static float getSpillWeight(bool isDef, bool isUse,
122                                        const MachineBlockFrequencyInfo *MBFI,
123                                        const MachineInstr &MI,
124                                        ProfileSummaryInfo *PSI = nullptr);
125 
126   /// Calculate the spill weight to assign to a single instruction.
127   /// If \p PSI is provided the calculation is altered for optsize functions.
128   LLVM_ABI static float getSpillWeight(bool isDef, bool isUse,
129                                        const MachineBlockFrequencyInfo *MBFI,
130                                        const MachineBasicBlock *MBB,
131                                        ProfileSummaryInfo *PSI = nullptr);
132 
getInterval(Register Reg)133   LiveInterval &getInterval(Register Reg) {
134     if (hasInterval(Reg))
135       return *VirtRegIntervals[Reg.id()];
136 
137     return createAndComputeVirtRegInterval(Reg);
138   }
139 
getInterval(Register Reg)140   const LiveInterval &getInterval(Register Reg) const {
141     return const_cast<LiveIntervals *>(this)->getInterval(Reg);
142   }
143 
hasInterval(Register Reg)144   bool hasInterval(Register Reg) const {
145     return VirtRegIntervals.inBounds(Reg.id()) && VirtRegIntervals[Reg.id()];
146   }
147 
148   /// Interval creation.
createEmptyInterval(Register Reg)149   LiveInterval &createEmptyInterval(Register Reg) {
150     assert(!hasInterval(Reg) && "Interval already exists!");
151     VirtRegIntervals.grow(Reg.id());
152     auto &Interval = VirtRegIntervals[Reg.id()];
153     Interval = createInterval(Reg);
154     return *Interval;
155   }
156 
createAndComputeVirtRegInterval(Register Reg)157   LiveInterval &createAndComputeVirtRegInterval(Register Reg) {
158     LiveInterval &LI = createEmptyInterval(Reg);
159     computeVirtRegInterval(LI);
160     return LI;
161   }
162 
163   /// Return an existing interval for \p Reg.
164   /// If \p Reg has no interval then this creates a new empty one instead.
165   /// Note: does not trigger interval computation.
getOrCreateEmptyInterval(Register Reg)166   LiveInterval &getOrCreateEmptyInterval(Register Reg) {
167     return hasInterval(Reg) ? getInterval(Reg) : createEmptyInterval(Reg);
168   }
169 
170   /// Interval removal.
removeInterval(Register Reg)171   void removeInterval(Register Reg) {
172     auto &Interval = VirtRegIntervals[Reg];
173     delete Interval;
174     Interval = nullptr;
175   }
176 
177   /// Given a register and an instruction, adds a live segment from that
178   /// instruction to the end of its MBB.
179   LLVM_ABI LiveInterval::Segment
180   addSegmentToEndOfBlock(Register Reg, MachineInstr &startInst);
181 
182   /// After removing some uses of a register, shrink its live range to just
183   /// the remaining uses. This method does not compute reaching defs for new
184   /// uses, and it doesn't remove dead defs.
185   /// Dead PHIDef values are marked as unused. New dead machine instructions
186   /// are added to the dead vector. Returns true if the interval may have been
187   /// separated into multiple connected components.
188   LLVM_ABI bool shrinkToUses(LiveInterval *li,
189                              SmallVectorImpl<MachineInstr *> *dead = nullptr);
190 
191   /// Specialized version of
192   /// shrinkToUses(LiveInterval *li, SmallVectorImpl<MachineInstr*> *dead)
193   /// that works on a subregister live range and only looks at uses matching
194   /// the lane mask of the subregister range.
195   /// This may leave the subrange empty which needs to be cleaned up with
196   /// LiveInterval::removeEmptySubranges() afterwards.
197   LLVM_ABI void shrinkToUses(LiveInterval::SubRange &SR, Register Reg);
198 
199   /// Extend the live range \p LR to reach all points in \p Indices. The
200   /// points in the \p Indices array must be jointly dominated by the union
201   /// of the existing defs in \p LR and points in \p Undefs.
202   ///
203   /// PHI-defs are added as needed to maintain SSA form.
204   ///
205   /// If a SlotIndex in \p Indices is the end index of a basic block, \p LR
206   /// will be extended to be live out of the basic block.
207   /// If a SlotIndex in \p Indices is jointy dominated only by points in
208   /// \p Undefs, the live range will not be extended to that point.
209   ///
210   /// See also LiveRangeCalc::extend().
211   LLVM_ABI void extendToIndices(LiveRange &LR, ArrayRef<SlotIndex> Indices,
212                                 ArrayRef<SlotIndex> Undefs);
213 
extendToIndices(LiveRange & LR,ArrayRef<SlotIndex> Indices)214   void extendToIndices(LiveRange &LR, ArrayRef<SlotIndex> Indices) {
215     extendToIndices(LR, Indices, /*Undefs=*/{});
216   }
217 
218   /// If \p LR has a live value at \p Kill, prune its live range by removing
219   /// any liveness reachable from Kill. Add live range end points to
220   /// EndPoints such that extendToIndices(LI, EndPoints) will reconstruct the
221   /// value's live range.
222   ///
223   /// Calling pruneValue() and extendToIndices() can be used to reconstruct
224   /// SSA form after adding defs to a virtual register.
225   LLVM_ABI void pruneValue(LiveRange &LR, SlotIndex Kill,
226                            SmallVectorImpl<SlotIndex> *EndPoints);
227 
228   /// This function should not be used. Its intent is to tell you that you are
229   /// doing something wrong if you call pruneValue directly on a
230   /// LiveInterval. Indeed, you are supposed to call pruneValue on the main
231   /// LiveRange and all the LiveRanges of the subranges if any.
pruneValue(LiveInterval &,SlotIndex,SmallVectorImpl<SlotIndex> *)232   LLVM_ATTRIBUTE_UNUSED void pruneValue(LiveInterval &, SlotIndex,
233                                         SmallVectorImpl<SlotIndex> *) {
234     llvm_unreachable(
235         "Use pruneValue on the main LiveRange and on each subrange");
236   }
237 
getSlotIndexes()238   SlotIndexes *getSlotIndexes() const { return Indexes; }
239 
240   /// Returns true if the specified machine instr has been removed or was
241   /// never entered in the map.
isNotInMIMap(const MachineInstr & Instr)242   bool isNotInMIMap(const MachineInstr &Instr) const {
243     return !Indexes->hasIndex(Instr);
244   }
245 
246   /// Returns the base index of the given instruction.
getInstructionIndex(const MachineInstr & Instr)247   SlotIndex getInstructionIndex(const MachineInstr &Instr) const {
248     return Indexes->getInstructionIndex(Instr);
249   }
250 
251   /// Returns the instruction associated with the given index.
getInstructionFromIndex(SlotIndex index)252   MachineInstr *getInstructionFromIndex(SlotIndex index) const {
253     return Indexes->getInstructionFromIndex(index);
254   }
255 
256   /// Return the first index in the given basic block.
getMBBStartIdx(const MachineBasicBlock * mbb)257   SlotIndex getMBBStartIdx(const MachineBasicBlock *mbb) const {
258     return Indexes->getMBBStartIdx(mbb);
259   }
260 
261   /// Return the last index in the given basic block.
getMBBEndIdx(const MachineBasicBlock * mbb)262   SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const {
263     return Indexes->getMBBEndIdx(mbb);
264   }
265 
isLiveInToMBB(const LiveRange & LR,const MachineBasicBlock * mbb)266   bool isLiveInToMBB(const LiveRange &LR, const MachineBasicBlock *mbb) const {
267     return LR.liveAt(getMBBStartIdx(mbb));
268   }
269 
isLiveOutOfMBB(const LiveRange & LR,const MachineBasicBlock * mbb)270   bool isLiveOutOfMBB(const LiveRange &LR, const MachineBasicBlock *mbb) const {
271     return LR.liveAt(getMBBEndIdx(mbb).getPrevSlot());
272   }
273 
getMBBFromIndex(SlotIndex index)274   MachineBasicBlock *getMBBFromIndex(SlotIndex index) const {
275     return Indexes->getMBBFromIndex(index);
276   }
277 
insertMBBInMaps(MachineBasicBlock * MBB)278   void insertMBBInMaps(MachineBasicBlock *MBB) {
279     Indexes->insertMBBInMaps(MBB);
280     assert(unsigned(MBB->getNumber()) == RegMaskBlocks.size() &&
281            "Blocks must be added in order.");
282     RegMaskBlocks.push_back(std::make_pair(RegMaskSlots.size(), 0));
283   }
284 
InsertMachineInstrInMaps(MachineInstr & MI)285   SlotIndex InsertMachineInstrInMaps(MachineInstr &MI) {
286     return Indexes->insertMachineInstrInMaps(MI);
287   }
288 
InsertMachineInstrRangeInMaps(MachineBasicBlock::iterator B,MachineBasicBlock::iterator E)289   void InsertMachineInstrRangeInMaps(MachineBasicBlock::iterator B,
290                                      MachineBasicBlock::iterator E) {
291     for (MachineBasicBlock::iterator I = B; I != E; ++I)
292       Indexes->insertMachineInstrInMaps(*I);
293   }
294 
RemoveMachineInstrFromMaps(MachineInstr & MI)295   void RemoveMachineInstrFromMaps(MachineInstr &MI) {
296     Indexes->removeMachineInstrFromMaps(MI);
297   }
298 
ReplaceMachineInstrInMaps(MachineInstr & MI,MachineInstr & NewMI)299   SlotIndex ReplaceMachineInstrInMaps(MachineInstr &MI, MachineInstr &NewMI) {
300     return Indexes->replaceMachineInstrInMaps(MI, NewMI);
301   }
302 
getVNInfoAllocator()303   VNInfo::Allocator &getVNInfoAllocator() { return VNInfoAllocator; }
304 
305   /// Implement the dump method.
306   LLVM_ABI void print(raw_ostream &O) const;
307   LLVM_ABI void dump() const;
308 
309   // For legacy pass to recompute liveness.
reanalyze(MachineFunction & MF)310   void reanalyze(MachineFunction &MF) {
311     clear();
312     analyze(MF);
313   }
314 
getDomTree()315   MachineDominatorTree &getDomTree() { return *DomTree; }
316 
317   /// If LI is confined to a single basic block, return a pointer to that
318   /// block.  If LI is live in to or out of any block, return NULL.
319   LLVM_ABI MachineBasicBlock *intervalIsInOneMBB(const LiveInterval &LI) const;
320 
321   /// Returns true if VNI is killed by any PHI-def values in LI.
322   /// This may conservatively return true to avoid expensive computations.
323   LLVM_ABI bool hasPHIKill(const LiveInterval &LI, const VNInfo *VNI) const;
324 
325   /// Add kill flags to any instruction that kills a virtual register.
326   LLVM_ABI void addKillFlags(const VirtRegMap *);
327 
328   /// Call this method to notify LiveIntervals that instruction \p MI has been
329   /// moved within a basic block. This will update the live intervals for all
330   /// operands of \p MI. Moves between basic blocks are not supported.
331   ///
332   /// \param UpdateFlags Update live intervals for nonallocatable physregs.
333   LLVM_ABI void handleMove(MachineInstr &MI, bool UpdateFlags = false);
334 
335   /// Update intervals of operands of all instructions in the newly
336   /// created bundle specified by \p BundleStart.
337   ///
338   /// \param UpdateFlags Update live intervals for nonallocatable physregs.
339   ///
340   /// Assumes existing liveness is accurate.
341   /// \pre BundleStart should be the first instruction in the Bundle.
342   /// \pre BundleStart should not have a have SlotIndex as one will be assigned.
343   LLVM_ABI void handleMoveIntoNewBundle(MachineInstr &BundleStart,
344                                         bool UpdateFlags = false);
345 
346   /// Update live intervals for instructions in a range of iterators. It is
347   /// intended for use after target hooks that may insert or remove
348   /// instructions, and is only efficient for a small number of instructions.
349   ///
350   /// OrigRegs is a vector of registers that were originally used by the
351   /// instructions in the range between the two iterators.
352   ///
353   /// Currently, the only changes that are supported are simple removal
354   /// and addition of uses.
355   LLVM_ABI void repairIntervalsInRange(MachineBasicBlock *MBB,
356                                        MachineBasicBlock::iterator Begin,
357                                        MachineBasicBlock::iterator End,
358                                        ArrayRef<Register> OrigRegs);
359 
360   // Register mask functions.
361   //
362   // Machine instructions may use a register mask operand to indicate that a
363   // large number of registers are clobbered by the instruction.  This is
364   // typically used for calls.
365   //
366   // For compile time performance reasons, these clobbers are not recorded in
367   // the live intervals for individual physical registers.  Instead,
368   // LiveIntervalAnalysis maintains a sorted list of instructions with
369   // register mask operands.
370 
371   /// Returns a sorted array of slot indices of all instructions with
372   /// register mask operands.
getRegMaskSlots()373   ArrayRef<SlotIndex> getRegMaskSlots() const { return RegMaskSlots; }
374 
375   /// Returns a sorted array of slot indices of all instructions with register
376   /// mask operands in the basic block numbered \p MBBNum.
getRegMaskSlotsInBlock(unsigned MBBNum)377   ArrayRef<SlotIndex> getRegMaskSlotsInBlock(unsigned MBBNum) const {
378     std::pair<unsigned, unsigned> P = RegMaskBlocks[MBBNum];
379     return getRegMaskSlots().slice(P.first, P.second);
380   }
381 
382   /// Returns an array of register mask pointers corresponding to
383   /// getRegMaskSlots().
getRegMaskBits()384   ArrayRef<const uint32_t *> getRegMaskBits() const { return RegMaskBits; }
385 
386   /// Returns an array of mask pointers corresponding to
387   /// getRegMaskSlotsInBlock(MBBNum).
getRegMaskBitsInBlock(unsigned MBBNum)388   ArrayRef<const uint32_t *> getRegMaskBitsInBlock(unsigned MBBNum) const {
389     std::pair<unsigned, unsigned> P = RegMaskBlocks[MBBNum];
390     return getRegMaskBits().slice(P.first, P.second);
391   }
392 
393   /// Test if \p LI is live across any register mask instructions, and
394   /// compute a bit mask of physical registers that are not clobbered by any
395   /// of them.
396   ///
397   /// Returns false if \p LI doesn't cross any register mask instructions. In
398   /// that case, the bit vector is not filled in.
399   LLVM_ABI bool checkRegMaskInterference(const LiveInterval &LI,
400                                          BitVector &UsableRegs);
401 
402   // Register unit functions.
403   //
404   // Fixed interference occurs when MachineInstrs use physregs directly
405   // instead of virtual registers. This typically happens when passing
406   // arguments to a function call, or when instructions require operands in
407   // fixed registers.
408   //
409   // Each physreg has one or more register units, see MCRegisterInfo. We
410   // track liveness per register unit to handle aliasing registers more
411   // efficiently.
412 
413   /// Return the live range for register unit \p Unit. It will be computed if
414   /// it doesn't exist.
getRegUnit(unsigned Unit)415   LiveRange &getRegUnit(unsigned Unit) {
416     LiveRange *LR = RegUnitRanges[Unit];
417     if (!LR) {
418       // Compute missing ranges on demand.
419       // Use segment set to speed-up initial computation of the live range.
420       RegUnitRanges[Unit] = LR = new LiveRange(UseSegmentSetForPhysRegs);
421       computeRegUnitRange(*LR, Unit);
422     }
423     return *LR;
424   }
425 
426   /// Return the live range for register unit \p Unit if it has already been
427   /// computed, or nullptr if it hasn't been computed yet.
getCachedRegUnit(unsigned Unit)428   LiveRange *getCachedRegUnit(unsigned Unit) { return RegUnitRanges[Unit]; }
429 
getCachedRegUnit(unsigned Unit)430   const LiveRange *getCachedRegUnit(unsigned Unit) const {
431     return RegUnitRanges[Unit];
432   }
433 
434   /// Remove computed live range for register unit \p Unit. Subsequent uses
435   /// should rely on on-demand recomputation.
removeRegUnit(unsigned Unit)436   void removeRegUnit(unsigned Unit) {
437     delete RegUnitRanges[Unit];
438     RegUnitRanges[Unit] = nullptr;
439   }
440 
441   /// Remove associated live ranges for the register units associated with \p
442   /// Reg. Subsequent uses should rely on on-demand recomputation.  \note This
443   /// method can result in inconsistent liveness tracking if multiple phyical
444   /// registers share a regunit, and should be used cautiously.
removeAllRegUnitsForPhysReg(MCRegister Reg)445   void removeAllRegUnitsForPhysReg(MCRegister Reg) {
446     for (MCRegUnit Unit : TRI->regunits(Reg))
447       removeRegUnit(Unit);
448   }
449 
450   /// Remove value numbers and related live segments starting at position
451   /// \p Pos that are part of any liverange of physical register \p Reg or one
452   /// of its subregisters.
453   LLVM_ABI void removePhysRegDefAt(MCRegister Reg, SlotIndex Pos);
454 
455   /// Remove value number and related live segments of \p LI and its subranges
456   /// that start at position \p Pos.
457   LLVM_ABI void removeVRegDefAt(LiveInterval &LI, SlotIndex Pos);
458 
459   /// Split separate components in LiveInterval \p LI into separate intervals.
460   LLVM_ABI void
461   splitSeparateComponents(LiveInterval &LI,
462                           SmallVectorImpl<LiveInterval *> &SplitLIs);
463 
464   /// For live interval \p LI with correct SubRanges construct matching
465   /// information for the main live range. Expects the main live range to not
466   /// have any segments or value numbers.
467   LLVM_ABI void constructMainRangeFromSubranges(LiveInterval &LI);
468 
469 private:
470   /// Compute live intervals for all virtual registers.
471   void computeVirtRegs();
472 
473   /// Compute RegMaskSlots and RegMaskBits.
474   void computeRegMasks();
475 
476   /// Walk the values in \p LI and check for dead values:
477   /// - Dead PHIDef values are marked as unused.
478   /// - Dead operands are marked as such.
479   /// - Completely dead machine instructions are added to the \p dead vector
480   ///   if it is not nullptr.
481   /// Returns true if any PHI value numbers have been removed which may
482   /// have separated the interval into multiple connected components.
483   bool computeDeadValues(LiveInterval &LI,
484                          SmallVectorImpl<MachineInstr *> *dead);
485 
486   LLVM_ABI static LiveInterval *createInterval(Register Reg);
487 
488   void printInstrs(raw_ostream &O) const;
489   void dumpInstrs() const;
490 
491   void computeLiveInRegUnits();
492   LLVM_ABI void computeRegUnitRange(LiveRange &, unsigned Unit);
493   LLVM_ABI bool computeVirtRegInterval(LiveInterval &);
494 
495   using ShrinkToUsesWorkList = SmallVector<std::pair<SlotIndex, VNInfo *>, 16>;
496   void extendSegmentsToUses(LiveRange &Segments, ShrinkToUsesWorkList &WorkList,
497                             Register Reg, LaneBitmask LaneMask);
498 
499   /// Helper function for repairIntervalsInRange(), walks backwards and
500   /// creates/modifies live segments in \p LR to match the operands found.
501   /// Only full operands or operands with subregisters matching \p LaneMask
502   /// are considered.
503   void repairOldRegInRange(MachineBasicBlock::iterator Begin,
504                            MachineBasicBlock::iterator End,
505                            const SlotIndex endIdx, LiveRange &LR, Register Reg,
506                            LaneBitmask LaneMask = LaneBitmask::getAll());
507 
508   class HMEditor;
509 };
510 
511 class LiveIntervalsAnalysis : public AnalysisInfoMixin<LiveIntervalsAnalysis> {
512   friend AnalysisInfoMixin<LiveIntervalsAnalysis>;
513   LLVM_ABI static AnalysisKey Key;
514 
515 public:
516   using Result = LiveIntervals;
517   LLVM_ABI Result run(MachineFunction &MF,
518                       MachineFunctionAnalysisManager &MFAM);
519 };
520 
521 class LiveIntervalsPrinterPass
522     : public PassInfoMixin<LiveIntervalsPrinterPass> {
523   raw_ostream &OS;
524 
525 public:
LiveIntervalsPrinterPass(raw_ostream & OS)526   explicit LiveIntervalsPrinterPass(raw_ostream &OS) : OS(OS) {}
527   LLVM_ABI PreservedAnalyses run(MachineFunction &MF,
528                                  MachineFunctionAnalysisManager &MFAM);
isRequired()529   static bool isRequired() { return true; }
530 };
531 
532 class LLVM_ABI LiveIntervalsWrapperPass : public MachineFunctionPass {
533   LiveIntervals LIS;
534 
535 public:
536   static char ID;
537 
538   LiveIntervalsWrapperPass();
539 
540   void getAnalysisUsage(AnalysisUsage &AU) const override;
releaseMemory()541   void releaseMemory() override { LIS.clear(); }
542 
543   /// Pass entry point; Calculates LiveIntervals.
544   bool runOnMachineFunction(MachineFunction &) override;
545 
546   /// Implement the dump method.
547   void print(raw_ostream &O, const Module * = nullptr) const override {
548     LIS.print(O);
549   }
550 
getLIS()551   LiveIntervals &getLIS() { return LIS; }
552 };
553 
554 } // end namespace llvm
555 
556 #endif
557