LLVM 24.0.0git
AMDGPUArgumentUsageInfo.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
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
10#include "SIRegisterInfo.h"
15
16using namespace llvm;
17
19 const TargetRegisterInfo *TRI) const {
20 if (!isSet()) {
21 OS << "<not set>\n";
22 return;
23 }
24
25 if (isRegister())
26 OS << "Reg " << printReg(getRegister(), TRI);
27 else
28 OS << "Stack offset " << getStackOffset();
29
30 if (isMasked()) {
31 OS << " & ";
33 }
34
35 OS << '\n';
36}
37
38// Hardcoded registers from fixed function ABI
41
42std::tuple<const ArgDescriptor *, const TargetRegisterClass *, LLT>
45 switch (Value) {
47 return std::tuple(PrivateSegmentBuffer ? &PrivateSegmentBuffer : nullptr,
48 &AMDGPU::SGPR_128RegClass, LLT::fixed_vector(4, 32));
49 }
51 return std::tuple(ImplicitBufferPtr ? &ImplicitBufferPtr : nullptr,
52 &AMDGPU::SGPR_64RegClass,
55 return std::tuple(WorkGroupIDX ? &WorkGroupIDX : nullptr,
56 &AMDGPU::SGPR_32RegClass, LLT::scalar(32));
58 return std::tuple(WorkGroupIDY ? &WorkGroupIDY : nullptr,
59 &AMDGPU::SGPR_32RegClass, LLT::scalar(32));
61 return std::tuple(WorkGroupIDZ ? &WorkGroupIDZ : nullptr,
62 &AMDGPU::SGPR_32RegClass, LLT::scalar(32));
70 return std::tuple(nullptr, &AMDGPU::SGPR_32RegClass, LLT::scalar(32));
72 return std::tuple(LDSKernelId ? &LDSKernelId : nullptr,
73 &AMDGPU::SGPR_32RegClass, LLT::scalar(32));
75 return std::tuple(
77 &AMDGPU::SGPR_32RegClass, LLT::scalar(32));
79 return {PrivateSegmentSize ? &PrivateSegmentSize : nullptr,
80 &AMDGPU::SGPR_32RegClass, LLT::scalar(32)};
82 return std::tuple(KernargSegmentPtr ? &KernargSegmentPtr : nullptr,
83 &AMDGPU::SGPR_64RegClass,
86 return std::tuple(ImplicitArgPtr ? &ImplicitArgPtr : nullptr,
87 &AMDGPU::SGPR_64RegClass,
90 return std::tuple(DispatchID ? &DispatchID : nullptr,
91 &AMDGPU::SGPR_64RegClass, LLT::scalar(64));
93 return std::tuple(FlatScratchInit ? &FlatScratchInit : nullptr,
94 &AMDGPU::SGPR_64RegClass, LLT::scalar(64));
96 return std::tuple(DispatchPtr ? &DispatchPtr : nullptr,
97 &AMDGPU::SGPR_64RegClass,
100 return std::tuple(QueuePtr ? &QueuePtr : nullptr, &AMDGPU::SGPR_64RegClass,
103 return std::tuple(WorkItemIDX ? &WorkItemIDX : nullptr,
104 &AMDGPU::VGPR_32RegClass, LLT::integer(32));
106 return std::tuple(WorkItemIDY ? &WorkItemIDY : nullptr,
107 &AMDGPU::VGPR_32RegClass, LLT::integer(32));
109 return std::tuple(WorkItemIDZ ? &WorkItemIDZ : nullptr,
110 &AMDGPU::VGPR_32RegClass, LLT::integer(32));
111 }
112 llvm_unreachable("unexpected preloaded value type");
113}
114
117 return AMDGPU::isChainCC(CC) ? AMDGPU::SGPR48_SGPR49_SGPR50_SGPR51
118 : AMDGPU::SGPR0_SGPR1_SGPR2_SGPR3;
119}
120
124 = ArgDescriptor::createRegister(AMDGPU::SGPR0_SGPR1_SGPR2_SGPR3);
125 AI.DispatchPtr = ArgDescriptor::createRegister(AMDGPU::SGPR4_SGPR5);
126 AI.QueuePtr = ArgDescriptor::createRegister(AMDGPU::SGPR6_SGPR7);
127
128 // Do not pass kernarg segment pointer, only pass increment version in its
129 // place.
130 AI.ImplicitArgPtr = ArgDescriptor::createRegister(AMDGPU::SGPR8_SGPR9);
131 AI.DispatchID = ArgDescriptor::createRegister(AMDGPU::SGPR10_SGPR11);
132
133 // Skip FlatScratchInit/PrivateSegmentSize
134 AI.WorkGroupIDX = ArgDescriptor::createRegister(AMDGPU::SGPR12);
135 AI.WorkGroupIDY = ArgDescriptor::createRegister(AMDGPU::SGPR13);
136 AI.WorkGroupIDZ = ArgDescriptor::createRegister(AMDGPU::SGPR14);
137 AI.LDSKernelId = ArgDescriptor::createRegister(AMDGPU::SGPR15);
138
139 const unsigned Mask = 0x3ff;
140 AI.WorkItemIDX = ArgDescriptor::createRegister(AMDGPU::VGPR31, Mask);
141 AI.WorkItemIDY = ArgDescriptor::createRegister(AMDGPU::VGPR31, Mask << 10);
142 AI.WorkItemIDZ = ArgDescriptor::createRegister(AMDGPU::VGPR31, Mask << 20);
143 return AI;
144}
Register const TargetRegisterInfo * TRI
RISCVCC::CondCode CC
Interface definition for SIRegisterInfo.
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
static constexpr LLT pointer(unsigned AddressSpace, unsigned SizeInBits)
Get a low-level pointer in the given address space.
static constexpr LLT fixed_vector(unsigned NumElements, unsigned ScalarSizeInBits)
Get a low-level fixed-width vector of some number of elements and element width.
static LLT integer(unsigned SizeInBits)
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
LLVM Value Representation.
Definition Value.h:75
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ CONSTANT_ADDRESS
Address space for constant memory (VTX2).
LLVM_READNONE constexpr bool isChainCC(CallingConv::ID CC)
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.
LLVM_ABI void write_hex(raw_ostream &S, uint64_t N, HexPrintStyle Style, std::optional< size_t > Width=std::nullopt)
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.
static AMDGPUFunctionArgInfo fixedABILayout()
std::tuple< const ArgDescriptor *, const TargetRegisterClass *, LLT > getPreloadedValue(PreloadedValue Value) const
static MCRegister getPrivateSegmentBufferReg(CallingConv::ID CC)
Returns the register a non-entry function with calling convention CC expects the private segment buff...
static const AMDGPUFunctionArgInfo FixedABIFunctionInfo
MCRegister getRegister() const
static ArgDescriptor createRegister(Register Reg, unsigned Mask=~0u)
unsigned getStackOffset() const
void print(raw_ostream &OS, const TargetRegisterInfo *TRI=nullptr) const