269 unsigned builtinIDIfNoAsmLabel = fd->
hasAttr<AsmLabelAttr>() ? 0 : builtinID;
274 switch (builtinIDIfNoAsmLabel) {
279 case Builtin::BI__builtin_stdarg_start:
280 case Builtin::BI__builtin_va_start:
281 case Builtin::BI__va_start: {
282 mlir::Value vaList = builtinID == Builtin::BI__va_start
290 case Builtin::BI__builtin_va_end:
293 case Builtin::BI__builtin_va_copy: {
296 cir::VACopyOp::create(builder, dstPtr.getLoc(), dstPtr, srcPtr);
300 case Builtin::BIcosf:
301 case Builtin::BIcosl:
302 case Builtin::BI__builtin_cos:
303 case Builtin::BI__builtin_cosf:
304 case Builtin::BI__builtin_cosf16:
305 case Builtin::BI__builtin_cosl:
306 case Builtin::BI__builtin_cosf128:
310 case Builtin::BIceil:
311 case Builtin::BIceilf:
312 case Builtin::BIceill:
313 case Builtin::BI__builtin_ceil:
314 case Builtin::BI__builtin_ceilf:
315 case Builtin::BI__builtin_ceilf16:
316 case Builtin::BI__builtin_ceill:
317 case Builtin::BI__builtin_ceilf128:
322 case Builtin::BIexpf:
323 case Builtin::BIexpl:
324 case Builtin::BI__builtin_exp:
325 case Builtin::BI__builtin_expf:
326 case Builtin::BI__builtin_expf16:
327 case Builtin::BI__builtin_expl:
328 case Builtin::BI__builtin_expf128:
332 case Builtin::BIexp2:
333 case Builtin::BIexp2f:
334 case Builtin::BIexp2l:
335 case Builtin::BI__builtin_exp2:
336 case Builtin::BI__builtin_exp2f:
337 case Builtin::BI__builtin_exp2f16:
338 case Builtin::BI__builtin_exp2l:
339 case Builtin::BI__builtin_exp2f128:
343 case Builtin::BIfabs:
344 case Builtin::BIfabsf:
345 case Builtin::BIfabsl:
346 case Builtin::BI__builtin_fabs:
347 case Builtin::BI__builtin_fabsf:
348 case Builtin::BI__builtin_fabsf16:
349 case Builtin::BI__builtin_fabsl:
350 case Builtin::BI__builtin_fabsf128:
353 case Builtin::BIfloor:
354 case Builtin::BIfloorf:
355 case Builtin::BIfloorl:
356 case Builtin::BI__builtin_floor:
357 case Builtin::BI__builtin_floorf:
358 case Builtin::BI__builtin_floorf16:
359 case Builtin::BI__builtin_floorl:
360 case Builtin::BI__builtin_floorf128:
363 case Builtin::BI__assume:
364 case Builtin::BI__builtin_assume: {
369 cir::AssumeOp::create(builder, loc, argValue);
373 case Builtin::BI__builtin_assume_separate_storage: {
376 cir::AssumeSepStorageOp::create(builder, loc, value0, value1);
380 case Builtin::BI__builtin_assume_aligned: {
383 mlir::Value offsetValue =
386 std::optional<llvm::APSInt> alignment =
388 assert(alignment.has_value() &&
389 "the second argument to __builtin_assume_aligned must be an "
390 "integral constant expression");
394 alignment->getSExtValue(), offsetValue);
398 case Builtin::BI__builtin_complex: {
401 mlir::Value complex = builder.createComplexCreate(loc, real, imag);
405 case Builtin::BI__builtin_creal:
406 case Builtin::BI__builtin_crealf:
407 case Builtin::BI__builtin_creall:
408 case Builtin::BIcreal:
409 case Builtin::BIcrealf:
410 case Builtin::BIcreall: {
412 mlir::Value real = builder.createComplexReal(loc, complex);
416 case Builtin::BI__builtin_cimag:
417 case Builtin::BI__builtin_cimagf:
418 case Builtin::BI__builtin_cimagl:
419 case Builtin::BIcimag:
420 case Builtin::BIcimagf:
421 case Builtin::BIcimagl: {
423 mlir::Value imag = builder.createComplexImag(loc, complex);
427 case Builtin::BI__builtin_conj:
428 case Builtin::BI__builtin_conjf:
429 case Builtin::BI__builtin_conjl:
430 case Builtin::BIconj:
431 case Builtin::BIconjf:
432 case Builtin::BIconjl: {
435 cir::UnaryOpKind::Not, complex);
439 case Builtin::BI__builtin_clrsb:
440 case Builtin::BI__builtin_clrsbl:
441 case Builtin::BI__builtin_clrsbll:
444 case Builtin::BI__builtin_ctzs:
445 case Builtin::BI__builtin_ctz:
446 case Builtin::BI__builtin_ctzl:
447 case Builtin::BI__builtin_ctzll:
448 case Builtin::BI__builtin_ctzg:
452 case Builtin::BI__builtin_clzs:
453 case Builtin::BI__builtin_clz:
454 case Builtin::BI__builtin_clzl:
455 case Builtin::BI__builtin_clzll:
456 case Builtin::BI__builtin_clzg:
460 case Builtin::BI__builtin_ffs:
461 case Builtin::BI__builtin_ffsl:
462 case Builtin::BI__builtin_ffsll:
465 case Builtin::BI__builtin_parity:
466 case Builtin::BI__builtin_parityl:
467 case Builtin::BI__builtin_parityll:
470 case Builtin::BI__lzcnt16:
471 case Builtin::BI__lzcnt:
472 case Builtin::BI__lzcnt64:
476 case Builtin::BI__popcnt16:
477 case Builtin::BI__popcnt:
478 case Builtin::BI__popcnt64:
479 case Builtin::BI__builtin_popcount:
480 case Builtin::BI__builtin_popcountl:
481 case Builtin::BI__builtin_popcountll:
482 case Builtin::BI__builtin_popcountg:
485 case Builtin::BI__builtin_expect:
486 case Builtin::BI__builtin_expect_with_probability: {
490 mlir::FloatAttr probAttr;
491 if (builtinIDIfNoAsmLabel == Builtin::BI__builtin_expect_with_probability) {
492 llvm::APFloat probability(0.0);
494 [[maybe_unused]]
bool evalSucceeded =
496 assert(evalSucceeded &&
497 "probability should be able to evaluate as float");
498 bool loseInfo =
false;
499 probability.convert(llvm::APFloat::IEEEdouble(),
500 llvm::RoundingMode::Dynamic, &loseInfo);
501 probAttr = mlir::FloatAttr::get(mlir::Float64Type::get(&
getMLIRContext()),
505 auto result = cir::ExpectOp::create(builder, loc, argValue.getType(),
506 argValue, expectedValue, probAttr);
510 case Builtin::BI__builtin_bswap16:
511 case Builtin::BI__builtin_bswap32:
512 case Builtin::BI__builtin_bswap64:
513 case Builtin::BI_byteswap_ushort:
514 case Builtin::BI_byteswap_ulong:
515 case Builtin::BI_byteswap_uint64: {
517 return RValue::get(cir::ByteSwapOp::create(builder, loc, arg));
520 case Builtin::BI__builtin_bitreverse8:
521 case Builtin::BI__builtin_bitreverse16:
522 case Builtin::BI__builtin_bitreverse32:
523 case Builtin::BI__builtin_bitreverse64: {
525 return RValue::get(cir::BitReverseOp::create(builder, loc, arg));
528 case Builtin::BI__builtin_rotateleft8:
529 case Builtin::BI__builtin_rotateleft16:
530 case Builtin::BI__builtin_rotateleft32:
531 case Builtin::BI__builtin_rotateleft64:
534 case Builtin::BI__builtin_rotateright8:
535 case Builtin::BI__builtin_rotateright16:
536 case Builtin::BI__builtin_rotateright32:
537 case Builtin::BI__builtin_rotateright64:
540 case Builtin::BI__builtin_coro_id:
541 case Builtin::BI__builtin_coro_promise:
542 case Builtin::BI__builtin_coro_resume:
543 case Builtin::BI__builtin_coro_noop:
544 case Builtin::BI__builtin_coro_destroy:
545 case Builtin::BI__builtin_coro_done:
546 case Builtin::BI__builtin_coro_alloc:
547 case Builtin::BI__builtin_coro_begin:
548 case Builtin::BI__builtin_coro_end:
549 case Builtin::BI__builtin_coro_suspend:
550 case Builtin::BI__builtin_coro_align:
554 case Builtin::BI__builtin_coro_frame: {
557 case Builtin::BI__builtin_coro_free:
558 case Builtin::BI__builtin_coro_size: {
560 mlir::Type ty =
cgm.getTypes().getFunctionType(
561 cgm.getTypes().arrangeGlobalDeclaration(gd));
564 cgm.getOrCreateCIRFunction(nd->getName(), ty, gd,
false);
565 fnOp.setBuiltin(
true);
570 case Builtin::BI__builtin_constant_p: {
583 mlir::cast<cir::IntType>(resultType), 0));
591 mlir::cast<cir::IntType>(resultType), 0));
597 "__builtin_constant_p: Obj-C object pointer");
600 argValue = builder.createBitcast(argValue,
convertType(argType));
602 mlir::Value result = cir::IsConstantOp::create(
605 result = builder.createBoolToInt(result, resultType);
608 case Builtin::BI__builtin_dynamic_object_size:
609 case Builtin::BI__builtin_object_size: {
616 bool isDynamic = builtinID == Builtin::BI__builtin_dynamic_object_size;
618 nullptr, isDynamic));
621 case Builtin::BI__builtin_prefetch: {
622 auto evaluateOperandAsInt = [&](
const Expr *arg) {
624 [[maybe_unused]]
bool evalSucceed =
625 arg->EvaluateAsInt(res,
cgm.getASTContext());
626 assert(evalSucceed &&
"expression should be able to evaluate as int");
630 bool isWrite =
false;
632 isWrite = evaluateOperandAsInt(e->
getArg(1));
636 locality = evaluateOperandAsInt(e->
getArg(2));
639 cir::PrefetchOp::create(builder, loc, address, locality, isWrite);
642 case Builtin::BI__builtin_readcyclecounter:
643 case Builtin::BI__builtin_readsteadycounter:
644 case Builtin::BI__builtin___clear_cache:
646 case Builtin::BI__builtin_trap:
649 case Builtin::BI__builtin_verbose_trap:
650 case Builtin::BI__debugbreak:
652 case Builtin::BI__builtin_unreachable:
655 case Builtin::BI__builtin_powi:
656 case Builtin::BI__builtin_powif:
657 case Builtin::BI__builtin_powil:
658 case Builtin::BI__builtin_frexpl:
659 case Builtin::BI__builtin_frexp:
660 case Builtin::BI__builtin_frexpf:
661 case Builtin::BI__builtin_frexpf128:
662 case Builtin::BI__builtin_frexpf16:
663 case Builtin::BImodf:
664 case Builtin::BImodff:
665 case Builtin::BImodfl:
666 case Builtin::BI__builtin_modf:
667 case Builtin::BI__builtin_modff:
668 case Builtin::BI__builtin_modfl:
669 case Builtin::BI__builtin_isgreater:
670 case Builtin::BI__builtin_isgreaterequal:
671 case Builtin::BI__builtin_isless:
672 case Builtin::BI__builtin_islessequal:
673 case Builtin::BI__builtin_islessgreater:
674 case Builtin::BI__builtin_isunordered:
681 case Builtin::BI__builtin_isnan: {
687 builder.createIsFPClass(loc, v, cir::FPClassTest::Nan),
691 case Builtin::BI__builtin_issignaling: {
696 builder.createIsFPClass(loc, v, cir::FPClassTest::SignalingNaN),
700 case Builtin::BI__builtin_isinf: {
706 builder.createIsFPClass(loc, v, cir::FPClassTest::Infinity),
709 case Builtin::BIfinite:
710 case Builtin::BI__finite:
711 case Builtin::BIfinitef:
712 case Builtin::BI__finitef:
713 case Builtin::BIfinitel:
714 case Builtin::BI__finitel:
715 case Builtin::BI__builtin_isfinite: {
721 builder.createIsFPClass(loc, v, cir::FPClassTest::Finite),
725 case Builtin::BI__builtin_isnormal: {
730 builder.createIsFPClass(loc, v, cir::FPClassTest::Normal),
734 case Builtin::BI__builtin_issubnormal: {
739 builder.createIsFPClass(loc, v, cir::FPClassTest::Subnormal),
743 case Builtin::BI__builtin_iszero: {
748 builder.createIsFPClass(loc, v, cir::FPClassTest::Zero),
751 case Builtin::BI__builtin_isfpclass: {
758 uint64_t test = result.
Val.
getInt().getLimitedValue();
762 builder.createIsFPClass(loc, v, cir::FPClassTest(test)),
765 case Builtin::BI__builtin_nondeterministic_value:
766 case Builtin::BI__builtin_elementwise_abs:
768 case Builtin::BI__builtin_elementwise_acos:
770 case Builtin::BI__builtin_elementwise_asin:
772 case Builtin::BI__builtin_elementwise_atan:
774 case Builtin::BI__builtin_elementwise_atan2:
775 case Builtin::BI__builtin_elementwise_ceil:
776 case Builtin::BI__builtin_elementwise_exp:
777 case Builtin::BI__builtin_elementwise_exp2:
778 case Builtin::BI__builtin_elementwise_exp10:
779 case Builtin::BI__builtin_elementwise_ldexp:
780 case Builtin::BI__builtin_elementwise_log:
781 case Builtin::BI__builtin_elementwise_log2:
782 case Builtin::BI__builtin_elementwise_log10:
783 case Builtin::BI__builtin_elementwise_pow:
784 case Builtin::BI__builtin_elementwise_bitreverse:
786 case Builtin::BI__builtin_elementwise_cos:
788 case Builtin::BI__builtin_elementwise_cosh:
789 case Builtin::BI__builtin_elementwise_floor:
790 case Builtin::BI__builtin_elementwise_popcount:
791 case Builtin::BI__builtin_elementwise_roundeven:
792 case Builtin::BI__builtin_elementwise_round:
793 case Builtin::BI__builtin_elementwise_rint:
794 case Builtin::BI__builtin_elementwise_nearbyint:
795 case Builtin::BI__builtin_elementwise_sin:
796 case Builtin::BI__builtin_elementwise_sinh:
797 case Builtin::BI__builtin_elementwise_tan:
798 case Builtin::BI__builtin_elementwise_tanh:
799 case Builtin::BI__builtin_elementwise_trunc:
800 case Builtin::BI__builtin_elementwise_canonicalize:
801 case Builtin::BI__builtin_elementwise_copysign:
802 case Builtin::BI__builtin_elementwise_fma:
803 case Builtin::BI__builtin_elementwise_fshl:
804 case Builtin::BI__builtin_elementwise_fshr:
805 case Builtin::BI__builtin_elementwise_add_sat:
806 case Builtin::BI__builtin_elementwise_sub_sat:
807 case Builtin::BI__builtin_elementwise_max:
808 case Builtin::BI__builtin_elementwise_min:
809 case Builtin::BI__builtin_elementwise_maxnum:
810 case Builtin::BI__builtin_elementwise_minnum:
811 case Builtin::BI__builtin_elementwise_maximum:
812 case Builtin::BI__builtin_elementwise_minimum:
813 case Builtin::BI__builtin_elementwise_maximumnum:
814 case Builtin::BI__builtin_elementwise_minimumnum:
815 case Builtin::BI__builtin_reduce_max:
816 case Builtin::BI__builtin_reduce_min:
817 case Builtin::BI__builtin_reduce_add:
818 case Builtin::BI__builtin_reduce_mul:
819 case Builtin::BI__builtin_reduce_xor:
820 case Builtin::BI__builtin_reduce_or:
821 case Builtin::BI__builtin_reduce_and:
822 case Builtin::BI__builtin_reduce_maximum:
823 case Builtin::BI__builtin_reduce_minimum:
824 case Builtin::BI__builtin_matrix_transpose:
825 case Builtin::BI__builtin_matrix_column_major_load:
826 case Builtin::BI__builtin_matrix_column_major_store:
827 case Builtin::BI__builtin_masked_load:
828 case Builtin::BI__builtin_masked_expand_load:
829 case Builtin::BI__builtin_masked_gather:
830 case Builtin::BI__builtin_masked_store:
831 case Builtin::BI__builtin_masked_compress_store:
832 case Builtin::BI__builtin_masked_scatter:
833 case Builtin::BI__builtin_isinf_sign:
834 case Builtin::BI__builtin_flt_rounds:
835 case Builtin::BI__builtin_set_flt_rounds:
836 case Builtin::BI__builtin_fpclassify:
838 case Builtin::BIalloca:
839 case Builtin::BI_alloca:
840 case Builtin::BI__builtin_alloca_uninitialized:
841 case Builtin::BI__builtin_alloca:
843 case Builtin::BI__builtin_alloca_with_align_uninitialized:
844 case Builtin::BI__builtin_alloca_with_align:
845 case Builtin::BI__builtin_infer_alloc_token:
846 case Builtin::BIbzero:
847 case Builtin::BI__builtin_bzero:
848 case Builtin::BIbcopy:
849 case Builtin::BI__builtin_bcopy:
851 case Builtin::BImemcpy:
852 case Builtin::BI__builtin_memcpy:
853 case Builtin::BImempcpy:
854 case Builtin::BI__builtin_mempcpy:
855 case Builtin::BI__builtin_memcpy_inline:
856 case Builtin::BI__builtin_char_memchr:
857 case Builtin::BI__builtin___memcpy_chk:
858 case Builtin::BI__builtin_objc_memmove_collectable:
859 case Builtin::BI__builtin___memmove_chk:
860 case Builtin::BI__builtin_trivially_relocate:
861 case Builtin::BImemmove:
862 case Builtin::BI__builtin_memmove:
863 case Builtin::BImemset:
864 case Builtin::BI__builtin_memset:
865 case Builtin::BI__builtin_memset_inline:
866 case Builtin::BI__builtin___memset_chk:
867 case Builtin::BI__builtin_wmemchr:
868 case Builtin::BI__builtin_wmemcmp:
870 case Builtin::BI__builtin_dwarf_cfa:
872 case Builtin::BI__builtin_return_address:
873 case Builtin::BI_ReturnAddress:
874 case Builtin::BI__builtin_frame_address: {
877 if (builtinID == Builtin::BI__builtin_return_address) {
880 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));
884 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));
886 case Builtin::BI__builtin_extract_return_addr:
887 case Builtin::BI__builtin_frob_return_addr:
888 case Builtin::BI__builtin_dwarf_sp_column:
889 case Builtin::BI__builtin_init_dwarf_reg_size_table:
890 case Builtin::BI__builtin_eh_return:
891 case Builtin::BI__builtin_unwind_init:
892 case Builtin::BI__builtin_extend_pointer:
893 case Builtin::BI__builtin_setjmp:
894 case Builtin::BI__builtin_longjmp:
895 case Builtin::BI__builtin_launder:
896 case Builtin::BI__sync_fetch_and_add:
897 case Builtin::BI__sync_fetch_and_sub:
898 case Builtin::BI__sync_fetch_and_or:
899 case Builtin::BI__sync_fetch_and_and:
900 case Builtin::BI__sync_fetch_and_xor:
901 case Builtin::BI__sync_fetch_and_nand:
902 case Builtin::BI__sync_add_and_fetch:
903 case Builtin::BI__sync_sub_and_fetch:
904 case Builtin::BI__sync_and_and_fetch:
905 case Builtin::BI__sync_or_and_fetch:
906 case Builtin::BI__sync_xor_and_fetch:
907 case Builtin::BI__sync_nand_and_fetch:
908 case Builtin::BI__sync_val_compare_and_swap:
909 case Builtin::BI__sync_bool_compare_and_swap:
910 case Builtin::BI__sync_lock_test_and_set:
911 case Builtin::BI__sync_lock_release:
912 case Builtin::BI__sync_swap:
913 case Builtin::BI__sync_fetch_and_add_1:
914 case Builtin::BI__sync_fetch_and_add_2:
915 case Builtin::BI__sync_fetch_and_add_4:
916 case Builtin::BI__sync_fetch_and_add_8:
917 case Builtin::BI__sync_fetch_and_add_16:
918 case Builtin::BI__sync_fetch_and_sub_1:
919 case Builtin::BI__sync_fetch_and_sub_2:
920 case Builtin::BI__sync_fetch_and_sub_4:
921 case Builtin::BI__sync_fetch_and_sub_8:
922 case Builtin::BI__sync_fetch_and_sub_16:
923 case Builtin::BI__sync_fetch_and_or_1:
924 case Builtin::BI__sync_fetch_and_or_2:
925 case Builtin::BI__sync_fetch_and_or_4:
926 case Builtin::BI__sync_fetch_and_or_8:
927 case Builtin::BI__sync_fetch_and_or_16:
928 case Builtin::BI__sync_fetch_and_and_1:
929 case Builtin::BI__sync_fetch_and_and_2:
930 case Builtin::BI__sync_fetch_and_and_4:
931 case Builtin::BI__sync_fetch_and_and_8:
932 case Builtin::BI__sync_fetch_and_and_16:
933 case Builtin::BI__sync_fetch_and_xor_1:
934 case Builtin::BI__sync_fetch_and_xor_2:
935 case Builtin::BI__sync_fetch_and_xor_4:
936 case Builtin::BI__sync_fetch_and_xor_8:
937 case Builtin::BI__sync_fetch_and_xor_16:
938 case Builtin::BI__sync_fetch_and_nand_1:
939 case Builtin::BI__sync_fetch_and_nand_2:
940 case Builtin::BI__sync_fetch_and_nand_4:
941 case Builtin::BI__sync_fetch_and_nand_8:
942 case Builtin::BI__sync_fetch_and_nand_16:
943 case Builtin::BI__sync_fetch_and_min:
944 case Builtin::BI__sync_fetch_and_max:
945 case Builtin::BI__sync_fetch_and_umin:
946 case Builtin::BI__sync_fetch_and_umax:
947 case Builtin::BI__sync_add_and_fetch_1:
948 case Builtin::BI__sync_add_and_fetch_2:
949 case Builtin::BI__sync_add_and_fetch_4:
950 case Builtin::BI__sync_add_and_fetch_8:
951 case Builtin::BI__sync_add_and_fetch_16:
952 case Builtin::BI__sync_sub_and_fetch_1:
953 case Builtin::BI__sync_sub_and_fetch_2:
954 case Builtin::BI__sync_sub_and_fetch_4:
955 case Builtin::BI__sync_sub_and_fetch_8:
956 case Builtin::BI__sync_sub_and_fetch_16:
957 case Builtin::BI__sync_and_and_fetch_1:
958 case Builtin::BI__sync_and_and_fetch_2:
959 case Builtin::BI__sync_and_and_fetch_4:
960 case Builtin::BI__sync_and_and_fetch_8:
961 case Builtin::BI__sync_and_and_fetch_16:
962 case Builtin::BI__sync_or_and_fetch_1:
963 case Builtin::BI__sync_or_and_fetch_2:
964 case Builtin::BI__sync_or_and_fetch_4:
965 case Builtin::BI__sync_or_and_fetch_8:
966 case Builtin::BI__sync_or_and_fetch_16:
967 case Builtin::BI__sync_xor_and_fetch_1:
968 case Builtin::BI__sync_xor_and_fetch_2:
969 case Builtin::BI__sync_xor_and_fetch_4:
970 case Builtin::BI__sync_xor_and_fetch_8:
971 case Builtin::BI__sync_xor_and_fetch_16:
972 case Builtin::BI__sync_nand_and_fetch_1:
973 case Builtin::BI__sync_nand_and_fetch_2:
974 case Builtin::BI__sync_nand_and_fetch_4:
975 case Builtin::BI__sync_nand_and_fetch_8:
976 case Builtin::BI__sync_nand_and_fetch_16:
977 case Builtin::BI__sync_val_compare_and_swap_1:
978 case Builtin::BI__sync_val_compare_and_swap_2:
979 case Builtin::BI__sync_val_compare_and_swap_4:
980 case Builtin::BI__sync_val_compare_and_swap_8:
981 case Builtin::BI__sync_val_compare_and_swap_16:
982 case Builtin::BI__sync_bool_compare_and_swap_1:
983 case Builtin::BI__sync_bool_compare_and_swap_2:
984 case Builtin::BI__sync_bool_compare_and_swap_4:
985 case Builtin::BI__sync_bool_compare_and_swap_8:
986 case Builtin::BI__sync_bool_compare_and_swap_16:
987 case Builtin::BI__sync_swap_1:
988 case Builtin::BI__sync_swap_2:
989 case Builtin::BI__sync_swap_4:
990 case Builtin::BI__sync_swap_8:
991 case Builtin::BI__sync_swap_16:
992 case Builtin::BI__sync_lock_test_and_set_1:
993 case Builtin::BI__sync_lock_test_and_set_2:
994 case Builtin::BI__sync_lock_test_and_set_4:
995 case Builtin::BI__sync_lock_test_and_set_8:
996 case Builtin::BI__sync_lock_test_and_set_16:
997 case Builtin::BI__sync_lock_release_1:
998 case Builtin::BI__sync_lock_release_2:
999 case Builtin::BI__sync_lock_release_4:
1000 case Builtin::BI__sync_lock_release_8:
1001 case Builtin::BI__sync_lock_release_16:
1002 case Builtin::BI__sync_synchronize:
1003 case Builtin::BI__builtin_nontemporal_load:
1004 case Builtin::BI__builtin_nontemporal_store:
1005 case Builtin::BI__c11_atomic_is_lock_free:
1006 case Builtin::BI__atomic_is_lock_free:
1007 case Builtin::BI__atomic_test_and_set:
1008 case Builtin::BI__atomic_clear:
1010 case Builtin::BI__atomic_thread_fence: {
1014 case Builtin::BI__atomic_signal_fence: {
1018 case Builtin::BI__c11_atomic_thread_fence:
1019 case Builtin::BI__c11_atomic_signal_fence:
1020 case Builtin::BI__scoped_atomic_thread_fence:
1021 case Builtin::BI__builtin_signbit:
1022 case Builtin::BI__builtin_signbitf:
1023 case Builtin::BI__builtin_signbitl:
1024 case Builtin::BI__warn_memset_zero_len:
1025 case Builtin::BI__annotation:
1026 case Builtin::BI__builtin_annotation:
1027 case Builtin::BI__builtin_addcb:
1028 case Builtin::BI__builtin_addcs:
1029 case Builtin::BI__builtin_addc:
1030 case Builtin::BI__builtin_addcl:
1031 case Builtin::BI__builtin_addcll:
1032 case Builtin::BI__builtin_subcb:
1033 case Builtin::BI__builtin_subcs:
1034 case Builtin::BI__builtin_subc:
1035 case Builtin::BI__builtin_subcl:
1036 case Builtin::BI__builtin_subcll:
1039 case Builtin::BI__builtin_add_overflow:
1040 case Builtin::BI__builtin_sub_overflow:
1041 case Builtin::BI__builtin_mul_overflow: {
1049 WidthAndSignedness leftInfo =
1051 WidthAndSignedness rightInfo =
1053 WidthAndSignedness resultInfo =
1059 WidthAndSignedness encompassingInfo =
1062 auto encompassingCIRTy = cir::IntType::get(
1063 &
getMLIRContext(), encompassingInfo.width, encompassingInfo.isSigned);
1064 auto resultCIRTy = mlir::cast<cir::IntType>(
cgm.convertType(resultQTy));
1071 if (left.getType() != encompassingCIRTy)
1073 builder.createCast(cir::CastKind::integral, left, encompassingCIRTy);
1074 if (right.getType() != encompassingCIRTy)
1076 builder.createCast(cir::CastKind::integral, right, encompassingCIRTy);
1079 cir::BinOpOverflowKind opKind;
1080 switch (builtinID) {
1082 llvm_unreachable(
"Unknown overflow builtin id.");
1083 case Builtin::BI__builtin_add_overflow:
1084 opKind = cir::BinOpOverflowKind::Add;
1086 case Builtin::BI__builtin_sub_overflow:
1087 opKind = cir::BinOpOverflowKind::Sub;
1089 case Builtin::BI__builtin_mul_overflow:
1090 opKind = cir::BinOpOverflowKind::Mul;
1095 auto arithOp = cir::BinOpOverflowOp::create(builder, loc, resultCIRTy,
1096 opKind, left, right);
1110 builder.createStore(loc,
emitToMemory(arithOp.getResult(), resultQTy),
1111 resultPtr, isVolatile);
1116 case Builtin::BI__builtin_uadd_overflow:
1117 case Builtin::BI__builtin_uaddl_overflow:
1118 case Builtin::BI__builtin_uaddll_overflow:
1119 case Builtin::BI__builtin_usub_overflow:
1120 case Builtin::BI__builtin_usubl_overflow:
1121 case Builtin::BI__builtin_usubll_overflow:
1122 case Builtin::BI__builtin_umul_overflow:
1123 case Builtin::BI__builtin_umull_overflow:
1124 case Builtin::BI__builtin_umulll_overflow:
1125 case Builtin::BI__builtin_sadd_overflow:
1126 case Builtin::BI__builtin_saddl_overflow:
1127 case Builtin::BI__builtin_saddll_overflow:
1128 case Builtin::BI__builtin_ssub_overflow:
1129 case Builtin::BI__builtin_ssubl_overflow:
1130 case Builtin::BI__builtin_ssubll_overflow:
1131 case Builtin::BI__builtin_smul_overflow:
1132 case Builtin::BI__builtin_smull_overflow:
1133 case Builtin::BI__builtin_smulll_overflow: {
1142 cir::BinOpOverflowKind arithKind;
1143 switch (builtinID) {
1145 llvm_unreachable(
"Unknown overflow builtin id.");
1146 case Builtin::BI__builtin_uadd_overflow:
1147 case Builtin::BI__builtin_uaddl_overflow:
1148 case Builtin::BI__builtin_uaddll_overflow:
1149 case Builtin::BI__builtin_sadd_overflow:
1150 case Builtin::BI__builtin_saddl_overflow:
1151 case Builtin::BI__builtin_saddll_overflow:
1152 arithKind = cir::BinOpOverflowKind::Add;
1154 case Builtin::BI__builtin_usub_overflow:
1155 case Builtin::BI__builtin_usubl_overflow:
1156 case Builtin::BI__builtin_usubll_overflow:
1157 case Builtin::BI__builtin_ssub_overflow:
1158 case Builtin::BI__builtin_ssubl_overflow:
1159 case Builtin::BI__builtin_ssubll_overflow:
1160 arithKind = cir::BinOpOverflowKind::Sub;
1162 case Builtin::BI__builtin_umul_overflow:
1163 case Builtin::BI__builtin_umull_overflow:
1164 case Builtin::BI__builtin_umulll_overflow:
1165 case Builtin::BI__builtin_smul_overflow:
1166 case Builtin::BI__builtin_smull_overflow:
1167 case Builtin::BI__builtin_smulll_overflow:
1168 arithKind = cir::BinOpOverflowKind::Mul;
1174 auto resultCIRTy = mlir::cast<cir::IntType>(
cgm.convertType(resultQTy));
1177 cir::BinOpOverflowOp arithOp = cir::BinOpOverflowOp::create(
1178 builder, loc, resultCIRTy, arithKind, x, y);
1182 builder.createStore(loc,
emitToMemory(arithOp.getResult(), resultQTy),
1183 resultPtr, isVolatile);
1188 case Builtin::BIaddressof:
1189 case Builtin::BI__addressof:
1190 case Builtin::BI__builtin_addressof:
1191 case Builtin::BI__builtin_function_start:
1193 case Builtin::BI__builtin_operator_new:
1196 case Builtin::BI__builtin_operator_delete:
1200 case Builtin::BI__builtin_is_aligned:
1201 case Builtin::BI__builtin_align_up:
1202 case Builtin::BI__builtin_align_down:
1203 case Builtin::BI__noop:
1204 case Builtin::BI__builtin_call_with_static_chain:
1205 case Builtin::BI_InterlockedExchange8:
1206 case Builtin::BI_InterlockedExchange16:
1207 case Builtin::BI_InterlockedExchange:
1208 case Builtin::BI_InterlockedExchangePointer:
1209 case Builtin::BI_InterlockedCompareExchangePointer:
1210 case Builtin::BI_InterlockedCompareExchangePointer_nf:
1211 case Builtin::BI_InterlockedCompareExchange8:
1212 case Builtin::BI_InterlockedCompareExchange16:
1213 case Builtin::BI_InterlockedCompareExchange:
1214 case Builtin::BI_InterlockedCompareExchange64:
1215 case Builtin::BI_InterlockedIncrement16:
1216 case Builtin::BI_InterlockedIncrement:
1217 case Builtin::BI_InterlockedDecrement16:
1218 case Builtin::BI_InterlockedDecrement:
1219 case Builtin::BI_InterlockedAnd8:
1220 case Builtin::BI_InterlockedAnd16:
1221 case Builtin::BI_InterlockedAnd:
1222 case Builtin::BI_InterlockedExchangeAdd8:
1223 case Builtin::BI_InterlockedExchangeAdd16:
1224 case Builtin::BI_InterlockedExchangeAdd:
1225 case Builtin::BI_InterlockedExchangeSub8:
1226 case Builtin::BI_InterlockedExchangeSub16:
1227 case Builtin::BI_InterlockedExchangeSub:
1228 case Builtin::BI_InterlockedOr8:
1229 case Builtin::BI_InterlockedOr16:
1230 case Builtin::BI_InterlockedOr:
1231 case Builtin::BI_InterlockedXor8:
1232 case Builtin::BI_InterlockedXor16:
1233 case Builtin::BI_InterlockedXor:
1234 case Builtin::BI_bittest64:
1235 case Builtin::BI_bittest:
1236 case Builtin::BI_bittestandcomplement64:
1237 case Builtin::BI_bittestandcomplement:
1238 case Builtin::BI_bittestandreset64:
1239 case Builtin::BI_bittestandreset:
1240 case Builtin::BI_bittestandset64:
1241 case Builtin::BI_bittestandset:
1242 case Builtin::BI_interlockedbittestandreset:
1243 case Builtin::BI_interlockedbittestandreset64:
1244 case Builtin::BI_interlockedbittestandreset64_acq:
1245 case Builtin::BI_interlockedbittestandreset64_rel:
1246 case Builtin::BI_interlockedbittestandreset64_nf:
1247 case Builtin::BI_interlockedbittestandset64:
1248 case Builtin::BI_interlockedbittestandset64_acq:
1249 case Builtin::BI_interlockedbittestandset64_rel:
1250 case Builtin::BI_interlockedbittestandset64_nf:
1251 case Builtin::BI_interlockedbittestandset:
1252 case Builtin::BI_interlockedbittestandset_acq:
1253 case Builtin::BI_interlockedbittestandset_rel:
1254 case Builtin::BI_interlockedbittestandset_nf:
1255 case Builtin::BI_interlockedbittestandreset_acq:
1256 case Builtin::BI_interlockedbittestandreset_rel:
1257 case Builtin::BI_interlockedbittestandreset_nf:
1258 case Builtin::BI__iso_volatile_load8:
1259 case Builtin::BI__iso_volatile_load16:
1260 case Builtin::BI__iso_volatile_load32:
1261 case Builtin::BI__iso_volatile_load64:
1262 case Builtin::BI__iso_volatile_store8:
1263 case Builtin::BI__iso_volatile_store16:
1264 case Builtin::BI__iso_volatile_store32:
1265 case Builtin::BI__iso_volatile_store64:
1266 case Builtin::BI__builtin_ptrauth_sign_constant:
1267 case Builtin::BI__builtin_ptrauth_auth:
1268 case Builtin::BI__builtin_ptrauth_auth_and_resign:
1269 case Builtin::BI__builtin_ptrauth_blend_discriminator:
1270 case Builtin::BI__builtin_ptrauth_sign_generic_data:
1271 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
1272 case Builtin::BI__builtin_ptrauth_strip:
1273 case Builtin::BI__builtin_get_vtable_pointer:
1274 case Builtin::BI__exception_code:
1275 case Builtin::BI_exception_code:
1276 case Builtin::BI__exception_info:
1277 case Builtin::BI_exception_info:
1278 case Builtin::BI__abnormal_termination:
1279 case Builtin::BI_abnormal_termination:
1280 case Builtin::BI_setjmpex:
1281 case Builtin::BI_setjmp:
1282 case Builtin::BImove:
1283 case Builtin::BImove_if_noexcept:
1284 case Builtin::BIforward:
1285 case Builtin::BIforward_like:
1286 case Builtin::BIas_const:
1287 case Builtin::BI__GetExceptionInfo:
1288 case Builtin::BI__fastfail:
1289 case Builtin::BIread_pipe:
1290 case Builtin::BIwrite_pipe:
1291 case Builtin::BIreserve_read_pipe:
1292 case Builtin::BIreserve_write_pipe:
1293 case Builtin::BIwork_group_reserve_read_pipe:
1294 case Builtin::BIwork_group_reserve_write_pipe:
1295 case Builtin::BIsub_group_reserve_read_pipe:
1296 case Builtin::BIsub_group_reserve_write_pipe:
1297 case Builtin::BIcommit_read_pipe:
1298 case Builtin::BIcommit_write_pipe:
1299 case Builtin::BIwork_group_commit_read_pipe:
1300 case Builtin::BIwork_group_commit_write_pipe:
1301 case Builtin::BIsub_group_commit_read_pipe:
1302 case Builtin::BIsub_group_commit_write_pipe:
1303 case Builtin::BIget_pipe_num_packets:
1304 case Builtin::BIget_pipe_max_packets:
1305 case Builtin::BIto_global:
1306 case Builtin::BIto_local:
1307 case Builtin::BIto_private:
1308 case Builtin::BIenqueue_kernel:
1309 case Builtin::BIget_kernel_work_group_size:
1310 case Builtin::BIget_kernel_preferred_work_group_size_multiple:
1311 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange:
1312 case Builtin::BIget_kernel_sub_group_count_for_ndrange:
1313 case Builtin::BI__builtin_store_half:
1314 case Builtin::BI__builtin_store_halff:
1315 case Builtin::BI__builtin_load_half:
1316 case Builtin::BI__builtin_load_halff:
1318 case Builtin::BI__builtin_printf:
1319 case Builtin::BIprintf:
1321 case Builtin::BI__builtin_canonicalize:
1322 case Builtin::BI__builtin_canonicalizef:
1323 case Builtin::BI__builtin_canonicalizef16:
1324 case Builtin::BI__builtin_canonicalizel:
1325 case Builtin::BI__builtin_thread_pointer:
1326 case Builtin::BI__builtin_os_log_format:
1327 case Builtin::BI__xray_customevent:
1328 case Builtin::BI__xray_typedevent:
1329 case Builtin::BI__builtin_ms_va_start:
1330 case Builtin::BI__builtin_ms_va_end:
1331 case Builtin::BI__builtin_ms_va_copy:
1332 case Builtin::BI__builtin_get_device_side_mangled_name:
1339 if (
getContext().BuiltinInfo.isLibFunction(builtinID))
1341 cgm.getBuiltinLibFunction(fd, builtinID));
1359 if (std::optional<mlir::Value> rst =
1361 mlir::Value v = rst.value();
1369 if (mlir::isa<cir::VoidType>(v.getType()))
1376 llvm_unreachable(
"No current target builtin returns complex");
1378 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
1382 std::string(
"unimplemented builtin call: ") +
1383 getContext().BuiltinInfo.getName(builtinID));