1 //==- AMDGPUArgumentrUsageInfo.h - Function Arg Usage Info -------*- C++ -*-==//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUARGUMENTUSAGEINFO_H
10 #define LLVM_LIB_TARGET_AMDGPU_AMDGPUARGUMENTUSAGEINFO_H
12 #include "llvm/CodeGen/Register.h"
13 #include "llvm/Pass.h"
20 class TargetRegisterClass
;
21 class TargetRegisterInfo
;
23 struct ArgDescriptor
{
25 friend struct AMDGPUFunctionArgInfo
;
26 friend class AMDGPUArgumentUsageInfo
;
33 // Bitmask to locate argument within the register.
40 constexpr ArgDescriptor(unsigned Val
= 0, unsigned Mask
= ~0u,
41 bool IsStack
= false, bool IsSet
= false)
42 : Reg(Val
), Mask(Mask
), IsStack(IsStack
), IsSet(IsSet
) {}
44 static constexpr ArgDescriptor
createRegister(Register Reg
,
45 unsigned Mask
= ~0u) {
46 return ArgDescriptor(Reg
, Mask
, false, true);
49 static constexpr ArgDescriptor
createStack(unsigned Offset
,
50 unsigned Mask
= ~0u) {
51 return ArgDescriptor(Offset
, Mask
, true, true);
54 static constexpr ArgDescriptor
createArg(const ArgDescriptor
&Arg
,
56 return ArgDescriptor(Arg
.Reg
, Mask
, Arg
.IsStack
, Arg
.IsSet
);
63 explicit operator bool() const {
67 bool isRegister() const {
71 MCRegister
getRegister() const {
76 unsigned getStackOffset() const {
81 unsigned getMask() const {
85 bool isMasked() const {
89 void print(raw_ostream
&OS
, const TargetRegisterInfo
*TRI
= nullptr) const;
92 inline raw_ostream
&operator<<(raw_ostream
&OS
, const ArgDescriptor
&Arg
) {
97 struct AMDGPUFunctionArgInfo
{
100 PRIVATE_SEGMENT_BUFFER
= 0,
103 KERNARG_SEGMENT_PTR
= 3,
105 FLAT_SCRATCH_INIT
= 5,
109 PRIVATE_SEGMENT_WAVE_BYTE_OFFSET
= 14,
110 IMPLICIT_BUFFER_PTR
= 15,
111 IMPLICIT_ARG_PTR
= 16,
117 FIRST_VGPR_VALUE
= WORKITEM_ID_X
120 // Kernel input registers setup for the HSA ABI in allocation order.
122 // User SGPRs in kernels
123 // XXX - Can these require argument spills?
124 ArgDescriptor PrivateSegmentBuffer
;
125 ArgDescriptor DispatchPtr
;
126 ArgDescriptor QueuePtr
;
127 ArgDescriptor KernargSegmentPtr
;
128 ArgDescriptor DispatchID
;
129 ArgDescriptor FlatScratchInit
;
130 ArgDescriptor PrivateSegmentSize
;
132 // System SGPRs in kernels.
133 ArgDescriptor WorkGroupIDX
;
134 ArgDescriptor WorkGroupIDY
;
135 ArgDescriptor WorkGroupIDZ
;
136 ArgDescriptor WorkGroupInfo
;
137 ArgDescriptor PrivateSegmentWaveByteOffset
;
139 // Pointer with offset from kernargsegmentptr to where special ABI arguments
140 // are passed to callable functions.
141 ArgDescriptor ImplicitArgPtr
;
143 // Input registers for non-HSA ABI
144 ArgDescriptor ImplicitBufferPtr
;
146 // VGPRs inputs. For entry functions these are either v0, v1 and v2 or packed
147 // into v0, 10 bits per dimension if packed-tid is set.
148 ArgDescriptor WorkItemIDX
;
149 ArgDescriptor WorkItemIDY
;
150 ArgDescriptor WorkItemIDZ
;
152 std::tuple
<const ArgDescriptor
*, const TargetRegisterClass
*, LLT
>
153 getPreloadedValue(PreloadedValue Value
) const;
155 static constexpr AMDGPUFunctionArgInfo
fixedABILayout();
158 class AMDGPUArgumentUsageInfo
: public ImmutablePass
{
160 DenseMap
<const Function
*, AMDGPUFunctionArgInfo
> ArgInfoMap
;
165 static const AMDGPUFunctionArgInfo ExternFunctionInfo
;
166 static const AMDGPUFunctionArgInfo FixedABIFunctionInfo
;
168 AMDGPUArgumentUsageInfo() : ImmutablePass(ID
) { }
170 void getAnalysisUsage(AnalysisUsage
&AU
) const override
{
171 AU
.setPreservesAll();
174 bool doInitialization(Module
&M
) override
;
175 bool doFinalization(Module
&M
) override
;
177 void print(raw_ostream
&OS
, const Module
*M
= nullptr) const override
;
179 void setFuncArgInfo(const Function
&F
, const AMDGPUFunctionArgInfo
&ArgInfo
) {
180 ArgInfoMap
[&F
] = ArgInfo
;
183 const AMDGPUFunctionArgInfo
&lookupFuncArgInfo(const Function
&F
) const;
186 } // end namespace llvm