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 |