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