LLVM 24.0.0git
SIRegisterInfo.h
Go to the documentation of this file.
1//===-- SIRegisterInfo.h - SI Register Info Interface ----------*- 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
10/// Interface definition for SIRegisterInfo
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_AMDGPU_SIREGISTERINFO_H
15#define LLVM_LIB_TARGET_AMDGPU_SIREGISTERINFO_H
16
17#include "llvm/ADT/BitVector.h"
18
19#define GET_REGINFO_HEADER
20#include "AMDGPUGenRegisterInfo.inc"
21
22#include "SIDefines.h"
23
24namespace llvm {
25
26class GCNSubtarget;
27class LiveIntervals;
28class LiveRegUnits;
29class MachineInstrBuilder;
30class RegisterBank;
31struct SGPRSpillBuilder;
32
33/// Register allocation hint types. Helps eliminate unneeded COPY with True16
34namespace AMDGPURI {
35
36enum { Size16 = 1, Size32 = 2 };
37
38} // end namespace AMDGPURI
39
41private:
42 const GCNSubtarget &ST;
43 bool SpillSGPRToVGPR;
44 bool isWave32;
45 BitVector RegPressureIgnoredUnits;
46
47 /// Sub reg indexes for getRegSplitParts.
48 /// First index represents subreg size from 1 to 32 Half DWORDS.
49 /// The inner vector is sorted by bit offset.
50 /// Provided a register can be fully split with given subregs,
51 /// all elements of the inner vector combined give a full lane mask.
52 static std::array<std::vector<int16_t>, 32> RegSplitParts;
53
54 // Table representing sub reg of given width and offset.
55 // First index is subreg size: 32, 64, 96, 128, 160, 192, 224, 256, 512.
56 // Second index is 32 different dword offsets.
57 static std::array<std::array<uint16_t, 32>, 9> SubRegFromChannelTable;
58
59 void reserveRegisterTuples(BitVector &, MCRegister Reg) const;
60
61public:
63
64 struct SpilledReg {
66 int Lane = -1;
67
68 SpilledReg() = default;
69 SpilledReg(Register R, int L) : VGPR(R), Lane(L) {}
70
71 bool hasLane() { return Lane != -1; }
72 bool hasReg() { return VGPR != 0; }
73 };
74
75 /// \returns the sub reg enum value for the given \p Channel
76 /// (e.g. getSubRegFromChannel(0) -> AMDGPU::sub0)
77 static unsigned getSubRegFromChannel(unsigned Channel, unsigned NumRegs = 1);
78
79 bool spillSGPRToVGPR() const {
80 return SpillSGPRToVGPR;
81 }
82
83 bool isCFISavedRegsSpillEnabled() const;
84
85 /// Return the largest available SGPR aligned to \p Align for the register
86 /// class \p RC.
88 const unsigned Align,
89 const TargetRegisterClass *RC) const;
90
91 /// Return the end register initially reserved for the scratch buffer in case
92 /// spilling is needed.
94
95 BitVector getReservedRegs(const MachineFunction &MF) const override;
96 bool isAsmClobberable(const MachineFunction &MF,
97 MCRegister PhysReg) const override;
98
99 const MCPhysReg *getCalleeSavedRegs(const MachineFunction *MF) const override;
102 CallingConv::ID) const override;
103 const uint32_t *getNoPreservedMask() const override;
104
105 // Functions with the amdgpu_cs_chain or amdgpu_cs_chain_preserve calling
106 // conventions are free to use certain VGPRs without saving and restoring any
107 // lanes (not even inactive ones).
108 static bool isChainScratchRegister(Register VGPR);
109
110 unsigned getCSRFirstUseCost(const MachineFunction &) const override {
111 // The cost of 27 balances multiple factors that influence CSR cost:
112 // - Saving a SGPR CSR to VGPR lanes is relatively cheap.
113 // - In cases where this is not possible, stack access is very expensive.
114 // - CSRs are also the high registers, and we want to minimize the number of
115 // used registers as it impacts occupancy.
116 // Note: Register allocation only applies these cost to callee-save
117 // registers according to getCalleeSavedRegs, so handling of calling
118 // conventions with no CSR is handled there.
119 return 27;
120 }
121
122 // When building a block VGPR load, we only really transfer a subset of the
123 // registers in the block, based on a mask. Liveness analysis is not aware of
124 // the mask, so it might consider that any register in the block is available
125 // before the load and may therefore be scavenged. This is not ok for CSRs
126 // that are not clobbered, since the caller will expect them to be preserved.
127 // This method will add artificial implicit uses for those registers on the
128 // load instruction, so liveness analysis knows they're unavailable.
130 Register BlockReg) const;
131
132 // Iterate over all VGPRs in the given BlockReg and emit CFI for each VGPR
133 // as-needed depending on the (statically known) mask, relative to the given
134 // base Offset.
137 Register BlockReg, int64_t Offset) const;
138
139 const TargetRegisterClass *
141 const MachineFunction &MF) const override;
142
143 Register getFrameRegister(const MachineFunction &MF) const override;
144
145 bool hasBasePointer(const MachineFunction &MF) const;
147
148 bool shouldRealignStack(const MachineFunction &MF) const override;
149 bool requiresRegisterScavenging(const MachineFunction &Fn) const override;
150
151 bool requiresFrameIndexScavenging(const MachineFunction &MF) const override;
153 const MachineFunction &MF) const override;
154 bool requiresVirtualBaseRegisters(const MachineFunction &Fn) const override;
155
156 int64_t getScratchInstrOffset(const MachineInstr *MI) const;
157
159 int Idx) const override;
160
161 bool needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const override;
162
164 int64_t Offset) const override;
165
167 int64_t Offset) const override;
168
169 bool isFrameOffsetLegal(const MachineInstr *MI, Register BaseReg,
170 int64_t Offset) const override;
171
172 const TargetRegisterClass *
173 getPointerRegClass(unsigned Kind = 0) const override;
174
175 /// Returns a legal register class to copy a register in the specified class
176 /// to or from. If it is possible to copy the register directly without using
177 /// a cross register class copy, return the specified RC. Returns NULL if it
178 /// is not possible to copy between two registers of the specified class.
179 const TargetRegisterClass *
180 getCrossCopyRegClass(const TargetRegisterClass *RC) const override;
181
182 const TargetRegisterClass *
184 return &AMDGPU::VReg_1024RegClass;
185 }
186
187 void buildVGPRSpillLoadStore(SGPRSpillBuilder &SB, int Index, int Offset,
188 bool IsLoad, bool IsKill = true) const;
189
190 /// If \p OnlyToVGPR is true, this will only succeed if this manages to find a
191 /// free VGPR lane to spill.
193 SlotIndexes *Indexes = nullptr, LiveIntervals *LIS = nullptr,
194 bool OnlyToVGPR = false, bool SpillToPhysVGPRLane = false,
195 bool NeedsCFI = false) const;
196
198 SlotIndexes *Indexes = nullptr, LiveIntervals *LIS = nullptr,
199 bool OnlyToVGPR = false,
200 bool SpillToPhysVGPRLane = false) const;
201
203 MachineBasicBlock &RestoreMBB, Register SGPR,
204 RegScavenger *RS) const;
205
207 unsigned FIOperandNum,
208 RegScavenger *RS) const override;
209
212 SlotIndexes *Indexes = nullptr, LiveIntervals *LIS = nullptr,
213 bool SpillToPhysVGPRLane = false) const;
214
215 StringRef getRegAsmName(MCRegister Reg) const override;
216
217 // Pseudo regs are not allowed
218 unsigned getHWRegIndex(MCRegister Reg) const;
219
222
225
228
230 const TargetRegisterClass *
232
234 const TargetRegisterClass *
236
239
240 /// \returns true if this class contains only SGPR registers
241 static bool isSGPRClass(const TargetRegisterClass *RC) {
242 return hasSGPRs(RC) && !hasVGPRs(RC) && !hasAGPRs(RC);
243 }
244
245 /// \returns true if this class ID contains only SGPR registers
246 bool isSGPRClassID(unsigned RCID) const {
247 return isSGPRClass(getRegClass(RCID));
248 }
249
250 bool isSGPRReg(const MachineRegisterInfo &MRI, Register Reg) const;
252 return isSGPRClass(getPhysRegBaseClass(Reg));
253 }
254
256 return isVGPRClass(getPhysRegBaseClass(Reg));
257 }
258
259 /// \returns true if this class contains only VGPR registers
260 static bool isVGPRClass(const TargetRegisterClass *RC) {
261 return hasVGPRs(RC) && !hasAGPRs(RC) && !hasSGPRs(RC);
262 }
263
264 /// \returns true if this class contains only AGPR registers
265 static bool isAGPRClass(const TargetRegisterClass *RC) {
266 return hasAGPRs(RC) && !hasVGPRs(RC) && !hasSGPRs(RC);
267 }
268
269 /// \returns true only if this class contains both VGPR and AGPR registers
271 return hasVGPRs(RC) && hasAGPRs(RC) && !hasSGPRs(RC);
272 }
273
274 /// \returns true only if this class contains both VGPR and SGPR registers
275 bool isVSSuperClass(const TargetRegisterClass *RC) const {
276 return hasVGPRs(RC) && hasSGPRs(RC) && !hasAGPRs(RC);
277 }
278
279 /// \returns true if this class contains VGPR registers.
280 static bool hasVGPRs(const TargetRegisterClass *RC) {
281 return RC->TSFlags & SIRCFlags::HasVGPR;
282 }
283
284 /// \returns true if this class contains AGPR registers.
285 static bool hasAGPRs(const TargetRegisterClass *RC) {
286 return RC->TSFlags & SIRCFlags::HasAGPR;
287 }
288
289 /// \returns true if this class contains SGPR registers.
290 static bool hasSGPRs(const TargetRegisterClass *RC) {
291 return RC->TSFlags & SIRCFlags::HasSGPR;
292 }
293
294 /// \returns true if this class contains any vector registers.
296 return hasVGPRs(RC) || hasAGPRs(RC);
297 }
298
299 /// \returns A VGPR reg class with the same width as \p SRC
300 const TargetRegisterClass *
302
303 /// \returns An AGPR reg class with the same width as \p SRC
304 const TargetRegisterClass *
306
307 /// \returns An AGPR+VGPR super reg class with the same width as \p SRC
308 const TargetRegisterClass *
310
311 /// \returns A SGPR reg class with the same width as \p SRC
312 const TargetRegisterClass *
314
315 /// Returns a register class which is compatible with \p SuperRC, such that a
316 /// subregister exists with class \p SubRC with subregister index \p
317 /// SubIdx. If this is impossible (e.g., an unaligned subregister index within
318 /// a register tuple), return null.
319 const TargetRegisterClass *
321 const TargetRegisterClass *SubRC,
322 unsigned SubIdx) const;
323
324 /// \returns True if operands defined with this operand type can accept
325 /// a literal constant (i.e. any 32-bit immediate).
326 bool opCanUseLiteralConstant(unsigned OpType) const;
327
328 /// \returns True if operands defined with this operand type can accept
329 /// an inline constant. i.e. An integer value in the range (-16, 64) or
330 /// -4.0f, -2.0f, -1.0f, -0.5f, 0.0f, 0.5f, 1.0f, 2.0f, 4.0f.
331 bool opCanUseInlineConstant(unsigned OpType) const;
332
334 const TargetRegisterClass *RC,
335 const MachineFunction &MF,
336 bool ReserveHighestVGPR = false) const;
337
339 Register Reg) const;
340 const TargetRegisterClass *
342 const MachineOperand &MO) const;
343
344 bool isVGPR(const MachineRegisterInfo &MRI, Register Reg) const;
345 bool isAGPR(const MachineRegisterInfo &MRI, Register Reg) const;
347 return isVGPR(MRI, Reg) || isAGPR(MRI, Reg);
348 }
349
350 // FIXME: SGPRs are assumed to be uniform, but this is not true for i1 SGPRs
351 // (such as VCC) which hold a wave-wide vector of boolean values. Examining
352 // just the register class is not suffcient; it needs to be combined with a
353 // value type. The next predicate isUniformReg() does this correctly.
354 bool isDivergentRegClass(const TargetRegisterClass *RC) const override {
355 return !isSGPRClass(RC);
356 }
357
358 bool isUniformReg(const MachineRegisterInfo &MRI, const RegisterBankInfo &RBI,
359 Register Reg) const override;
360
362 unsigned EltSize) const;
363
364 unsigned getRegPressureLimit(const TargetRegisterClass *RC,
365 MachineFunction &MF) const override;
366
367 unsigned getRegPressureSetLimit(const MachineFunction &MF,
368 unsigned Idx) const override;
369
372 const MachineFunction &MF, const VirtRegMap *VRM,
373 const LiveRegMatrix *Matrix) const override;
374
375 const int *getRegUnitPressureSets(MCRegUnit RegUnit) const override;
376
378
379 const TargetRegisterClass *
380 getRegClassForSizeOnBank(unsigned Size, const RegisterBank &Bank) const;
381
382 const TargetRegisterClass *
384 return getRegClassForSizeOnBank(Ty.getSizeInBits(), Bank);
385 }
386
387 const TargetRegisterClass *
389 const MachineRegisterInfo &MRI) const override;
390
392 return isWave32 ? &AMDGPU::SReg_32RegClass
393 : &AMDGPU::SReg_64RegClass;
394 }
395
397 return isWave32 ? &AMDGPU::SReg_32_XM0_XEXECRegClass
398 : &AMDGPU::SReg_64_XEXECRegClass;
399 }
400
401 // Return the appropriate register class to use for 64-bit VGPRs for the
402 // subtarget.
403 const TargetRegisterClass *getVGPR64Class() const;
404
405 MCRegister getVCC() const;
406
407 MCRegister getExec() const;
408
409 // Find reaching register definition
410 MachineInstr *findReachingDef(Register Reg, unsigned SubReg,
413 LiveIntervals *LIS) const;
414
415 const uint32_t *getAllVGPRRegMask() const;
416 const uint32_t *getAllAGPRRegMask() const;
417 const uint32_t *getAllVectorRegMask() const;
418 const uint32_t *getAllAllocatableSRegMask() const;
419
420 // \returns number of 32 bit registers covered by a \p LM
421 static unsigned getNumCoveredRegs(LaneBitmask LM) {
422 // The assumption is that every lo16 subreg is an even bit and every hi16
423 // is an adjacent odd bit or vice versa.
424 uint64_t Mask = LM.getAsInteger();
425 uint64_t Even = Mask & 0xAAAAAAAAAAAAAAAAULL;
426 Mask = (Even >> 1) | Mask;
427 uint64_t Odd = Mask & 0x5555555555555555ULL;
428 return llvm::popcount(Odd);
429 }
430
431 // \returns a DWORD offset of a \p SubReg
432 unsigned getChannelFromSubReg(unsigned SubReg) const {
433 return SubReg ? (getSubRegIdxOffset(SubReg) + 31) / 32 : 0;
434 }
435
436 // \returns a DWORD size of a \p SubReg
437 unsigned getNumChannelsFromSubReg(unsigned SubReg) const {
438 return getNumCoveredRegs(getSubRegIndexLaneMask(SubReg));
439 }
440
441 // For a given 16 bit \p Reg \returns a 32 bit register holding it.
442 // \returns \p Reg otherwise.
444
445 // Returns true if a given register class is properly aligned for
446 // the subtarget.
447 bool isProperlyAlignedRC(const TargetRegisterClass &RC) const;
448
449 /// Return all SGPR128 which satisfy the waves per execution unit requirement
450 /// of the subtarget.
452
453 /// Return all SGPR64 which satisfy the waves per execution unit requirement
454 /// of the subtarget.
456
457 /// Return all SGPR32 which satisfy the waves per execution unit requirement
458 /// of the subtarget.
460
461 // Insert spill or restore instructions.
462 // When lowering spill pseudos, the RegScavenger should be set.
463 // For creating spill instructions during frame lowering, where no scavenger
464 // is available, LiveUnits can be used.
467 unsigned LoadStoreOp, int Index, Register ValueReg,
468 bool ValueIsKill, MCRegister ScratchOffsetReg,
469 int64_t InstrOffset, MachineMemOperand *MMO,
470 RegScavenger *RS, LiveRegUnits *LiveUnits = nullptr,
471 bool NeedsCFI = false) const;
472
473 // Return alignment in register file of first register in a register tuple.
475 return (RC->TSFlags & SIRCFlags::RegTupleAlignUnitsMask) * 32;
476 }
477
478 // Check if register class RC has required alignment.
480 unsigned AlignNumBits) const {
481 assert(AlignNumBits != 0);
482 unsigned RCAlign = getRegClassAlignmentNumBits(RC);
483 return RCAlign == AlignNumBits ||
484 (RCAlign > AlignNumBits && (RCAlign % AlignNumBits) == 0);
485 }
486
487 // Return alignment of a SubReg relative to start of a register in RC class.
488 // No check if the subreg is supported by the current RC is made.
490 unsigned SubReg) const;
491
492 // \returns a number of registers of a given \p RC used in a function.
493 // Does not go inside function calls. If \p IncludeCalls is true, it will
494 // include registers that may be clobbered by calls.
495 unsigned getNumUsedPhysRegs(const MachineRegisterInfo &MRI,
496 const TargetRegisterClass &RC,
497 bool IncludeCalls = true) const;
498
499 std::optional<uint8_t> getVRegFlagValue(StringRef Name) const override {
500 return Name == "WWM_REG" ? AMDGPU::VirtRegFlag::WWM_REG
501 : std::optional<uint8_t>{};
502 }
503
505 getVRegFlagsOfReg(Register Reg, const MachineFunction &MF) const override;
506
507 float
509 // Prioritize VGPR_32_Lo256 over other classes which may occupy registers
510 // beyond v256.
511 return AMDGPUGenRegisterInfo::getSpillWeightScaleFactor(RC) *
512 ((RC == &AMDGPU::VGPR_32_Lo256RegClass ||
513 RC == &AMDGPU::VReg_64_Lo256_Align2RegClass)
514 ? 2.0
515 : 1.0);
516 }
517};
518
519} // End namespace llvm
520
521#endif
static const TargetRegisterClass * getRegClass(const MachineInstr &MI, Register Reg)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file implements the BitVector class.
#define LLVM_READONLY
Definition Compiler.h:330
IRTranslator LLVM IR MI
Live Register Matrix
Register Reg
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
A debug info location.
Definition DebugLoc.h:126
A set of register units used to track register liveness.
const uint8_t TSFlags
Configurable target specific flags.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
MachineInstrBundleIterator< MachineInstr > iterator
Representation of each machine instruction.
A description of a memory reference used in the backend.
MachineOperand class - Representation of each machine instruction operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Holds all the information related to register banks.
This class implements the register bank concept.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Register materializeFrameBaseRegister(MachineBasicBlock *MBB, int FrameIdx, int64_t Offset) const override
int64_t getScratchInstrOffset(const MachineInstr *MI) const
bool isFrameOffsetLegal(const MachineInstr *MI, Register BaseReg, int64_t Offset) const override
const TargetRegisterClass * getCompatibleSubRegClass(const TargetRegisterClass *SuperRC, const TargetRegisterClass *SubRC, unsigned SubIdx) const
Returns a register class which is compatible with SuperRC, such that a subregister exists with class ...
ArrayRef< MCPhysReg > getAllSGPR64(const MachineFunction &MF) const
Return all SGPR64 which satisfy the waves per execution unit requirement of the subtarget.
MCRegister findUnusedRegister(const MachineRegisterInfo &MRI, const TargetRegisterClass *RC, const MachineFunction &MF, bool ReserveHighestVGPR=false) const
Returns a lowest register that is not used at any point in the function.
static unsigned getSubRegFromChannel(unsigned Channel, unsigned NumRegs=1)
static unsigned getNumCoveredRegs(LaneBitmask LM)
MCPhysReg get32BitRegister(MCPhysReg Reg) const
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const override
void buildSpillLoadStore(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const DebugLoc &DL, unsigned LoadStoreOp, int Index, Register ValueReg, bool ValueIsKill, MCRegister ScratchOffsetReg, int64_t InstrOffset, MachineMemOperand *MMO, RegScavenger *RS, LiveRegUnits *LiveUnits=nullptr, bool NeedsCFI=false) const
bool requiresFrameIndexReplacementScavenging(const MachineFunction &MF) const override
bool shouldRealignStack(const MachineFunction &MF) const override
bool restoreSGPR(MachineBasicBlock::iterator MI, int FI, RegScavenger *RS, SlotIndexes *Indexes=nullptr, LiveIntervals *LIS=nullptr, bool OnlyToVGPR=false, bool SpillToPhysVGPRLane=false) const
bool isProperlyAlignedRC(const TargetRegisterClass &RC) const
static bool hasVectorRegisters(const TargetRegisterClass *RC)
const TargetRegisterClass * getEquivalentVGPRClass(const TargetRegisterClass *SRC) const
Register getFrameRegister(const MachineFunction &MF) const override
LLVM_READONLY const TargetRegisterClass * getVectorSuperClassForBitWidth(unsigned BitWidth) const
bool spillEmergencySGPR(MachineBasicBlock::iterator MI, MachineBasicBlock &RestoreMBB, Register SGPR, RegScavenger *RS) const
float getSpillWeightScaleFactor(const TargetRegisterClass *RC) const override
SIRegisterInfo(const GCNSubtarget &ST)
const uint32_t * getAllVGPRRegMask() const
MCRegister getReturnAddressReg(const MachineFunction &MF) const
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
bool hasBasePointer(const MachineFunction &MF) const
const TargetRegisterClass * getCrossCopyRegClass(const TargetRegisterClass *RC) const override
Returns a legal register class to copy a register in the specified class to or from.
ArrayRef< int16_t > getRegSplitParts(const TargetRegisterClass *RC, unsigned EltSize) const
ArrayRef< MCPhysReg > getAllSGPR32(const MachineFunction &MF) const
Return all SGPR32 which satisfy the waves per execution unit requirement of the subtarget.
const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC, const MachineFunction &MF) const override
MCRegister reservedPrivateSegmentBufferReg(const MachineFunction &MF) const
Return the end register initially reserved for the scratch buffer in case spilling is needed.
bool eliminateSGPRToVGPRSpillFrameIndex(MachineBasicBlock::iterator MI, int FI, RegScavenger *RS, SlotIndexes *Indexes=nullptr, LiveIntervals *LIS=nullptr, bool SpillToPhysVGPRLane=false) const
Special case of eliminateFrameIndex.
bool isVGPR(const MachineRegisterInfo &MRI, Register Reg) const
const TargetRegisterClass * getRegClassForBlockOp(const MachineFunction &MF) const
bool isAsmClobberable(const MachineFunction &MF, MCRegister PhysReg) const override
LLVM_READONLY const TargetRegisterClass * getAGPRClassForBitWidth(unsigned BitWidth) const
static bool isChainScratchRegister(Register VGPR)
bool requiresRegisterScavenging(const MachineFunction &Fn) const override
bool opCanUseInlineConstant(unsigned OpType) const
const TargetRegisterClass * getRegClassForSizeOnBank(unsigned Size, const RegisterBank &Bank) const
bool isVGPRPhysReg(Register Reg) const
bool isUniformReg(const MachineRegisterInfo &MRI, const RegisterBankInfo &RBI, Register Reg) const override
const uint32_t * getNoPreservedMask() const override
StringRef getRegAsmName(MCRegister Reg) const override
const uint32_t * getAllAllocatableSRegMask() const
bool isVectorRegister(const MachineRegisterInfo &MRI, Register Reg) const
MCRegister getAlignedHighSGPRForRC(const MachineFunction &MF, const unsigned Align, const TargetRegisterClass *RC) const
Return the largest available SGPR aligned to Align for the register class RC.
void buildCFIForBlockCSRStore(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register BlockReg, int64_t Offset) const
const TargetRegisterClass * getRegClassForReg(const MachineRegisterInfo &MRI, Register Reg) const
unsigned getHWRegIndex(MCRegister Reg) const
const MCPhysReg * getCalleeSavedRegsViaCopy(const MachineFunction *MF) const
const uint32_t * getAllVectorRegMask() const
const TargetRegisterClass * getEquivalentAGPRClass(const TargetRegisterClass *SRC) const
static LLVM_READONLY const TargetRegisterClass * getSGPRClassForBitWidth(unsigned BitWidth)
const TargetRegisterClass * getPointerRegClass(unsigned Kind=0) const override
const TargetRegisterClass * getRegClassForTypeOnBank(LLT Ty, const RegisterBank &Bank) const
bool opCanUseLiteralConstant(unsigned OpType) const
Register getBaseRegister() const
bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM, const LiveRegMatrix *Matrix) const override
LLVM_READONLY const TargetRegisterClass * getAlignedLo256VGPRClassForBitWidth(unsigned BitWidth) const
LLVM_READONLY const TargetRegisterClass * getVGPRClassForBitWidth(unsigned BitWidth) const
const TargetRegisterClass * getEquivalentAVClass(const TargetRegisterClass *SRC) const
bool requiresFrameIndexScavenging(const MachineFunction &MF) const override
static bool hasVGPRs(const TargetRegisterClass *RC)
static bool isVGPRClass(const TargetRegisterClass *RC)
MachineInstr * findReachingDef(Register Reg, unsigned SubReg, MachineInstr &Use, MachineRegisterInfo &MRI, LiveIntervals *LIS) const
bool isSGPRReg(const MachineRegisterInfo &MRI, Register Reg) const
const TargetRegisterClass * getEquivalentSGPRClass(const TargetRegisterClass *VRC) const
SmallVector< StringLiteral > getVRegFlagsOfReg(Register Reg, const MachineFunction &MF) const override
unsigned getNumChannelsFromSubReg(unsigned SubReg) const
LLVM_READONLY const TargetRegisterClass * getDefaultVectorSuperClassForBitWidth(unsigned BitWidth) const
unsigned getRegPressureLimit(const TargetRegisterClass *RC, MachineFunction &MF) const override
ArrayRef< MCPhysReg > getAllSGPR128(const MachineFunction &MF) const
Return all SGPR128 which satisfy the waves per execution unit requirement of the subtarget.
unsigned getRegPressureSetLimit(const MachineFunction &MF, unsigned Idx) const override
BitVector getReservedRegs(const MachineFunction &MF) const override
bool needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const override
const TargetRegisterClass * getRegClassForOperandReg(const MachineRegisterInfo &MRI, const MachineOperand &MO) const
void addImplicitUsesForBlockCSRLoad(MachineInstrBuilder &MIB, Register BlockReg) const
bool isSGPRClassID(unsigned RCID) const
unsigned getNumUsedPhysRegs(const MachineRegisterInfo &MRI, const TargetRegisterClass &RC, bool IncludeCalls=true) const
const uint32_t * getAllAGPRRegMask() const
const int * getRegUnitPressureSets(MCRegUnit RegUnit) const override
bool isDivergentRegClass(const TargetRegisterClass *RC) const override
const TargetRegisterClass * getBoolRC() const
bool isAGPR(const MachineRegisterInfo &MRI, Register Reg) const
bool eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj, unsigned FIOperandNum, RegScavenger *RS) const override
bool spillSGPR(MachineBasicBlock::iterator MI, int FI, RegScavenger *RS, SlotIndexes *Indexes=nullptr, LiveIntervals *LIS=nullptr, bool OnlyToVGPR=false, bool SpillToPhysVGPRLane=false, bool NeedsCFI=false) const
If OnlyToVGPR is true, this will only succeed if this manages to find a free VGPR lane to spill.
bool isVSSuperClass(const TargetRegisterClass *RC) const
unsigned getChannelFromSubReg(unsigned SubReg) const
MCRegister getExec() const
bool isSGPRPhysReg(Register Reg) const
std::optional< uint8_t > getVRegFlagValue(StringRef Name) const override
MCRegister getVCC() const
int64_t getFrameIndexInstrOffset(const MachineInstr *MI, int Idx) const override
bool isVectorSuperClass(const TargetRegisterClass *RC) const
bool isRegClassAligned(const TargetRegisterClass *RC, unsigned AlignNumBits) const
static bool hasAGPRs(const TargetRegisterClass *RC)
const TargetRegisterClass * getWaveMaskRegClass() const
unsigned getSubRegAlignmentNumBits(const TargetRegisterClass *RC, unsigned SubReg) const
static bool hasSGPRs(const TargetRegisterClass *RC)
void resolveFrameIndex(MachineInstr &MI, Register BaseReg, int64_t Offset) const override
bool requiresVirtualBaseRegisters(const MachineFunction &Fn) const override
unsigned getCSRFirstUseCost(const MachineFunction &) const override
bool spillSGPRToVGPR() const
const TargetRegisterClass * getVGPR64Class() const
void buildVGPRSpillLoadStore(SGPRSpillBuilder &SB, int Index, int Offset, bool IsLoad, bool IsKill=true) const
bool isCFISavedRegsSpillEnabled() const
unsigned getRegClassAlignmentNumBits(const TargetRegisterClass *RC) const
static bool isSGPRClass(const TargetRegisterClass *RC)
static bool isAGPRClass(const TargetRegisterClass *RC)
const TargetRegisterClass * getConstrainedRegClassForReg(Register Reg, const MachineRegisterInfo &MRI) const override
SlotIndexes pass.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
Register allocation hint types. Helps eliminate unneeded COPY with True16.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition bit.h:156
@ HasSGPR
Definition SIDefines.h:29
@ RegTupleAlignUnitsMask
Definition SIDefines.h:31
@ HasVGPR
Definition SIDefines.h:27
@ HasAGPR
Definition SIDefines.h:28
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
constexpr unsigned BitWidth
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr Type getAsInteger() const
Definition LaneBitmask.h:74