30 unsigned OrderIndex, ScopeIndex;
32 const auto *FD =
SemaRef.getCurFunctionDecl(
true);
33 assert(FD &&
"AMDGPU builtins should not be used outside of a function");
34 llvm::StringMap<bool> CallerFeatureMap;
40 case AMDGPU::BI__builtin_amdgcn_raw_ptr_buffer_load_lds:
41 case AMDGPU::BI__builtin_amdgcn_struct_ptr_buffer_load_lds:
42 case AMDGPU::BI__builtin_amdgcn_load_to_lds:
43 case AMDGPU::BI__builtin_amdgcn_global_load_lds: {
44 constexpr const int SizeIdx = 2;
52 SemaRef.VerifyIntegerConstantExpression(ArgExpr, &Size);
54 switch (Size.getSExtValue()) {
67 diag::err_amdgcn_load_lds_size_invalid_value)
70 diag::note_amdgcn_load_lds_size_valid_value)
75 case AMDGPU::BI__builtin_amdgcn_get_fpenv:
76 case AMDGPU::BI__builtin_amdgcn_set_fpenv:
78 case AMDGPU::BI__builtin_amdgcn_atomic_inc32:
79 case AMDGPU::BI__builtin_amdgcn_atomic_inc64:
80 case AMDGPU::BI__builtin_amdgcn_atomic_dec32:
81 case AMDGPU::BI__builtin_amdgcn_atomic_dec64:
85 case AMDGPU::BI__builtin_amdgcn_fence:
89 case AMDGPU::BI__builtin_amdgcn_s_setreg:
90 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0,
92 case AMDGPU::BI__builtin_amdgcn_mov_dpp:
94 case AMDGPU::BI__builtin_amdgcn_mov_dpp8:
96 case AMDGPU::BI__builtin_amdgcn_update_dpp:
98 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f16_fp8:
99 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_bf16_fp8:
100 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f16_bf8:
101 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_bf16_bf8:
102 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f16_fp4:
103 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_bf16_fp4:
104 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f32_fp8:
105 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f32_bf8:
106 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk8_f32_fp4:
107 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f16_fp6:
108 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_bf16_fp6:
109 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f16_bf6:
110 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_bf16_bf6:
111 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f32_fp6:
112 case AMDGPU::BI__builtin_amdgcn_cvt_scale_pk16_f32_bf6:
113 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 15);
114 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_32x4B:
115 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_16x8B:
116 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_8x16B:
118 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_32x4B:
119 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_16x8B:
120 case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_8x16B:
122 case AMDGPU::BI__builtin_amdgcn_image_load_1d_v4f32_i32:
123 case AMDGPU::BI__builtin_amdgcn_image_load_1darray_v4f32_i32:
124 case AMDGPU::BI__builtin_amdgcn_image_load_1d_v4f16_i32:
125 case AMDGPU::BI__builtin_amdgcn_image_load_1darray_v4f16_i32:
126 case AMDGPU::BI__builtin_amdgcn_image_load_2d_f32_i32:
127 case AMDGPU::BI__builtin_amdgcn_image_load_2d_v4f32_i32:
128 case AMDGPU::BI__builtin_amdgcn_image_load_2d_v4f16_i32:
129 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_f32_i32:
130 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_v4f32_i32:
131 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_v4f16_i32:
132 case AMDGPU::BI__builtin_amdgcn_image_load_3d_v4f32_i32:
133 case AMDGPU::BI__builtin_amdgcn_image_load_3d_v4f16_i32:
134 case AMDGPU::BI__builtin_amdgcn_image_load_cube_v4f32_i32:
135 case AMDGPU::BI__builtin_amdgcn_image_load_cube_v4f16_i32:
136 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1d_v4f32_i32:
137 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1d_v4f16_i32:
138 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1darray_v4f32_i32:
139 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1darray_v4f16_i32:
140 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_f32_i32:
141 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_v4f32_i32:
142 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_v4f16_i32:
143 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_f32_i32:
144 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_v4f32_i32:
145 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_v4f16_i32:
146 case AMDGPU::BI__builtin_amdgcn_image_load_mip_3d_v4f32_i32:
147 case AMDGPU::BI__builtin_amdgcn_image_load_mip_3d_v4f16_i32:
148 case AMDGPU::BI__builtin_amdgcn_image_load_mip_cube_v4f32_i32:
149 case AMDGPU::BI__builtin_amdgcn_image_load_mip_cube_v4f16_i32:
150 case AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f32_f32:
151 case AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f32_f32:
152 case AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f16_f32:
153 case AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f16_f32:
154 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_f32_f32:
155 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f32_f32:
156 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f16_f32:
157 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_f32_f32:
158 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f32_f32:
159 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f16_f32:
160 case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f32_f32:
161 case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f16_f32:
162 case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f32_f32:
163 case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f16_f32:
164 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f32_f32:
165 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f16_f32:
166 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f32_f32:
167 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f16_f32:
168 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_f32_f32:
169 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f32_f32:
170 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f16_f32:
171 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_f32_f32:
172 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f32_f32:
173 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f16_f32:
174 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f32_f32:
175 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f16_f32:
176 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f32_f32:
177 case AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f16_f32:
178 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f32_f32:
179 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f16_f32:
180 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f32_f32:
181 case AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f16_f32:
182 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_f32_f32:
183 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f16_f32:
184 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f32_f32:
185 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_f32_f32:
186 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f32_f32:
187 case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f16_f32:
188 case AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f32_f32:
189 case AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f16_f32:
190 case AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f32_f32:
191 case AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f16_f32:
192 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f32_f32:
193 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f16_f32:
194 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f32_f32:
195 case AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f16_f32:
196 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_f32_f32:
197 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f32_f32:
198 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f16_f32:
199 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_f32_f32:
200 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f32_f32:
201 case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f16_f32:
202 case AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f32_f32:
203 case AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f16_f32:
204 case AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32: {
205 StringRef FeatureList(
210 << FD->getDeclName() << FeatureList;
214 unsigned ArgCount = TheCall->
getNumArgs() - 1;
219 (
SemaRef.BuiltinConstantArg(TheCall, (ArgCount - 1),
Result));
221 case AMDGPU::BI__builtin_amdgcn_image_store_1d_v4f32_i32:
222 case AMDGPU::BI__builtin_amdgcn_image_store_1darray_v4f32_i32:
223 case AMDGPU::BI__builtin_amdgcn_image_store_1d_v4f16_i32:
224 case AMDGPU::BI__builtin_amdgcn_image_store_1darray_v4f16_i32:
225 case AMDGPU::BI__builtin_amdgcn_image_store_2d_f32_i32:
226 case AMDGPU::BI__builtin_amdgcn_image_store_2d_v4f32_i32:
227 case AMDGPU::BI__builtin_amdgcn_image_store_2d_v4f16_i32:
228 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_f32_i32:
229 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_v4f32_i32:
230 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_v4f16_i32:
231 case AMDGPU::BI__builtin_amdgcn_image_store_3d_v4f32_i32:
232 case AMDGPU::BI__builtin_amdgcn_image_store_3d_v4f16_i32:
233 case AMDGPU::BI__builtin_amdgcn_image_store_cube_v4f32_i32:
234 case AMDGPU::BI__builtin_amdgcn_image_store_cube_v4f16_i32:
235 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1d_v4f32_i32:
236 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1d_v4f16_i32:
237 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1darray_v4f32_i32:
238 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1darray_v4f16_i32:
239 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_f32_i32:
240 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_v4f32_i32:
241 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_v4f16_i32:
242 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_f32_i32:
243 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_v4f32_i32:
244 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_v4f16_i32:
245 case AMDGPU::BI__builtin_amdgcn_image_store_mip_3d_v4f32_i32:
246 case AMDGPU::BI__builtin_amdgcn_image_store_mip_3d_v4f16_i32:
247 case AMDGPU::BI__builtin_amdgcn_image_store_mip_cube_v4f32_i32:
248 case AMDGPU::BI__builtin_amdgcn_image_store_mip_cube_v4f16_i32: {
249 StringRef FeatureList(
254 << FD->getDeclName() << FeatureList;
258 unsigned ArgCount = TheCall->
getNumArgs() - 1;
263 (
SemaRef.BuiltinConstantArg(TheCall, (ArgCount - 1),
Result));
265 case AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x64_iu8:
266 case AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x128_iu8: {
267 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_wmma_i32_16x16x64_iu8) {
268 if (
SemaRef.checkArgCountRange(TheCall, 7, 8))
272 }
else if (BuiltinID ==
273 AMDGPU::BI__builtin_amdgcn_swmmac_i32_16x16x128_iu8) {
274 if (
SemaRef.checkArgCountRange(TheCall, 8, 9))
283 llvm::APSInt ClampValue;
284 if (!
SemaRef.VerifyIntegerConstantExpression(ClampArg, &ClampValue)
293 SemaRef.CheckSingleAssignmentConstraints(BoolTy, ClampExpr);
304 auto ArgExpr = Arg.
get();
308 return Diag(ArgExpr->getExprLoc(), diag::err_typecheck_expect_int)
309 << ArgExpr->getType();
310 auto Ord = ArgResult.
Val.
getInt().getZExtValue();
314 if (!llvm::isValidAtomicOrderingCABI(Ord))
315 return Diag(ArgExpr->getBeginLoc(),
316 diag::warn_atomic_op_has_invalid_memory_order)
317 << 0 << ArgExpr->getSourceRange();
318 switch (
static_cast<llvm::AtomicOrderingCABI
>(Ord)) {
319 case llvm::AtomicOrderingCABI::relaxed:
320 case llvm::AtomicOrderingCABI::consume:
321 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_fence)
322 return Diag(ArgExpr->getBeginLoc(),
323 diag::warn_atomic_op_has_invalid_memory_order)
324 << 0 << ArgExpr->getSourceRange();
326 case llvm::AtomicOrderingCABI::acquire:
327 case llvm::AtomicOrderingCABI::release:
328 case llvm::AtomicOrderingCABI::acq_rel:
329 case llvm::AtomicOrderingCABI::seq_cst:
333 Arg = TheCall->
getArg(ScopeIndex);
337 if (!ArgExpr->EvaluateAsConstantExpr(ArgResult1,
getASTContext()))
338 return Diag(ArgExpr->getExprLoc(), diag::err_expr_not_string_literal)
339 << ArgExpr->getType();