422 unsigned builtinID) {
425 case Builtin::BIacos:
426 case Builtin::BIacosf:
427 case Builtin::BIacosl:
428 case Builtin::BI__builtin_acos:
429 case Builtin::BI__builtin_acosf:
430 case Builtin::BI__builtin_acosf16:
431 case Builtin::BI__builtin_acosl:
432 case Builtin::BI__builtin_acosf128:
433 case Builtin::BI__builtin_elementwise_acos:
435 case Builtin::BIasin:
436 case Builtin::BIasinf:
437 case Builtin::BIasinl:
438 case Builtin::BI__builtin_asin:
439 case Builtin::BI__builtin_asinf:
440 case Builtin::BI__builtin_asinf16:
441 case Builtin::BI__builtin_asinl:
442 case Builtin::BI__builtin_asinf128:
443 case Builtin::BI__builtin_elementwise_asin:
445 case Builtin::BIatan:
446 case Builtin::BIatanf:
447 case Builtin::BIatanl:
448 case Builtin::BI__builtin_atan:
449 case Builtin::BI__builtin_atanf:
450 case Builtin::BI__builtin_atanf16:
451 case Builtin::BI__builtin_atanl:
452 case Builtin::BI__builtin_atanf128:
453 case Builtin::BI__builtin_elementwise_atan:
455 case Builtin::BIatan2:
456 case Builtin::BIatan2f:
457 case Builtin::BIatan2l:
458 case Builtin::BI__builtin_atan2:
459 case Builtin::BI__builtin_atan2f:
460 case Builtin::BI__builtin_atan2f16:
461 case Builtin::BI__builtin_atan2l:
462 case Builtin::BI__builtin_atan2f128:
463 case Builtin::BI__builtin_elementwise_atan2:
466 case Builtin::BIceil:
467 case Builtin::BIceilf:
468 case Builtin::BIceill:
469 case Builtin::BI__builtin_ceil:
470 case Builtin::BI__builtin_ceilf:
471 case Builtin::BI__builtin_ceilf16:
472 case Builtin::BI__builtin_ceill:
473 case Builtin::BI__builtin_ceilf128:
475 case Builtin::BI__builtin_elementwise_ceil:
477 case Builtin::BIcopysign:
478 case Builtin::BIcopysignf:
479 case Builtin::BIcopysignl:
480 case Builtin::BI__builtin_copysign:
481 case Builtin::BI__builtin_copysignf:
482 case Builtin::BI__builtin_copysignf16:
483 case Builtin::BI__builtin_copysignl:
484 case Builtin::BI__builtin_copysignf128:
487 case Builtin::BIcosf:
488 case Builtin::BIcosl:
489 case Builtin::BI__builtin_cos:
490 case Builtin::BI__builtin_cosf:
491 case Builtin::BI__builtin_cosf16:
492 case Builtin::BI__builtin_cosl:
493 case Builtin::BI__builtin_cosf128:
495 case Builtin::BI__builtin_elementwise_cos:
496 case Builtin::BIcosh:
497 case Builtin::BIcoshf:
498 case Builtin::BIcoshl:
499 case Builtin::BI__builtin_cosh:
500 case Builtin::BI__builtin_coshf:
501 case Builtin::BI__builtin_coshf16:
502 case Builtin::BI__builtin_coshl:
503 case Builtin::BI__builtin_coshf128:
504 case Builtin::BI__builtin_elementwise_cosh:
507 case Builtin::BIexpf:
508 case Builtin::BIexpl:
509 case Builtin::BI__builtin_exp:
510 case Builtin::BI__builtin_expf:
511 case Builtin::BI__builtin_expf16:
512 case Builtin::BI__builtin_expl:
513 case Builtin::BI__builtin_expf128:
515 case Builtin::BI__builtin_elementwise_exp:
517 case Builtin::BIexp2:
518 case Builtin::BIexp2f:
519 case Builtin::BIexp2l:
520 case Builtin::BI__builtin_exp2:
521 case Builtin::BI__builtin_exp2f:
522 case Builtin::BI__builtin_exp2f16:
523 case Builtin::BI__builtin_exp2l:
524 case Builtin::BI__builtin_exp2f128:
526 case Builtin::BI__builtin_elementwise_exp2:
527 case Builtin::BI__builtin_exp10:
528 case Builtin::BI__builtin_exp10f:
529 case Builtin::BI__builtin_exp10f16:
530 case Builtin::BI__builtin_exp10l:
531 case Builtin::BI__builtin_exp10f128:
532 case Builtin::BI__builtin_elementwise_exp10:
534 case Builtin::BIfabs:
535 case Builtin::BIfabsf:
536 case Builtin::BIfabsl:
537 case Builtin::BI__builtin_fabs:
538 case Builtin::BI__builtin_fabsf:
539 case Builtin::BI__builtin_fabsf16:
540 case Builtin::BI__builtin_fabsl:
541 case Builtin::BI__builtin_fabsf128:
543 case Builtin::BIfloor:
544 case Builtin::BIfloorf:
545 case Builtin::BIfloorl:
546 case Builtin::BI__builtin_floor:
547 case Builtin::BI__builtin_floorf:
548 case Builtin::BI__builtin_floorf16:
549 case Builtin::BI__builtin_floorl:
550 case Builtin::BI__builtin_floorf128:
552 case Builtin::BI__builtin_elementwise_floor:
554 case Builtin::BIfmaf:
555 case Builtin::BIfmal:
556 case Builtin::BI__builtin_fma:
557 case Builtin::BI__builtin_fmaf:
558 case Builtin::BI__builtin_fmaf16:
559 case Builtin::BI__builtin_fmal:
560 case Builtin::BI__builtin_fmaf128:
561 case Builtin::BI__builtin_elementwise_fma:
563 case Builtin::BIfmax:
564 case Builtin::BIfmaxf:
565 case Builtin::BIfmaxl:
566 case Builtin::BI__builtin_fmax:
567 case Builtin::BI__builtin_fmaxf:
568 case Builtin::BI__builtin_fmaxf16:
569 case Builtin::BI__builtin_fmaxl:
570 case Builtin::BI__builtin_fmaxf128:
573 case Builtin::BIfmin:
574 case Builtin::BIfminf:
575 case Builtin::BIfminl:
576 case Builtin::BI__builtin_fmin:
577 case Builtin::BI__builtin_fminf:
578 case Builtin::BI__builtin_fminf16:
579 case Builtin::BI__builtin_fminl:
580 case Builtin::BI__builtin_fminf128:
583 case Builtin::BIfmaximum_num:
584 case Builtin::BIfmaximum_numf:
585 case Builtin::BIfmaximum_numl:
586 case Builtin::BI__builtin_fmaximum_num:
587 case Builtin::BI__builtin_fmaximum_numf:
588 case Builtin::BI__builtin_fmaximum_numf16:
589 case Builtin::BI__builtin_fmaximum_numl:
590 case Builtin::BI__builtin_fmaximum_numf128:
591 case Builtin::BIfminimum_num:
592 case Builtin::BIfminimum_numf:
593 case Builtin::BIfminimum_numl:
594 case Builtin::BI__builtin_fminimum_num:
595 case Builtin::BI__builtin_fminimum_numf:
596 case Builtin::BI__builtin_fminimum_numf16:
597 case Builtin::BI__builtin_fminimum_numl:
598 case Builtin::BI__builtin_fminimum_numf128:
600 case Builtin::BIfmod:
601 case Builtin::BIfmodf:
602 case Builtin::BIfmodl:
603 case Builtin::BI__builtin_fmod:
604 case Builtin::BI__builtin_fmodf:
605 case Builtin::BI__builtin_fmodf16:
606 case Builtin::BI__builtin_fmodl:
607 case Builtin::BI__builtin_fmodf128:
608 case Builtin::BI__builtin_elementwise_fmod:
612 case Builtin::BIlogf:
613 case Builtin::BIlogl:
614 case Builtin::BI__builtin_log:
615 case Builtin::BI__builtin_logf:
616 case Builtin::BI__builtin_logf16:
617 case Builtin::BI__builtin_logl:
618 case Builtin::BI__builtin_logf128:
619 case Builtin::BI__builtin_elementwise_log:
621 case Builtin::BIlog10:
622 case Builtin::BIlog10f:
623 case Builtin::BIlog10l:
624 case Builtin::BI__builtin_log10:
625 case Builtin::BI__builtin_log10f:
626 case Builtin::BI__builtin_log10f16:
627 case Builtin::BI__builtin_log10l:
628 case Builtin::BI__builtin_log10f128:
629 case Builtin::BI__builtin_elementwise_log10:
631 case Builtin::BIlog2:
632 case Builtin::BIlog2f:
633 case Builtin::BIlog2l:
634 case Builtin::BI__builtin_log2:
635 case Builtin::BI__builtin_log2f:
636 case Builtin::BI__builtin_log2f16:
637 case Builtin::BI__builtin_log2l:
638 case Builtin::BI__builtin_log2f128:
639 case Builtin::BI__builtin_elementwise_log2:
641 case Builtin::BInearbyint:
642 case Builtin::BInearbyintf:
643 case Builtin::BInearbyintl:
644 case Builtin::BI__builtin_nearbyint:
645 case Builtin::BI__builtin_nearbyintf:
646 case Builtin::BI__builtin_nearbyintl:
647 case Builtin::BI__builtin_nearbyintf128:
648 case Builtin::BI__builtin_elementwise_nearbyint:
651 case Builtin::BIpowf:
652 case Builtin::BIpowl:
653 case Builtin::BI__builtin_pow:
654 case Builtin::BI__builtin_powf:
655 case Builtin::BI__builtin_powf16:
656 case Builtin::BI__builtin_powl:
657 case Builtin::BI__builtin_powf128:
660 case Builtin::BI__builtin_elementwise_pow:
662 case Builtin::BIrint:
663 case Builtin::BIrintf:
664 case Builtin::BIrintl:
665 case Builtin::BI__builtin_rint:
666 case Builtin::BI__builtin_rintf:
667 case Builtin::BI__builtin_rintf16:
668 case Builtin::BI__builtin_rintl:
669 case Builtin::BI__builtin_rintf128:
670 case Builtin::BI__builtin_elementwise_rint:
672 case Builtin::BIround:
673 case Builtin::BIroundf:
674 case Builtin::BIroundl:
675 case Builtin::BI__builtin_round:
676 case Builtin::BI__builtin_roundf:
677 case Builtin::BI__builtin_roundf16:
678 case Builtin::BI__builtin_roundl:
679 case Builtin::BI__builtin_roundf128:
680 case Builtin::BI__builtin_elementwise_round:
682 case Builtin::BIroundeven:
683 case Builtin::BIroundevenf:
684 case Builtin::BIroundevenl:
685 case Builtin::BI__builtin_roundeven:
686 case Builtin::BI__builtin_roundevenf:
687 case Builtin::BI__builtin_roundevenf16:
688 case Builtin::BI__builtin_roundevenl:
689 case Builtin::BI__builtin_roundevenf128:
690 case Builtin::BI__builtin_elementwise_roundeven:
693 case Builtin::BIsinf:
694 case Builtin::BIsinl:
695 case Builtin::BI__builtin_sin:
696 case Builtin::BI__builtin_sinf:
697 case Builtin::BI__builtin_sinf16:
698 case Builtin::BI__builtin_sinl:
699 case Builtin::BI__builtin_sinf128:
700 case Builtin::BI__builtin_elementwise_sin:
702 case Builtin::BIsinh:
703 case Builtin::BIsinhf:
704 case Builtin::BIsinhl:
705 case Builtin::BI__builtin_sinh:
706 case Builtin::BI__builtin_sinhf:
707 case Builtin::BI__builtin_sinhf16:
708 case Builtin::BI__builtin_sinhl:
709 case Builtin::BI__builtin_sinhf128:
710 case Builtin::BI__builtin_elementwise_sinh:
711 case Builtin::BI__builtin_sincospi:
712 case Builtin::BI__builtin_sincospif:
713 case Builtin::BI__builtin_sincospil:
714 case Builtin::BIsincos:
715 case Builtin::BIsincosf:
716 case Builtin::BIsincosl:
717 case Builtin::BI__builtin_sincos:
718 case Builtin::BI__builtin_sincosf:
719 case Builtin::BI__builtin_sincosf16:
720 case Builtin::BI__builtin_sincosl:
721 case Builtin::BI__builtin_sincosf128:
723 case Builtin::BIsqrt:
724 case Builtin::BIsqrtf:
725 case Builtin::BIsqrtl:
726 case Builtin::BI__builtin_sqrt:
727 case Builtin::BI__builtin_sqrtf:
728 case Builtin::BI__builtin_sqrtf16:
729 case Builtin::BI__builtin_sqrtl:
730 case Builtin::BI__builtin_sqrtf128:
731 case Builtin::BI__builtin_elementwise_sqrt:
734 case Builtin::BItanf:
735 case Builtin::BItanl:
736 case Builtin::BI__builtin_tan:
737 case Builtin::BI__builtin_tanf:
738 case Builtin::BI__builtin_tanf16:
739 case Builtin::BI__builtin_tanl:
740 case Builtin::BI__builtin_tanf128:
741 case Builtin::BI__builtin_elementwise_tan:
743 case Builtin::BItanh:
744 case Builtin::BItanhf:
745 case Builtin::BItanhl:
746 case Builtin::BI__builtin_tanh:
747 case Builtin::BI__builtin_tanhf:
748 case Builtin::BI__builtin_tanhf16:
749 case Builtin::BI__builtin_tanhl:
750 case Builtin::BI__builtin_tanhf128:
751 case Builtin::BI__builtin_elementwise_tanh:
753 case Builtin::BItrunc:
754 case Builtin::BItruncf:
755 case Builtin::BItruncl:
756 case Builtin::BI__builtin_trunc:
757 case Builtin::BI__builtin_truncf:
758 case Builtin::BI__builtin_truncf16:
759 case Builtin::BI__builtin_truncl:
760 case Builtin::BI__builtin_truncf128:
761 case Builtin::BI__builtin_elementwise_trunc:
763 case Builtin::BIlround:
764 case Builtin::BIlroundf:
765 case Builtin::BIlroundl:
766 case Builtin::BI__builtin_lround:
767 case Builtin::BI__builtin_lroundf:
768 case Builtin::BI__builtin_lroundl:
769 case Builtin::BI__builtin_lroundf128:
771 case Builtin::BIllround:
772 case Builtin::BIllroundf:
773 case Builtin::BIllroundl:
774 case Builtin::BI__builtin_llround:
775 case Builtin::BI__builtin_llroundf:
776 case Builtin::BI__builtin_llroundl:
777 case Builtin::BI__builtin_llroundf128:
779 case Builtin::BIlrint:
780 case Builtin::BIlrintf:
781 case Builtin::BIlrintl:
782 case Builtin::BI__builtin_lrint:
783 case Builtin::BI__builtin_lrintf:
784 case Builtin::BI__builtin_lrintl:
785 case Builtin::BI__builtin_lrintf128:
787 case Builtin::BIllrint:
788 case Builtin::BIllrintf:
789 case Builtin::BIllrintl:
790 case Builtin::BI__builtin_llrint:
791 case Builtin::BI__builtin_llrintf:
792 case Builtin::BI__builtin_llrintl:
793 case Builtin::BI__builtin_llrintf128:
795 case Builtin::BI__builtin_ldexp:
796 case Builtin::BI__builtin_ldexpf:
797 case Builtin::BI__builtin_ldexpl:
798 case Builtin::BI__builtin_ldexpf16:
799 case Builtin::BI__builtin_ldexpf128:
800 case Builtin::BI__builtin_elementwise_ldexp:
923 if (
type->isBooleanType())
925 builder.getBool(result.
Val.
getInt().getBoolValue(), loc));
947 unsigned builtinIDIfNoAsmLabel = fd->
hasAttr<AsmLabelAttr>() ? 0 : builtinID;
949 bool generateFPMathIntrinsics =
952 if (generateFPMathIntrinsics) {
964 switch (builtinIDIfNoAsmLabel) {
969 case Builtin::BI__builtin_stdarg_start:
970 case Builtin::BI__builtin_va_start:
971 case Builtin::BI__va_start: {
972 mlir::Value vaList = builtinID == Builtin::BI__va_start
979 case Builtin::BI__builtin_va_end:
982 case Builtin::BI__builtin_va_copy: {
985 cir::VACopyOp::create(builder, dstPtr.getLoc(), dstPtr, srcPtr);
990 case Builtin::BIlabs:
991 case Builtin::BIllabs:
992 case Builtin::BI__builtin_abs:
993 case Builtin::BI__builtin_labs:
994 case Builtin::BI__builtin_llabs: {
995 bool sanitizeOverflow =
sanOpts.has(SanitizerKind::SignedIntegerOverflow);
998 switch (
getLangOpts().getSignedOverflowBehavior()) {
1000 result = cir::AbsOp::create(builder, loc, arg.getType(), arg,
1004 if (!sanitizeOverflow) {
1005 result = cir::AbsOp::create(builder, loc, arg.getType(), arg,
1017 case Builtin::BI__assume:
1018 case Builtin::BI__builtin_assume: {
1023 cir::AssumeOp::create(builder, loc, argValue);
1027 case Builtin::BI__builtin_assume_separate_storage: {
1030 cir::AssumeSepStorageOp::create(builder, loc, value0, value1);
1034 case Builtin::BI__builtin_assume_aligned: {
1037 mlir::Value offsetValue =
1040 std::optional<llvm::APSInt> alignment =
1042 assert(alignment.has_value() &&
1043 "the second argument to __builtin_assume_aligned must be an "
1044 "integral constant expression");
1046 mlir::Value result =
1048 alignment->getSExtValue(), offsetValue);
1052 case Builtin::BI__builtin_complex: {
1055 mlir::Value complex = builder.createComplexCreate(loc, real, imag);
1059 case Builtin::BI__builtin_creal:
1060 case Builtin::BI__builtin_crealf:
1061 case Builtin::BI__builtin_creall:
1062 case Builtin::BIcreal:
1063 case Builtin::BIcrealf:
1064 case Builtin::BIcreall: {
1066 mlir::Value real = builder.createComplexReal(loc, complex);
1070 case Builtin::BI__builtin_cimag:
1071 case Builtin::BI__builtin_cimagf:
1072 case Builtin::BI__builtin_cimagl:
1073 case Builtin::BIcimag:
1074 case Builtin::BIcimagf:
1075 case Builtin::BIcimagl: {
1077 mlir::Value imag = builder.createComplexImag(loc, complex);
1081 case Builtin::BI__builtin_conj:
1082 case Builtin::BI__builtin_conjf:
1083 case Builtin::BI__builtin_conjl:
1084 case Builtin::BIconj:
1085 case Builtin::BIconjf:
1086 case Builtin::BIconjl: {
1089 cir::UnaryOpKind::Not, complex);
1093 case Builtin::BI__builtin_clrsb:
1094 case Builtin::BI__builtin_clrsbl:
1095 case Builtin::BI__builtin_clrsbll:
1098 case Builtin::BI__builtin_ctzs:
1099 case Builtin::BI__builtin_ctz:
1100 case Builtin::BI__builtin_ctzl:
1101 case Builtin::BI__builtin_ctzll:
1102 case Builtin::BI__builtin_ctzg:
1106 case Builtin::BI__builtin_clzs:
1107 case Builtin::BI__builtin_clz:
1108 case Builtin::BI__builtin_clzl:
1109 case Builtin::BI__builtin_clzll:
1110 case Builtin::BI__builtin_clzg:
1114 case Builtin::BI__builtin_ffs:
1115 case Builtin::BI__builtin_ffsl:
1116 case Builtin::BI__builtin_ffsll:
1119 case Builtin::BI__builtin_parity:
1120 case Builtin::BI__builtin_parityl:
1121 case Builtin::BI__builtin_parityll:
1124 case Builtin::BI__lzcnt16:
1125 case Builtin::BI__lzcnt:
1126 case Builtin::BI__lzcnt64:
1130 case Builtin::BI__popcnt16:
1131 case Builtin::BI__popcnt:
1132 case Builtin::BI__popcnt64:
1133 case Builtin::BI__builtin_popcount:
1134 case Builtin::BI__builtin_popcountl:
1135 case Builtin::BI__builtin_popcountll:
1136 case Builtin::BI__builtin_popcountg:
1143 case Builtin::BI__builtin_unpredictable: {
1147 case Builtin::BI__builtin_expect:
1148 case Builtin::BI__builtin_expect_with_probability: {
1150 if (
cgm.getCodeGenOpts().OptimizationLevel == 0)
1155 mlir::FloatAttr probAttr;
1156 if (builtinIDIfNoAsmLabel == Builtin::BI__builtin_expect_with_probability) {
1157 llvm::APFloat probability(0.0);
1159 [[maybe_unused]]
bool evalSucceeded =
1161 assert(evalSucceeded &&
1162 "probability should be able to evaluate as float");
1163 bool loseInfo =
false;
1164 probability.convert(llvm::APFloat::IEEEdouble(),
1165 llvm::RoundingMode::Dynamic, &loseInfo);
1166 probAttr = mlir::FloatAttr::get(mlir::Float64Type::get(&
getMLIRContext()),
1170 auto result = cir::ExpectOp::create(builder, loc, argValue.getType(),
1171 argValue, expectedValue, probAttr);
1175 case Builtin::BI__builtin_bswap16:
1176 case Builtin::BI__builtin_bswap32:
1177 case Builtin::BI__builtin_bswap64:
1178 case Builtin::BI_byteswap_ushort:
1179 case Builtin::BI_byteswap_ulong:
1180 case Builtin::BI_byteswap_uint64: {
1182 return RValue::get(cir::ByteSwapOp::create(builder, loc, arg));
1185 case Builtin::BI__builtin_bitreverse8:
1186 case Builtin::BI__builtin_bitreverse16:
1187 case Builtin::BI__builtin_bitreverse32:
1188 case Builtin::BI__builtin_bitreverse64: {
1190 return RValue::get(cir::BitReverseOp::create(builder, loc, arg));
1193 case Builtin::BI__builtin_rotateleft8:
1194 case Builtin::BI__builtin_rotateleft16:
1195 case Builtin::BI__builtin_rotateleft32:
1196 case Builtin::BI__builtin_rotateleft64:
1199 case Builtin::BI__builtin_rotateright8:
1200 case Builtin::BI__builtin_rotateright16:
1201 case Builtin::BI__builtin_rotateright32:
1202 case Builtin::BI__builtin_rotateright64:
1205 case Builtin::BI__builtin_coro_id:
1206 case Builtin::BI__builtin_coro_promise:
1207 case Builtin::BI__builtin_coro_resume:
1208 case Builtin::BI__builtin_coro_noop:
1209 case Builtin::BI__builtin_coro_destroy:
1210 case Builtin::BI__builtin_coro_done:
1211 case Builtin::BI__builtin_coro_alloc:
1212 case Builtin::BI__builtin_coro_begin:
1213 case Builtin::BI__builtin_coro_end:
1214 case Builtin::BI__builtin_coro_suspend:
1215 case Builtin::BI__builtin_coro_align:
1219 case Builtin::BI__builtin_coro_frame: {
1222 case Builtin::BI__builtin_coro_free:
1223 case Builtin::BI__builtin_coro_size: {
1225 mlir::Type ty =
cgm.getTypes().getFunctionType(
1226 cgm.getTypes().arrangeGlobalDeclaration(gd));
1229 cgm.getOrCreateCIRFunction(nd->getName(), ty, gd,
false);
1230 fnOp.setBuiltin(
true);
1235 case Builtin::BI__builtin_constant_p: {
1248 mlir::cast<cir::IntType>(resultType), 0));
1256 mlir::cast<cir::IntType>(resultType), 0));
1262 "__builtin_constant_p: Obj-C object pointer");
1265 argValue = builder.createBitcast(argValue,
convertType(argType));
1267 mlir::Value result = cir::IsConstantOp::create(
1270 result = builder.createBoolToInt(result, resultType);
1273 case Builtin::BI__builtin_dynamic_object_size:
1274 case Builtin::BI__builtin_object_size: {
1281 bool isDynamic = builtinID == Builtin::BI__builtin_dynamic_object_size;
1283 nullptr, isDynamic));
1286 case Builtin::BI__builtin_prefetch: {
1287 auto evaluateOperandAsInt = [&](
const Expr *arg) {
1289 [[maybe_unused]]
bool evalSucceed =
1290 arg->EvaluateAsInt(res,
cgm.getASTContext());
1291 assert(evalSucceed &&
"expression should be able to evaluate as int");
1295 bool isWrite =
false;
1297 isWrite = evaluateOperandAsInt(e->
getArg(1));
1301 locality = evaluateOperandAsInt(e->
getArg(2));
1304 cir::PrefetchOp::create(builder, loc, address, locality, isWrite);
1307 case Builtin::BI__builtin_readcyclecounter:
1308 case Builtin::BI__builtin_readsteadycounter:
1310 case Builtin::BI__builtin___clear_cache: {
1318 case Builtin::BI__builtin_trap:
1321 case Builtin::BI__builtin_verbose_trap:
1322 case Builtin::BI__debugbreak:
1324 case Builtin::BI__builtin_unreachable:
1327 case Builtin::BI__builtin_powi:
1328 case Builtin::BI__builtin_powif:
1329 case Builtin::BI__builtin_powil:
1330 case Builtin::BI__builtin_frexpl:
1331 case Builtin::BI__builtin_frexp:
1332 case Builtin::BI__builtin_frexpf:
1333 case Builtin::BI__builtin_frexpf128:
1334 case Builtin::BI__builtin_frexpf16:
1335 case Builtin::BImodf:
1336 case Builtin::BImodff:
1337 case Builtin::BImodfl:
1338 case Builtin::BI__builtin_modf:
1339 case Builtin::BI__builtin_modff:
1340 case Builtin::BI__builtin_modfl:
1341 case Builtin::BI__builtin_isgreater:
1342 case Builtin::BI__builtin_isgreaterequal:
1343 case Builtin::BI__builtin_isless:
1344 case Builtin::BI__builtin_islessequal:
1345 case Builtin::BI__builtin_islessgreater:
1346 case Builtin::BI__builtin_isunordered:
1353 case Builtin::BI__builtin_isnan: {
1359 builder.createIsFPClass(loc, v, cir::FPClassTest::Nan),
1363 case Builtin::BI__builtin_issignaling: {
1368 builder.createIsFPClass(loc, v, cir::FPClassTest::SignalingNaN),
1372 case Builtin::BI__builtin_isinf: {
1378 builder.createIsFPClass(loc, v, cir::FPClassTest::Infinity),
1381 case Builtin::BIfinite:
1382 case Builtin::BI__finite:
1383 case Builtin::BIfinitef:
1384 case Builtin::BI__finitef:
1385 case Builtin::BIfinitel:
1386 case Builtin::BI__finitel:
1387 case Builtin::BI__builtin_isfinite: {
1393 builder.createIsFPClass(loc, v, cir::FPClassTest::Finite),
1397 case Builtin::BI__builtin_isnormal: {
1402 builder.createIsFPClass(loc, v, cir::FPClassTest::Normal),
1406 case Builtin::BI__builtin_issubnormal: {
1411 builder.createIsFPClass(loc, v, cir::FPClassTest::Subnormal),
1415 case Builtin::BI__builtin_iszero: {
1420 builder.createIsFPClass(loc, v, cir::FPClassTest::Zero),
1423 case Builtin::BI__builtin_isfpclass: {
1430 uint64_t test = result.
Val.
getInt().getLimitedValue();
1434 builder.createIsFPClass(loc, v, cir::FPClassTest(test)),
1437 case Builtin::BI__builtin_nondeterministic_value:
1439 case Builtin::BI__builtin_elementwise_abs: {
1441 bool isIntTy = cir::isIntOrVectorOfIntType(cirTy);
1446 arg.getType(), arg,
false);
1449 case Builtin::BI__builtin_elementwise_acos:
1451 case Builtin::BI__builtin_elementwise_asin:
1453 case Builtin::BI__builtin_elementwise_atan:
1455 case Builtin::BI__builtin_elementwise_atan2:
1458 case Builtin::BI__builtin_elementwise_exp:
1460 case Builtin::BI__builtin_elementwise_exp2:
1462 case Builtin::BI__builtin_elementwise_log:
1464 case Builtin::BI__builtin_elementwise_log2:
1466 case Builtin::BI__builtin_elementwise_log10:
1468 case Builtin::BI__builtin_elementwise_cos:
1470 case Builtin::BI__builtin_elementwise_floor:
1472 case Builtin::BI__builtin_elementwise_round:
1474 case Builtin::BI__builtin_elementwise_rint:
1476 case Builtin::BI__builtin_elementwise_nearbyint:
1478 case Builtin::BI__builtin_elementwise_sin:
1480 case Builtin::BI__builtin_elementwise_sqrt:
1482 case Builtin::BI__builtin_elementwise_tan:
1484 case Builtin::BI__builtin_elementwise_trunc:
1486 case Builtin::BI__builtin_elementwise_fmod:
1489 case Builtin::BI__builtin_elementwise_ceil:
1490 case Builtin::BI__builtin_elementwise_exp10:
1491 case Builtin::BI__builtin_elementwise_ldexp:
1492 case Builtin::BI__builtin_elementwise_pow:
1493 case Builtin::BI__builtin_elementwise_bitreverse:
1494 case Builtin::BI__builtin_elementwise_cosh:
1495 case Builtin::BI__builtin_elementwise_popcount:
1496 case Builtin::BI__builtin_elementwise_roundeven:
1497 case Builtin::BI__builtin_elementwise_sinh:
1498 case Builtin::BI__builtin_elementwise_tanh:
1499 case Builtin::BI__builtin_elementwise_canonicalize:
1500 case Builtin::BI__builtin_elementwise_copysign:
1501 case Builtin::BI__builtin_elementwise_fma:
1503 case Builtin::BI__builtin_elementwise_fshl: {
1508 return RValue::get(builder.emitIntrinsicCallOp(loc,
"fshl", a.getType(),
1509 mlir::ValueRange{a, b, c}));
1511 case Builtin::BI__builtin_elementwise_fshr: {
1516 return RValue::get(builder.emitIntrinsicCallOp(loc,
"fshr", a.getType(),
1517 mlir::ValueRange{a, b, c}));
1519 case Builtin::BI__builtin_elementwise_add_sat:
1520 case Builtin::BI__builtin_elementwise_sub_sat:
1521 case Builtin::BI__builtin_elementwise_max:
1522 case Builtin::BI__builtin_elementwise_min:
1523 case Builtin::BI__builtin_elementwise_maxnum:
1524 case Builtin::BI__builtin_elementwise_minnum:
1525 case Builtin::BI__builtin_elementwise_maximum:
1526 case Builtin::BI__builtin_elementwise_minimum:
1527 case Builtin::BI__builtin_elementwise_maximumnum:
1528 case Builtin::BI__builtin_elementwise_minimumnum:
1529 case Builtin::BI__builtin_reduce_max:
1530 case Builtin::BI__builtin_reduce_min:
1531 case Builtin::BI__builtin_reduce_add:
1532 case Builtin::BI__builtin_reduce_mul:
1533 case Builtin::BI__builtin_reduce_xor:
1534 case Builtin::BI__builtin_reduce_or:
1535 case Builtin::BI__builtin_reduce_and:
1536 case Builtin::BI__builtin_reduce_assoc_fadd:
1537 case Builtin::BI__builtin_reduce_in_order_fadd:
1538 case Builtin::BI__builtin_reduce_maximum:
1539 case Builtin::BI__builtin_reduce_minimum:
1540 case Builtin::BI__builtin_matrix_transpose:
1541 case Builtin::BI__builtin_matrix_column_major_load:
1542 case Builtin::BI__builtin_matrix_column_major_store:
1543 case Builtin::BI__builtin_masked_load:
1544 case Builtin::BI__builtin_masked_expand_load:
1545 case Builtin::BI__builtin_masked_gather:
1546 case Builtin::BI__builtin_masked_store:
1547 case Builtin::BI__builtin_masked_compress_store:
1548 case Builtin::BI__builtin_masked_scatter:
1550 case Builtin::BI__builtin_isinf_sign: {
1555 builder.createIsFPClass(loc, arg, cir::FPClassTest::Infinity);
1558 cir::ConstantOp zero = builder.getNullValue(intTy, loc);
1559 cir::ConstantOp one = builder.getConstant(loc, cir::IntAttr::get(intTy, 1));
1560 cir::ConstantOp negativeOne =
1561 builder.getConstant(loc, cir::IntAttr::get(intTy, -1));
1562 mlir::Value signResult = builder.createSelect(loc, isNeg, negativeOne, one);
1563 mlir::Value result = builder.createSelect(loc, isInf, signResult, zero);
1566 case Builtin::BI__builtin_flt_rounds:
1567 case Builtin::BI__builtin_set_flt_rounds:
1568 case Builtin::BI__builtin_fpclassify:
1570 case Builtin::BIalloca:
1571 case Builtin::BI_alloca:
1572 case Builtin::BI__builtin_alloca_uninitialized:
1573 case Builtin::BI__builtin_alloca:
1575 case Builtin::BI__builtin_alloca_with_align_uninitialized:
1576 case Builtin::BI__builtin_alloca_with_align:
1577 case Builtin::BI__builtin_infer_alloc_token:
1579 case Builtin::BIbzero:
1580 case Builtin::BI__builtin_bzero: {
1585 mlir::Value zero = builder.getNullValue(builder.getUInt8Ty(), loc);
1587 builder.createMemSet(loc, destPtrCast, zero, size);
1591 case Builtin::BIbcopy:
1592 case Builtin::BI__builtin_bcopy:
1594 case Builtin::BI__builtin_char_memchr:
1595 case Builtin::BI__builtin_memchr: {
1598 builder.createBitcast(srcPtr.
getPointer(), builder.getVoidPtrTy());
1605 case Builtin::BImemcpy:
1606 case Builtin::BI__builtin_memcpy:
1607 case Builtin::BImempcpy:
1608 case Builtin::BI__builtin_mempcpy:
1609 case Builtin::BI__builtin_memcpy_inline:
1610 case Builtin::BI__builtin___memcpy_chk:
1611 case Builtin::BI__builtin_objc_memmove_collectable:
1612 case Builtin::BI__builtin___memmove_chk:
1613 case Builtin::BI__builtin_trivially_relocate:
1614 case Builtin::BImemmove:
1615 case Builtin::BI__builtin_memmove:
1616 case Builtin::BImemset:
1617 case Builtin::BI__builtin_memset:
1618 case Builtin::BI__builtin_memset_inline:
1619 case Builtin::BI__builtin___memset_chk:
1620 case Builtin::BI__builtin_wmemchr:
1621 case Builtin::BI__builtin_wmemcmp:
1623 case Builtin::BI__builtin_dwarf_cfa:
1625 case Builtin::BI__builtin_return_address: {
1629 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));
1631 case Builtin::BI_ReturnAddress: {
1634 builder.getConstInt(loc, builder.getUInt32Ty(), 0)));
1636 case Builtin::BI__builtin_frame_address: {
1639 mlir::Value addr = cir::FrameAddrOp::create(
1641 builder.getConstAPInt(loc, builder.getUInt32Ty(), level));
1643 builder.createCast(loc, cir::CastKind::bitcast, addr,
voidPtrTy));
1645 case Builtin::BI__builtin_extract_return_addr:
1646 case Builtin::BI__builtin_frob_return_addr:
1647 case Builtin::BI__builtin_dwarf_sp_column:
1648 case Builtin::BI__builtin_init_dwarf_reg_size_table:
1649 case Builtin::BI__builtin_eh_return:
1650 case Builtin::BI__builtin_unwind_init:
1651 case Builtin::BI__builtin_extend_pointer:
1653 case Builtin::BI__builtin_setjmp: {
1657 cir::PointerType
voidPtrTy = builder.getVoidPtrTy();
1658 cir::PointerType ppTy = builder.getPointerTo(
voidPtrTy);
1662 if (
getTarget().getTriple().isSystemZ()) {
1667 mlir::Value frameAddress =
1668 cir::FrameAddrOp::create(builder, loc,
voidPtrTy,
1669 mlir::ValueRange{builder.getUInt32(0, loc)})
1672 builder.createStore(loc, frameAddress, castBuf);
1674 mlir::Value stacksave =
1675 cir::StackSaveOp::create(builder, loc,
voidPtrTy).getResult();
1676 cir::PtrStrideOp stackSaveSlot = cir::PtrStrideOp::create(
1677 builder, loc, ppTy, castBuf.
getPointer(), builder.getSInt32(2, loc));
1678 llvm::TypeSize voidPtrTySize =
1681 CharUnits().fromQuantity(2 * voidPtrTySize));
1683 builder.createStore(loc, stacksave, slotAddr);
1684 auto op = cir::EhSetjmpOp::create(builder, loc, castBuf.
getPointer());
1687 case Builtin::BI__builtin_longjmp: {
1691 cir::EhLongjmpOp::create(builder, loc, buf);
1692 cir::UnreachableOp::create(builder, loc);
1695 case Builtin::BI__builtin_launder:
1696 case Builtin::BI__sync_fetch_and_add:
1697 case Builtin::BI__sync_fetch_and_sub:
1698 case Builtin::BI__sync_fetch_and_or:
1699 case Builtin::BI__sync_fetch_and_and:
1700 case Builtin::BI__sync_fetch_and_xor:
1701 case Builtin::BI__sync_fetch_and_nand:
1702 case Builtin::BI__sync_add_and_fetch:
1703 case Builtin::BI__sync_sub_and_fetch:
1704 case Builtin::BI__sync_and_and_fetch:
1705 case Builtin::BI__sync_or_and_fetch:
1706 case Builtin::BI__sync_xor_and_fetch:
1707 case Builtin::BI__sync_nand_and_fetch:
1708 case Builtin::BI__sync_val_compare_and_swap:
1709 case Builtin::BI__sync_bool_compare_and_swap:
1710 case Builtin::BI__sync_lock_test_and_set:
1711 case Builtin::BI__sync_lock_release:
1712 case Builtin::BI__sync_swap:
1713 case Builtin::BI__sync_fetch_and_add_1:
1714 case Builtin::BI__sync_fetch_and_add_2:
1715 case Builtin::BI__sync_fetch_and_add_4:
1716 case Builtin::BI__sync_fetch_and_add_8:
1717 case Builtin::BI__sync_fetch_and_add_16:
1718 case Builtin::BI__sync_fetch_and_sub_1:
1719 case Builtin::BI__sync_fetch_and_sub_2:
1720 case Builtin::BI__sync_fetch_and_sub_4:
1721 case Builtin::BI__sync_fetch_and_sub_8:
1722 case Builtin::BI__sync_fetch_and_sub_16:
1723 case Builtin::BI__sync_fetch_and_or_1:
1724 case Builtin::BI__sync_fetch_and_or_2:
1725 case Builtin::BI__sync_fetch_and_or_4:
1726 case Builtin::BI__sync_fetch_and_or_8:
1727 case Builtin::BI__sync_fetch_and_or_16:
1728 case Builtin::BI__sync_fetch_and_and_1:
1729 case Builtin::BI__sync_fetch_and_and_2:
1730 case Builtin::BI__sync_fetch_and_and_4:
1731 case Builtin::BI__sync_fetch_and_and_8:
1732 case Builtin::BI__sync_fetch_and_and_16:
1733 case Builtin::BI__sync_fetch_and_xor_1:
1734 case Builtin::BI__sync_fetch_and_xor_2:
1735 case Builtin::BI__sync_fetch_and_xor_4:
1736 case Builtin::BI__sync_fetch_and_xor_8:
1737 case Builtin::BI__sync_fetch_and_xor_16:
1738 case Builtin::BI__sync_fetch_and_nand_1:
1739 case Builtin::BI__sync_fetch_and_nand_2:
1740 case Builtin::BI__sync_fetch_and_nand_4:
1741 case Builtin::BI__sync_fetch_and_nand_8:
1742 case Builtin::BI__sync_fetch_and_nand_16:
1743 case Builtin::BI__sync_fetch_and_min:
1744 case Builtin::BI__sync_fetch_and_max:
1745 case Builtin::BI__sync_fetch_and_umin:
1746 case Builtin::BI__sync_fetch_and_umax:
1749 case Builtin::BI__sync_add_and_fetch_1:
1750 case Builtin::BI__sync_add_and_fetch_2:
1751 case Builtin::BI__sync_add_and_fetch_4:
1752 case Builtin::BI__sync_add_and_fetch_8:
1753 case Builtin::BI__sync_add_and_fetch_16:
1756 case Builtin::BI__sync_sub_and_fetch_1:
1757 case Builtin::BI__sync_sub_and_fetch_2:
1758 case Builtin::BI__sync_sub_and_fetch_4:
1759 case Builtin::BI__sync_sub_and_fetch_8:
1760 case Builtin::BI__sync_sub_and_fetch_16:
1763 case Builtin::BI__sync_and_and_fetch_1:
1764 case Builtin::BI__sync_and_and_fetch_2:
1765 case Builtin::BI__sync_and_and_fetch_4:
1766 case Builtin::BI__sync_and_and_fetch_8:
1767 case Builtin::BI__sync_and_and_fetch_16:
1770 case Builtin::BI__sync_or_and_fetch_1:
1771 case Builtin::BI__sync_or_and_fetch_2:
1772 case Builtin::BI__sync_or_and_fetch_4:
1773 case Builtin::BI__sync_or_and_fetch_8:
1774 case Builtin::BI__sync_or_and_fetch_16:
1776 case Builtin::BI__sync_xor_and_fetch_1:
1777 case Builtin::BI__sync_xor_and_fetch_2:
1778 case Builtin::BI__sync_xor_and_fetch_4:
1779 case Builtin::BI__sync_xor_and_fetch_8:
1780 case Builtin::BI__sync_xor_and_fetch_16:
1783 case Builtin::BI__sync_nand_and_fetch_1:
1784 case Builtin::BI__sync_nand_and_fetch_2:
1785 case Builtin::BI__sync_nand_and_fetch_4:
1786 case Builtin::BI__sync_nand_and_fetch_8:
1787 case Builtin::BI__sync_nand_and_fetch_16:
1790 case Builtin::BI__sync_val_compare_and_swap_1:
1791 case Builtin::BI__sync_val_compare_and_swap_2:
1792 case Builtin::BI__sync_val_compare_and_swap_4:
1793 case Builtin::BI__sync_val_compare_and_swap_8:
1794 case Builtin::BI__sync_val_compare_and_swap_16:
1795 case Builtin::BI__sync_bool_compare_and_swap_1:
1796 case Builtin::BI__sync_bool_compare_and_swap_2:
1797 case Builtin::BI__sync_bool_compare_and_swap_4:
1798 case Builtin::BI__sync_bool_compare_and_swap_8:
1799 case Builtin::BI__sync_bool_compare_and_swap_16:
1800 case Builtin::BI__sync_swap_1:
1801 case Builtin::BI__sync_swap_2:
1802 case Builtin::BI__sync_swap_4:
1803 case Builtin::BI__sync_swap_8:
1804 case Builtin::BI__sync_swap_16:
1805 case Builtin::BI__sync_lock_test_and_set_1:
1806 case Builtin::BI__sync_lock_test_and_set_2:
1807 case Builtin::BI__sync_lock_test_and_set_4:
1808 case Builtin::BI__sync_lock_test_and_set_8:
1809 case Builtin::BI__sync_lock_test_and_set_16:
1810 case Builtin::BI__sync_lock_release_1:
1811 case Builtin::BI__sync_lock_release_2:
1812 case Builtin::BI__sync_lock_release_4:
1813 case Builtin::BI__sync_lock_release_8:
1814 case Builtin::BI__sync_lock_release_16:
1815 case Builtin::BI__sync_synchronize:
1816 case Builtin::BI__builtin_nontemporal_load:
1817 case Builtin::BI__builtin_nontemporal_store:
1818 case Builtin::BI__c11_atomic_is_lock_free:
1819 case Builtin::BI__atomic_is_lock_free:
1820 case Builtin::BI__atomic_test_and_set:
1821 case Builtin::BI__atomic_clear:
1823 case Builtin::BI__atomic_thread_fence:
1824 case Builtin::BI__c11_atomic_thread_fence: {
1828 case Builtin::BI__atomic_signal_fence:
1829 case Builtin::BI__c11_atomic_signal_fence: {
1833 case Builtin::BI__scoped_atomic_thread_fence:
1834 case Builtin::BI__builtin_signbit:
1835 case Builtin::BI__builtin_signbitf:
1836 case Builtin::BI__builtin_signbitl:
1837 case Builtin::BI__warn_memset_zero_len:
1838 case Builtin::BI__annotation:
1839 case Builtin::BI__builtin_annotation:
1840 case Builtin::BI__builtin_addcb:
1841 case Builtin::BI__builtin_addcs:
1842 case Builtin::BI__builtin_addc:
1843 case Builtin::BI__builtin_addcl:
1844 case Builtin::BI__builtin_addcll:
1845 case Builtin::BI__builtin_subcb:
1846 case Builtin::BI__builtin_subcs:
1847 case Builtin::BI__builtin_subc:
1848 case Builtin::BI__builtin_subcl:
1849 case Builtin::BI__builtin_subcll:
1852 case Builtin::BI__builtin_add_overflow:
1853 case Builtin::BI__builtin_sub_overflow:
1854 case Builtin::BI__builtin_mul_overflow: {
1862 WidthAndSignedness leftInfo =
1864 WidthAndSignedness rightInfo =
1866 WidthAndSignedness resultInfo =
1872 WidthAndSignedness encompassingInfo =
1875 auto encompassingCIRTy = cir::IntType::get(
1876 &
getMLIRContext(), encompassingInfo.width, encompassingInfo.isSigned);
1877 auto resultCIRTy = mlir::cast<cir::IntType>(
cgm.convertType(resultQTy));
1884 if (left.getType() != encompassingCIRTy)
1886 builder.createCast(cir::CastKind::integral, left, encompassingCIRTy);
1887 if (right.getType() != encompassingCIRTy)
1889 builder.createCast(cir::CastKind::integral, right, encompassingCIRTy);
1892 cir::BinOpOverflowKind opKind;
1893 switch (builtinID) {
1895 llvm_unreachable(
"Unknown overflow builtin id.");
1896 case Builtin::BI__builtin_add_overflow:
1897 opKind = cir::BinOpOverflowKind::Add;
1899 case Builtin::BI__builtin_sub_overflow:
1900 opKind = cir::BinOpOverflowKind::Sub;
1902 case Builtin::BI__builtin_mul_overflow:
1903 opKind = cir::BinOpOverflowKind::Mul;
1908 auto arithOp = cir::BinOpOverflowOp::create(builder, loc, resultCIRTy,
1909 opKind, left, right);
1923 builder.createStore(loc, arithOp.getResult(), resultPtr, isVolatile);
1928 case Builtin::BI__builtin_uadd_overflow:
1929 case Builtin::BI__builtin_uaddl_overflow:
1930 case Builtin::BI__builtin_uaddll_overflow:
1931 case Builtin::BI__builtin_usub_overflow:
1932 case Builtin::BI__builtin_usubl_overflow:
1933 case Builtin::BI__builtin_usubll_overflow:
1934 case Builtin::BI__builtin_umul_overflow:
1935 case Builtin::BI__builtin_umull_overflow:
1936 case Builtin::BI__builtin_umulll_overflow:
1937 case Builtin::BI__builtin_sadd_overflow:
1938 case Builtin::BI__builtin_saddl_overflow:
1939 case Builtin::BI__builtin_saddll_overflow:
1940 case Builtin::BI__builtin_ssub_overflow:
1941 case Builtin::BI__builtin_ssubl_overflow:
1942 case Builtin::BI__builtin_ssubll_overflow:
1943 case Builtin::BI__builtin_smul_overflow:
1944 case Builtin::BI__builtin_smull_overflow:
1945 case Builtin::BI__builtin_smulll_overflow: {
1954 cir::BinOpOverflowKind arithKind;
1955 switch (builtinID) {
1957 llvm_unreachable(
"Unknown overflow builtin id.");
1958 case Builtin::BI__builtin_uadd_overflow:
1959 case Builtin::BI__builtin_uaddl_overflow:
1960 case Builtin::BI__builtin_uaddll_overflow:
1961 case Builtin::BI__builtin_sadd_overflow:
1962 case Builtin::BI__builtin_saddl_overflow:
1963 case Builtin::BI__builtin_saddll_overflow:
1964 arithKind = cir::BinOpOverflowKind::Add;
1966 case Builtin::BI__builtin_usub_overflow:
1967 case Builtin::BI__builtin_usubl_overflow:
1968 case Builtin::BI__builtin_usubll_overflow:
1969 case Builtin::BI__builtin_ssub_overflow:
1970 case Builtin::BI__builtin_ssubl_overflow:
1971 case Builtin::BI__builtin_ssubll_overflow:
1972 arithKind = cir::BinOpOverflowKind::Sub;
1974 case Builtin::BI__builtin_umul_overflow:
1975 case Builtin::BI__builtin_umull_overflow:
1976 case Builtin::BI__builtin_umulll_overflow:
1977 case Builtin::BI__builtin_smul_overflow:
1978 case Builtin::BI__builtin_smull_overflow:
1979 case Builtin::BI__builtin_smulll_overflow:
1980 arithKind = cir::BinOpOverflowKind::Mul;
1986 auto resultCIRTy = mlir::cast<cir::IntType>(
cgm.convertType(resultQTy));
1989 cir::BinOpOverflowOp arithOp = cir::BinOpOverflowOp::create(
1990 builder, loc, resultCIRTy, arithKind, x, y);
1994 builder.createStore(loc,
emitToMemory(arithOp.getResult(), resultQTy),
1995 resultPtr, isVolatile);
2000 case Builtin::BIaddressof:
2001 case Builtin::BI__addressof:
2002 case Builtin::BI__builtin_addressof:
2004 case Builtin::BI__builtin_function_start:
2006 case Builtin::BI__builtin_operator_new:
2009 case Builtin::BI__builtin_operator_delete:
2013 case Builtin::BI__builtin_is_aligned:
2014 case Builtin::BI__builtin_align_up:
2015 case Builtin::BI__builtin_align_down:
2016 case Builtin::BI__noop:
2017 case Builtin::BI__builtin_call_with_static_chain:
2018 case Builtin::BI_InterlockedExchange8:
2019 case Builtin::BI_InterlockedExchange16:
2020 case Builtin::BI_InterlockedExchange:
2021 case Builtin::BI_InterlockedExchangePointer:
2022 case Builtin::BI_InterlockedCompareExchangePointer:
2023 case Builtin::BI_InterlockedCompareExchangePointer_nf:
2024 case Builtin::BI_InterlockedCompareExchange8:
2025 case Builtin::BI_InterlockedCompareExchange16:
2026 case Builtin::BI_InterlockedCompareExchange:
2027 case Builtin::BI_InterlockedCompareExchange64:
2028 case Builtin::BI_InterlockedIncrement16:
2029 case Builtin::BI_InterlockedIncrement:
2030 case Builtin::BI_InterlockedDecrement16:
2031 case Builtin::BI_InterlockedDecrement:
2032 case Builtin::BI_InterlockedAnd8:
2033 case Builtin::BI_InterlockedAnd16:
2034 case Builtin::BI_InterlockedAnd:
2035 case Builtin::BI_InterlockedExchangeAdd8:
2036 case Builtin::BI_InterlockedExchangeAdd16:
2037 case Builtin::BI_InterlockedExchangeAdd:
2038 case Builtin::BI_InterlockedExchangeSub8:
2039 case Builtin::BI_InterlockedExchangeSub16:
2040 case Builtin::BI_InterlockedExchangeSub:
2041 case Builtin::BI_InterlockedOr8:
2042 case Builtin::BI_InterlockedOr16:
2043 case Builtin::BI_InterlockedOr:
2044 case Builtin::BI_InterlockedXor8:
2045 case Builtin::BI_InterlockedXor16:
2046 case Builtin::BI_InterlockedXor:
2047 case Builtin::BI_bittest64:
2048 case Builtin::BI_bittest:
2049 case Builtin::BI_bittestandcomplement64:
2050 case Builtin::BI_bittestandcomplement:
2051 case Builtin::BI_bittestandreset64:
2052 case Builtin::BI_bittestandreset:
2053 case Builtin::BI_bittestandset64:
2054 case Builtin::BI_bittestandset:
2055 case Builtin::BI_interlockedbittestandreset:
2056 case Builtin::BI_interlockedbittestandreset64:
2057 case Builtin::BI_interlockedbittestandreset64_acq:
2058 case Builtin::BI_interlockedbittestandreset64_rel:
2059 case Builtin::BI_interlockedbittestandreset64_nf:
2060 case Builtin::BI_interlockedbittestandset64:
2061 case Builtin::BI_interlockedbittestandset64_acq:
2062 case Builtin::BI_interlockedbittestandset64_rel:
2063 case Builtin::BI_interlockedbittestandset64_nf:
2064 case Builtin::BI_interlockedbittestandset:
2065 case Builtin::BI_interlockedbittestandset_acq:
2066 case Builtin::BI_interlockedbittestandset_rel:
2067 case Builtin::BI_interlockedbittestandset_nf:
2068 case Builtin::BI_interlockedbittestandreset_acq:
2069 case Builtin::BI_interlockedbittestandreset_rel:
2070 case Builtin::BI_interlockedbittestandreset_nf:
2071 case Builtin::BI__iso_volatile_load8:
2072 case Builtin::BI__iso_volatile_load16:
2073 case Builtin::BI__iso_volatile_load32:
2074 case Builtin::BI__iso_volatile_load64:
2075 case Builtin::BI__iso_volatile_store8:
2076 case Builtin::BI__iso_volatile_store16:
2077 case Builtin::BI__iso_volatile_store32:
2078 case Builtin::BI__iso_volatile_store64:
2079 case Builtin::BI__builtin_ptrauth_sign_constant:
2080 case Builtin::BI__builtin_ptrauth_auth:
2081 case Builtin::BI__builtin_ptrauth_auth_and_resign:
2082 case Builtin::BI__builtin_ptrauth_blend_discriminator:
2083 case Builtin::BI__builtin_ptrauth_sign_generic_data:
2084 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
2085 case Builtin::BI__builtin_ptrauth_strip:
2086 case Builtin::BI__builtin_get_vtable_pointer:
2087 case Builtin::BI__exception_code:
2088 case Builtin::BI_exception_code:
2089 case Builtin::BI__exception_info:
2090 case Builtin::BI_exception_info:
2091 case Builtin::BI__abnormal_termination:
2092 case Builtin::BI_abnormal_termination:
2093 case Builtin::BI_setjmpex:
2094 case Builtin::BI_setjmp:
2096 case Builtin::BImove:
2097 case Builtin::BImove_if_noexcept:
2098 case Builtin::BIforward:
2099 case Builtin::BIforward_like:
2100 case Builtin::BIas_const:
2102 case Builtin::BI__GetExceptionInfo:
2103 case Builtin::BI__fastfail:
2104 case Builtin::BIread_pipe:
2105 case Builtin::BIwrite_pipe:
2106 case Builtin::BIreserve_read_pipe:
2107 case Builtin::BIreserve_write_pipe:
2108 case Builtin::BIwork_group_reserve_read_pipe:
2109 case Builtin::BIwork_group_reserve_write_pipe:
2110 case Builtin::BIsub_group_reserve_read_pipe:
2111 case Builtin::BIsub_group_reserve_write_pipe:
2112 case Builtin::BIcommit_read_pipe:
2113 case Builtin::BIcommit_write_pipe:
2114 case Builtin::BIwork_group_commit_read_pipe:
2115 case Builtin::BIwork_group_commit_write_pipe:
2116 case Builtin::BIsub_group_commit_read_pipe:
2117 case Builtin::BIsub_group_commit_write_pipe:
2118 case Builtin::BIget_pipe_num_packets:
2119 case Builtin::BIget_pipe_max_packets:
2120 case Builtin::BIto_global:
2121 case Builtin::BIto_local:
2122 case Builtin::BIto_private:
2123 case Builtin::BIenqueue_kernel:
2124 case Builtin::BIget_kernel_work_group_size:
2125 case Builtin::BIget_kernel_preferred_work_group_size_multiple:
2126 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange:
2127 case Builtin::BIget_kernel_sub_group_count_for_ndrange:
2128 case Builtin::BI__builtin_store_half:
2129 case Builtin::BI__builtin_store_halff:
2130 case Builtin::BI__builtin_load_half:
2131 case Builtin::BI__builtin_load_halff:
2133 case Builtin::BI__builtin_printf:
2134 case Builtin::BIprintf:
2136 case Builtin::BI__builtin_canonicalize:
2137 case Builtin::BI__builtin_canonicalizef:
2138 case Builtin::BI__builtin_canonicalizef16:
2139 case Builtin::BI__builtin_canonicalizel:
2140 case Builtin::BI__builtin_thread_pointer:
2141 case Builtin::BI__builtin_os_log_format:
2142 case Builtin::BI__xray_customevent:
2143 case Builtin::BI__xray_typedevent:
2144 case Builtin::BI__builtin_ms_va_start:
2145 case Builtin::BI__builtin_ms_va_end:
2146 case Builtin::BI__builtin_ms_va_copy:
2147 case Builtin::BI__builtin_get_device_side_mangled_name:
2154 if (
getContext().BuiltinInfo.isLibFunction(builtinID))
2156 cgm.getBuiltinLibFunction(fd, builtinID));
2160 if (
getContext().BuiltinInfo.isPredefinedLibFunction(builtinID))
2166 Intrinsic::ID intrinsicID = Intrinsic::not_intrinsic;
2168 llvm::Triple::getArchTypePrefix(
getTarget().getTriple().getArch());
2169 if (!prefix.empty()) {
2170 intrinsicID = Intrinsic::getIntrinsicForClangBuiltin(prefix.data(), name);
2174 if (intrinsicID == Intrinsic::not_intrinsic)
2175 intrinsicID = Intrinsic::getIntrinsicForMSBuiltin(prefix.data(), name);
2178 if (intrinsicID != Intrinsic::not_intrinsic) {
2179 unsigned iceArguments = 0;
2184 llvm::StringRef name = llvm::Intrinsic::getName(intrinsicID);
2188 assert(name.starts_with(
"llvm.") &&
"expected llvm. prefix");
2189 name = name.drop_front(5);
2191 cir::FuncType intrinsicType =
2196 for (
unsigned i = 0; i < e->
getNumArgs(); i++) {
2197 mlir::Value argValue =
2201 mlir::Type argType = argValue.getType();
2202 mlir::Type expectedTy = intrinsicType.getInput(i);
2205 mlir::Type correctedExpectedTy = expectedTy;
2206 if (fd && i < fd->getNumParams()) {
2211 if (mlir::isa<cir::PointerType>(expectedTy)) {
2212 bool argIsPointer = mlir::isa<cir::PointerType>(argType);
2213 bool argIsVectorOfPointer =
false;
2214 if (
auto vecTy = dyn_cast<mlir::VectorType>(argType))
2215 argIsVectorOfPointer =
2216 mlir::isa<cir::PointerType>(vecTy.getElementType());
2218 if (!argIsPointer && !argIsVectorOfPointer) {
2221 "intrinsic expects a pointer type (NYI for non-pointer)");
2226 if (argType != expectedTy)
2231 if (argType != correctedExpectedTy)
2232 argValue = builder.createBitcast(argValue, correctedExpectedTy);
2235 args.push_back(argValue);
2240 mlir::Type correctedReturnType = intrinsicType.
getReturnType();
2242 correctedReturnType =
2247 cir::LLVMIntrinsicCallOp intrinsicCall = cir::LLVMIntrinsicCallOp::create(
2249 correctedReturnType, args);
2251 mlir::Value intrinsicRes = intrinsicCall.getResult();
2275 if (std::optional<mlir::Value> rst =
2277 mlir::Value v = rst.value();
2285 if (mlir::isa<cir::VoidType>(v.getType()))
2292 llvm_unreachable(
"No current target builtin returns complex");
2294 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
2298 std::string(
"unimplemented builtin call: ") +
2299 getContext().BuiltinInfo.getName(builtinID));