39 const auto *FD =
SemaRef.getCurFunctionDecl(
true);
40 assert(FD &&
"AMDGPU builtins should not be used outside of a function");
41 llvm::StringMap<bool> CallerFeatureMap;
47 case AMDGPU::BI__builtin_amdgcn_raw_ptr_buffer_load_lds:
48 case AMDGPU::BI__builtin_amdgcn_raw_ptr_buffer_load_async_lds:
49 case AMDGPU::BI__builtin_amdgcn_struct_ptr_buffer_load_lds:
50 case AMDGPU::BI__builtin_amdgcn_struct_ptr_buffer_load_async_lds:
51 case AMDGPU::BI__builtin_amdgcn_load_to_lds:
52 case AMDGPU::BI__builtin_amdgcn_load_async_to_lds:
53 case AMDGPU::BI__builtin_amdgcn_global_load_lds:
54 case AMDGPU::BI__builtin_amdgcn_global_load_async_lds: {
55 constexpr const int SizeIdx = 2;
63 SemaRef.VerifyIntegerConstantExpression(ArgExpr, &Size);
64 assert(!R.isInvalid());
65 switch (Size.getSExtValue()) {
78 diag::err_amdgcn_load_lds_size_invalid_value)
81 diag::note_amdgcn_load_lds_size_valid_value)
86 case AMDGPU::BI__builtin_amdgcn_uicmp:
87 case AMDGPU::BI__builtin_amdgcn_uicmpl:
88 case AMDGPU::BI__builtin_amdgcn_sicmp:
89 case AMDGPU::BI__builtin_amdgcn_sicmpl:
90 case AMDGPU::BI__builtin_amdgcn_fcmp:
91 case AMDGPU::BI__builtin_amdgcn_fcmpf: {
99 << (IsWave32 ?
"__builtin_amdgcn_ballot_w32"
100 :
"__builtin_amdgcn_ballot_w64");
103 case AMDGPU::BI__builtin_amdgcn_get_fpenv:
104 case AMDGPU::BI__builtin_amdgcn_set_fpenv:
106 case AMDGPU::BI__builtin_amdgcn_atomic_inc32:
107 case AMDGPU::BI__builtin_amdgcn_atomic_inc64:
108 case AMDGPU::BI__builtin_amdgcn_atomic_dec32:
109 case AMDGPU::BI__builtin_amdgcn_atomic_dec64:
110 case AMDGPU::BI__builtin_amdgcn_fence: {
111 bool IsFence = BuiltinID == AMDGPU::BI__builtin_amdgcn_fence;
112 unsigned OrderIndex = IsFence ? 0 : 2;
113 unsigned ScopeIndex = IsFence ? 1 : 3;
114 Expr *OrderExpr = TheCall->
getArg(OrderIndex);
115 Expr *ScopeExpr = TheCall->
getArg(ScopeIndex);
124 return Diag(OrderExpr->
getExprLoc(), diag::err_typecheck_expect_int)
126 uint64_t Ord = OrderResult.
Val.
getInt().getZExtValue();
130 if (!llvm::isValidAtomicOrderingCABI(Ord))
132 diag::warn_atomic_op_has_invalid_memory_order)
134 switch (
static_cast<llvm::AtomicOrderingCABI
>(Ord)) {
135 case llvm::AtomicOrderingCABI::relaxed:
136 case llvm::AtomicOrderingCABI::consume:
139 diag::warn_atomic_op_has_invalid_memory_order)
142 case llvm::AtomicOrderingCABI::acquire:
143 case llvm::AtomicOrderingCABI::release:
144 case llvm::AtomicOrderingCABI::acq_rel:
145 case llvm::AtomicOrderingCABI::seq_cst:
152 return Diag(ScopeExpr->
getExprLoc(), diag::err_expr_not_string_literal)
157 case AMDGPU::BI__builtin_amdgcn_s_setreg:
158 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0,
160 case AMDGPU::BI__builtin_amdgcn_s_wait_event: {
166 "gfx12-insts", CallerFeatureMap);
171 if (((IsGFX12Plus && !
Result[1]) || (!IsGFX12Plus &&
Result[0])) ||
172 Result.getZExtValue() > 2) {
175 diag::warn_amdgpu_s_wait_event_mask_no_effect_target)
178 diag::note_amdgpu_s_wait_event_suggested_value)
184 case AMDGPU::BI__builtin_amdgcn_mov_dpp:
186 case AMDGPU::BI__builtin_amdgcn_mov_dpp8:
188 case AMDGPU::BI__builtin_amdgcn_update_dpp:
190 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f16_fp8:
191 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_bf16_fp8:
192 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f16_bf8:
193 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_bf16_bf8:
194 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f16_fp4:
195 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_bf16_fp4:
196 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f32_fp8:
197 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f32_bf8:
198 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f32_fp4:
199 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f16_fp6:
200 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_bf16_fp6:
201 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f16_bf6:
202 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_bf16_bf6:
203 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f32_fp6:
204 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f32_bf6:
205 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 15);
206 case AMDGPU::BI__builtin_amdgcn_av_load_b128:
208 case AMDGPU::BI__builtin_amdgcn_av_store_b128:
210 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_32x4B:
211 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_16x8B:
212 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_8x16B:
214 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_32x4B:
215 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_16x8B:
216 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_8x16B:
218 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b32:
219 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b64:
220 case AMDGPU::BI__builtin_amdgcn_flat_load_monitor_b128:
221 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b32:
222 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b64:
223 case AMDGPU::BI__builtin_amdgcn_global_load_monitor_b128:
225 case AMDGPU::BI__builtin_amdgcn_image_load_1d_v4f32_i32:
226 case AMDGPU::BI__builtin_amdgcn_image_load_1darray_v4f32_i32:
227 case AMDGPU::BI__builtin_amdgcn_image_load_1d_v4f16_i32:
228 case AMDGPU::BI__builtin_amdgcn_image_load_1darray_v4f16_i32:
229 case AMDGPU::BI__builtin_amdgcn_image_load_2d_f32_i32:
230 case AMDGPU::BI__builtin_amdgcn_image_load_2d_v4f32_i32:
231 case AMDGPU::BI__builtin_amdgcn_image_load_2d_v4f16_i32:
232 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_f32_i32:
233 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_v4f32_i32:
234 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_v4f16_i32:
235 case AMDGPU::BI__builtin_amdgcn_image_load_3d_v4f32_i32:
236 case AMDGPU::BI__builtin_amdgcn_image_load_3d_v4f16_i32:
237 case AMDGPU::BI__builtin_amdgcn_image_load_cube_v4f32_i32:
238 case AMDGPU::BI__builtin_amdgcn_image_load_cube_v4f16_i32:
239 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1d_v4f32_i32:
240 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1d_v4f16_i32:
241 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1darray_v4f32_i32:
242 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1darray_v4f16_i32:
243 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_f32_i32:
244 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_v4f32_i32:
245 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_v4f16_i32:
246 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_f32_i32:
247 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_v4f32_i32:
248 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_v4f16_i32:
249 case AMDGPU::BI__builtin_amdgcn_image_load_mip_3d_v4f32_i32:
250 case AMDGPU::BI__builtin_amdgcn_image_load_mip_3d_v4f16_i32:
251 case AMDGPU::BI__builtin_amdgcn_image_load_mip_cube_v4f32_i32:
252 case AMDGPU::BI__builtin_amdgcn_image_load_mip_cube_v4f16_i32:
253 case AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f32_f32:
254 case AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f32_f32:
255 case AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f16_f32:
256 case AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f16_f32:
257 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_f32_f32:
258 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f32_f32:
259 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f16_f32:
260 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_f32_f32:
261 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f32_f32:
262 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f16_f32:
263 case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f32_f32:
264 case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f16_f32:
265 case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f32_f32:
266 case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f16_f32:
267 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f32_f32:
268 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f16_f32:
269 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f32_f32:
270 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f16_f32:
271 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_f32_f32:
272 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f32_f32:
273 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f16_f32:
274 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_f32_f32:
275 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f32_f32:
276 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f16_f32:
277 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f32_f32:
278 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f16_f32:
279 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f32_f32:
280 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f16_f32:
281 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f32_f32:
282 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f16_f32:
283 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f32_f32:
284 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f16_f32:
285 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_f32_f32:
286 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f16_f32:
287 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f32_f32:
288 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_f32_f32:
289 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f32_f32:
290 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f16_f32:
291 case AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f32_f32:
292 case AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f16_f32:
293 case AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f32_f32:
294 case AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f16_f32:
295 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f32_f32:
296 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f16_f32:
297 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f32_f32:
298 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f16_f32:
299 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_f32_f32:
300 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f32_f32:
301 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f16_f32:
302 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_f32_f32:
303 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f32_f32:
304 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f16_f32:
305 case AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f32_f32:
306 case AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f16_f32:
307 case AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32:
308 case AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f16_f32: {
309 StringRef FeatureList(
314 << FD->getDeclName() << FeatureList;
318 unsigned ArgCount = TheCall->
getNumArgs() - 1;
323 constexpr unsigned DMaskArgNo = 0;
324 constexpr int Low = 0;
325 constexpr int High = 15;
326 if (
SemaRef.BuiltinConstantArg(TheCall, DMaskArgNo,
Result) ||
327 SemaRef.BuiltinConstantArgRange(TheCall, DMaskArgNo, Low, High,
333 int NumElementsInRetTy = 1;
335 if (
auto *VTy = dyn_cast<VectorType>(RetTy))
336 NumElementsInRetTy = VTy->getNumElements();
337 int NumActiveBitsInDMask =
339 if (NumActiveBitsInDMask > NumElementsInRetTy) {
341 diag::err_amdgcn_dmask_has_too_many_bits_set);
347 bool ExtraGatherChecks =
349 AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32 ||
351 AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f16_f32) &&
352 SemaRef.BuiltinConstantArgPower2(TheCall, 0);
354 return ExtraGatherChecks ||
356 (
SemaRef.BuiltinConstantArg(TheCall, (ArgCount - 1),
Result));
358 case AMDGPU::BI__builtin_amdgcn_image_store_1d_v4f32_i32:
359 case AMDGPU::BI__builtin_amdgcn_image_store_1darray_v4f32_i32:
360 case AMDGPU::BI__builtin_amdgcn_image_store_1d_v4f16_i32:
361 case AMDGPU::BI__builtin_amdgcn_image_store_1darray_v4f16_i32:
362 case AMDGPU::BI__builtin_amdgcn_image_store_2d_f32_i32:
363 case AMDGPU::BI__builtin_amdgcn_image_store_2d_v4f32_i32:
364 case AMDGPU::BI__builtin_amdgcn_image_store_2d_v4f16_i32:
365 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_f32_i32:
366 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_v4f32_i32:
367 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_v4f16_i32:
368 case AMDGPU::BI__builtin_amdgcn_image_store_3d_v4f32_i32:
369 case AMDGPU::BI__builtin_amdgcn_image_store_3d_v4f16_i32:
370 case AMDGPU::BI__builtin_amdgcn_image_store_cube_v4f32_i32:
371 case AMDGPU::BI__builtin_amdgcn_image_store_cube_v4f16_i32:
372 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1d_v4f32_i32:
373 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1d_v4f16_i32:
374 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1darray_v4f32_i32:
375 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1darray_v4f16_i32:
376 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_f32_i32:
377 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_v4f32_i32:
378 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_v4f16_i32:
379 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_f32_i32:
380 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_v4f32_i32:
381 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_v4f16_i32:
382 case AMDGPU::BI__builtin_amdgcn_image_store_mip_3d_v4f32_i32:
383 case AMDGPU::BI__builtin_amdgcn_image_store_mip_3d_v4f16_i32:
384 case AMDGPU::BI__builtin_amdgcn_image_store_mip_cube_v4f32_i32:
385 case AMDGPU::BI__builtin_amdgcn_image_store_mip_cube_v4f16_i32: {
386 StringRef FeatureList(
391 << FD->getDeclName() << FeatureList;
395 unsigned ArgCount = TheCall->
getNumArgs() - 1;
400 constexpr unsigned DMaskArgNo = 1;
401 return SemaRef.BuiltinConstantArgRange(TheCall, DMaskArgNo, 0,
407 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x64_iu8:
408 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x128_iu8: {
409 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x64_iu8) {
410 if (
SemaRef.checkArgCountRange(TheCall, 7, 8))
414 }
else if (BuiltinID ==
415 AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x128_iu8) {
416 if (
SemaRef.checkArgCountRange(TheCall, 8, 9))
425 llvm::APSInt ClampValue;
426 if (!
SemaRef.VerifyIntegerConstantExpression(ClampArg, &ClampValue)
435 SemaRef.CheckSingleAssignmentConstraints(BoolTy, ClampExpr);
441 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x32_bf16:
442 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x4_f32:
443 case AMDGPU::BI__builtin_amdgcn_wmma_f32_16x16x32_f16:
444 case AMDGPU::BI__builtin_amdgcn_wmma_f16_16x16x32_f16:
445 case AMDGPU::BI__builtin_amdgcn_wmma_bf16_16x16x32_bf16:
446 case AMDGPU::BI__builtin_amdgcn_wmma_bf16f32_16x16x32_bf16:
447 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0,
449 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0,