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:
113 case AMDGPU::BI__builtin_amdgcn_fence: {
114 bool IsFence = BuiltinID == AMDGPU::BI__builtin_amdgcn_fence;
115 unsigned OrderIndex = IsFence ? 0 : 2;
116 unsigned ScopeIndex = IsFence ? 1 : 3;
117 Expr *OrderExpr = TheCall->
getArg(OrderIndex);
118 Expr *ScopeExpr = TheCall->
getArg(ScopeIndex);
127 return Diag(OrderExpr->
getExprLoc(), diag::err_typecheck_expect_int)
129 uint64_t Ord = OrderResult.
Val.
getInt().getZExtValue();
133 if (!llvm::isValidAtomicOrderingCABI(Ord))
135 diag::warn_atomic_op_has_invalid_memory_order)
137 switch (
static_cast<llvm::AtomicOrderingCABI
>(Ord)) {
138 case llvm::AtomicOrderingCABI::relaxed:
139 case llvm::AtomicOrderingCABI::consume:
142 diag::warn_atomic_op_has_invalid_memory_order)
145 case llvm::AtomicOrderingCABI::acquire:
146 case llvm::AtomicOrderingCABI::release:
147 case llvm::AtomicOrderingCABI::acq_rel:
148 case llvm::AtomicOrderingCABI::seq_cst:
155 return Diag(ScopeExpr->
getExprLoc(), diag::err_expr_not_string_literal)
159 std::optional<std::string> ScopeName =
162 if (ScopeName && !llvm::parseAtomicScopeIRString(TT, *ScopeName)) {
163 return Diag(ScopeExpr->
getExprLoc(), diag::err_invalid_sync_scope)
169 case AMDGPU::BI__builtin_amdgcn_s_setreg:
170 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0,
172 case AMDGPU::BI__builtin_amdgcn_flat_prefetch:
173 case AMDGPU::BI__builtin_amdgcn_global_prefetch: {
176 if (
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0,
178 SemaRef.BuiltinConstantArg(TheCall, 1, CPol))
180 if ((CPol.getZExtValue() & 0x7) != 0x7)
184 diag::err_amdgcn_prefetch_reserved_th)
188 case AMDGPU::BI__builtin_amdgcn_s_wait_event: {
194 "gfx12-insts", CallerFeatureMap);
199 if (((IsGFX12Plus && !
Result[1]) || (!IsGFX12Plus &&
Result[0])) ||
200 Result.getZExtValue() > 2) {
203 diag::warn_amdgpu_s_wait_event_mask_no_effect_target)
206 diag::note_amdgpu_s_wait_event_suggested_value)
212 case AMDGPU::BI__builtin_amdgcn_mov_dpp:
214 case AMDGPU::BI__builtin_amdgcn_mov_dpp8:
216 case AMDGPU::BI__builtin_amdgcn_update_dpp:
218 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f16_fp8:
219 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_bf16_fp8:
220 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f16_bf8:
221 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_bf16_bf8:
222 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f16_fp4:
223 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_bf16_fp4:
224 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f32_fp8:
225 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f32_bf8:
226 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f32_fp4:
227 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f16_fp6:
228 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_bf16_fp6:
229 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f16_bf6:
230 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_bf16_bf6:
231 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f32_fp6:
232 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f32_bf6:
233 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk32_bf16_bf6:
234 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk32_bf16_fp6:
235 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk32_f16_bf6:
236 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk32_f16_fp6:
237 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk32_f32_bf6:
238 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk32_f32_fp6:
239 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 15);
240 case AMDGPU::BI__builtin_amdgcn_asyncmark:
241 case AMDGPU::BI__builtin_amdgcn_wait_asyncmark: {
242 bool IsMark = BuiltinID == AMDGPU::BI__builtin_amdgcn_asyncmark;
245 llvm::APSInt NumMarks;
246 if (!IsMark &&
SemaRef.BuiltinConstantArg(TheCall, 0, NumMarks))
252 unsigned MaskArgNum = IsMark ? 0 : 1;
253 return SemaRef.BuiltinConstantArgRange(
254 TheCall, MaskArgNum, 0,
255 llvm::to_underlying(llvm::AMDGPU::AsyncStages::ALL));
257 case AMDGPU::BI__builtin_amdgcn_av_load_b8:
258 case AMDGPU::BI__builtin_amdgcn_av_load_b16:
259 case AMDGPU::BI__builtin_amdgcn_av_load_b32:
260 case AMDGPU::BI__builtin_amdgcn_av_load_b64:
261 case AMDGPU::BI__builtin_amdgcn_av_load_b128:
263 case AMDGPU::BI__builtin_amdgcn_av_store_b8:
264 case AMDGPU::BI__builtin_amdgcn_av_store_b16:
265 case AMDGPU::BI__builtin_amdgcn_av_store_b32:
266 case AMDGPU::BI__builtin_amdgcn_av_store_b64:
267 case AMDGPU::BI__builtin_amdgcn_av_store_b128:
269 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_32x4B:
270 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_16x8B:
271 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_8x16B:
273 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_32x4B:
274 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_16x8B:
275 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_8x16B:
277 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b32:
278 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b64:
279 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b128:
280 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b32:
281 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b64:
282 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b128:
284 case AMDGPU::BI__builtin_amdgcn_image_load_1d_v4f32_i32:
285 case AMDGPU::BI__builtin_amdgcn_image_load_1darray_v4f32_i32:
286 case AMDGPU::BI__builtin_amdgcn_image_load_1d_v4f16_i32:
287 case AMDGPU::BI__builtin_amdgcn_image_load_1darray_v4f16_i32:
288 case AMDGPU::BI__builtin_amdgcn_image_load_2d_f32_i32:
289 case AMDGPU::BI__builtin_amdgcn_image_load_2d_v4f32_i32:
290 case AMDGPU::BI__builtin_amdgcn_image_load_2d_v4f16_i32:
291 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_f32_i32:
292 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_v4f32_i32:
293 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_v4f16_i32:
294 case AMDGPU::BI__builtin_amdgcn_image_load_3d_v4f32_i32:
295 case AMDGPU::BI__builtin_amdgcn_image_load_3d_v4f16_i32:
296 case AMDGPU::BI__builtin_amdgcn_image_load_cube_v4f32_i32:
297 case AMDGPU::BI__builtin_amdgcn_image_load_cube_v4f16_i32:
298 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1d_v4f32_i32:
299 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1d_v4f16_i32:
300 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1darray_v4f32_i32:
301 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1darray_v4f16_i32:
302 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_f32_i32:
303 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_v4f32_i32:
304 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_v4f16_i32:
305 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_f32_i32:
306 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_v4f32_i32:
307 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_v4f16_i32:
308 case AMDGPU::BI__builtin_amdgcn_image_load_mip_3d_v4f32_i32:
309 case AMDGPU::BI__builtin_amdgcn_image_load_mip_3d_v4f16_i32:
310 case AMDGPU::BI__builtin_amdgcn_image_load_mip_cube_v4f32_i32:
311 case AMDGPU::BI__builtin_amdgcn_image_load_mip_cube_v4f16_i32:
312 case AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f32_f32:
313 case AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f32_f32:
314 case AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f16_f32:
315 case AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f16_f32:
316 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_f32_f32:
317 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f32_f32:
318 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f16_f32:
319 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_f32_f32:
320 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f32_f32:
321 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f16_f32:
322 case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f32_f32:
323 case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f16_f32:
324 case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f32_f32:
325 case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f16_f32:
326 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f32_f32:
327 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f16_f32:
328 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f32_f32:
329 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f16_f32:
330 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_f32_f32:
331 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f32_f32:
332 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f16_f32:
333 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_f32_f32:
334 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f32_f32:
335 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f16_f32:
336 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f32_f32:
337 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f16_f32:
338 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f32_f32:
339 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f16_f32:
340 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f32_f32:
341 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f16_f32:
342 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f32_f32:
343 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f16_f32:
344 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_f32_f32:
345 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f16_f32:
346 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f32_f32:
347 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_f32_f32:
348 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f32_f32:
349 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f16_f32:
350 case AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f32_f32:
351 case AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f16_f32:
352 case AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f32_f32:
353 case AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f16_f32:
354 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f32_f32:
355 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f16_f32:
356 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f32_f32:
357 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f16_f32:
358 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_f32_f32:
359 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f32_f32:
360 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f16_f32:
361 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_f32_f32:
362 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f32_f32:
363 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f16_f32:
364 case AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f32_f32:
365 case AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f16_f32:
366 case AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32:
367 case AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f16_f32: {
368 StringRef FeatureList(
373 << FD->getDeclName() << FeatureList;
377 unsigned ArgCount = TheCall->
getNumArgs() - 1;
382 constexpr unsigned DMaskArgNo = 0;
383 constexpr int Low = 0;
384 constexpr int High = 15;
385 if (
SemaRef.BuiltinConstantArg(TheCall, DMaskArgNo,
Result) ||
386 SemaRef.BuiltinConstantArgRange(TheCall, DMaskArgNo, Low, High,
392 int NumElementsInRetTy = 1;
394 if (
auto *VTy = dyn_cast<VectorType>(RetTy))
395 NumElementsInRetTy = VTy->getNumElements();
396 int NumActiveBitsInDMask =
398 if (NumActiveBitsInDMask > NumElementsInRetTy) {
400 diag::err_amdgcn_dmask_has_too_many_bits_set);
406 bool ExtraGatherChecks =
408 AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32 ||
410 AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f16_f32) &&
411 SemaRef.BuiltinConstantArgPower2(TheCall, 0);
413 return ExtraGatherChecks ||
415 (
SemaRef.BuiltinConstantArg(TheCall, (ArgCount - 1),
Result));
417 case AMDGPU::BI__builtin_amdgcn_image_store_1d_v4f32_i32:
418 case AMDGPU::BI__builtin_amdgcn_image_store_1darray_v4f32_i32:
419 case AMDGPU::BI__builtin_amdgcn_image_store_1d_v4f16_i32:
420 case AMDGPU::BI__builtin_amdgcn_image_store_1darray_v4f16_i32:
421 case AMDGPU::BI__builtin_amdgcn_image_store_2d_f32_i32:
422 case AMDGPU::BI__builtin_amdgcn_image_store_2d_v4f32_i32:
423 case AMDGPU::BI__builtin_amdgcn_image_store_2d_v4f16_i32:
424 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_f32_i32:
425 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_v4f32_i32:
426 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_v4f16_i32:
427 case AMDGPU::BI__builtin_amdgcn_image_store_3d_v4f32_i32:
428 case AMDGPU::BI__builtin_amdgcn_image_store_3d_v4f16_i32:
429 case AMDGPU::BI__builtin_amdgcn_image_store_cube_v4f32_i32:
430 case AMDGPU::BI__builtin_amdgcn_image_store_cube_v4f16_i32:
431 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1d_v4f32_i32:
432 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1d_v4f16_i32:
433 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1darray_v4f32_i32:
434 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1darray_v4f16_i32:
435 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_f32_i32:
436 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_v4f32_i32:
437 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_v4f16_i32:
438 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_f32_i32:
439 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_v4f32_i32:
440 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_v4f16_i32:
441 case AMDGPU::BI__builtin_amdgcn_image_store_mip_3d_v4f32_i32:
442 case AMDGPU::BI__builtin_amdgcn_image_store_mip_3d_v4f16_i32:
443 case AMDGPU::BI__builtin_amdgcn_image_store_mip_cube_v4f32_i32:
444 case AMDGPU::BI__builtin_amdgcn_image_store_mip_cube_v4f16_i32: {
445 StringRef FeatureList(
450 << FD->getDeclName() << FeatureList;
454 unsigned ArgCount = TheCall->
getNumArgs() - 1;
459 constexpr unsigned DMaskArgNo = 1;
460 return SemaRef.BuiltinConstantArgRange(TheCall, DMaskArgNo, 0,
466 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x64_iu8:
467 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x128_iu8: {
468 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x64_iu8) {
469 if (
SemaRef.checkArgCountRange(TheCall, 7, 8))
473 }
else if (BuiltinID ==
474 AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x128_iu8) {
475 if (
SemaRef.checkArgCountRange(TheCall, 8, 9))
484 llvm::APSInt ClampValue;
485 if (!
SemaRef.VerifyIntegerConstantExpression(ClampArg, &ClampValue)
494 SemaRef.CheckSingleAssignmentConstraints(BoolTy, ClampExpr);
500 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x32_bf16:
501 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x4_f32:
502 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x32_f16:
503 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x32_f16:
504 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x32_bf16:
505 case AMDGPU::BI__builtin_amdgcn_wmma_bf16f32_16x16x32_bf16:
506 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0,
508 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0,