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::BIceil:
215 case Builtin::BIceilf:
216 case Builtin::BIceill:
217 case Builtin::BI__builtin_ceil:
218 case Builtin::BI__builtin_ceilf:
219 case Builtin::BI__builtin_ceilf16:
220 case Builtin::BI__builtin_ceill:
221 case Builtin::BI__builtin_ceilf128:
226 case Builtin::BIexpf:
227 case Builtin::BIexpl:
228 case Builtin::BI__builtin_exp:
229 case Builtin::BI__builtin_expf:
230 case Builtin::BI__builtin_expf16:
231 case Builtin::BI__builtin_expl:
232 case Builtin::BI__builtin_expf128:
236 case Builtin::BIfabs:
237 case Builtin::BIfabsf:
238 case Builtin::BIfabsl:
239 case Builtin::BI__builtin_fabs:
240 case Builtin::BI__builtin_fabsf:
241 case Builtin::BI__builtin_fabsf16:
242 case Builtin::BI__builtin_fabsl:
243 case Builtin::BI__builtin_fabsf128:
246 case Builtin::BI__assume:
247 case Builtin::BI__builtin_assume: {
252 cir::AssumeOp::create(builder, loc, argValue);
256 case Builtin::BI__builtin_assume_separate_storage: {
259 cir::AssumeSepStorageOp::create(builder, loc, value0, value1);
263 case Builtin::BI__builtin_assume_aligned: {
266 mlir::Value offsetValue =
269 std::optional<llvm::APSInt> alignment =
271 assert(alignment.has_value() &&
272 "the second argument to __builtin_assume_aligned must be an "
273 "integral constant expression");
277 alignment->getSExtValue(), offsetValue);
281 case Builtin::BI__builtin_complex: {
284 mlir::Value complex = builder.createComplexCreate(loc, real, imag);
288 case Builtin::BI__builtin_creal:
289 case Builtin::BI__builtin_crealf:
290 case Builtin::BI__builtin_creall:
291 case Builtin::BIcreal:
292 case Builtin::BIcrealf:
293 case Builtin::BIcreall: {
295 mlir::Value real = builder.createComplexReal(loc, complex);
299 case Builtin::BI__builtin_cimag:
300 case Builtin::BI__builtin_cimagf:
301 case Builtin::BI__builtin_cimagl:
302 case Builtin::BIcimag:
303 case Builtin::BIcimagf:
304 case Builtin::BIcimagl: {
306 mlir::Value imag = builder.createComplexImag(loc, complex);
310 case Builtin::BI__builtin_conj:
311 case Builtin::BI__builtin_conjf:
312 case Builtin::BI__builtin_conjl:
313 case Builtin::BIconj:
314 case Builtin::BIconjf:
315 case Builtin::BIconjl: {
318 cir::UnaryOpKind::Not, complex);
322 case Builtin::BI__builtin_clrsb:
323 case Builtin::BI__builtin_clrsbl:
324 case Builtin::BI__builtin_clrsbll:
327 case Builtin::BI__builtin_ctzs:
328 case Builtin::BI__builtin_ctz:
329 case Builtin::BI__builtin_ctzl:
330 case Builtin::BI__builtin_ctzll:
331 case Builtin::BI__builtin_ctzg:
335 case Builtin::BI__builtin_clzs:
336 case Builtin::BI__builtin_clz:
337 case Builtin::BI__builtin_clzl:
338 case Builtin::BI__builtin_clzll:
339 case Builtin::BI__builtin_clzg:
343 case Builtin::BI__builtin_ffs:
344 case Builtin::BI__builtin_ffsl:
345 case Builtin::BI__builtin_ffsll:
348 case Builtin::BI__builtin_parity:
349 case Builtin::BI__builtin_parityl:
350 case Builtin::BI__builtin_parityll:
353 case Builtin::BI__lzcnt16:
354 case Builtin::BI__lzcnt:
355 case Builtin::BI__lzcnt64:
359 case Builtin::BI__popcnt16:
360 case Builtin::BI__popcnt:
361 case Builtin::BI__popcnt64:
362 case Builtin::BI__builtin_popcount:
363 case Builtin::BI__builtin_popcountl:
364 case Builtin::BI__builtin_popcountll:
365 case Builtin::BI__builtin_popcountg:
368 case Builtin::BI__builtin_expect:
369 case Builtin::BI__builtin_expect_with_probability: {
373 mlir::FloatAttr probAttr;
374 if (builtinIDIfNoAsmLabel == Builtin::BI__builtin_expect_with_probability) {
375 llvm::APFloat probability(0.0);
377 [[maybe_unused]]
bool evalSucceeded =
379 assert(evalSucceeded &&
380 "probability should be able to evaluate as float");
381 bool loseInfo =
false;
382 probability.convert(llvm::APFloat::IEEEdouble(),
383 llvm::RoundingMode::Dynamic, &loseInfo);
384 probAttr = mlir::FloatAttr::get(mlir::Float64Type::get(&
getMLIRContext()),
388 auto result = cir::ExpectOp::create(builder, loc, argValue.getType(),
389 argValue, expectedValue, probAttr);
393 case Builtin::BI__builtin_bswap16:
394 case Builtin::BI__builtin_bswap32:
395 case Builtin::BI__builtin_bswap64:
396 case Builtin::BI_byteswap_ushort:
397 case Builtin::BI_byteswap_ulong:
398 case Builtin::BI_byteswap_uint64: {
400 return RValue::get(cir::ByteSwapOp::create(builder, loc, arg));
403 case Builtin::BI__builtin_bitreverse8:
404 case Builtin::BI__builtin_bitreverse16:
405 case Builtin::BI__builtin_bitreverse32:
406 case Builtin::BI__builtin_bitreverse64: {
408 return RValue::get(cir::BitReverseOp::create(builder, loc, arg));
411 case Builtin::BI__builtin_rotateleft8:
412 case Builtin::BI__builtin_rotateleft16:
413 case Builtin::BI__builtin_rotateleft32:
414 case Builtin::BI__builtin_rotateleft64:
417 case Builtin::BI__builtin_rotateright8:
418 case Builtin::BI__builtin_rotateright16:
419 case Builtin::BI__builtin_rotateright32:
420 case Builtin::BI__builtin_rotateright64:
423 case Builtin::BI__builtin_return_address:
424 case Builtin::BI__builtin_frame_address: {
427 if (builtinID == Builtin::BI__builtin_return_address) {
430 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));
434 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));
437 case Builtin::BI__builtin_trap:
441 case Builtin::BI__builtin_unreachable:
445 case Builtin::BI__builtin_elementwise_acos:
447 case Builtin::BI__builtin_elementwise_asin:
449 case Builtin::BI__builtin_elementwise_atan:
451 case Builtin::BI__builtin_elementwise_cos:
453 case Builtin::BI__builtin_coro_id:
454 case Builtin::BI__builtin_coro_promise:
455 case Builtin::BI__builtin_coro_resume:
456 case Builtin::BI__builtin_coro_noop:
457 case Builtin::BI__builtin_coro_destroy:
458 case Builtin::BI__builtin_coro_done:
459 case Builtin::BI__builtin_coro_alloc:
460 case Builtin::BI__builtin_coro_begin:
461 case Builtin::BI__builtin_coro_end:
462 case Builtin::BI__builtin_coro_suspend:
463 case Builtin::BI__builtin_coro_align:
467 case Builtin::BI__builtin_coro_frame: {
472 case Builtin::BI__builtin_coro_free:
473 case Builtin::BI__builtin_coro_size: {
475 mlir::Type ty =
cgm.getTypes().getFunctionType(
476 cgm.getTypes().arrangeGlobalDeclaration(gd));
479 cgm.getOrCreateCIRFunction(nd->getName(), ty, gd,
false);
480 fnOp.setBuiltin(
true);
484 case Builtin::BI__builtin_prefetch: {
485 auto evaluateOperandAsInt = [&](
const Expr *arg) {
487 [[maybe_unused]]
bool evalSucceed =
488 arg->EvaluateAsInt(res,
cgm.getASTContext());
489 assert(evalSucceed &&
"expression should be able to evaluate as int");
493 bool isWrite =
false;
495 isWrite = evaluateOperandAsInt(e->
getArg(1));
499 locality = evaluateOperandAsInt(e->
getArg(2));
502 cir::PrefetchOp::create(builder, loc, address, locality, isWrite);
510 if (
getContext().BuiltinInfo.isLibFunction(builtinID))
512 cgm.getBuiltinLibFunction(fd, builtinID));
528 if (mlir::isa<cir::VoidType>(v.getType()))
535 llvm_unreachable(
"No current target builtin returns complex");
537 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
541 std::string(
"unimplemented builtin call: ") +