35 "amdgpu-mfma-vgpr-form",
36 cl::desc(
"Whether to force use VGPR for Opc and Dest of MFMA. If "
37 "unspecified, default to compiler heuristics"),
51 GWSResourcePSV(
getTM(STI)), UserSGPRInfo(
F, *STI), WorkGroupIDX(
false),
53 LDSKernelId(
false), PrivateSegmentWaveByteOffset(
false),
55 ImplicitArgPtr(
false), GITPtrHigh(0xffffffff), HighBitsOf32BitAddress(0),
56 IsWholeWaveFunction(
F.getCallingConv() ==
59 FlatWorkGroupSizes = ST.getFlatWorkGroupSizes(
F);
60 WavesPerEU = ST.getWavesPerEU(
F);
62 assert(MaxNumWorkGroups.size() == 3);
65 Occupancy = ST.computeOccupancy(
F,
getLDSSize()).second;
68 VRegFlags.reserve(1024);
80 if (ST.hasGFX90AInsts()) {
83 auto [MinNumAGPRAttr, MaxNumAGPRAttr] =
86 MinNumAGPRs = MinNumAGPRAttr;
94 FrameOffsetReg = AMDGPU::SGPR33;
95 StackPtrOffsetReg = AMDGPU::SGPR32;
97 if (!ST.hasFlatScratchEnabled()) {
101 ? AMDGPU::SGPR48_SGPR49_SGPR50_SGPR51
102 : AMDGPU::SGPR0_SGPR1_SGPR2_SGPR3;
104 ArgInfo.PrivateSegmentBuffer =
108 if (!
F.hasFnAttribute(
"amdgpu-no-implicitarg-ptr") &&
110 ImplicitArgPtr =
true;
112 ImplicitArgPtr =
false;
119 ST.hasArchitectedSGPRs())) {
120 if (IsKernel || !
F.hasFnAttribute(
"amdgpu-no-workgroup-id-x") ||
121 !
F.hasFnAttribute(
"amdgpu-no-cluster-id-x"))
124 if (!
F.hasFnAttribute(
"amdgpu-no-workgroup-id-y") ||
125 !
F.hasFnAttribute(
"amdgpu-no-cluster-id-y"))
128 if (!
F.hasFnAttribute(
"amdgpu-no-workgroup-id-z") ||
129 !
F.hasFnAttribute(
"amdgpu-no-cluster-id-z"))
134 if (IsKernel || !
F.hasFnAttribute(
"amdgpu-no-workitem-id-x"))
137 if (!
F.hasFnAttribute(
"amdgpu-no-workitem-id-y") &&
138 ST.getMaxWorkitemID(
F, 1) != 0)
141 if (!
F.hasFnAttribute(
"amdgpu-no-workitem-id-z") &&
142 ST.getMaxWorkitemID(
F, 2) != 0)
145 if (!IsKernel && !
F.hasFnAttribute(
"amdgpu-no-lds-kernel-id"))
155 if (!ST.hasArchitectedFlatScratch()) {
156 PrivateSegmentWaveByteOffset =
true;
161 ArgInfo.PrivateSegmentWaveByteOffset =
166 Attribute A =
F.getFnAttribute(
"amdgpu-git-ptr-high");
171 A =
F.getFnAttribute(
"amdgpu-32bit-address-high-bits");
172 S =
A.getValueAsString();
176 MaxMemoryClusterDWords =
F.getFnAttributeAsParsedInteger(
182 if (ST.hasMAIInsts() && !ST.hasGFX90AInsts()) {
184 AMDGPU::VGPR_32RegClass.getRegister(ST.getMaxNumVGPRs(
F) - 1);
205 ArgInfo.PrivateSegmentBuffer =
207 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SGPR_128RegClass));
209 return ArgInfo.PrivateSegmentBuffer.getRegister();
214 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SReg_64RegClass));
216 return ArgInfo.DispatchPtr.getRegister();
221 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SReg_64RegClass));
223 return ArgInfo.QueuePtr.getRegister();
227 ArgInfo.KernargSegmentPtr
229 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SReg_64RegClass));
231 return ArgInfo.KernargSegmentPtr.getRegister();
236 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SReg_64RegClass));
238 return ArgInfo.DispatchID.getRegister();
243 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SReg_64RegClass));
245 return ArgInfo.FlatScratchInit.getRegister();
251 return ArgInfo.PrivateSegmentSize.getRegister();
256 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SReg_64RegClass));
258 return ArgInfo.ImplicitBufferPtr.getRegister();
264 return ArgInfo.LDSKernelId.getRegister();
269 unsigned AllocSizeDWord,
int KernArgIdx,
int PaddingSGPRs) {
270 auto [It, Inserted] = ArgInfo.PreloadKernArgs.try_emplace(KernArgIdx);
271 assert(Inserted &&
"Preload kernel argument allocated twice.");
272 NumUserSGPRs += PaddingSGPRs;
276 if (!ArgInfo.FirstKernArgPreloadReg)
277 ArgInfo.FirstKernArgPreloadReg = getNextUserSGPR();
279 TRI.getMatchingSuperReg(getNextUserSGPR(), AMDGPU::sub0, RC);
280 auto &Regs = It->second.Regs;
282 (RC == &AMDGPU::SReg_32RegClass || RC == &AMDGPU::SReg_64RegClass)) {
283 Regs.push_back(PreloadReg);
284 NumUserSGPRs += AllocSizeDWord;
286 Regs.reserve(AllocSizeDWord);
287 for (
unsigned I = 0;
I < AllocSizeDWord; ++
I) {
288 Regs.push_back(getNextUserSGPR());
294 UserSGPRInfo.allocKernargPreloadSGPRs(AllocSizeDWord + PaddingSGPRs);
318 WWMSpills.insert(std::make_pair(
328 for (
auto &Reg : WWMSpills) {
330 CalleeSavedRegs.push_back(Reg);
332 ScratchRegs.push_back(Reg);
338 for (
unsigned I = 0; CSRegs[
I]; ++
I) {
339 if (CSRegs[
I] == Reg)
351 for (
unsigned I = 0, E = WWMVGPRs.
size();
I < E; ++
I) {
354 TRI->findUnusedRegister(MRI, &AMDGPU::VGPR_32RegClass, MF);
355 if (!NewReg || NewReg >= Reg)
361 WWMVGPRs[
I] = NewReg;
362 WWMReservedRegs.remove(Reg);
363 WWMReservedRegs.insert(NewReg);
368 auto *RegItr =
llvm::find(SpillPhysVGPRs, Reg);
369 if (RegItr != SpillPhysVGPRs.end()) {
370 unsigned Idx = std::distance(SpillPhysVGPRs.begin(), RegItr);
371 SpillPhysVGPRs[Idx] = NewReg;
379 SavedVGPRs.
reset(Reg);
382 MBB.removeLiveIn(Reg);
383 MBB.sortUniqueLiveIns();
390bool SIMachineFunctionInfo::allocateVirtualVGPRForSGPRSpills(
396 SpillVGPRs.push_back(LaneVGPR);
398 LaneVGPR = SpillVGPRs.back();
401 SGPRSpillsToVirtualVGPRLanes[FI].emplace_back(LaneVGPR, LaneIndex);
405bool SIMachineFunctionInfo::allocatePhysicalVGPRForSGPRSpills(
406 MachineFunction &MF,
int FI,
unsigned LaneIndex,
bool IsPrologEpilog) {
408 const SIRegisterInfo *
TRI =
ST.getRegisterInfo();
415 LaneVGPR =
TRI->findUnusedRegister(MRI, &AMDGPU::VGPR_32RegClass, MF,
417 if (LaneVGPR == AMDGPU::NoRegister) {
420 SGPRSpillsToPhysicalVGPRLanes.erase(FI);
428 for (MachineBasicBlock &
MBB : MF) {
432 SpillPhysVGPRs.push_back(LaneVGPR);
434 LaneVGPR = SpillPhysVGPRs.back();
437 SGPRSpillsToPhysicalVGPRLanes[FI].emplace_back(LaneVGPR, LaneIndex);
443 bool IsPrologEpilog) {
444 std::vector<SIRegisterInfo::SpilledReg> &SpillLanes =
445 SpillToPhysVGPRLane ? SGPRSpillsToPhysicalVGPRLanes[FI]
446 : SGPRSpillsToVirtualVGPRLanes[FI];
449 if (!SpillLanes.empty())
454 unsigned WaveSize = ST.getWavefrontSize();
456 unsigned Size = FrameInfo.getObjectSize(FI);
457 unsigned NumLanes =
Size / 4;
459 if (NumLanes > WaveSize)
462 assert(
Size >= 4 &&
"invalid sgpr spill size");
463 assert(ST.getRegisterInfo()->spillSGPRToVGPR() &&
464 "not spilling SGPRs to VGPRs");
466 unsigned &NumSpillLanes = SpillToPhysVGPRLane ? NumPhysicalVGPRSpillLanes
467 : NumVirtualVGPRSpillLanes;
469 for (
unsigned I = 0;
I < NumLanes; ++
I, ++NumSpillLanes) {
470 unsigned LaneIndex = (NumSpillLanes % WaveSize);
472 bool Allocated = SpillToPhysVGPRLane
473 ? allocatePhysicalVGPRForSGPRSpills(MF, FI, LaneIndex,
475 : allocateVirtualVGPRForSGPRSpills(MF, FI, LaneIndex);
495 assert(ST.hasMAIInsts() && FrameInfo.isSpillSlotObjectIndex(FI));
497 auto &Spill = VGPRToAGPRSpills[FI];
500 if (!Spill.Lanes.empty())
501 return Spill.FullyAllocated;
503 unsigned Size = FrameInfo.getObjectSize(FI);
504 unsigned NumLanes =
Size / 4;
505 Spill.Lanes.resize(NumLanes, AMDGPU::NoRegister);
508 isAGPRtoVGPR ? AMDGPU::VGPR_32RegClass : AMDGPU::AGPR_32RegClass;
511 auto &SpillRegs = isAGPRtoVGPR ? SpillAGPR : SpillVGPR;
513 Spill.FullyAllocated =
true;
528 OtherUsedRegs.
set(Reg);
530 OtherUsedRegs.
set(Reg);
533 for (
int I = NumLanes - 1;
I >= 0; --
I) {
534 NextSpillReg = std::find_if(
535 NextSpillReg, Regs.
end(), [&MRI, &OtherUsedRegs](
MCPhysReg Reg) {
536 return MRI.isAllocatable(Reg) && !MRI.isPhysRegUsed(Reg) &&
540 if (NextSpillReg == Regs.
end()) {
541 Spill.FullyAllocated =
false;
545 OtherUsedRegs.
set(*NextSpillReg);
548 Spill.Lanes[
I] = *NextSpillReg++;
551 return Spill.FullyAllocated;
562 for (
auto &R : SGPRSpillsToVirtualVGPRLanes)
564 SGPRSpillsToVirtualVGPRLanes.clear();
568 if (!ResetSGPRSpillStackIDs) {
569 for (
auto &R : SGPRSpillsToPhysicalVGPRLanes)
571 SGPRSpillsToPhysicalVGPRLanes.clear();
573 bool HaveSGPRToMemory =
false;
575 if (ResetSGPRSpillStackIDs) {
583 HaveSGPRToMemory =
true;
589 for (
auto &R : VGPRToAGPRSpills) {
594 return HaveSGPRToMemory;
604 TRI.getSpillAlign(AMDGPU::SGPR_32RegClass),
false);
608MCPhysReg SIMachineFunctionInfo::getNextUserSGPR()
const {
609 assert(NumSystemSGPRs == 0 &&
"System SGPRs must be added after user SGPRs");
610 return AMDGPU::SGPR0 + NumUserSGPRs;
613MCPhysReg SIMachineFunctionInfo::getNextSystemSGPR()
const {
614 return AMDGPU::SGPR0 + NumUserSGPRs + NumSystemSGPRs;
617void SIMachineFunctionInfo::MRI_NoteNewVirtualRegister(
Register Reg) {
621void SIMachineFunctionInfo::MRI_NoteCloneVirtualRegister(
Register NewReg,
623 VRegFlags.grow(NewReg);
624 VRegFlags[NewReg] = VRegFlags[SrcReg];
630 if (!ST.isAmdPalOS())
633 if (ST.hasMergedShaders()) {
639 GitPtrLo = AMDGPU::SGPR8;
658static std::optional<yaml::SIArgumentInfo>
663 auto convertArg = [&](std::optional<yaml::SIArgument> &
A,
670 if (Arg.isRegister()) {
677 SA.
Mask = Arg.getMask();
697 ArgInfo.PrivateSegmentWaveByteOffset);
706 if (
ArgInfo.FirstKernArgPreloadReg) {
709 "FirstKernArgPreloadReg must be a physical register");
819 SourceRange = YamlMFI.
ScavengeFI->SourceRange;
822 ScavengeFI = *FIOrErr;
824 ScavengeFI = std::nullopt;
830 auto [MinNumAGPR, MaxNumAGPR] =
833 return MinNumAGPR != 0u;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Base class for AMDGPU specific classes of TargetSubtarget.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
AMD GCN specific subclass of TargetSubtarget.
Register const TargetRegisterInfo * TRI
Promote Memory to Register
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
static cl::opt< bool, true > MFMAVGPRFormOpt("amdgpu-mfma-vgpr-form", cl::desc("Whether to force use VGPR for Opc and Dest of MFMA. If " "unspecified, default to compiler heuristics"), cl::location(SIMachineFunctionInfo::MFMAVGPRForm), cl::init(true), cl::Hidden)
static std::optional< yaml::SIArgumentInfo > convertArgumentInfo(const AMDGPUFunctionArgInfo &ArgInfo, const TargetRegisterInfo &TRI)
static yaml::StringValue regToString(Register Reg, const TargetRegisterInfo &TRI)
Interface definition for SIRegisterInfo.
bool isChainFunction() const
Align DynLDSAlign
Align for dynamic shared memory if any.
uint64_t ExplicitKernArgSize
AMDGPUMachineFunctionInfo(const Function &F, const AMDGPUSubtarget &ST)
uint32_t getLDSSize() const
uint32_t LDSSize
Number of bytes in the LDS that are being used.
bool hasInitWholeWave() const
bool isEntryFunction() const
static ClusterDimsAttr get(const Function &F)
Functions, function parameters, and return types can have attributes to indicate how they should be t...
BitVector & reset()
Reset all bits in the bitvector.
void resize(unsigned N, bool t=false)
Grow or shrink the bitvector.
BitVector & set()
Set all bits in the bitvector.
void setBitsInMask(const uint32_t *Mask, unsigned MaskWords=~0u)
Add '1' bits from Mask to this vector.
Lightweight error class with error context and mandatory checking.
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
const SITargetLowering * getTargetLowering() const override
ArrayRef< MCPhysReg > getRegisters() const
LLVM_ABI void sortUniqueLiveIns()
Sorts and uniques the LiveIns vector.
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
void setStackID(int ObjectIdx, uint8_t ID)
bool hasTailCall() const
Returns true if the function contains a tail call.
LLVM_ABI int CreateSpillStackObject(uint64_t Size, Align Alignment, TargetStackID::Value StackID=TargetStackID::Default)
Create a new statically sized stack object that represents a spill slot, returning a nonnegative iden...
void RemoveStackObject(int ObjectIdx)
Remove or mark dead a statically sized stack object.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
uint8_t getStackID(int ObjectIdx) const
int getObjectIndexBegin() const
Return the minimum frame object index.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
void replaceFrameInstRegister(MCRegister From, MCRegister To)
Replace all references to register.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * cloneInfo(const Ty &Old)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
LLVM_ABI const MCPhysReg * getCalleeSavedRegs() const
Returns list of callee saved registers.
void reserveReg(MCRegister PhysReg, const TargetRegisterInfo *TRI)
reserveReg – Mark a register as reserved so checks like isAllocatable will not suggest using it.
LLVM_ABI void replaceRegWith(Register FromReg, Register ToReg)
replaceRegWith - Replace all instances of FromReg with ToReg in the machine function.
This interface provides simple read-only access to a block of memory, and provides simple methods for...
virtual StringRef getBufferIdentifier() const
Return an identifier for this buffer, typically the filename it was read from.
Wrapper class representing virtual and physical registers.
This class keeps track of the SPI_SP_INPUT_ADDR config register, which tells the hardware which inter...
bool initializeBaseYamlFields(const yaml::SIMachineFunctionInfo &YamlMFI, const MachineFunction &MF, PerFunctionMIParsingState &PFS, SMDiagnostic &Error, SMRange &SourceRange)
void shiftWwmVGPRsToLowestRange(MachineFunction &MF, SmallVectorImpl< Register > &WWMVGPRs, BitVector &SavedVGPRs)
Register addPrivateSegmentSize(const SIRegisterInfo &TRI)
void allocateWWMSpill(MachineFunction &MF, Register VGPR, uint64_t Size=4, Align Alignment=Align(4))
Register addDispatchPtr(const SIRegisterInfo &TRI)
Register getLongBranchReservedReg() const
Register addFlatScratchInit(const SIRegisterInfo &TRI)
unsigned getMaxWavesPerEU() const
ArrayRef< Register > getSGPRSpillPhysVGPRs() const
int getScavengeFI(MachineFrameInfo &MFI, const SIRegisterInfo &TRI)
Register addQueuePtr(const SIRegisterInfo &TRI)
SIMachineFunctionInfo(const SIMachineFunctionInfo &MFI)=default
Register getGITPtrLoReg(const MachineFunction &MF) const
bool allocateVGPRSpillToAGPR(MachineFunction &MF, int FI, bool isAGPRtoVGPR)
Reserve AGPRs or VGPRs to support spilling for FrameIndex FI.
void splitWWMSpillRegisters(MachineFunction &MF, SmallVectorImpl< std::pair< Register, int > > &CalleeSavedRegs, SmallVectorImpl< std::pair< Register, int > > &ScratchRegs) const
Register getSGPRForEXECCopy() const
bool mayUseAGPRs(const Function &F) const
bool isCalleeSavedReg(const MCPhysReg *CSRegs, MCPhysReg Reg) const
Register addLDSKernelId()
Register getVGPRForAGPRCopy() const
bool allocateSGPRSpillToVGPRLane(MachineFunction &MF, int FI, bool SpillToPhysVGPRLane=false, bool IsPrologEpilog=false)
Register addKernargSegmentPtr(const SIRegisterInfo &TRI)
Register addDispatchID(const SIRegisterInfo &TRI)
bool removeDeadFrameIndices(MachineFrameInfo &MFI, bool ResetSGPRSpillStackIDs)
If ResetSGPRSpillStackIDs is true, reset the stack ID from sgpr-spill to the default stack.
MachineFunctionInfo * clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, const DenseMap< MachineBasicBlock *, MachineBasicBlock * > &Src2DstMBB) const override
Make a functionally equivalent copy of this MachineFunctionInfo in MF.
bool checkIndexInPrologEpilogSGPRSpills(int FI) const
Register addPrivateSegmentBuffer(const SIRegisterInfo &TRI)
const ReservedRegSet & getWWMReservedRegs() const
std::optional< int > getOptionalScavengeFI() const
Register addImplicitBufferPtr(const SIRegisterInfo &TRI)
void limitOccupancy(const MachineFunction &MF)
SmallVectorImpl< MCRegister > * addPreloadedKernArg(const SIRegisterInfo &TRI, const TargetRegisterClass *RC, unsigned AllocSizeDWord, int KernArgIdx, int PaddingSGPRs)
void reserveWWMRegister(Register Reg)
static bool isChainScratchRegister(Register VGPR)
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Represents a location in source code.
Represents a range in source code.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
typename SuperClass::const_iterator const_iterator
unsigned getMainFileID() const
const MemoryBuffer * getMemoryBuffer(unsigned i) const
Represent a constant reference to a string, i.e.
bool consumeInteger(unsigned Radix, T &Result)
Parse the current string as an integer of the specified radix.
constexpr bool empty() const
Check if the string is empty.
const TargetMachine & getTargetMachine() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
A raw_ostream that writes to an std::string.
unsigned getInitialPSInputAddr(const Function &F)
unsigned getDynamicVGPRBlockSize(const Function &F)
SmallVector< unsigned > getMaxNumWorkGroups(const Function &F)
LLVM_READNONE constexpr bool isChainCC(CallingConv::ID CC)
std::pair< unsigned, unsigned > getIntegerPairAttribute(const Function &F, StringRef Name, std::pair< unsigned, unsigned > Default, bool OnlyFirstRequired)
LLVM_READNONE constexpr bool isGraphics(CallingConv::ID CC)
CallingConv Namespace - This namespace contains an enum with a value for the well-known calling conve...
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ AMDGPU_CS
Used for Mesa/AMDPAL compute shaders.
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
@ AMDGPU_Gfx
Used for AMD graphics targets.
@ AMDGPU_HS
Used for Mesa/AMDPAL hull shaders (= tessellation control shaders).
@ AMDGPU_GS
Used for Mesa/AMDPAL geometry shaders.
@ AMDGPU_PS
Used for Mesa/AMDPAL pixel shaders.
@ SPIR_KERNEL
Used for SPIR kernel functions.
initializer< Ty > init(const Ty &Val)
LocationClass< Ty > location(Ty &L)
This is an optimization pass for GlobalISel generic memory operations.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
constexpr unsigned DefaultMemoryClusterDWordsLimit
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
MCRegisterClass TargetRegisterClass
static const AMDGPUFunctionArgInfo FixedABIFunctionInfo
This struct is a compact representation of a valid (non-zero power of two) alignment.
static ArgDescriptor createRegister(Register Reg, unsigned Mask=~0u)
Helper struct shared between Function Specialization and SCCP Solver.
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
A serializaable representation of a reference to a stack object or fixed stack object.
This class should be specialized by any type that needs to be converted to/from a YAML mapping.
std::optional< SIArgument > PrivateSegmentWaveByteOffset
std::optional< SIArgument > WorkGroupIDY
std::optional< SIArgument > FlatScratchInit
std::optional< SIArgument > DispatchPtr
std::optional< SIArgument > DispatchID
std::optional< SIArgument > WorkItemIDY
std::optional< SIArgument > WorkGroupIDX
std::optional< SIArgument > ImplicitArgPtr
std::optional< SIArgument > QueuePtr
std::optional< SIArgument > WorkGroupInfo
std::optional< SIArgument > LDSKernelId
std::optional< SIArgument > ImplicitBufferPtr
std::optional< SIArgument > WorkItemIDX
std::optional< SIArgument > KernargSegmentPtr
std::optional< SIArgument > WorkItemIDZ
std::optional< SIArgument > PrivateSegmentSize
std::optional< SIArgument > PrivateSegmentBuffer
std::optional< SIArgument > FirstKernArgPreloadReg
std::optional< SIArgument > WorkGroupIDZ
std::optional< unsigned > Mask
static SIArgument createArgument(bool IsReg)
unsigned MaxMemoryClusterDWords
StringValue SGPRForEXECCopy
bool HasNoWWMPoolSGPRSpillFallback
SmallVector< StringValue > WWMReservedRegs
uint32_t HighBitsOf32BitAddress
SIMachineFunctionInfo()=default
StringValue FrameOffsetReg
StringValue LongBranchReservedReg
unsigned NumKernargPreloadSGPRs
uint64_t ExplicitKernArgSize
uint16_t NumWaveDispatchSGPRs
void mappingImpl(yaml::IO &YamlIO) override
StringValue VGPRForAGPRCopy
std::optional< SIArgumentInfo > ArgInfo
std::optional< unsigned > DynamicVGPRBlockSize
SmallVector< StringValue, 2 > SpillPhysVGPRS
std::optional< FrameIndex > ScavengeFI
uint16_t NumWaveDispatchVGPRs
unsigned BytesInStackArgArea
unsigned ScratchReservedForDynamicVGPRs
StringValue ScratchRSrcReg
StringValue StackPtrOffsetReg
A wrapper around std::string which contains a source range that's being set during parsing.