LLVM 17.0.0git
AMDGPUArgumentUsageInfo.h
Go to the documentation of this file.
1//==- AMDGPUArgumentrUsageInfo.h - Function Arg Usage Info -------*- 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#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUARGUMENTUSAGEINFO_H
10#define LLVM_LIB_TARGET_AMDGPU_AMDGPUARGUMENTUSAGEINFO_H
11
13#include "llvm/Pass.h"
14
15namespace llvm {
16
17class Function;
18class LLT;
19class raw_ostream;
20class TargetRegisterClass;
21class TargetRegisterInfo;
22
24private:
25 friend struct AMDGPUFunctionArgInfo;
27
28 union {
30 unsigned StackOffset;
31 };
32
33 // Bitmask to locate argument within the register.
34 unsigned Mask;
35
36 bool IsStack : 1;
37 bool IsSet : 1;
38
39public:
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) {}
43
45 unsigned Mask = ~0u) {
46 return ArgDescriptor(Reg, Mask, false, true);
47 }
48
49 static constexpr ArgDescriptor createStack(unsigned Offset,
50 unsigned Mask = ~0u) {
51 return ArgDescriptor(Offset, Mask, true, true);
52 }
53
54 static constexpr ArgDescriptor createArg(const ArgDescriptor &Arg,
55 unsigned Mask) {
56 return ArgDescriptor(Arg.Reg, Mask, Arg.IsStack, Arg.IsSet);
57 }
58
59 bool isSet() const {
60 return IsSet;
61 }
62
63 explicit operator bool() const {
64 return isSet();
65 }
66
67 bool isRegister() const {
68 return !IsStack;
69 }
70
72 assert(!IsStack);
73 return Reg;
74 }
75
76 unsigned getStackOffset() const {
77 assert(IsStack);
78 return StackOffset;
79 }
80
81 unsigned getMask() const {
82 return Mask;
83 }
84
85 bool isMasked() const {
86 return Mask != ~0u;
87 }
88
89 void print(raw_ostream &OS, const TargetRegisterInfo *TRI = nullptr) const;
90};
91
93 Arg.print(OS);
94 return OS;
95}
96
99 // SGPRS:
106 LDS_KERNEL_ID = 6, // LLVM internal, not part of the ABI
113
114 // VGPRS:
119 };
120
121 // Kernel input registers setup for the HSA ABI in allocation order.
122
123 // User SGPRs in kernels
124 // XXX - Can these require argument spills?
133
134 // System SGPRs in kernels.
140
141 // Pointer with offset from kernargsegmentptr to where special ABI arguments
142 // are passed to callable functions.
144
145 // Input registers for non-HSA ABI
147
148 // VGPRs inputs. For entry functions these are either v0, v1 and v2 or packed
149 // into v0, 10 bits per dimension if packed-tid is set.
153
154 std::tuple<const ArgDescriptor *, const TargetRegisterClass *, LLT>
156
157 static constexpr AMDGPUFunctionArgInfo fixedABILayout();
158};
159
161private:
163
164public:
165 static char ID;
166
169
171
172 void getAnalysisUsage(AnalysisUsage &AU) const override {
173 AU.setPreservesAll();
174 }
175
176 bool doInitialization(Module &M) override;
177 bool doFinalization(Module &M) override;
178
179 void print(raw_ostream &OS, const Module *M = nullptr) const override;
180
182 ArgInfoMap[&F] = ArgInfo;
183 }
184
186};
187
188} // end namespace llvm
189
190#endif
amdgpu Simplify well known AMD library false FunctionCallee Value * Arg
#define F(x, y, z)
Definition: MD5.cpp:55
unsigned const TargetRegisterInfo * TRI
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
static const AMDGPUFunctionArgInfo ExternFunctionInfo
static const AMDGPUFunctionArgInfo FixedABIFunctionInfo
const AMDGPUFunctionArgInfo & lookupFuncArgInfo(const Function &F) const
void setFuncArgInfo(const Function &F, const AMDGPUFunctionArgInfo &ArgInfo)
void print(raw_ostream &OS, const Module *M=nullptr) const override
print - Print out the internal state of the pass.
bool doInitialization(Module &M) override
doInitialization - Virtual method overridden by subclasses to do any necessary initialization before ...
bool doFinalization(Module &M) override
doFinalization - Virtual method overriden by subclasses to do any necessary clean up after all passes...
Represent the analysis usage information of a pass.
void setPreservesAll()
Set by analyses that do not transform their input at all.
ImmutablePass class - This class is used to provide information that does not need to be run.
Definition: Pass.h:282
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:24
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
LLVM Value Representation.
Definition: Value.h:74
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:440
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
Definition: APFixedPoint.h:292
static constexpr AMDGPUFunctionArgInfo fixedABILayout()
std::tuple< const ArgDescriptor *, const TargetRegisterClass *, LLT > getPreloadedValue(PreloadedValue Value) const
static constexpr ArgDescriptor createRegister(Register Reg, unsigned Mask=~0u)
MCRegister getRegister() const
static constexpr ArgDescriptor createArg(const ArgDescriptor &Arg, unsigned Mask)
void print(raw_ostream &OS, const TargetRegisterInfo *TRI=nullptr) const
unsigned getStackOffset() const
constexpr ArgDescriptor(unsigned Val=0, unsigned Mask=~0u, bool IsStack=false, bool IsSet=false)
static constexpr ArgDescriptor createStack(unsigned Offset, unsigned Mask=~0u)
Helper struct shared between Function Specialization and SCCP Solver.
Definition: SCCPSolver.h:43