40 unsigned OrderIndex, ScopeIndex;
42 const auto *FD =
SemaRef.getCurFunctionDecl(
true);
43 assert(FD &&
"AMDGPU builtins should not be used outside of a function");
44 llvm::StringMap<bool> CallerFeatureMap;
50 case AMDGPU::BI__builtin_amdgcn_raw_ptr_buffer_load_lds:
51 case AMDGPU::BI__builtin_amdgcn_raw_ptr_buffer_load_async_lds:
52 case AMDGPU::BI__builtin_amdgcn_struct_ptr_buffer_load_lds:
53 case AMDGPU::BI__builtin_amdgcn_struct_ptr_buffer_load_async_lds:
54 case AMDGPU::BI__builtin_amdgcn_load_to_lds:
55 case AMDGPU::BI__builtin_amdgcn_load_async_to_lds:
56 case AMDGPU::BI__builtin_amdgcn_global_load_lds:
57 case AMDGPU::BI__builtin_amdgcn_global_load_async_lds: {
58 constexpr const int SizeIdx = 2;
66 SemaRef.VerifyIntegerConstantExpression(ArgExpr, &Size);
67 assert(!R.isInvalid());
68 switch (Size.getSExtValue()) {
81 diag::err_amdgcn_load_lds_size_invalid_value)
84 diag::note_amdgcn_load_lds_size_valid_value)
89 case AMDGPU::BI__builtin_amdgcn_uicmp:
90 case AMDGPU::BI__builtin_amdgcn_uicmpl:
91 case AMDGPU::BI__builtin_amdgcn_sicmp:
92 case AMDGPU::BI__builtin_amdgcn_sicmpl:
93 case AMDGPU::BI__builtin_amdgcn_fcmp:
94 case AMDGPU::BI__builtin_amdgcn_fcmpf: {
102 << (IsWave32 ?
"__builtin_amdgcn_ballot_w32"
103 :
"__builtin_amdgcn_ballot_w64");
106 case AMDGPU::BI__builtin_amdgcn_get_fpenv:
107 case AMDGPU::BI__builtin_amdgcn_set_fpenv:
109 case AMDGPU::BI__builtin_amdgcn_atomic_inc32:
110 case AMDGPU::BI__builtin_amdgcn_atomic_inc64:
111 case AMDGPU::BI__builtin_amdgcn_atomic_dec32:
112 case AMDGPU::BI__builtin_amdgcn_atomic_dec64:
116 case AMDGPU::BI__builtin_amdgcn_fence:
120 case AMDGPU::BI__builtin_amdgcn_s_setreg:
121 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0,
123 case AMDGPU::BI__builtin_amdgcn_s_wait_event: {
129 "gfx12-insts", CallerFeatureMap);
134 if (((IsGFX12Plus && !
Result[1]) || (!IsGFX12Plus &&
Result[0])) ||
135 Result.getZExtValue() > 2) {
138 diag::warn_amdgpu_s_wait_event_mask_no_effect_target)
141 diag::note_amdgpu_s_wait_event_suggested_value)
147 case AMDGPU::BI__builtin_amdgcn_mov_dpp:
149 case AMDGPU::BI__builtin_amdgcn_mov_dpp8:
151 case AMDGPU::BI__builtin_amdgcn_update_dpp:
153 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f16_fp8:
154 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_bf16_fp8:
155 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f16_bf8:
156 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_bf16_bf8:
157 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f16_fp4:
158 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_bf16_fp4:
159 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f32_fp8:
160 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f32_bf8:
161 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f32_fp4:
162 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f16_fp6:
163 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_bf16_fp6:
164 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f16_bf6:
165 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_bf16_bf6:
166 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f32_fp6:
167 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f32_bf6:
168 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 15);
169 case AMDGPU::BI__builtin_amdgcn_av_load_b128:
171 case AMDGPU::BI__builtin_amdgcn_av_store_b128:
173 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_32x4B:
174 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_16x8B:
175 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_8x16B:
177 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_32x4B:
178 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_16x8B:
179 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_8x16B:
181 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b32:
182 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b64:
183 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b128:
184 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b32:
185 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b64:
186 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b128:
188 case AMDGPU::BI__builtin_amdgcn_image_load_1d_v4f32_i32:
189 case AMDGPU::BI__builtin_amdgcn_image_load_1darray_v4f32_i32:
190 case AMDGPU::BI__builtin_amdgcn_image_load_1d_v4f16_i32:
191 case AMDGPU::BI__builtin_amdgcn_image_load_1darray_v4f16_i32:
192 case AMDGPU::BI__builtin_amdgcn_image_load_2d_f32_i32:
193 case AMDGPU::BI__builtin_amdgcn_image_load_2d_v4f32_i32:
194 case AMDGPU::BI__builtin_amdgcn_image_load_2d_v4f16_i32:
195 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_f32_i32:
196 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_v4f32_i32:
197 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_v4f16_i32:
198 case AMDGPU::BI__builtin_amdgcn_image_load_3d_v4f32_i32:
199 case AMDGPU::BI__builtin_amdgcn_image_load_3d_v4f16_i32:
200 case AMDGPU::BI__builtin_amdgcn_image_load_cube_v4f32_i32:
201 case AMDGPU::BI__builtin_amdgcn_image_load_cube_v4f16_i32:
202 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1d_v4f32_i32:
203 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1d_v4f16_i32:
204 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1darray_v4f32_i32:
205 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1darray_v4f16_i32:
206 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_f32_i32:
207 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_v4f32_i32:
208 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_v4f16_i32:
209 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_f32_i32:
210 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_v4f32_i32:
211 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_v4f16_i32:
212 case AMDGPU::BI__builtin_amdgcn_image_load_mip_3d_v4f32_i32:
213 case AMDGPU::BI__builtin_amdgcn_image_load_mip_3d_v4f16_i32:
214 case AMDGPU::BI__builtin_amdgcn_image_load_mip_cube_v4f32_i32:
215 case AMDGPU::BI__builtin_amdgcn_image_load_mip_cube_v4f16_i32:
216 case AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f32_f32:
217 case AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f32_f32:
218 case AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f16_f32:
219 case AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f16_f32:
220 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_f32_f32:
221 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f32_f32:
222 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f16_f32:
223 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_f32_f32:
224 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f32_f32:
225 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f16_f32:
226 case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f32_f32:
227 case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f16_f32:
228 case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f32_f32:
229 case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f16_f32:
230 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f32_f32:
231 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f16_f32:
232 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f32_f32:
233 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f16_f32:
234 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_f32_f32:
235 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f32_f32:
236 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f16_f32:
237 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_f32_f32:
238 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f32_f32:
239 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f16_f32:
240 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f32_f32:
241 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f16_f32:
242 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f32_f32:
243 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f16_f32:
244 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f32_f32:
245 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f16_f32:
246 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f32_f32:
247 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f16_f32:
248 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_f32_f32:
249 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f16_f32:
250 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f32_f32:
251 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_f32_f32:
252 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f32_f32:
253 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f16_f32:
254 case AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f32_f32:
255 case AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f16_f32:
256 case AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f32_f32:
257 case AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f16_f32:
258 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f32_f32:
259 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f16_f32:
260 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f32_f32:
261 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f16_f32:
262 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_f32_f32:
263 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f32_f32:
264 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f16_f32:
265 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_f32_f32:
266 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f32_f32:
267 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f16_f32:
268 case AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f32_f32:
269 case AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f16_f32:
270 case AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32: {
271 StringRef FeatureList(
276 << FD->getDeclName() << FeatureList;
280 unsigned ArgCount = TheCall->
getNumArgs() - 1;
285 constexpr unsigned DMaskArgNo = 0;
286 constexpr int Low = 0;
287 constexpr int High = 15;
288 if (
SemaRef.BuiltinConstantArg(TheCall, DMaskArgNo,
Result) ||
289 SemaRef.BuiltinConstantArgRange(TheCall, DMaskArgNo, Low, High,
295 int NumElementsInRetTy = 1;
297 if (
auto *VTy = dyn_cast<VectorType>(RetTy))
298 NumElementsInRetTy = VTy->getNumElements();
299 int NumActiveBitsInDMask =
301 if (NumActiveBitsInDMask > NumElementsInRetTy) {
303 diag::err_amdgcn_dmask_has_too_many_bits_set);
309 bool ExtraGatherChecks =
310 BuiltinID == AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32 &&
311 SemaRef.BuiltinConstantArgPower2(TheCall, 0);
313 return ExtraGatherChecks ||
315 (
SemaRef.BuiltinConstantArg(TheCall, (ArgCount - 1),
Result));
317 case AMDGPU::BI__builtin_amdgcn_image_store_1d_v4f32_i32:
318 case AMDGPU::BI__builtin_amdgcn_image_store_1darray_v4f32_i32:
319 case AMDGPU::BI__builtin_amdgcn_image_store_1d_v4f16_i32:
320 case AMDGPU::BI__builtin_amdgcn_image_store_1darray_v4f16_i32:
321 case AMDGPU::BI__builtin_amdgcn_image_store_2d_f32_i32:
322 case AMDGPU::BI__builtin_amdgcn_image_store_2d_v4f32_i32:
323 case AMDGPU::BI__builtin_amdgcn_image_store_2d_v4f16_i32:
324 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_f32_i32:
325 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_v4f32_i32:
326 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_v4f16_i32:
327 case AMDGPU::BI__builtin_amdgcn_image_store_3d_v4f32_i32:
328 case AMDGPU::BI__builtin_amdgcn_image_store_3d_v4f16_i32:
329 case AMDGPU::BI__builtin_amdgcn_image_store_cube_v4f32_i32:
330 case AMDGPU::BI__builtin_amdgcn_image_store_cube_v4f16_i32:
331 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1d_v4f32_i32:
332 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1d_v4f16_i32:
333 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1darray_v4f32_i32:
334 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1darray_v4f16_i32:
335 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_f32_i32:
336 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_v4f32_i32:
337 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_v4f16_i32:
338 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_f32_i32:
339 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_v4f32_i32:
340 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_v4f16_i32:
341 case AMDGPU::BI__builtin_amdgcn_image_store_mip_3d_v4f32_i32:
342 case AMDGPU::BI__builtin_amdgcn_image_store_mip_3d_v4f16_i32:
343 case AMDGPU::BI__builtin_amdgcn_image_store_mip_cube_v4f32_i32:
344 case AMDGPU::BI__builtin_amdgcn_image_store_mip_cube_v4f16_i32: {
345 StringRef FeatureList(
350 << FD->getDeclName() << FeatureList;
354 unsigned ArgCount = TheCall->
getNumArgs() - 1;
359 constexpr unsigned DMaskArgNo = 1;
360 return SemaRef.BuiltinConstantArgRange(TheCall, DMaskArgNo, 0,
366 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x64_iu8:
367 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x128_iu8: {
368 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x64_iu8) {
369 if (
SemaRef.checkArgCountRange(TheCall, 7, 8))
373 }
else if (BuiltinID ==
374 AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x128_iu8) {
375 if (
SemaRef.checkArgCountRange(TheCall, 8, 9))
384 llvm::APSInt ClampValue;
385 if (!
SemaRef.VerifyIntegerConstantExpression(ClampArg, &ClampValue)
394 SemaRef.CheckSingleAssignmentConstraints(BoolTy, ClampExpr);
400 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x32_bf16:
401 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x4_f32:
402 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x32_f16:
403 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x32_f16:
404 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x32_bf16:
405 case AMDGPU::BI__builtin_amdgcn_wmma_bf16f32_16x16x32_bf16:
406 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0,
408 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0,
415 auto ArgExpr = Arg.
get();
419 return Diag(ArgExpr->getExprLoc(), diag::err_typecheck_expect_int)
420 << ArgExpr->getType();
421 auto Ord = ArgResult.
Val.
getInt().getZExtValue();
425 if (!llvm::isValidAtomicOrderingCABI(Ord))
426 return Diag(ArgExpr->getBeginLoc(),
427 diag::warn_atomic_op_has_invalid_memory_order)
428 << 0 << ArgExpr->getSourceRange();
429 switch (
static_cast<llvm::AtomicOrderingCABI
>(Ord)) {
430 case llvm::AtomicOrderingCABI::relaxed:
431 case llvm::AtomicOrderingCABI::consume:
432 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_fence)
433 return Diag(ArgExpr->getBeginLoc(),
434 diag::warn_atomic_op_has_invalid_memory_order)
435 << 0 << ArgExpr->getSourceRange();
437 case llvm::AtomicOrderingCABI::acquire:
438 case llvm::AtomicOrderingCABI::release:
439 case llvm::AtomicOrderingCABI::acq_rel:
440 case llvm::AtomicOrderingCABI::seq_cst:
444 Arg = TheCall->
getArg(ScopeIndex);
448 if (!ArgExpr->EvaluateAsConstantExpr(ArgResult1,
getASTContext()))
449 return Diag(ArgExpr->getExprLoc(), diag::err_expr_not_string_literal)
450 << ArgExpr->getType();