1//===- AMDGPULegalizerInfo ---------------------------------------*- 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/// \file
9/// This file declares the targeting of the Machinelegalizer class for
10/// AMDGPU.
11/// \todo This should be generated by TableGen.
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINELEGALIZER_H
15#define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINELEGALIZER_H
16
17#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
18#include "AMDGPUArgumentUsageInfo.h"
19#include "SIInstrInfo.h"
20
21namespace llvm {
22
23class GCNTargetMachine;
24class GCNSubtarget;
25class MachineIRBuilder;
26
27namespace AMDGPU {
28struct ImageDimIntrinsicInfo;
29}
30class AMDGPULegalizerInfo final : public LegalizerInfo {
31 const GCNSubtarget &ST;
32
33public:
34 AMDGPULegalizerInfo(const GCNSubtarget &ST,
35 const GCNTargetMachine &TM);
36
37 bool legalizeCustom(LegalizerHelper &Helper, MachineInstr &MI,
38 LostDebugLocObserver &LocObserver) const override;
39
40 Register getSegmentAperture(unsigned AddrSpace,
41 MachineRegisterInfo &MRI,
42 MachineIRBuilder &B) const;
43
44 bool legalizeAddrSpaceCast(MachineInstr &MI, MachineRegisterInfo &MRI,
45 MachineIRBuilder &B) const;
46 bool legalizeFroundeven(MachineInstr &MI, MachineRegisterInfo &MRI,
47 MachineIRBuilder &B) const;
48 bool legalizeFceil(MachineInstr &MI, MachineRegisterInfo &MRI,
49 MachineIRBuilder &B) const;
50 bool legalizeFrem(MachineInstr &MI, MachineRegisterInfo &MRI,
51 MachineIRBuilder &B) const;
52 bool legalizeIntrinsicTrunc(MachineInstr &MI, MachineRegisterInfo &MRI,
53 MachineIRBuilder &B) const;
54 bool legalizeITOFP(MachineInstr &MI, MachineRegisterInfo &MRI,
55 MachineIRBuilder &B, bool Signed) const;
56 bool legalizeFPTOI(MachineInstr &MI, MachineRegisterInfo &MRI,
57 MachineIRBuilder &B, bool Signed) const;
58 bool legalizeMinNumMaxNum(LegalizerHelper &Helper, MachineInstr &MI) const;
59 bool legalizeExtract(LegalizerHelper &Helper, MachineInstr &MI) const;
60 bool legalizeInsert(LegalizerHelper &Helper, MachineInstr &MI) const;
61 bool legalizeExtractVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
62 MachineIRBuilder &B) const;
63 bool legalizeInsertVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
64 MachineIRBuilder &B) const;
65
66 bool legalizeSinCos(MachineInstr &MI, MachineRegisterInfo &MRI,
67 MachineIRBuilder &B) const;
68
69 bool buildPCRelGlobalAddress(Register DstReg, LLT PtrTy, MachineIRBuilder &B,
70 const GlobalValue *GV, int64_t Offset,
71 unsigned GAFlags = SIInstrInfo::MO_NONE) const;
72
73 void buildAbsGlobalAddress(Register DstReg, LLT PtrTy, MachineIRBuilder &B,
74 const GlobalValue *GV,
75 MachineRegisterInfo &MRI) const;
76
77 bool legalizeGlobalValue(MachineInstr &MI, MachineRegisterInfo &MRI,
78 MachineIRBuilder &B) const;
79 bool legalizeLoad(LegalizerHelper &Helper, MachineInstr &MI) const;
80 bool legalizeStore(LegalizerHelper &Helper, MachineInstr &MI) const;
81
82 bool legalizeFMad(MachineInstr &MI, MachineRegisterInfo &MRI,
83 MachineIRBuilder &B) const;
84
85 bool legalizeAtomicCmpXChg(MachineInstr &MI, MachineRegisterInfo &MRI,
86 MachineIRBuilder &B) const;
87
88 std::pair<Register, Register>
89 getScaledLogInput(MachineIRBuilder &B, Register Src, unsigned Flags) const;
90
91 bool legalizeFlog2(MachineInstr &MI, MachineIRBuilder &B) const;
92 bool legalizeFlogCommon(MachineInstr &MI, MachineIRBuilder &B) const;
93 bool legalizeFlogUnsafe(MachineIRBuilder &B, Register Dst, Register Src,
94 bool IsLog10, unsigned Flags) const;
95 bool legalizeFExp2(MachineInstr &MI, MachineIRBuilder &B) const;
96 bool legalizeFExpUnsafeImpl(MachineIRBuilder &B, Register Dst, Register Src,
97 unsigned Flags, bool IsExp10) const;
98 bool legalizeFExpUnsafe(MachineIRBuilder &B, Register Dst, Register Src,
99 unsigned Flags) const;
100 bool legalizeFExp10Unsafe(MachineIRBuilder &B, Register Dst, Register Src,
101 unsigned Flags) const;
102
103 bool legalizeFEXPF64(MachineInstr &MI, MachineIRBuilder &B) const;
104
105 bool legalizeFExp(MachineInstr &MI, MachineIRBuilder &B) const;
106 bool legalizeFPow(MachineInstr &MI, MachineIRBuilder &B) const;
107 bool legalizeFFloor(MachineInstr &MI, MachineRegisterInfo &MRI,
108 MachineIRBuilder &B) const;
109
110 bool legalizeBuildVector(MachineInstr &MI, MachineRegisterInfo &MRI,
111 MachineIRBuilder &B) const;
112
113 void buildMultiply(LegalizerHelper &Helper, MutableArrayRef<Register> Accum,
114 ArrayRef<Register> Src0, ArrayRef<Register> Src1,
115 bool UsePartialMad64_32,
116 bool SeparateOddAlignedProducts) const;
117 bool legalizeMul(LegalizerHelper &Helper, MachineInstr &MI) const;
118 bool legalizeCTLZ_CTTZ(MachineInstr &MI, MachineRegisterInfo &MRI,
119 MachineIRBuilder &B) const;
120 bool legalizeCTLZ_ZERO_UNDEF(MachineInstr &MI, MachineRegisterInfo &MRI,
121 MachineIRBuilder &B) const;
122 bool legalizeCTLS(MachineInstr &MI, MachineRegisterInfo &MRI,
123 MachineIRBuilder &B) const;
124
125 void buildLoadInputValue(Register DstReg, MachineIRBuilder &B,
126 const ArgDescriptor *Arg,
127 const TargetRegisterClass *ArgRC, LLT ArgTy) const;
128 bool legalizeWorkGroupId(
129 MachineInstr &MI, MachineIRBuilder &B,
130 AMDGPUFunctionArgInfo::PreloadedValue ClusterIdPV,
131 AMDGPUFunctionArgInfo::PreloadedValue ClusterMaxIdPV,
132 AMDGPUFunctionArgInfo::PreloadedValue ClusterWorkGroupIdPV) const;
133 bool loadInputValue(Register DstReg, MachineIRBuilder &B,
134 AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
135
136 bool legalizePointerAsRsrcIntrin(MachineInstr &MI, MachineRegisterInfo &MRI,
137 MachineIRBuilder &B) const;
138
139 bool legalizePreloadedArgIntrin(
140 MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
141 AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
142 bool legalizeWorkitemIDIntrinsic(
143 MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
144 unsigned Dim, AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
145
146 MachinePointerInfo getKernargSegmentPtrInfo(MachineFunction &MF) const;
147 Register getKernargParameterPtr(MachineIRBuilder &B, int64_t Offset) const;
148 bool legalizeKernargMemParameter(MachineInstr &MI, MachineIRBuilder &B,
149 uint64_t Offset,
150 Align Alignment = Align(4)) const;
151
152 bool legalizeUnsignedDIV_REM(MachineInstr &MI, MachineRegisterInfo &MRI,
153 MachineIRBuilder &B) const;
154
155 void legalizeUnsignedDIV_REM32Impl(MachineIRBuilder &B, Register DstDivReg,
156 Register DstRemReg, Register Num,
157 Register Den) const;
158
159 void legalizeUnsignedDIV_REM64Impl(MachineIRBuilder &B, Register DstDivReg,
160 Register DstRemReg, Register Num,
161 Register Den) const;
162
163 bool legalizeSignedDIV_REM(MachineInstr &MI, MachineRegisterInfo &MRI,
164 MachineIRBuilder &B) const;
165
166 bool legalizeFDIV(MachineInstr &MI, MachineRegisterInfo &MRI,
167 MachineIRBuilder &B) const;
168 bool legalizeFDIV16(MachineInstr &MI, MachineRegisterInfo &MRI,
169 MachineIRBuilder &B) const;
170 bool legalizeFDIV32(MachineInstr &MI, MachineRegisterInfo &MRI,
171 MachineIRBuilder &B) const;
172 bool legalizeFDIV64(MachineInstr &MI, MachineRegisterInfo &MRI,
173 MachineIRBuilder &B) const;
174 bool legalizeFFREXP(MachineInstr &MI, MachineRegisterInfo &MRI,
175 MachineIRBuilder &B) const;
176 bool legalizeFastUnsafeFDIV(MachineInstr &MI, MachineRegisterInfo &MRI,
177 MachineIRBuilder &B) const;
178 bool legalizeFastUnsafeFDIV64(MachineInstr &MI, MachineRegisterInfo &MRI,
179 MachineIRBuilder &B) const;
180 bool legalizeFDIVFastIntrin(MachineInstr &MI, MachineRegisterInfo &MRI,
181 MachineIRBuilder &B) const;
182
183 bool legalizeFSQRTF16(MachineInstr &MI, MachineRegisterInfo &MRI,
184 MachineIRBuilder &B) const;
185 bool legalizeFSQRTF32(MachineInstr &MI, MachineRegisterInfo &MRI,
186 MachineIRBuilder &B) const;
187 bool legalizeFSQRTF64(MachineInstr &MI, MachineRegisterInfo &MRI,
188 MachineIRBuilder &B) const;
189 bool legalizeFSQRT(MachineInstr &MI, MachineRegisterInfo &MRI,
190 MachineIRBuilder &B) const;
191
192 bool legalizeRsqClampIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
193 MachineIRBuilder &B) const;
194
195 bool getImplicitArgPtr(Register DstReg, MachineRegisterInfo &MRI,
196 MachineIRBuilder &B) const;
197
198 bool legalizeImplicitArgPtr(MachineInstr &MI, MachineRegisterInfo &MRI,
199 MachineIRBuilder &B) const;
200
201 bool getLDSKernelId(Register DstReg, MachineRegisterInfo &MRI,
202 MachineIRBuilder &B) const;
203
204 bool legalizeLDSKernelId(MachineInstr &MI, MachineRegisterInfo &MRI,
205 MachineIRBuilder &B) const;
206
207 bool legalizeIsAddrSpace(MachineInstr &MI, MachineRegisterInfo &MRI,
208 MachineIRBuilder &B, unsigned AddrSpace) const;
209
210 std::pair<Register, unsigned> splitBufferOffsets(MachineIRBuilder &B,
211 Register OrigOffset) const;
212
213 Register handleD16VData(MachineIRBuilder &B, MachineRegisterInfo &MRI,
214 Register Reg, bool ImageStore = false) const;
215 Register fixStoreSourceType(MachineIRBuilder &B, Register VData, LLT MemTy,
216 bool IsFormat) const;
217
218 bool legalizeBufferStore(MachineInstr &MI, LegalizerHelper &Helper,
219 bool IsTyped, bool IsFormat) const;
220 bool legalizeBufferLoad(MachineInstr &MI, LegalizerHelper &Helper,
221 bool IsFormat, bool IsTyped) const;
222 bool legalizeBufferAtomic(MachineInstr &MI, MachineIRBuilder &B,
223 Intrinsic::ID IID) const;
224
225 bool legalizeBVHIntersectRayIntrinsic(MachineInstr &MI,
226 MachineIRBuilder &B) const;
227
228 bool legalizeBVHDualOrBVH8IntersectRayIntrinsic(MachineInstr &MI,
229 MachineIRBuilder &B) const;
230
231 bool legalizeLaneOp(LegalizerHelper &Helper, MachineInstr &MI,
232 Intrinsic::ID IID) const;
233
234 bool legalizeBVHIntrinsic(MachineInstr &MI, MachineIRBuilder &B) const;
235
236 bool legalizeStackSave(MachineInstr &MI, MachineIRBuilder &B) const;
237 bool legalizeWaveID(MachineInstr &MI, MachineIRBuilder &B) const;
238 bool legalizeConstHwRegRead(MachineInstr &MI, MachineIRBuilder &B,
239 AMDGPU::Hwreg::Id HwReg, unsigned LowBit,
240 unsigned Width) const;
241
242 bool legalizeGetFPEnv(MachineInstr &MI, MachineRegisterInfo &MRI,
243 MachineIRBuilder &B) const;
244 bool legalizeSetFPEnv(MachineInstr &MI, MachineRegisterInfo &MRI,
245 MachineIRBuilder &B) const;
246
247 bool legalizeImageIntrinsic(
248 MachineInstr &MI, MachineIRBuilder &B,
249 GISelChangeObserver &Observer,
250 const AMDGPU::ImageDimIntrinsicInfo *ImageDimIntr) const;
251
252 bool legalizeSBufferLoad(LegalizerHelper &Helper, MachineInstr &MI) const;
253
254 bool legalizeSBufferPrefetch(LegalizerHelper &Helper, MachineInstr &MI) const;
255
256 bool legalizeTrap(MachineInstr &MI, MachineRegisterInfo &MRI,
257 MachineIRBuilder &B) const;
258 bool legalizeTrapEndpgm(MachineInstr &MI, MachineRegisterInfo &MRI,
259 MachineIRBuilder &B) const;
260 bool legalizeTrapHsaQueuePtr(MachineInstr &MI, MachineRegisterInfo &MRI,
261 MachineIRBuilder &B) const;
262 bool legalizeTrapHsa(MachineInstr &MI, MachineRegisterInfo &MRI,
263 MachineIRBuilder &B) const;
264 bool legalizeDebugTrap(MachineInstr &MI, MachineRegisterInfo &MRI,
265 MachineIRBuilder &B) const;
266
267 bool legalizeIntrinsic(LegalizerHelper &Helper,
268 MachineInstr &MI) const override;
269};
270} // End llvm namespace.
271#endif
272