38 cl::desc(
"Whether to force use VGPR for Opc and Dest of MFMA. If "
39 "unspecified, default to compiler heuristics"),
50 UserSGPRInfo(
F, *STI), WorkGroupIDX(
false), WorkGroupIDY(
false),
52 PrivateSegmentWaveByteOffset(
false), WorkItemIDX(
false),
54 GITPtrHigh(0xffffffff), HighBitsOf32BitAddress(0),
55 IsWholeWaveFunction(
F.getCallingConv() ==
58 FlatWorkGroupSizes = ST.getFlatWorkGroupSizes(
F);
59 WavesPerEU = ST.getWavesPerEU(
F);
60 MaxNumWorkGroups = ST.getMaxNumWorkGroups(
F);
66 if (DynamicVGPRBlockSize == 0 && ST.isDynamicVGPREnabled())
67 DynamicVGPRBlockSize = ST.getDynamicVGPRBlockSize();
69 Occupancy = ST.computeOccupancy(
F,
getLDSSize()).second;
72 VRegFlags.reserve(1024);
84 MayNeedAGPRs = ST.hasMAIInsts();
85 if (ST.hasGFX90AInsts()) {
89 (ST.getMaxNumVGPRs(
F) <= AMDGPU::VGPR_32RegClass.getNumRegs() &&
99 StackPtrOffsetReg = AMDGPU::SGPR32;
101 ScratchRSrcReg = AMDGPU::SGPR48_SGPR49_SGPR50_SGPR51;
106 ImplicitArgPtr =
false;
112 FrameOffsetReg = AMDGPU::SGPR33;
113 StackPtrOffsetReg = AMDGPU::SGPR32;
115 if (!ST.enableFlatScratch()) {
118 ScratchRSrcReg = AMDGPU::SGPR0_SGPR1_SGPR2_SGPR3;
124 if (!
F.hasFnAttribute(
"amdgpu-no-implicitarg-ptr"))
125 ImplicitArgPtr =
true;
127 ImplicitArgPtr =
false;
134 ST.hasArchitectedSGPRs())) {
135 if (IsKernel || !
F.hasFnAttribute(
"amdgpu-no-workgroup-id-x"))
138 if (!
F.hasFnAttribute(
"amdgpu-no-workgroup-id-y"))
141 if (!
F.hasFnAttribute(
"amdgpu-no-workgroup-id-z"))
146 if (IsKernel || !
F.hasFnAttribute(
"amdgpu-no-workitem-id-x"))
149 if (!
F.hasFnAttribute(
"amdgpu-no-workitem-id-y") &&
150 ST.getMaxWorkitemID(
F, 1) != 0)
153 if (!
F.hasFnAttribute(
"amdgpu-no-workitem-id-z") &&
154 ST.getMaxWorkitemID(
F, 2) != 0)
157 if (!IsKernel && !
F.hasFnAttribute(
"amdgpu-no-lds-kernel-id"))
167 if (!ST.flatScratchIsArchitected()) {
168 PrivateSegmentWaveByteOffset =
true;
173 ArgInfo.PrivateSegmentWaveByteOffset =
178 Attribute A =
F.getFnAttribute(
"amdgpu-git-ptr-high");
183 A =
F.getFnAttribute(
"amdgpu-32bit-address-high-bits");
184 S =
A.getValueAsString();
188 MaxMemoryClusterDWords =
F.getFnAttributeAsParsedInteger(
194 if (ST.hasMAIInsts() && !ST.hasGFX90AInsts()) {
196 AMDGPU::VGPR_32RegClass.getRegister(ST.getMaxNumVGPRs(
F) - 1);
217 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SGPR_128RegClass));
219 return ArgInfo.PrivateSegmentBuffer.getRegister();
224 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SReg_64RegClass));
226 return ArgInfo.DispatchPtr.getRegister();
231 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SReg_64RegClass));
233 return ArgInfo.QueuePtr.getRegister();
239 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SReg_64RegClass));
241 return ArgInfo.KernargSegmentPtr.getRegister();
246 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SReg_64RegClass));
248 return ArgInfo.DispatchID.getRegister();
253 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SReg_64RegClass));
255 return ArgInfo.FlatScratchInit.getRegister();
261 return ArgInfo.PrivateSegmentSize.getRegister();
266 getNextUserSGPR(), AMDGPU::sub0, &AMDGPU::SReg_64RegClass));
268 return ArgInfo.ImplicitBufferPtr.getRegister();
274 return ArgInfo.LDSKernelId.getRegister();
279 unsigned AllocSizeDWord,
int KernArgIdx,
int PaddingSGPRs) {
280 auto [It, Inserted] =
ArgInfo.PreloadKernArgs.try_emplace(KernArgIdx);
281 assert(Inserted &&
"Preload kernel argument allocated twice.");
282 NumUserSGPRs += PaddingSGPRs;
286 if (!
ArgInfo.FirstKernArgPreloadReg)
287 ArgInfo.FirstKernArgPreloadReg = getNextUserSGPR();
289 TRI.getMatchingSuperReg(getNextUserSGPR(), AMDGPU::sub0, RC);
290 auto &Regs = It->second.Regs;
292 (RC == &AMDGPU::SReg_32RegClass || RC == &AMDGPU::SReg_64RegClass)) {
293 Regs.push_back(PreloadReg);
294 NumUserSGPRs += AllocSizeDWord;
296 Regs.reserve(AllocSizeDWord);
297 for (
unsigned I = 0;
I < AllocSizeDWord; ++
I) {
298 Regs.push_back(getNextUserSGPR());
328 WWMSpills.
insert(std::make_pair(
338 for (
auto &Reg : WWMSpills) {
340 CalleeSavedRegs.push_back(Reg);
342 ScratchRegs.push_back(Reg);
348 for (
unsigned I = 0; CSRegs[
I]; ++
I) {
349 if (CSRegs[
I] == Reg)
361 for (
unsigned I = 0, E = WWMVGPRs.
size();
I < E; ++
I) {
364 TRI->findUnusedRegister(
MRI, &AMDGPU::VGPR_32RegClass, MF);
365 if (!NewReg || NewReg >= Reg)
368 MRI.replaceRegWith(Reg, NewReg);
371 WWMVGPRs[
I] = NewReg;
372 WWMReservedRegs.
remove(Reg);
373 WWMReservedRegs.
insert(NewReg);
374 MRI.reserveReg(NewReg,
TRI);
378 auto *RegItr =
llvm::find(SpillPhysVGPRs, Reg);
379 if (RegItr != SpillPhysVGPRs.end()) {
380 unsigned Idx = std::distance(SpillPhysVGPRs.begin(), RegItr);
381 SpillPhysVGPRs[
Idx] = NewReg;
386 SavedVGPRs.
reset(Reg);
397bool SIMachineFunctionInfo::allocateVirtualVGPRForSGPRSpills(
402 LaneVGPR =
MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
403 SpillVGPRs.push_back(LaneVGPR);
405 LaneVGPR = SpillVGPRs.back();
408 SGPRSpillsToVirtualVGPRLanes[FI].emplace_back(LaneVGPR, LaneIndex);
412bool SIMachineFunctionInfo::allocatePhysicalVGPRForSGPRSpills(
413 MachineFunction &MF,
int FI,
unsigned LaneIndex,
bool IsPrologEpilog) {
422 LaneVGPR =
TRI->findUnusedRegister(
MRI, &AMDGPU::VGPR_32RegClass, MF,
424 if (LaneVGPR == AMDGPU::NoRegister) {
427 SGPRSpillsToPhysicalVGPRLanes.erase(FI);
439 SpillPhysVGPRs.push_back(LaneVGPR);
441 LaneVGPR = SpillPhysVGPRs.back();
444 SGPRSpillsToPhysicalVGPRLanes[FI].emplace_back(LaneVGPR, LaneIndex);
450 bool IsPrologEpilog) {
451 std::vector<SIRegisterInfo::SpilledReg> &SpillLanes =
452 SpillToPhysVGPRLane ? SGPRSpillsToPhysicalVGPRLanes[FI]
453 : SGPRSpillsToVirtualVGPRLanes[FI];
456 if (!SpillLanes.empty())
461 unsigned WaveSize = ST.getWavefrontSize();
463 unsigned Size = FrameInfo.getObjectSize(FI);
464 unsigned NumLanes =
Size / 4;
466 if (NumLanes > WaveSize)
469 assert(
Size >= 4 &&
"invalid sgpr spill size");
470 assert(ST.getRegisterInfo()->spillSGPRToVGPR() &&
471 "not spilling SGPRs to VGPRs");
473 unsigned &NumSpillLanes = SpillToPhysVGPRLane ? NumPhysicalVGPRSpillLanes
474 : NumVirtualVGPRSpillLanes;
476 for (
unsigned I = 0;
I < NumLanes; ++
I, ++NumSpillLanes) {
477 unsigned LaneIndex = (NumSpillLanes % WaveSize);
479 bool Allocated = SpillToPhysVGPRLane
480 ? allocatePhysicalVGPRForSGPRSpills(MF, FI, LaneIndex,
482 : allocateVirtualVGPRForSGPRSpills(MF, FI, LaneIndex);
504 auto &Spill = VGPRToAGPRSpills[FI];
507 if (!Spill.Lanes.empty())
508 return Spill.FullyAllocated;
511 unsigned NumLanes =
Size / 4;
512 Spill.Lanes.resize(NumLanes, AMDGPU::NoRegister);
515 isAGPRtoVGPR ? AMDGPU::VGPR_32RegClass : AMDGPU::AGPR_32RegClass;
518 auto &SpillRegs = isAGPRtoVGPR ? SpillAGPR : SpillVGPR;
520 Spill.FullyAllocated =
true;
535 OtherUsedRegs.
set(Reg);
537 OtherUsedRegs.
set(Reg);
540 for (
int I = NumLanes - 1;
I >= 0; --
I) {
541 NextSpillReg = std::find_if(
543 return MRI.isAllocatable(Reg) && !MRI.isPhysRegUsed(Reg) &&
547 if (NextSpillReg == Regs.
end()) {
548 Spill.FullyAllocated =
false;
552 OtherUsedRegs.
set(*NextSpillReg);
554 MRI.reserveReg(*NextSpillReg,
TRI);
555 Spill.Lanes[
I] = *NextSpillReg++;
558 return Spill.FullyAllocated;
571 SGPRSpillsToVirtualVGPRLanes.erase(R.first);
576 if (!ResetSGPRSpillStackIDs) {
579 SGPRSpillsToPhysicalVGPRLanes.erase(R.first);
582 bool HaveSGPRToMemory =
false;
584 if (ResetSGPRSpillStackIDs) {
592 HaveSGPRToMemory =
true;
598 for (
auto &R : VGPRToAGPRSpills) {
603 return HaveSGPRToMemory;
613 TRI.getSpillAlign(AMDGPU::SGPR_32RegClass),
false);
617MCPhysReg SIMachineFunctionInfo::getNextUserSGPR()
const {
618 assert(NumSystemSGPRs == 0 &&
"System SGPRs must be added after user SGPRs");
619 return AMDGPU::SGPR0 + NumUserSGPRs;
622MCPhysReg SIMachineFunctionInfo::getNextSystemSGPR()
const {
623 return AMDGPU::SGPR0 + NumUserSGPRs + NumSystemSGPRs;
626void SIMachineFunctionInfo::MRI_NoteNewVirtualRegister(
Register Reg) {
630void SIMachineFunctionInfo::MRI_NoteCloneVirtualRegister(
Register NewReg,
632 VRegFlags.grow(NewReg);
633 VRegFlags[NewReg] = VRegFlags[SrcReg];
639 if (!ST.isAmdPalOS())
642 if (ST.hasMergedShaders()) {
648 GitPtrLo = AMDGPU::SGPR8;
667static std::optional<yaml::SIArgumentInfo>
672 auto convertArg = [&](std::optional<yaml::SIArgument> &
A,
679 if (Arg.isRegister()) {
686 SA.
Mask = Arg.getMask();
707 ArgInfo.PrivateSegmentWaveByteOffset);
723 : ExplicitKernArgSize(MFI.getExplicitKernArgSize()),
724 MaxKernArgAlign(MFI.getMaxKernArgAlign()), LDSSize(MFI.getLDSSize()),
725 GDSSize(MFI.getGDSSize()), DynLDSAlign(MFI.getDynLDSAlign()),
726 IsEntryFunction(MFI.isEntryFunction()),
727 NoSignedZerosFPMath(MFI.hasNoSignedZerosFPMath()),
728 MemoryBound(MFI.isMemoryBound()), WaveLimiter(MFI.needsWaveLimiter()),
729 HasSpilledSGPRs(MFI.hasSpilledSGPRs()),
730 HasSpilledVGPRs(MFI.hasSpilledVGPRs()),
731 NumWaveDispatchSGPRs(MFI.getNumWaveDispatchSGPRs()),
732 NumWaveDispatchVGPRs(MFI.getNumWaveDispatchVGPRs()),
733 HighBitsOf32BitAddress(MFI.get32BitAddressHighBits()),
734 Occupancy(MFI.getOccupancy()),
738 BytesInStackArgArea(MFI.getBytesInStackArgArea()),
739 ReturnsVoid(MFI.returnsVoid()),
741 PSInputAddr(MFI.getPSInputAddr()), PSInputEnable(MFI.getPSInputEnable()),
742 MaxMemoryClusterDWords(MFI.getMaxMemoryClusterDWords()),
743 Mode(MFI.getMode()), HasInitWholeWave(MFI.hasInitWholeWave()),
744 IsWholeWaveFunction(MFI.isWholeWaveFunction()),
745 DynamicVGPRBlockSize(MFI.getDynamicVGPRBlockSize()),
746 ScratchReservedForDynamicVGPRs(MFI.getScratchReservedForDynamicVGPRs()) {
805 SourceRange = YamlMFI.
ScavengeFI->SourceRange;
816 auto [MinNumAGPR, MaxNumAGPR] =
819 return MinNumAGPR != 0u;
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Provides AMDGPU specific target descriptions.
Base class for AMDGPU specific classes of TargetSubtarget.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
AMD GCN specific subclass of TargetSubtarget.
Register const TargetRegisterInfo * TRI
static cl::opt< bool > MFMAVGPRForm("amdgpu-mfma-vgpr-form", cl::Hidden, cl::desc("Whether to force use VGPR for Opc and Dest of MFMA. If " "unspecified, default to compiler heuristics"), cl::init(false))
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
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.
static const AMDGPUFunctionArgInfo FixedABIFunctionInfo
uint32_t getLDSSize() const
bool isChainFunction() const
bool hasInitWholeWave() const
bool isEntryFunction() const
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
void setBitsInMask(const uint32_t *Mask, unsigned MaskWords=~0u)
setBitsInMask - Add '1' bits from Mask to this vector.
Allocate memory in an ever growing pool, as if by bump-pointer.
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
void allocKernargPreloadSGPRs(unsigned NumSGPRs)
LLVM_ABI void removeLiveIn(MCRegister Reg, LaneBitmask LaneMask=LaneBitmask::getAll())
Remove the specified register from the live in set.
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.
LLVM_ABI int CreateSpillStackObject(uint64_t Size, Align Alignment)
Create a new statically sized stack object that represents a spill slot, returning a nonnegative iden...
void setStackID(int ObjectIdx, uint8_t ID)
bool hasTailCall() const
Returns true if the function contains a tail call.
bool isSpillSlotObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a spill slot.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
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.
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 const MCPhysReg * getCalleeSavedRegs() const
Returns list of callee saved registers.
size_type count(const KeyT &Key) const
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
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.
bool remove(const value_type &X)
Remove an item from the set vector.
bool insert(const value_type &X)
Insert a new element into the SetVector.
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
StringRef - 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
empty - Check if the string is empty.
const TargetMachine & getTargetMachine() const
ArrayRef< MCPhysReg > getRegisters() 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)
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)
@ 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)
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...
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
constexpr unsigned DefaultMemoryClusterDWordsLimit
const char * toString(DWARFSectionKind Kind)
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.
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.
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 > WorkGroupIDZ
std::optional< unsigned > Mask
static SIArgument createArgument(bool IsReg)
unsigned MaxMemoryClusterDWords
StringValue SGPRForEXECCopy
SmallVector< StringValue > WWMReservedRegs
uint32_t HighBitsOf32BitAddress
SIMachineFunctionInfo()=default
StringValue LongBranchReservedReg
uint64_t ExplicitKernArgSize
uint16_t NumWaveDispatchSGPRs
void mappingImpl(yaml::IO &YamlIO) override
StringValue VGPRForAGPRCopy
SmallVector< StringValue, 2 > SpillPhysVGPRS
std::optional< FrameIndex > ScavengeFI
uint16_t NumWaveDispatchVGPRs
unsigned BytesInStackArgArea
A wrapper around std::string which contains a source range that's being set during parsing.