127 unsigned builtinIDIfNoAsmLabel = fd->
hasAttr<AsmLabelAttr>() ? 0 : builtinID;
132 switch (builtinIDIfNoAsmLabel) {
137 case Builtin::BI__builtin_stdarg_start:
138 case Builtin::BI__builtin_va_start:
139 case Builtin::BI__va_start: {
140 mlir::Value vaList = builtinID == Builtin::BI__va_start
148 case Builtin::BI__builtin_va_end:
152 case Builtin::BIalloca:
153 case Builtin::BI_alloca:
154 case Builtin::BI__builtin_alloca_uninitialized:
155 case Builtin::BI__builtin_alloca: {
161 const CharUnits suitableAlignmentInBytes =
170 mlir::Value allocaAddr = builder.createAlloca(
172 builder.getUInt8Ty(),
"bi_alloca", suitableAlignmentInBytes, size);
175 if (builtinID != Builtin::BI__builtin_alloca_uninitialized) {
186 cgm.errorNYI(
"trivial auto var init");
200 builder.createBitcast(allocaAddr, builder.getVoidPtrTy()));
204 case Builtin::BIcosf:
205 case Builtin::BIcosl:
206 case Builtin::BI__builtin_cos:
207 case Builtin::BI__builtin_cosf:
208 case Builtin::BI__builtin_cosf16:
209 case Builtin::BI__builtin_cosl:
210 case Builtin::BI__builtin_cosf128:
214 case Builtin::BIfabs:
215 case Builtin::BIfabsf:
216 case Builtin::BIfabsl:
217 case Builtin::BI__builtin_fabs:
218 case Builtin::BI__builtin_fabsf:
219 case Builtin::BI__builtin_fabsf16:
220 case Builtin::BI__builtin_fabsl:
221 case Builtin::BI__builtin_fabsf128:
224 case Builtin::BI__assume:
225 case Builtin::BI__builtin_assume: {
230 builder.create<cir::AssumeOp>(loc, argValue);
234 case Builtin::BI__builtin_assume_separate_storage: {
237 builder.create<cir::AssumeSepStorageOp>(loc, value0, value1);
241 case Builtin::BI__builtin_assume_aligned: {
244 mlir::Value offsetValue =
247 std::optional<llvm::APSInt> alignment =
249 assert(alignment.has_value() &&
250 "the second argument to __builtin_assume_aligned must be an "
251 "integral constant expression");
255 alignment->getSExtValue(), offsetValue);
259 case Builtin::BI__builtin_complex: {
262 mlir::Value complex = builder.createComplexCreate(loc, real, imag);
266 case Builtin::BI__builtin_creal:
267 case Builtin::BI__builtin_crealf:
268 case Builtin::BI__builtin_creall:
269 case Builtin::BIcreal:
270 case Builtin::BIcrealf:
271 case Builtin::BIcreall: {
273 mlir::Value real = builder.createComplexReal(loc, complex);
277 case Builtin::BI__builtin_cimag:
278 case Builtin::BI__builtin_cimagf:
279 case Builtin::BI__builtin_cimagl:
280 case Builtin::BIcimag:
281 case Builtin::BIcimagf:
282 case Builtin::BIcimagl: {
284 mlir::Value imag = builder.createComplexImag(loc, complex);
288 case Builtin::BI__builtin_conj:
289 case Builtin::BI__builtin_conjf:
290 case Builtin::BI__builtin_conjl:
291 case Builtin::BIconj:
292 case Builtin::BIconjf:
293 case Builtin::BIconjl: {
296 cir::UnaryOpKind::Not, complex);
300 case Builtin::BI__builtin_clrsb:
301 case Builtin::BI__builtin_clrsbl:
302 case Builtin::BI__builtin_clrsbll:
305 case Builtin::BI__builtin_ctzs:
306 case Builtin::BI__builtin_ctz:
307 case Builtin::BI__builtin_ctzl:
308 case Builtin::BI__builtin_ctzll:
309 case Builtin::BI__builtin_ctzg:
313 case Builtin::BI__builtin_clzs:
314 case Builtin::BI__builtin_clz:
315 case Builtin::BI__builtin_clzl:
316 case Builtin::BI__builtin_clzll:
317 case Builtin::BI__builtin_clzg:
321 case Builtin::BI__builtin_ffs:
322 case Builtin::BI__builtin_ffsl:
323 case Builtin::BI__builtin_ffsll:
326 case Builtin::BI__builtin_parity:
327 case Builtin::BI__builtin_parityl:
328 case Builtin::BI__builtin_parityll:
331 case Builtin::BI__lzcnt16:
332 case Builtin::BI__lzcnt:
333 case Builtin::BI__lzcnt64:
337 case Builtin::BI__popcnt16:
338 case Builtin::BI__popcnt:
339 case Builtin::BI__popcnt64:
340 case Builtin::BI__builtin_popcount:
341 case Builtin::BI__builtin_popcountl:
342 case Builtin::BI__builtin_popcountll:
343 case Builtin::BI__builtin_popcountg:
346 case Builtin::BI__builtin_expect:
347 case Builtin::BI__builtin_expect_with_probability: {
351 mlir::FloatAttr probAttr;
352 if (builtinIDIfNoAsmLabel == Builtin::BI__builtin_expect_with_probability) {
353 llvm::APFloat probability(0.0);
355 [[maybe_unused]]
bool evalSucceeded =
357 assert(evalSucceeded &&
358 "probability should be able to evaluate as float");
359 bool loseInfo =
false;
360 probability.convert(llvm::APFloat::IEEEdouble(),
361 llvm::RoundingMode::Dynamic, &loseInfo);
362 probAttr = mlir::FloatAttr::get(mlir::Float64Type::get(&
getMLIRContext()),
366 auto result = builder.create<cir::ExpectOp>(
367 loc, argValue.getType(), argValue, expectedValue, probAttr);
371 case Builtin::BI__builtin_bswap16:
372 case Builtin::BI__builtin_bswap32:
373 case Builtin::BI__builtin_bswap64:
374 case Builtin::BI_byteswap_ushort:
375 case Builtin::BI_byteswap_ulong:
376 case Builtin::BI_byteswap_uint64: {
378 return RValue::get(builder.create<cir::ByteSwapOp>(loc, arg));
381 case Builtin::BI__builtin_bitreverse8:
382 case Builtin::BI__builtin_bitreverse16:
383 case Builtin::BI__builtin_bitreverse32:
384 case Builtin::BI__builtin_bitreverse64: {
386 return RValue::get(builder.create<cir::BitReverseOp>(loc, arg));
389 case Builtin::BI__builtin_rotateleft8:
390 case Builtin::BI__builtin_rotateleft16:
391 case Builtin::BI__builtin_rotateleft32:
392 case Builtin::BI__builtin_rotateleft64:
395 case Builtin::BI__builtin_rotateright8:
396 case Builtin::BI__builtin_rotateright16:
397 case Builtin::BI__builtin_rotateright32:
398 case Builtin::BI__builtin_rotateright64:
401 case Builtin::BI__builtin_return_address:
402 case Builtin::BI__builtin_frame_address: {
405 if (builtinID == Builtin::BI__builtin_return_address) {
408 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));
412 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));
415 case Builtin::BI__builtin_trap:
419 case Builtin::BI__builtin_unreachable:
423 case Builtin::BI__builtin_elementwise_acos:
425 case Builtin::BI__builtin_elementwise_asin:
427 case Builtin::BI__builtin_elementwise_atan:
429 case Builtin::BI__builtin_elementwise_cos:
436 if (
getContext().BuiltinInfo.isLibFunction(builtinID))
438 cgm.getBuiltinLibFunction(fd, builtinID));