245 unsigned builtinIDIfNoAsmLabel = fd->
hasAttr<AsmLabelAttr>() ? 0 : builtinID;
250 switch (builtinIDIfNoAsmLabel) {
255 case Builtin::BI__builtin_stdarg_start:
256 case Builtin::BI__builtin_va_start:
257 case Builtin::BI__va_start: {
258 mlir::Value vaList = builtinID == Builtin::BI__va_start
266 case Builtin::BI__builtin_va_end:
271 case Builtin::BIcosf:
272 case Builtin::BIcosl:
273 case Builtin::BI__builtin_cos:
274 case Builtin::BI__builtin_cosf:
275 case Builtin::BI__builtin_cosf16:
276 case Builtin::BI__builtin_cosl:
277 case Builtin::BI__builtin_cosf128:
281 case Builtin::BIceil:
282 case Builtin::BIceilf:
283 case Builtin::BIceill:
284 case Builtin::BI__builtin_ceil:
285 case Builtin::BI__builtin_ceilf:
286 case Builtin::BI__builtin_ceilf16:
287 case Builtin::BI__builtin_ceill:
288 case Builtin::BI__builtin_ceilf128:
293 case Builtin::BIexpf:
294 case Builtin::BIexpl:
295 case Builtin::BI__builtin_exp:
296 case Builtin::BI__builtin_expf:
297 case Builtin::BI__builtin_expf16:
298 case Builtin::BI__builtin_expl:
299 case Builtin::BI__builtin_expf128:
303 case Builtin::BIfabs:
304 case Builtin::BIfabsf:
305 case Builtin::BIfabsl:
306 case Builtin::BI__builtin_fabs:
307 case Builtin::BI__builtin_fabsf:
308 case Builtin::BI__builtin_fabsf16:
309 case Builtin::BI__builtin_fabsl:
310 case Builtin::BI__builtin_fabsf128:
313 case Builtin::BI__assume:
314 case Builtin::BI__builtin_assume: {
319 cir::AssumeOp::create(builder, loc, argValue);
323 case Builtin::BI__builtin_assume_separate_storage: {
326 cir::AssumeSepStorageOp::create(builder, loc, value0, value1);
330 case Builtin::BI__builtin_assume_aligned: {
333 mlir::Value offsetValue =
336 std::optional<llvm::APSInt> alignment =
338 assert(alignment.has_value() &&
339 "the second argument to __builtin_assume_aligned must be an "
340 "integral constant expression");
344 alignment->getSExtValue(), offsetValue);
348 case Builtin::BI__builtin_complex: {
351 mlir::Value complex = builder.createComplexCreate(loc, real, imag);
355 case Builtin::BI__builtin_creal:
356 case Builtin::BI__builtin_crealf:
357 case Builtin::BI__builtin_creall:
358 case Builtin::BIcreal:
359 case Builtin::BIcrealf:
360 case Builtin::BIcreall: {
362 mlir::Value real = builder.createComplexReal(loc, complex);
366 case Builtin::BI__builtin_cimag:
367 case Builtin::BI__builtin_cimagf:
368 case Builtin::BI__builtin_cimagl:
369 case Builtin::BIcimag:
370 case Builtin::BIcimagf:
371 case Builtin::BIcimagl: {
373 mlir::Value imag = builder.createComplexImag(loc, complex);
377 case Builtin::BI__builtin_conj:
378 case Builtin::BI__builtin_conjf:
379 case Builtin::BI__builtin_conjl:
380 case Builtin::BIconj:
381 case Builtin::BIconjf:
382 case Builtin::BIconjl: {
385 cir::UnaryOpKind::Not, complex);
389 case Builtin::BI__builtin_clrsb:
390 case Builtin::BI__builtin_clrsbl:
391 case Builtin::BI__builtin_clrsbll:
394 case Builtin::BI__builtin_ctzs:
395 case Builtin::BI__builtin_ctz:
396 case Builtin::BI__builtin_ctzl:
397 case Builtin::BI__builtin_ctzll:
398 case Builtin::BI__builtin_ctzg:
402 case Builtin::BI__builtin_clzs:
403 case Builtin::BI__builtin_clz:
404 case Builtin::BI__builtin_clzl:
405 case Builtin::BI__builtin_clzll:
406 case Builtin::BI__builtin_clzg:
410 case Builtin::BI__builtin_ffs:
411 case Builtin::BI__builtin_ffsl:
412 case Builtin::BI__builtin_ffsll:
415 case Builtin::BI__builtin_parity:
416 case Builtin::BI__builtin_parityl:
417 case Builtin::BI__builtin_parityll:
420 case Builtin::BI__lzcnt16:
421 case Builtin::BI__lzcnt:
422 case Builtin::BI__lzcnt64:
426 case Builtin::BI__popcnt16:
427 case Builtin::BI__popcnt:
428 case Builtin::BI__popcnt64:
429 case Builtin::BI__builtin_popcount:
430 case Builtin::BI__builtin_popcountl:
431 case Builtin::BI__builtin_popcountll:
432 case Builtin::BI__builtin_popcountg:
435 case Builtin::BI__builtin_expect:
436 case Builtin::BI__builtin_expect_with_probability: {
440 mlir::FloatAttr probAttr;
441 if (builtinIDIfNoAsmLabel == Builtin::BI__builtin_expect_with_probability) {
442 llvm::APFloat probability(0.0);
444 [[maybe_unused]]
bool evalSucceeded =
446 assert(evalSucceeded &&
447 "probability should be able to evaluate as float");
448 bool loseInfo =
false;
449 probability.convert(llvm::APFloat::IEEEdouble(),
450 llvm::RoundingMode::Dynamic, &loseInfo);
451 probAttr = mlir::FloatAttr::get(mlir::Float64Type::get(&
getMLIRContext()),
455 auto result = cir::ExpectOp::create(builder, loc, argValue.getType(),
456 argValue, expectedValue, probAttr);
460 case Builtin::BI__builtin_bswap16:
461 case Builtin::BI__builtin_bswap32:
462 case Builtin::BI__builtin_bswap64:
463 case Builtin::BI_byteswap_ushort:
464 case Builtin::BI_byteswap_ulong:
465 case Builtin::BI_byteswap_uint64: {
467 return RValue::get(cir::ByteSwapOp::create(builder, loc, arg));
470 case Builtin::BI__builtin_bitreverse8:
471 case Builtin::BI__builtin_bitreverse16:
472 case Builtin::BI__builtin_bitreverse32:
473 case Builtin::BI__builtin_bitreverse64: {
475 return RValue::get(cir::BitReverseOp::create(builder, loc, arg));
478 case Builtin::BI__builtin_rotateleft8:
479 case Builtin::BI__builtin_rotateleft16:
480 case Builtin::BI__builtin_rotateleft32:
481 case Builtin::BI__builtin_rotateleft64:
484 case Builtin::BI__builtin_rotateright8:
485 case Builtin::BI__builtin_rotateright16:
486 case Builtin::BI__builtin_rotateright32:
487 case Builtin::BI__builtin_rotateright64:
490 case Builtin::BI__builtin_coro_id:
491 case Builtin::BI__builtin_coro_promise:
492 case Builtin::BI__builtin_coro_resume:
493 case Builtin::BI__builtin_coro_noop:
494 case Builtin::BI__builtin_coro_destroy:
495 case Builtin::BI__builtin_coro_done:
496 case Builtin::BI__builtin_coro_alloc:
497 case Builtin::BI__builtin_coro_begin:
498 case Builtin::BI__builtin_coro_end:
499 case Builtin::BI__builtin_coro_suspend:
500 case Builtin::BI__builtin_coro_align:
504 case Builtin::BI__builtin_coro_frame: {
509 case Builtin::BI__builtin_coro_free:
510 case Builtin::BI__builtin_coro_size: {
512 mlir::Type ty =
cgm.getTypes().getFunctionType(
513 cgm.getTypes().arrangeGlobalDeclaration(gd));
516 cgm.getOrCreateCIRFunction(nd->getName(), ty, gd,
false);
517 fnOp.setBuiltin(
true);
521 case Builtin::BI__builtin_dynamic_object_size:
522 case Builtin::BI__builtin_object_size: {
529 bool isDynamic = builtinID == Builtin::BI__builtin_dynamic_object_size;
531 nullptr, isDynamic));
534 case Builtin::BI__builtin_prefetch: {
535 auto evaluateOperandAsInt = [&](
const Expr *arg) {
537 [[maybe_unused]]
bool evalSucceed =
538 arg->EvaluateAsInt(res,
cgm.getASTContext());
539 assert(evalSucceed &&
"expression should be able to evaluate as int");
543 bool isWrite =
false;
545 isWrite = evaluateOperandAsInt(e->
getArg(1));
549 locality = evaluateOperandAsInt(e->
getArg(2));
552 cir::PrefetchOp::create(builder, loc, address, locality, isWrite);
555 case Builtin::BI__builtin_readcyclecounter:
556 case Builtin::BI__builtin_readsteadycounter:
557 case Builtin::BI__builtin___clear_cache:
559 case Builtin::BI__builtin_trap:
562 case Builtin::BI__builtin_verbose_trap:
563 case Builtin::BI__debugbreak:
565 case Builtin::BI__builtin_unreachable:
568 case Builtin::BI__builtin_powi:
569 case Builtin::BI__builtin_powif:
570 case Builtin::BI__builtin_powil:
571 case Builtin::BI__builtin_frexpl:
572 case Builtin::BI__builtin_frexp:
573 case Builtin::BI__builtin_frexpf:
574 case Builtin::BI__builtin_frexpf128:
575 case Builtin::BI__builtin_frexpf16:
576 case Builtin::BImodf:
577 case Builtin::BImodff:
578 case Builtin::BImodfl:
579 case Builtin::BI__builtin_modf:
580 case Builtin::BI__builtin_modff:
581 case Builtin::BI__builtin_modfl:
582 case Builtin::BI__builtin_isgreater:
583 case Builtin::BI__builtin_isgreaterequal:
584 case Builtin::BI__builtin_isless:
585 case Builtin::BI__builtin_islessequal:
586 case Builtin::BI__builtin_islessgreater:
587 case Builtin::BI__builtin_isunordered:
594 case Builtin::BI__builtin_isnan: {
600 builder.createIsFPClass(loc, v, cir::FPClassTest::Nan),
604 case Builtin::BI__builtin_issignaling: {
609 builder.createIsFPClass(loc, v, cir::FPClassTest::SignalingNaN),
613 case Builtin::BI__builtin_isinf: {
619 builder.createIsFPClass(loc, v, cir::FPClassTest::Infinity),
622 case Builtin::BIfinite:
623 case Builtin::BI__finite:
624 case Builtin::BIfinitef:
625 case Builtin::BI__finitef:
626 case Builtin::BIfinitel:
627 case Builtin::BI__finitel:
628 case Builtin::BI__builtin_isfinite: {
634 builder.createIsFPClass(loc, v, cir::FPClassTest::Finite),
638 case Builtin::BI__builtin_isnormal: {
643 builder.createIsFPClass(loc, v, cir::FPClassTest::Normal),
647 case Builtin::BI__builtin_issubnormal: {
652 builder.createIsFPClass(loc, v, cir::FPClassTest::Subnormal),
656 case Builtin::BI__builtin_iszero: {
661 builder.createIsFPClass(loc, v, cir::FPClassTest::Zero),
664 case Builtin::BI__builtin_isfpclass: {
671 uint64_t test = result.
Val.
getInt().getLimitedValue();
675 builder.createIsFPClass(loc, v, cir::FPClassTest(test)),
678 case Builtin::BI__builtin_nondeterministic_value:
679 case Builtin::BI__builtin_elementwise_abs:
681 case Builtin::BI__builtin_elementwise_acos:
683 case Builtin::BI__builtin_elementwise_asin:
685 case Builtin::BI__builtin_elementwise_atan:
687 case Builtin::BI__builtin_elementwise_atan2:
688 case Builtin::BI__builtin_elementwise_ceil:
689 case Builtin::BI__builtin_elementwise_exp:
690 case Builtin::BI__builtin_elementwise_exp2:
691 case Builtin::BI__builtin_elementwise_exp10:
692 case Builtin::BI__builtin_elementwise_ldexp:
693 case Builtin::BI__builtin_elementwise_log:
694 case Builtin::BI__builtin_elementwise_log2:
695 case Builtin::BI__builtin_elementwise_log10:
696 case Builtin::BI__builtin_elementwise_pow:
697 case Builtin::BI__builtin_elementwise_bitreverse:
699 case Builtin::BI__builtin_elementwise_cos:
701 case Builtin::BI__builtin_elementwise_cosh:
702 case Builtin::BI__builtin_elementwise_floor:
703 case Builtin::BI__builtin_elementwise_popcount:
704 case Builtin::BI__builtin_elementwise_roundeven:
705 case Builtin::BI__builtin_elementwise_round:
706 case Builtin::BI__builtin_elementwise_rint:
707 case Builtin::BI__builtin_elementwise_nearbyint:
708 case Builtin::BI__builtin_elementwise_sin:
709 case Builtin::BI__builtin_elementwise_sinh:
710 case Builtin::BI__builtin_elementwise_tan:
711 case Builtin::BI__builtin_elementwise_tanh:
712 case Builtin::BI__builtin_elementwise_trunc:
713 case Builtin::BI__builtin_elementwise_canonicalize:
714 case Builtin::BI__builtin_elementwise_copysign:
715 case Builtin::BI__builtin_elementwise_fma:
716 case Builtin::BI__builtin_elementwise_fshl:
717 case Builtin::BI__builtin_elementwise_fshr:
718 case Builtin::BI__builtin_elementwise_add_sat:
719 case Builtin::BI__builtin_elementwise_sub_sat:
720 case Builtin::BI__builtin_elementwise_max:
721 case Builtin::BI__builtin_elementwise_min:
722 case Builtin::BI__builtin_elementwise_maxnum:
723 case Builtin::BI__builtin_elementwise_minnum:
724 case Builtin::BI__builtin_elementwise_maximum:
725 case Builtin::BI__builtin_elementwise_minimum:
726 case Builtin::BI__builtin_elementwise_maximumnum:
727 case Builtin::BI__builtin_elementwise_minimumnum:
728 case Builtin::BI__builtin_reduce_max:
729 case Builtin::BI__builtin_reduce_min:
730 case Builtin::BI__builtin_reduce_add:
731 case Builtin::BI__builtin_reduce_mul:
732 case Builtin::BI__builtin_reduce_xor:
733 case Builtin::BI__builtin_reduce_or:
734 case Builtin::BI__builtin_reduce_and:
735 case Builtin::BI__builtin_reduce_maximum:
736 case Builtin::BI__builtin_reduce_minimum:
737 case Builtin::BI__builtin_matrix_transpose:
738 case Builtin::BI__builtin_matrix_column_major_load:
739 case Builtin::BI__builtin_matrix_column_major_store:
740 case Builtin::BI__builtin_masked_load:
741 case Builtin::BI__builtin_masked_expand_load:
742 case Builtin::BI__builtin_masked_gather:
743 case Builtin::BI__builtin_masked_store:
744 case Builtin::BI__builtin_masked_compress_store:
745 case Builtin::BI__builtin_masked_scatter:
746 case Builtin::BI__builtin_isinf_sign:
747 case Builtin::BI__builtin_flt_rounds:
748 case Builtin::BI__builtin_set_flt_rounds:
749 case Builtin::BI__builtin_fpclassify:
751 case Builtin::BIalloca:
752 case Builtin::BI_alloca:
753 case Builtin::BI__builtin_alloca_uninitialized:
754 case Builtin::BI__builtin_alloca:
756 case Builtin::BI__builtin_alloca_with_align_uninitialized:
757 case Builtin::BI__builtin_alloca_with_align:
758 case Builtin::BI__builtin_infer_alloc_token:
759 case Builtin::BIbzero:
760 case Builtin::BI__builtin_bzero:
761 case Builtin::BIbcopy:
762 case Builtin::BI__builtin_bcopy:
764 case Builtin::BImemcpy:
765 case Builtin::BI__builtin_memcpy:
766 case Builtin::BImempcpy:
767 case Builtin::BI__builtin_mempcpy:
768 case Builtin::BI__builtin_memcpy_inline:
769 case Builtin::BI__builtin_char_memchr:
770 case Builtin::BI__builtin___memcpy_chk:
771 case Builtin::BI__builtin_objc_memmove_collectable:
772 case Builtin::BI__builtin___memmove_chk:
773 case Builtin::BI__builtin_trivially_relocate:
774 case Builtin::BImemmove:
775 case Builtin::BI__builtin_memmove:
776 case Builtin::BImemset:
777 case Builtin::BI__builtin_memset:
778 case Builtin::BI__builtin_memset_inline:
779 case Builtin::BI__builtin___memset_chk:
780 case Builtin::BI__builtin_wmemchr:
781 case Builtin::BI__builtin_wmemcmp:
783 case Builtin::BI__builtin_dwarf_cfa:
785 case Builtin::BI__builtin_return_address:
786 case Builtin::BI_ReturnAddress:
787 case Builtin::BI__builtin_frame_address: {
790 if (builtinID == Builtin::BI__builtin_return_address) {
793 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));
797 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));
799 case Builtin::BI__builtin_extract_return_addr:
800 case Builtin::BI__builtin_frob_return_addr:
801 case Builtin::BI__builtin_dwarf_sp_column:
802 case Builtin::BI__builtin_init_dwarf_reg_size_table:
803 case Builtin::BI__builtin_eh_return:
804 case Builtin::BI__builtin_unwind_init:
805 case Builtin::BI__builtin_extend_pointer:
806 case Builtin::BI__builtin_setjmp:
807 case Builtin::BI__builtin_longjmp:
808 case Builtin::BI__builtin_launder:
809 case Builtin::BI__sync_fetch_and_add:
810 case Builtin::BI__sync_fetch_and_sub:
811 case Builtin::BI__sync_fetch_and_or:
812 case Builtin::BI__sync_fetch_and_and:
813 case Builtin::BI__sync_fetch_and_xor:
814 case Builtin::BI__sync_fetch_and_nand:
815 case Builtin::BI__sync_add_and_fetch:
816 case Builtin::BI__sync_sub_and_fetch:
817 case Builtin::BI__sync_and_and_fetch:
818 case Builtin::BI__sync_or_and_fetch:
819 case Builtin::BI__sync_xor_and_fetch:
820 case Builtin::BI__sync_nand_and_fetch:
821 case Builtin::BI__sync_val_compare_and_swap:
822 case Builtin::BI__sync_bool_compare_and_swap:
823 case Builtin::BI__sync_lock_test_and_set:
824 case Builtin::BI__sync_lock_release:
825 case Builtin::BI__sync_swap:
826 case Builtin::BI__sync_fetch_and_add_1:
827 case Builtin::BI__sync_fetch_and_add_2:
828 case Builtin::BI__sync_fetch_and_add_4:
829 case Builtin::BI__sync_fetch_and_add_8:
830 case Builtin::BI__sync_fetch_and_add_16:
831 case Builtin::BI__sync_fetch_and_sub_1:
832 case Builtin::BI__sync_fetch_and_sub_2:
833 case Builtin::BI__sync_fetch_and_sub_4:
834 case Builtin::BI__sync_fetch_and_sub_8:
835 case Builtin::BI__sync_fetch_and_sub_16:
836 case Builtin::BI__sync_fetch_and_or_1:
837 case Builtin::BI__sync_fetch_and_or_2:
838 case Builtin::BI__sync_fetch_and_or_4:
839 case Builtin::BI__sync_fetch_and_or_8:
840 case Builtin::BI__sync_fetch_and_or_16:
841 case Builtin::BI__sync_fetch_and_and_1:
842 case Builtin::BI__sync_fetch_and_and_2:
843 case Builtin::BI__sync_fetch_and_and_4:
844 case Builtin::BI__sync_fetch_and_and_8:
845 case Builtin::BI__sync_fetch_and_and_16:
846 case Builtin::BI__sync_fetch_and_xor_1:
847 case Builtin::BI__sync_fetch_and_xor_2:
848 case Builtin::BI__sync_fetch_and_xor_4:
849 case Builtin::BI__sync_fetch_and_xor_8:
850 case Builtin::BI__sync_fetch_and_xor_16:
851 case Builtin::BI__sync_fetch_and_nand_1:
852 case Builtin::BI__sync_fetch_and_nand_2:
853 case Builtin::BI__sync_fetch_and_nand_4:
854 case Builtin::BI__sync_fetch_and_nand_8:
855 case Builtin::BI__sync_fetch_and_nand_16:
856 case Builtin::BI__sync_fetch_and_min:
857 case Builtin::BI__sync_fetch_and_max:
858 case Builtin::BI__sync_fetch_and_umin:
859 case Builtin::BI__sync_fetch_and_umax:
860 case Builtin::BI__sync_add_and_fetch_1:
861 case Builtin::BI__sync_add_and_fetch_2:
862 case Builtin::BI__sync_add_and_fetch_4:
863 case Builtin::BI__sync_add_and_fetch_8:
864 case Builtin::BI__sync_add_and_fetch_16:
865 case Builtin::BI__sync_sub_and_fetch_1:
866 case Builtin::BI__sync_sub_and_fetch_2:
867 case Builtin::BI__sync_sub_and_fetch_4:
868 case Builtin::BI__sync_sub_and_fetch_8:
869 case Builtin::BI__sync_sub_and_fetch_16:
870 case Builtin::BI__sync_and_and_fetch_1:
871 case Builtin::BI__sync_and_and_fetch_2:
872 case Builtin::BI__sync_and_and_fetch_4:
873 case Builtin::BI__sync_and_and_fetch_8:
874 case Builtin::BI__sync_and_and_fetch_16:
875 case Builtin::BI__sync_or_and_fetch_1:
876 case Builtin::BI__sync_or_and_fetch_2:
877 case Builtin::BI__sync_or_and_fetch_4:
878 case Builtin::BI__sync_or_and_fetch_8:
879 case Builtin::BI__sync_or_and_fetch_16:
880 case Builtin::BI__sync_xor_and_fetch_1:
881 case Builtin::BI__sync_xor_and_fetch_2:
882 case Builtin::BI__sync_xor_and_fetch_4:
883 case Builtin::BI__sync_xor_and_fetch_8:
884 case Builtin::BI__sync_xor_and_fetch_16:
885 case Builtin::BI__sync_nand_and_fetch_1:
886 case Builtin::BI__sync_nand_and_fetch_2:
887 case Builtin::BI__sync_nand_and_fetch_4:
888 case Builtin::BI__sync_nand_and_fetch_8:
889 case Builtin::BI__sync_nand_and_fetch_16:
890 case Builtin::BI__sync_val_compare_and_swap_1:
891 case Builtin::BI__sync_val_compare_and_swap_2:
892 case Builtin::BI__sync_val_compare_and_swap_4:
893 case Builtin::BI__sync_val_compare_and_swap_8:
894 case Builtin::BI__sync_val_compare_and_swap_16:
895 case Builtin::BI__sync_bool_compare_and_swap_1:
896 case Builtin::BI__sync_bool_compare_and_swap_2:
897 case Builtin::BI__sync_bool_compare_and_swap_4:
898 case Builtin::BI__sync_bool_compare_and_swap_8:
899 case Builtin::BI__sync_bool_compare_and_swap_16:
900 case Builtin::BI__sync_swap_1:
901 case Builtin::BI__sync_swap_2:
902 case Builtin::BI__sync_swap_4:
903 case Builtin::BI__sync_swap_8:
904 case Builtin::BI__sync_swap_16:
905 case Builtin::BI__sync_lock_test_and_set_1:
906 case Builtin::BI__sync_lock_test_and_set_2:
907 case Builtin::BI__sync_lock_test_and_set_4:
908 case Builtin::BI__sync_lock_test_and_set_8:
909 case Builtin::BI__sync_lock_test_and_set_16:
910 case Builtin::BI__sync_lock_release_1:
911 case Builtin::BI__sync_lock_release_2:
912 case Builtin::BI__sync_lock_release_4:
913 case Builtin::BI__sync_lock_release_8:
914 case Builtin::BI__sync_lock_release_16:
915 case Builtin::BI__sync_synchronize:
916 case Builtin::BI__builtin_nontemporal_load:
917 case Builtin::BI__builtin_nontemporal_store:
918 case Builtin::BI__c11_atomic_is_lock_free:
919 case Builtin::BI__atomic_is_lock_free:
920 case Builtin::BI__atomic_test_and_set:
921 case Builtin::BI__atomic_clear:
922 case Builtin::BI__atomic_thread_fence:
923 case Builtin::BI__atomic_signal_fence:
924 case Builtin::BI__c11_atomic_thread_fence:
925 case Builtin::BI__c11_atomic_signal_fence:
926 case Builtin::BI__scoped_atomic_thread_fence:
927 case Builtin::BI__builtin_signbit:
928 case Builtin::BI__builtin_signbitf:
929 case Builtin::BI__builtin_signbitl:
930 case Builtin::BI__warn_memset_zero_len:
931 case Builtin::BI__annotation:
932 case Builtin::BI__builtin_annotation:
933 case Builtin::BI__builtin_addcb:
934 case Builtin::BI__builtin_addcs:
935 case Builtin::BI__builtin_addc:
936 case Builtin::BI__builtin_addcl:
937 case Builtin::BI__builtin_addcll:
938 case Builtin::BI__builtin_subcb:
939 case Builtin::BI__builtin_subcs:
940 case Builtin::BI__builtin_subc:
941 case Builtin::BI__builtin_subcl:
942 case Builtin::BI__builtin_subcll:
945 case Builtin::BI__builtin_add_overflow:
946 case Builtin::BI__builtin_sub_overflow:
947 case Builtin::BI__builtin_mul_overflow: {
955 WidthAndSignedness leftInfo =
957 WidthAndSignedness rightInfo =
959 WidthAndSignedness resultInfo =
965 WidthAndSignedness encompassingInfo =
968 auto encompassingCIRTy = cir::IntType::get(
969 &
getMLIRContext(), encompassingInfo.width, encompassingInfo.isSigned);
970 auto resultCIRTy = mlir::cast<cir::IntType>(
cgm.convertType(resultQTy));
977 if (left.getType() != encompassingCIRTy)
979 builder.createCast(cir::CastKind::integral, left, encompassingCIRTy);
980 if (right.getType() != encompassingCIRTy)
982 builder.createCast(cir::CastKind::integral, right, encompassingCIRTy);
985 cir::BinOpOverflowKind opKind;
988 llvm_unreachable(
"Unknown overflow builtin id.");
989 case Builtin::BI__builtin_add_overflow:
990 opKind = cir::BinOpOverflowKind::Add;
992 case Builtin::BI__builtin_sub_overflow:
993 opKind = cir::BinOpOverflowKind::Sub;
995 case Builtin::BI__builtin_mul_overflow:
996 opKind = cir::BinOpOverflowKind::Mul;
1001 auto arithOp = cir::BinOpOverflowOp::create(builder, loc, resultCIRTy,
1002 opKind, left, right);
1016 builder.createStore(loc,
emitToMemory(arithOp.getResult(), resultQTy),
1017 resultPtr, isVolatile);
1022 case Builtin::BI__builtin_uadd_overflow:
1023 case Builtin::BI__builtin_uaddl_overflow:
1024 case Builtin::BI__builtin_uaddll_overflow:
1025 case Builtin::BI__builtin_usub_overflow:
1026 case Builtin::BI__builtin_usubl_overflow:
1027 case Builtin::BI__builtin_usubll_overflow:
1028 case Builtin::BI__builtin_umul_overflow:
1029 case Builtin::BI__builtin_umull_overflow:
1030 case Builtin::BI__builtin_umulll_overflow:
1031 case Builtin::BI__builtin_sadd_overflow:
1032 case Builtin::BI__builtin_saddl_overflow:
1033 case Builtin::BI__builtin_saddll_overflow:
1034 case Builtin::BI__builtin_ssub_overflow:
1035 case Builtin::BI__builtin_ssubl_overflow:
1036 case Builtin::BI__builtin_ssubll_overflow:
1037 case Builtin::BI__builtin_smul_overflow:
1038 case Builtin::BI__builtin_smull_overflow:
1039 case Builtin::BI__builtin_smulll_overflow: {
1048 cir::BinOpOverflowKind arithKind;
1049 switch (builtinID) {
1051 llvm_unreachable(
"Unknown overflow builtin id.");
1052 case Builtin::BI__builtin_uadd_overflow:
1053 case Builtin::BI__builtin_uaddl_overflow:
1054 case Builtin::BI__builtin_uaddll_overflow:
1055 case Builtin::BI__builtin_sadd_overflow:
1056 case Builtin::BI__builtin_saddl_overflow:
1057 case Builtin::BI__builtin_saddll_overflow:
1058 arithKind = cir::BinOpOverflowKind::Add;
1060 case Builtin::BI__builtin_usub_overflow:
1061 case Builtin::BI__builtin_usubl_overflow:
1062 case Builtin::BI__builtin_usubll_overflow:
1063 case Builtin::BI__builtin_ssub_overflow:
1064 case Builtin::BI__builtin_ssubl_overflow:
1065 case Builtin::BI__builtin_ssubll_overflow:
1066 arithKind = cir::BinOpOverflowKind::Sub;
1068 case Builtin::BI__builtin_umul_overflow:
1069 case Builtin::BI__builtin_umull_overflow:
1070 case Builtin::BI__builtin_umulll_overflow:
1071 case Builtin::BI__builtin_smul_overflow:
1072 case Builtin::BI__builtin_smull_overflow:
1073 case Builtin::BI__builtin_smulll_overflow:
1074 arithKind = cir::BinOpOverflowKind::Mul;
1080 auto resultCIRTy = mlir::cast<cir::IntType>(
cgm.convertType(resultQTy));
1083 cir::BinOpOverflowOp arithOp = cir::BinOpOverflowOp::create(
1084 builder, loc, resultCIRTy, arithKind, x, y);
1088 builder.createStore(loc,
emitToMemory(arithOp.getResult(), resultQTy),
1089 resultPtr, isVolatile);
1094 case Builtin::BIaddressof:
1095 case Builtin::BI__addressof:
1096 case Builtin::BI__builtin_addressof:
1097 case Builtin::BI__builtin_function_start:
1099 case Builtin::BI__builtin_operator_new:
1102 case Builtin::BI__builtin_operator_delete:
1106 case Builtin::BI__builtin_is_aligned:
1107 case Builtin::BI__builtin_align_up:
1108 case Builtin::BI__builtin_align_down:
1109 case Builtin::BI__noop:
1110 case Builtin::BI__builtin_call_with_static_chain:
1111 case Builtin::BI_InterlockedExchange8:
1112 case Builtin::BI_InterlockedExchange16:
1113 case Builtin::BI_InterlockedExchange:
1114 case Builtin::BI_InterlockedExchangePointer:
1115 case Builtin::BI_InterlockedCompareExchangePointer:
1116 case Builtin::BI_InterlockedCompareExchangePointer_nf:
1117 case Builtin::BI_InterlockedCompareExchange8:
1118 case Builtin::BI_InterlockedCompareExchange16:
1119 case Builtin::BI_InterlockedCompareExchange:
1120 case Builtin::BI_InterlockedCompareExchange64:
1121 case Builtin::BI_InterlockedIncrement16:
1122 case Builtin::BI_InterlockedIncrement:
1123 case Builtin::BI_InterlockedDecrement16:
1124 case Builtin::BI_InterlockedDecrement:
1125 case Builtin::BI_InterlockedAnd8:
1126 case Builtin::BI_InterlockedAnd16:
1127 case Builtin::BI_InterlockedAnd:
1128 case Builtin::BI_InterlockedExchangeAdd8:
1129 case Builtin::BI_InterlockedExchangeAdd16:
1130 case Builtin::BI_InterlockedExchangeAdd:
1131 case Builtin::BI_InterlockedExchangeSub8:
1132 case Builtin::BI_InterlockedExchangeSub16:
1133 case Builtin::BI_InterlockedExchangeSub:
1134 case Builtin::BI_InterlockedOr8:
1135 case Builtin::BI_InterlockedOr16:
1136 case Builtin::BI_InterlockedOr:
1137 case Builtin::BI_InterlockedXor8:
1138 case Builtin::BI_InterlockedXor16:
1139 case Builtin::BI_InterlockedXor:
1140 case Builtin::BI_bittest64:
1141 case Builtin::BI_bittest:
1142 case Builtin::BI_bittestandcomplement64:
1143 case Builtin::BI_bittestandcomplement:
1144 case Builtin::BI_bittestandreset64:
1145 case Builtin::BI_bittestandreset:
1146 case Builtin::BI_bittestandset64:
1147 case Builtin::BI_bittestandset:
1148 case Builtin::BI_interlockedbittestandreset:
1149 case Builtin::BI_interlockedbittestandreset64:
1150 case Builtin::BI_interlockedbittestandreset64_acq:
1151 case Builtin::BI_interlockedbittestandreset64_rel:
1152 case Builtin::BI_interlockedbittestandreset64_nf:
1153 case Builtin::BI_interlockedbittestandset64:
1154 case Builtin::BI_interlockedbittestandset64_acq:
1155 case Builtin::BI_interlockedbittestandset64_rel:
1156 case Builtin::BI_interlockedbittestandset64_nf:
1157 case Builtin::BI_interlockedbittestandset:
1158 case Builtin::BI_interlockedbittestandset_acq:
1159 case Builtin::BI_interlockedbittestandset_rel:
1160 case Builtin::BI_interlockedbittestandset_nf:
1161 case Builtin::BI_interlockedbittestandreset_acq:
1162 case Builtin::BI_interlockedbittestandreset_rel:
1163 case Builtin::BI_interlockedbittestandreset_nf:
1164 case Builtin::BI__iso_volatile_load8:
1165 case Builtin::BI__iso_volatile_load16:
1166 case Builtin::BI__iso_volatile_load32:
1167 case Builtin::BI__iso_volatile_load64:
1168 case Builtin::BI__iso_volatile_store8:
1169 case Builtin::BI__iso_volatile_store16:
1170 case Builtin::BI__iso_volatile_store32:
1171 case Builtin::BI__iso_volatile_store64:
1172 case Builtin::BI__builtin_ptrauth_sign_constant:
1173 case Builtin::BI__builtin_ptrauth_auth:
1174 case Builtin::BI__builtin_ptrauth_auth_and_resign:
1175 case Builtin::BI__builtin_ptrauth_blend_discriminator:
1176 case Builtin::BI__builtin_ptrauth_sign_generic_data:
1177 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
1178 case Builtin::BI__builtin_ptrauth_strip:
1179 case Builtin::BI__builtin_get_vtable_pointer:
1180 case Builtin::BI__exception_code:
1181 case Builtin::BI_exception_code:
1182 case Builtin::BI__exception_info:
1183 case Builtin::BI_exception_info:
1184 case Builtin::BI__abnormal_termination:
1185 case Builtin::BI_abnormal_termination:
1186 case Builtin::BI_setjmpex:
1187 case Builtin::BI_setjmp:
1188 case Builtin::BImove:
1189 case Builtin::BImove_if_noexcept:
1190 case Builtin::BIforward:
1191 case Builtin::BIforward_like:
1192 case Builtin::BIas_const:
1193 case Builtin::BI__GetExceptionInfo:
1194 case Builtin::BI__fastfail:
1195 case Builtin::BIread_pipe:
1196 case Builtin::BIwrite_pipe:
1197 case Builtin::BIreserve_read_pipe:
1198 case Builtin::BIreserve_write_pipe:
1199 case Builtin::BIwork_group_reserve_read_pipe:
1200 case Builtin::BIwork_group_reserve_write_pipe:
1201 case Builtin::BIsub_group_reserve_read_pipe:
1202 case Builtin::BIsub_group_reserve_write_pipe:
1203 case Builtin::BIcommit_read_pipe:
1204 case Builtin::BIcommit_write_pipe:
1205 case Builtin::BIwork_group_commit_read_pipe:
1206 case Builtin::BIwork_group_commit_write_pipe:
1207 case Builtin::BIsub_group_commit_read_pipe:
1208 case Builtin::BIsub_group_commit_write_pipe:
1209 case Builtin::BIget_pipe_num_packets:
1210 case Builtin::BIget_pipe_max_packets:
1211 case Builtin::BIto_global:
1212 case Builtin::BIto_local:
1213 case Builtin::BIto_private:
1214 case Builtin::BIenqueue_kernel:
1215 case Builtin::BIget_kernel_work_group_size:
1216 case Builtin::BIget_kernel_preferred_work_group_size_multiple:
1217 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange:
1218 case Builtin::BIget_kernel_sub_group_count_for_ndrange:
1219 case Builtin::BI__builtin_store_half:
1220 case Builtin::BI__builtin_store_halff:
1221 case Builtin::BI__builtin_load_half:
1222 case Builtin::BI__builtin_load_halff:
1224 case Builtin::BI__builtin_printf:
1225 case Builtin::BIprintf:
1227 case Builtin::BI__builtin_canonicalize:
1228 case Builtin::BI__builtin_canonicalizef:
1229 case Builtin::BI__builtin_canonicalizef16:
1230 case Builtin::BI__builtin_canonicalizel:
1231 case Builtin::BI__builtin_thread_pointer:
1232 case Builtin::BI__builtin_os_log_format:
1233 case Builtin::BI__xray_customevent:
1234 case Builtin::BI__xray_typedevent:
1235 case Builtin::BI__builtin_ms_va_start:
1236 case Builtin::BI__builtin_ms_va_end:
1237 case Builtin::BI__builtin_ms_va_copy:
1238 case Builtin::BI__builtin_get_device_side_mangled_name:
1245 if (
getContext().BuiltinInfo.isLibFunction(builtinID))
1247 cgm.getBuiltinLibFunction(fd, builtinID));
1263 if (mlir::isa<cir::VoidType>(v.getType()))
1270 llvm_unreachable(
"No current target builtin returns complex");
1272 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
1276 std::string(
"unimplemented builtin call: ") +
1277 getContext().BuiltinInfo.getName(builtinID));