532 unsigned builtinID) {
535 case Builtin::BIacos:
536 case Builtin::BIacosf:
537 case Builtin::BIacosl:
538 case Builtin::BI__builtin_acos:
539 case Builtin::BI__builtin_acosf:
540 case Builtin::BI__builtin_acosf16:
541 case Builtin::BI__builtin_acosl:
542 case Builtin::BI__builtin_acosf128:
543 case Builtin::BI__builtin_elementwise_acos:
545 case Builtin::BIasin:
546 case Builtin::BIasinf:
547 case Builtin::BIasinl:
548 case Builtin::BI__builtin_asin:
549 case Builtin::BI__builtin_asinf:
550 case Builtin::BI__builtin_asinf16:
551 case Builtin::BI__builtin_asinl:
552 case Builtin::BI__builtin_asinf128:
553 case Builtin::BI__builtin_elementwise_asin:
555 case Builtin::BIatan:
556 case Builtin::BIatanf:
557 case Builtin::BIatanl:
558 case Builtin::BI__builtin_atan:
559 case Builtin::BI__builtin_atanf:
560 case Builtin::BI__builtin_atanf16:
561 case Builtin::BI__builtin_atanl:
562 case Builtin::BI__builtin_atanf128:
563 case Builtin::BI__builtin_elementwise_atan:
565 case Builtin::BIatan2:
566 case Builtin::BIatan2f:
567 case Builtin::BIatan2l:
568 case Builtin::BI__builtin_atan2:
569 case Builtin::BI__builtin_atan2f:
570 case Builtin::BI__builtin_atan2f16:
571 case Builtin::BI__builtin_atan2l:
572 case Builtin::BI__builtin_atan2f128:
573 case Builtin::BI__builtin_elementwise_atan2:
576 case Builtin::BIceil:
577 case Builtin::BIceilf:
578 case Builtin::BIceill:
579 case Builtin::BI__builtin_ceil:
580 case Builtin::BI__builtin_ceilf:
581 case Builtin::BI__builtin_ceilf16:
582 case Builtin::BI__builtin_ceill:
583 case Builtin::BI__builtin_ceilf128:
584 case Builtin::BI__builtin_elementwise_ceil:
586 case Builtin::BIcopysign:
587 case Builtin::BIcopysignf:
588 case Builtin::BIcopysignl:
589 case Builtin::BI__builtin_copysign:
590 case Builtin::BI__builtin_copysignf:
591 case Builtin::BI__builtin_copysignf16:
592 case Builtin::BI__builtin_copysignl:
593 case Builtin::BI__builtin_copysignf128:
596 case Builtin::BIcosf:
597 case Builtin::BIcosl:
598 case Builtin::BI__builtin_cos:
599 case Builtin::BI__builtin_cosf:
600 case Builtin::BI__builtin_cosf16:
601 case Builtin::BI__builtin_cosl:
602 case Builtin::BI__builtin_cosf128:
603 case Builtin::BI__builtin_elementwise_cos:
605 case Builtin::BIcosh:
606 case Builtin::BIcoshf:
607 case Builtin::BIcoshl:
608 case Builtin::BI__builtin_cosh:
609 case Builtin::BI__builtin_coshf:
610 case Builtin::BI__builtin_coshf16:
611 case Builtin::BI__builtin_coshl:
612 case Builtin::BI__builtin_coshf128:
613 case Builtin::BI__builtin_elementwise_cosh:
616 case Builtin::BIexpf:
617 case Builtin::BIexpl:
618 case Builtin::BI__builtin_exp:
619 case Builtin::BI__builtin_expf:
620 case Builtin::BI__builtin_expf16:
621 case Builtin::BI__builtin_expl:
622 case Builtin::BI__builtin_expf128:
623 case Builtin::BI__builtin_elementwise_exp:
625 case Builtin::BIexp2:
626 case Builtin::BIexp2f:
627 case Builtin::BIexp2l:
628 case Builtin::BI__builtin_exp2:
629 case Builtin::BI__builtin_exp2f:
630 case Builtin::BI__builtin_exp2f16:
631 case Builtin::BI__builtin_exp2l:
632 case Builtin::BI__builtin_exp2f128:
633 case Builtin::BI__builtin_elementwise_exp2:
635 case Builtin::BI__builtin_exp10:
636 case Builtin::BI__builtin_exp10f:
637 case Builtin::BI__builtin_exp10f16:
638 case Builtin::BI__builtin_exp10l:
639 case Builtin::BI__builtin_exp10f128:
640 case Builtin::BI__builtin_elementwise_exp10:
642 case Builtin::BIfabs:
643 case Builtin::BIfabsf:
644 case Builtin::BIfabsl:
645 case Builtin::BI__builtin_fabs:
646 case Builtin::BI__builtin_fabsf:
647 case Builtin::BI__builtin_fabsf16:
648 case Builtin::BI__builtin_fabsl:
649 case Builtin::BI__builtin_fabsf128:
651 case Builtin::BIfloor:
652 case Builtin::BIfloorf:
653 case Builtin::BIfloorl:
654 case Builtin::BI__builtin_floor:
655 case Builtin::BI__builtin_floorf:
656 case Builtin::BI__builtin_floorf16:
657 case Builtin::BI__builtin_floorl:
658 case Builtin::BI__builtin_floorf128:
659 case Builtin::BI__builtin_elementwise_floor:
662 case Builtin::BIfmaf:
663 case Builtin::BIfmal:
664 case Builtin::BI__builtin_fma:
665 case Builtin::BI__builtin_fmaf:
666 case Builtin::BI__builtin_fmaf16:
667 case Builtin::BI__builtin_fmal:
668 case Builtin::BI__builtin_fmaf128:
669 case Builtin::BI__builtin_elementwise_fma:
671 case Builtin::BIfmax:
672 case Builtin::BIfmaxf:
673 case Builtin::BIfmaxl:
674 case Builtin::BI__builtin_fmax:
675 case Builtin::BI__builtin_fmaxf:
676 case Builtin::BI__builtin_fmaxf16:
677 case Builtin::BI__builtin_fmaxl:
678 case Builtin::BI__builtin_fmaxf128:
681 case Builtin::BIfmin:
682 case Builtin::BIfminf:
683 case Builtin::BIfminl:
684 case Builtin::BI__builtin_fmin:
685 case Builtin::BI__builtin_fminf:
686 case Builtin::BI__builtin_fminf16:
687 case Builtin::BI__builtin_fminl:
688 case Builtin::BI__builtin_fminf128:
691 case Builtin::BIfmaximum_num:
692 case Builtin::BIfmaximum_numf:
693 case Builtin::BIfmaximum_numl:
694 case Builtin::BI__builtin_fmaximum_num:
695 case Builtin::BI__builtin_fmaximum_numf:
696 case Builtin::BI__builtin_fmaximum_numf16:
697 case Builtin::BI__builtin_fmaximum_numl:
698 case Builtin::BI__builtin_fmaximum_numf128:
699 case Builtin::BIfminimum_num:
700 case Builtin::BIfminimum_numf:
701 case Builtin::BIfminimum_numl:
702 case Builtin::BI__builtin_fminimum_num:
703 case Builtin::BI__builtin_fminimum_numf:
704 case Builtin::BI__builtin_fminimum_numf16:
705 case Builtin::BI__builtin_fminimum_numl:
706 case Builtin::BI__builtin_fminimum_numf128:
708 case Builtin::BIfmod:
709 case Builtin::BIfmodf:
710 case Builtin::BIfmodl:
711 case Builtin::BI__builtin_fmod:
712 case Builtin::BI__builtin_fmodf:
713 case Builtin::BI__builtin_fmodf16:
714 case Builtin::BI__builtin_fmodl:
715 case Builtin::BI__builtin_fmodf128:
716 case Builtin::BI__builtin_elementwise_fmod:
720 case Builtin::BIlogf:
721 case Builtin::BIlogl:
722 case Builtin::BI__builtin_log:
723 case Builtin::BI__builtin_logf:
724 case Builtin::BI__builtin_logf16:
725 case Builtin::BI__builtin_logl:
726 case Builtin::BI__builtin_logf128:
727 case Builtin::BI__builtin_elementwise_log:
729 case Builtin::BIlog10:
730 case Builtin::BIlog10f:
731 case Builtin::BIlog10l:
732 case Builtin::BI__builtin_log10:
733 case Builtin::BI__builtin_log10f:
734 case Builtin::BI__builtin_log10f16:
735 case Builtin::BI__builtin_log10l:
736 case Builtin::BI__builtin_log10f128:
737 case Builtin::BI__builtin_elementwise_log10:
739 case Builtin::BIlog2:
740 case Builtin::BIlog2f:
741 case Builtin::BIlog2l:
742 case Builtin::BI__builtin_log2:
743 case Builtin::BI__builtin_log2f:
744 case Builtin::BI__builtin_log2f16:
745 case Builtin::BI__builtin_log2l:
746 case Builtin::BI__builtin_log2f128:
747 case Builtin::BI__builtin_elementwise_log2:
749 case Builtin::BInearbyint:
750 case Builtin::BInearbyintf:
751 case Builtin::BInearbyintl:
752 case Builtin::BI__builtin_nearbyint:
753 case Builtin::BI__builtin_nearbyintf:
754 case Builtin::BI__builtin_nearbyintl:
755 case Builtin::BI__builtin_nearbyintf128:
756 case Builtin::BI__builtin_elementwise_nearbyint:
759 case Builtin::BIpowf:
760 case Builtin::BIpowl:
761 case Builtin::BI__builtin_pow:
762 case Builtin::BI__builtin_powf:
763 case Builtin::BI__builtin_powf16:
764 case Builtin::BI__builtin_powl:
765 case Builtin::BI__builtin_powf128:
768 case Builtin::BI__builtin_elementwise_pow:
770 case Builtin::BIrint:
771 case Builtin::BIrintf:
772 case Builtin::BIrintl:
773 case Builtin::BI__builtin_rint:
774 case Builtin::BI__builtin_rintf:
775 case Builtin::BI__builtin_rintf16:
776 case Builtin::BI__builtin_rintl:
777 case Builtin::BI__builtin_rintf128:
778 case Builtin::BI__builtin_elementwise_rint:
780 case Builtin::BIround:
781 case Builtin::BIroundf:
782 case Builtin::BIroundl:
783 case Builtin::BI__builtin_round:
784 case Builtin::BI__builtin_roundf:
785 case Builtin::BI__builtin_roundf16:
786 case Builtin::BI__builtin_roundl:
787 case Builtin::BI__builtin_roundf128:
788 case Builtin::BI__builtin_elementwise_round:
790 case Builtin::BIroundeven:
791 case Builtin::BIroundevenf:
792 case Builtin::BIroundevenl:
793 case Builtin::BI__builtin_roundeven:
794 case Builtin::BI__builtin_roundevenf:
795 case Builtin::BI__builtin_roundevenf16:
796 case Builtin::BI__builtin_roundevenl:
797 case Builtin::BI__builtin_roundevenf128:
798 case Builtin::BI__builtin_elementwise_roundeven:
801 case Builtin::BIsinf:
802 case Builtin::BIsinl:
803 case Builtin::BI__builtin_sin:
804 case Builtin::BI__builtin_sinf:
805 case Builtin::BI__builtin_sinf16:
806 case Builtin::BI__builtin_sinl:
807 case Builtin::BI__builtin_sinf128:
808 case Builtin::BI__builtin_elementwise_sin:
810 case Builtin::BIsinh:
811 case Builtin::BIsinhf:
812 case Builtin::BIsinhl:
813 case Builtin::BI__builtin_sinh:
814 case Builtin::BI__builtin_sinhf:
815 case Builtin::BI__builtin_sinhf16:
816 case Builtin::BI__builtin_sinhl:
817 case Builtin::BI__builtin_sinhf128:
818 case Builtin::BI__builtin_elementwise_sinh:
820 case Builtin::BI__builtin_sincospi:
821 case Builtin::BI__builtin_sincospif:
822 case Builtin::BI__builtin_sincospil:
823 case Builtin::BIsincos:
824 case Builtin::BIsincosf:
825 case Builtin::BIsincosl:
826 case Builtin::BI__builtin_sincos:
827 case Builtin::BI__builtin_sincosf:
828 case Builtin::BI__builtin_sincosf16:
829 case Builtin::BI__builtin_sincosl:
830 case Builtin::BI__builtin_sincosf128:
832 case Builtin::BIsqrt:
833 case Builtin::BIsqrtf:
834 case Builtin::BIsqrtl:
835 case Builtin::BI__builtin_sqrt:
836 case Builtin::BI__builtin_sqrtf:
837 case Builtin::BI__builtin_sqrtf16:
838 case Builtin::BI__builtin_sqrtl:
839 case Builtin::BI__builtin_sqrtf128:
840 case Builtin::BI__builtin_elementwise_sqrt:
843 case Builtin::BItanf:
844 case Builtin::BItanl:
845 case Builtin::BI__builtin_tan:
846 case Builtin::BI__builtin_tanf:
847 case Builtin::BI__builtin_tanf16:
848 case Builtin::BI__builtin_tanl:
849 case Builtin::BI__builtin_tanf128:
850 case Builtin::BI__builtin_elementwise_tan:
852 case Builtin::BItanh:
853 case Builtin::BItanhf:
854 case Builtin::BItanhl:
855 case Builtin::BI__builtin_tanh:
856 case Builtin::BI__builtin_tanhf:
857 case Builtin::BI__builtin_tanhf16:
858 case Builtin::BI__builtin_tanhl:
859 case Builtin::BI__builtin_tanhf128:
860 case Builtin::BI__builtin_elementwise_tanh:
862 case Builtin::BItrunc:
863 case Builtin::BItruncf:
864 case Builtin::BItruncl:
865 case Builtin::BI__builtin_trunc:
866 case Builtin::BI__builtin_truncf:
867 case Builtin::BI__builtin_truncf16:
868 case Builtin::BI__builtin_truncl:
869 case Builtin::BI__builtin_truncf128:
870 case Builtin::BI__builtin_elementwise_trunc:
872 case Builtin::BIlround:
873 case Builtin::BIlroundf:
874 case Builtin::BIlroundl:
875 case Builtin::BI__builtin_lround:
876 case Builtin::BI__builtin_lroundf:
877 case Builtin::BI__builtin_lroundl:
878 case Builtin::BI__builtin_lroundf128:
880 case Builtin::BIllround:
881 case Builtin::BIllroundf:
882 case Builtin::BIllroundl:
883 case Builtin::BI__builtin_llround:
884 case Builtin::BI__builtin_llroundf:
885 case Builtin::BI__builtin_llroundl:
886 case Builtin::BI__builtin_llroundf128:
888 case Builtin::BIlrint:
889 case Builtin::BIlrintf:
890 case Builtin::BIlrintl:
891 case Builtin::BI__builtin_lrint:
892 case Builtin::BI__builtin_lrintf:
893 case Builtin::BI__builtin_lrintl:
894 case Builtin::BI__builtin_lrintf128:
896 case Builtin::BIllrint:
897 case Builtin::BIllrintf:
898 case Builtin::BIllrintl:
899 case Builtin::BI__builtin_llrint:
900 case Builtin::BI__builtin_llrintf:
901 case Builtin::BI__builtin_llrintl:
902 case Builtin::BI__builtin_llrintf128:
904 case Builtin::BI__builtin_ldexp:
905 case Builtin::BI__builtin_ldexpf:
906 case Builtin::BI__builtin_ldexpl:
907 case Builtin::BI__builtin_ldexpf16:
908 case Builtin::BI__builtin_ldexpf128:
909 case Builtin::BI__builtin_elementwise_ldexp:
1034 if (
type->isBooleanType())
1036 builder.getBool(result.
Val.
getInt().getBoolValue(), loc));
1058 unsigned builtinIDIfNoAsmLabel = fd->
hasAttr<AsmLabelAttr>() ? 0 : builtinID;
1060 bool generateFPMathIntrinsics =
1063 if (generateFPMathIntrinsics) {
1075 switch (builtinIDIfNoAsmLabel) {
1080 case Builtin::BI__builtin_stdarg_start:
1081 case Builtin::BI__builtin_va_start:
1082 case Builtin::BI__builtin_c23_va_start:
1083 case Builtin::BI__va_start: {
1084 mlir::Value vaList = builtinID == Builtin::BI__va_start
1091 case Builtin::BI__builtin_va_end:
1094 case Builtin::BI__builtin_va_copy: {
1097 cir::VACopyOp::create(builder, dstPtr.getLoc(), dstPtr, srcPtr);
1101 case Builtin::BIabs:
1102 case Builtin::BIlabs:
1103 case Builtin::BIllabs:
1104 case Builtin::BI__builtin_abs:
1105 case Builtin::BI__builtin_labs:
1106 case Builtin::BI__builtin_llabs: {
1107 bool sanitizeOverflow =
sanOpts.has(SanitizerKind::SignedIntegerOverflow);
1110 switch (
getLangOpts().getSignedOverflowBehavior()) {
1112 result = cir::AbsOp::create(builder, loc, arg.getType(), arg,
1116 if (!sanitizeOverflow) {
1117 result = cir::AbsOp::create(builder, loc, arg.getType(), arg,
1129 case Builtin::BI__assume:
1130 case Builtin::BI__builtin_assume: {
1135 cir::AssumeOp::create(builder, loc, argValue, cir::AssumeBundleKind::None,
1136 mlir::ValueRange{});
1140 case Builtin::BI__builtin_assume_separate_storage: {
1143 mlir::Value cond = builder.getBool(
true, loc);
1144 cir::AssumeOp::create(builder, loc, cond,
1145 cir::AssumeBundleKind::SeparateStorage,
1146 mlir::ValueRange{value0, value1});
1150 case Builtin::BI__arithmetic_fence: {
1154 if (fpFeatures.getAllowFPReassociate() &&
1155 getContext().getTargetInfo().checkArithmeticFenceSupported()) {
1163 case Builtin::BI__builtin_assume_dereferenceable: {
1169 if (sizeValue.getType() != uintPtrTy)
1170 sizeValue = builder.createIntCast(sizeValue, uintPtrTy);
1171 mlir::Value cond = builder.getBool(
true, loc);
1172 cir::AssumeOp::create(builder, loc, cond,
1173 cir::AssumeBundleKind::Dereferenceable,
1174 mlir::ValueRange{ptrValue, sizeValue});
1178 case Builtin::BI__builtin_assume_aligned: {
1181 mlir::Value offsetValue =
1184 std::optional<llvm::APSInt> alignment =
1186 assert(alignment.has_value() &&
1187 "the second argument to __builtin_assume_aligned must be an "
1188 "integral constant expression");
1190 mlir::Value result =
1192 alignment->getSExtValue(), offsetValue);
1196 case Builtin::BI__builtin_complex: {
1199 mlir::Value complex = builder.createComplexCreate(loc, real, imag);
1203 case Builtin::BI__builtin_creal:
1204 case Builtin::BI__builtin_crealf:
1205 case Builtin::BI__builtin_creall:
1206 case Builtin::BIcreal:
1207 case Builtin::BIcrealf:
1208 case Builtin::BIcreall: {
1210 mlir::Value real = builder.createComplexReal(loc, complex);
1214 case Builtin::BI__builtin_cimag:
1215 case Builtin::BI__builtin_cimagf:
1216 case Builtin::BI__builtin_cimagl:
1217 case Builtin::BIcimag:
1218 case Builtin::BIcimagf:
1219 case Builtin::BIcimagl: {
1221 mlir::Value imag = builder.createComplexImag(loc, complex);
1225 case Builtin::BI__builtin_conj:
1226 case Builtin::BI__builtin_conjf:
1227 case Builtin::BI__builtin_conjl:
1228 case Builtin::BIconj:
1229 case Builtin::BIconjf:
1230 case Builtin::BIconjl: {
1232 mlir::Value
conj = builder.createComplexConj(loc, complex);
1236 case Builtin::BI__builtin_clrsb:
1237 case Builtin::BI__builtin_clrsbl:
1238 case Builtin::BI__builtin_clrsbll:
1241 case Builtin::BI__builtin_ctzs:
1242 case Builtin::BI__builtin_ctz:
1243 case Builtin::BI__builtin_ctzl:
1244 case Builtin::BI__builtin_ctzll:
1248 case Builtin::BI__builtin_ctzg:
1251 case Builtin::BI__builtin_clzs:
1252 case Builtin::BI__builtin_clz:
1253 case Builtin::BI__builtin_clzl:
1254 case Builtin::BI__builtin_clzll:
1258 case Builtin::BI__builtin_clzg:
1261 case Builtin::BI__builtin_elementwise_ctzg:
1264 case Builtin::BI__builtin_elementwise_clzg:
1268 case Builtin::BI__builtin_ffs:
1269 case Builtin::BI__builtin_ffsl:
1270 case Builtin::BI__builtin_ffsll:
1273 case Builtin::BI__builtin_parity:
1274 case Builtin::BI__builtin_parityl:
1275 case Builtin::BI__builtin_parityll:
1278 case Builtin::BI__lzcnt16:
1279 case Builtin::BI__lzcnt:
1280 case Builtin::BI__lzcnt64:
1283 case Builtin::BI__popcnt16:
1284 case Builtin::BI__popcnt:
1285 case Builtin::BI__popcnt64:
1286 case Builtin::BI__builtin_popcount:
1287 case Builtin::BI__builtin_popcountl:
1288 case Builtin::BI__builtin_popcountll:
1289 case Builtin::BI__builtin_popcountg:
1296 case Builtin::BI__builtin_unpredictable: {
1300 case Builtin::BI__builtin_expect:
1301 case Builtin::BI__builtin_expect_with_probability: {
1303 if (
cgm.getCodeGenOpts().OptimizationLevel == 0)
1308 mlir::FloatAttr probAttr;
1309 if (builtinIDIfNoAsmLabel == Builtin::BI__builtin_expect_with_probability) {
1310 llvm::APFloat probability(0.0);
1312 [[maybe_unused]]
bool evalSucceeded =
1314 assert(evalSucceeded &&
1315 "probability should be able to evaluate as float");
1316 bool loseInfo =
false;
1317 probability.convert(llvm::APFloat::IEEEdouble(),
1318 llvm::RoundingMode::Dynamic, &loseInfo);
1319 probAttr = mlir::FloatAttr::get(mlir::Float64Type::get(&
getMLIRContext()),
1323 auto result = cir::ExpectOp::create(builder, loc, argValue.getType(),
1324 argValue, expectedValue, probAttr);
1328 case Builtin::BI__builtin_bswapg: {
1333 if (mlir::isa<cir::BoolType>(arg.getType()))
1335 auto argTy = mlir::cast<cir::IntType>(arg.getType());
1337 if (argTy.getWidth() == 1 || argTy.getWidth() == 8)
1339 assert(argTy.getWidth() % 16 == 0 &&
1340 "__builtin_bswapg requires a single byte or a multiple of 16 bits");
1344 if (argTy.isSigned())
1345 arg = builder.createIntCast(arg, builder.getUIntNTy(argTy.getWidth()));
1349 case Builtin::BI__builtin_bswap16:
1350 case Builtin::BI__builtin_bswap32:
1351 case Builtin::BI__builtin_bswap64:
1352 case Builtin::BI_byteswap_ushort:
1353 case Builtin::BI_byteswap_ulong:
1354 case Builtin::BI_byteswap_uint64: {
1356 return RValue::get(cir::ByteSwapOp::create(builder, loc, arg));
1359 case Builtin::BI__builtin_bitreverse8:
1360 case Builtin::BI__builtin_bitreverse16:
1361 case Builtin::BI__builtin_bitreverse32:
1362 case Builtin::BI__builtin_bitreverse64: {
1364 return RValue::get(cir::BitReverseOp::create(builder, loc, arg));
1367 case Builtin::BI__builtin_rotateleft8:
1368 case Builtin::BI__builtin_rotateleft16:
1369 case Builtin::BI__builtin_rotateleft32:
1370 case Builtin::BI__builtin_rotateleft64:
1373 case Builtin::BI__builtin_rotateright8:
1374 case Builtin::BI__builtin_rotateright16:
1375 case Builtin::BI__builtin_rotateright32:
1376 case Builtin::BI__builtin_rotateright64:
1379 case Builtin::BI__builtin_coro_id:
1381 case Builtin::BI__builtin_coro_alloc: {
1383 return coroAlloc ?
RValue::get(coroAlloc.getResult())
1386 case Builtin::BI__builtin_coro_begin: {
1391 case Builtin::BI__builtin_coro_end:
1393 case Builtin::BI__builtin_coro_promise:
1396 case Builtin::BI__builtin_coro_resume:
1399 case Builtin::BI__builtin_coro_noop:
1402 case Builtin::BI__builtin_coro_destroy:
1405 case Builtin::BI__builtin_coro_done:
1408 case Builtin::BI__builtin_coro_suspend:
1411 case Builtin::BI__builtin_coro_align:
1415 case Builtin::BI__builtin_coro_frame: {
1418 case Builtin::BI__builtin_coro_free: {
1420 return coroFree ?
RValue::get(coroFree.getResult())
1424 case Builtin::BI__builtin_coro_size: {
1428 case Builtin::BI__builtin_constant_p: {
1441 mlir::cast<cir::IntType>(resultType), 0));
1449 mlir::cast<cir::IntType>(resultType), 0));
1455 "__builtin_constant_p: Obj-C object pointer");
1458 argValue = builder.createBitcast(argValue,
convertType(argType));
1460 mlir::Value result = cir::IsConstantOp::create(
1463 result = builder.createBoolToInt(result, resultType);
1466 case Builtin::BI__builtin_dynamic_object_size:
1467 case Builtin::BI__builtin_object_size: {
1474 bool isDynamic = builtinID == Builtin::BI__builtin_dynamic_object_size;
1476 nullptr, isDynamic));
1479 case Builtin::BI__builtin_prefetch: {
1480 auto evaluateOperandAsInt = [&](
const Expr *arg) {
1482 [[maybe_unused]]
bool evalSucceed =
1483 arg->EvaluateAsInt(res,
cgm.getASTContext());
1484 assert(evalSucceed &&
"expression should be able to evaluate as int");
1488 bool isWrite =
false;
1490 isWrite = evaluateOperandAsInt(e->
getArg(1));
1494 locality = evaluateOperandAsInt(e->
getArg(2));
1497 cir::PrefetchOp::create(builder, loc, address, locality, isWrite);
1500 case Builtin::BI__builtin_readcyclecounter:
1501 case Builtin::BI__builtin_readsteadycounter:
1503 case Builtin::BI__builtin___clear_cache: {
1511 case Builtin::BI__builtin_trap:
1514 case Builtin::BI__builtin_verbose_trap:
1518 case Builtin::BI__debugbreak:
1520 case Builtin::BI__builtin_unreachable:
1523 case Builtin::BI__builtin_powi:
1524 case Builtin::BI__builtin_powif:
1525 case Builtin::BI__builtin_powil: {
1530 mlir::ValueRange{src0, src1}));
1532 case Builtin::BI__builtin_frexpl:
1533 case Builtin::BI__builtin_frexp:
1534 case Builtin::BI__builtin_frexpf:
1535 case Builtin::BI__builtin_frexpf128:
1536 case Builtin::BI__builtin_frexpf16: {
1539 mlir::Type fpTy = val.getType();
1543 auto frexpOp = cir::FrexpOp::create(builder, callLoc, fpTy, intTy, val);
1548 case Builtin::BImodf:
1549 case Builtin::BImodff:
1550 case Builtin::BImodfl:
1551 case Builtin::BI__builtin_modf:
1552 case Builtin::BI__builtin_modff:
1553 case Builtin::BI__builtin_modfl: {
1556 mlir::Type fpTy = val.getType();
1558 auto modfOp = cir::ModfOp::create(builder, callLoc, fpTy, fpTy, val);
1564 case Builtin::BI__builtin_isgreater:
1565 case Builtin::BI__builtin_isgreaterequal:
1566 case Builtin::BI__builtin_isless:
1567 case Builtin::BI__builtin_islessequal:
1568 case Builtin::BI__builtin_islessgreater:
1569 case Builtin::BI__builtin_isunordered: {
1576 mlir::Value cmpResult;
1577 switch (builtinID) {
1578 case Builtin::BI__builtin_isgreater:
1579 cmpResult = builder.createCompare(loc, cir::CmpOpKind::gt, lhs, rhs);
1581 case Builtin::BI__builtin_isgreaterequal:
1582 cmpResult = builder.createCompare(loc, cir::CmpOpKind::ge, lhs, rhs);
1584 case Builtin::BI__builtin_isless:
1585 cmpResult = builder.createCompare(loc, cir::CmpOpKind::lt, lhs, rhs);
1587 case Builtin::BI__builtin_islessequal:
1588 cmpResult = builder.createCompare(loc, cir::CmpOpKind::le, lhs, rhs);
1590 case Builtin::BI__builtin_islessgreater:
1591 cmpResult = builder.createCompare(loc, cir::CmpOpKind::one, lhs, rhs);
1593 case Builtin::BI__builtin_isunordered:
1594 cmpResult = builder.createCompare(loc, cir::CmpOpKind::uno, lhs, rhs);
1597 llvm_unreachable(
"Unknown ordered comparison");
1599 return RValue::get(builder.createBoolToInt(cmpResult, intTy));
1607 case Builtin::BI__builtin_isnan: {
1612 builder.createIsFPClass(loc, v, cir::FPClassTest::Nan),
1616 case Builtin::BI__builtin_issignaling: {
1621 builder.createIsFPClass(loc, v, cir::FPClassTest::SignalingNaN),
1625 case Builtin::BI__builtin_isinf: {
1630 builder.createIsFPClass(loc, v, cir::FPClassTest::Infinity),
1633 case Builtin::BIfinite:
1634 case Builtin::BI__finite:
1635 case Builtin::BIfinitef:
1636 case Builtin::BI__finitef:
1637 case Builtin::BIfinitel:
1638 case Builtin::BI__finitel:
1639 case Builtin::BI__builtin_isfinite: {
1643 builder.createIsFPClass(loc, v, cir::FPClassTest::Finite),
1647 case Builtin::BI__builtin_isnormal: {
1651 builder.createIsFPClass(loc, v, cir::FPClassTest::Normal),
1655 case Builtin::BI__builtin_issubnormal: {
1659 builder.createIsFPClass(loc, v, cir::FPClassTest::Subnormal),
1663 case Builtin::BI__builtin_iszero: {
1667 builder.createIsFPClass(loc, v, cir::FPClassTest::Zero),
1670 case Builtin::BI__builtin_isfpclass: {
1677 uint64_t test = result.
Val.
getInt().getLimitedValue();
1680 builder.createIsFPClass(loc, v, cir::FPClassTest(test)),
1683 case Builtin::BI__builtin_nondeterministic_value: {
1685 mlir::Value result =
1686 cir::ConstantOp::create(builder, loc, ty, cir::PoisonAttr::get(ty));
1687 result = cir::FreezeOp::create(builder, loc, result);
1690 case Builtin::BI__builtin_elementwise_abs: {
1692 bool isIntTy = cir::isIntOrVectorOfIntType(cirTy);
1697 arg.getType(), arg,
false);
1700 case Builtin::BI__builtin_elementwise_bitreverse:
1701 case Builtin::BI__builtin_elementwise_popcount:
1702 case Builtin::BI__builtin_elementwise_canonicalize:
1703 case Builtin::BI__builtin_elementwise_copysign:
1705 case Builtin::BI__builtin_elementwise_fshl: {
1710 return RValue::get(builder.emitIntrinsicCallOp(loc,
"fshl", a.getType(),
1711 mlir::ValueRange{a, b, c}));
1713 case Builtin::BI__builtin_elementwise_fshr: {
1718 return RValue::get(builder.emitIntrinsicCallOp(loc,
"fshr", a.getType(),
1719 mlir::ValueRange{a, b, c}));
1721 case Builtin::BI__builtin_elementwise_clmul:
1722 case Builtin::BI__builtin_elementwise_pext:
1723 case Builtin::BI__builtin_elementwise_pdep:
1725 case Builtin::BI__builtin_elementwise_add_sat:
1726 case Builtin::BI__builtin_elementwise_sub_sat: {
1735 "saturating add/sub on a boolean operand");
1741 assert(cir::isIntOrVectorOfIntType(op0.getType()) &&
1742 "elementwise saturating add/sub requires integer operands");
1744 builtinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_add_sat
1746 : builder.createSub(loc, op0, op1,
1750 case Builtin::BI__builtin_elementwise_max:
1751 case Builtin::BI__builtin_elementwise_min:
1752 case Builtin::BI__builtin_elementwise_maxnum:
1753 case Builtin::BI__builtin_elementwise_minnum:
1754 case Builtin::BI__builtin_elementwise_maximum:
1755 case Builtin::BI__builtin_elementwise_minimum:
1756 case Builtin::BI__builtin_elementwise_maximumnum:
1757 case Builtin::BI__builtin_elementwise_minimumnum:
1758 case Builtin::BI__builtin_reduce_max:
1759 case Builtin::BI__builtin_reduce_min:
1760 case Builtin::BI__builtin_reduce_add:
1761 case Builtin::BI__builtin_reduce_mul:
1763 case Builtin::BI__builtin_reduce_xor:
1765 e,
"vector.reduce.xor",
1768 case Builtin::BI__builtin_reduce_or:
1770 e,
"vector.reduce.or",
1773 case Builtin::BI__builtin_reduce_and:
1775 e,
"vector.reduce.and",
1778 case Builtin::BI__builtin_reduce_assoc_fadd:
1779 case Builtin::BI__builtin_reduce_in_order_fadd:
1780 case Builtin::BI__builtin_reduce_maximum:
1781 case Builtin::BI__builtin_reduce_minimum:
1782 case Builtin::BI__builtin_matrix_transpose:
1783 case Builtin::BI__builtin_matrix_column_major_load:
1784 case Builtin::BI__builtin_matrix_column_major_store:
1785 case Builtin::BI__builtin_masked_load:
1786 case Builtin::BI__builtin_masked_expand_load:
1787 case Builtin::BI__builtin_masked_gather:
1788 case Builtin::BI__builtin_masked_store:
1789 case Builtin::BI__builtin_masked_compress_store:
1790 case Builtin::BI__builtin_masked_scatter:
1792 case Builtin::BI__builtin_isinf_sign: {
1797 builder.createIsFPClass(loc, arg, cir::FPClassTest::Infinity);
1800 cir::ConstantOp zero = builder.getNullValue(intTy, loc);
1801 cir::ConstantOp one = builder.getConstant(loc, cir::IntAttr::get(intTy, 1));
1802 cir::ConstantOp negativeOne =
1803 builder.getConstant(loc, cir::IntAttr::get(intTy, -1));
1804 mlir::Value signResult = builder.createSelect(loc, isNeg, negativeOne, one);
1805 mlir::Value result = builder.createSelect(loc, isInf, signResult, zero);
1808 case Builtin::BI__builtin_flt_rounds: {
1811 mlir::Value result =
1812 builder.emitIntrinsicCallOp(loc,
"get.rounding", resultType);
1813 if (result.getType() != resultType)
1815 builder.createCast(loc, cir::CastKind::integral, result, resultType);
1818 case Builtin::BI__builtin_set_flt_rounds: {
1821 builder.emitIntrinsicCallOp(loc,
"set.rounding", builder.getVoidTy(),
1822 mlir::ValueRange{v});
1825 case Builtin::BI__builtin_fpclassify: {
1841 cir::IsFPClassOp::create(builder, loc, value, cir::FPClassTest::Zero);
1842 mlir::Value result =
1843 cir::TernaryOp::create(
1844 builder, loc, isZero,
1846 [&](mlir::OpBuilder &opBuilder, mlir::Location location) {
1848 cir::YieldOp::create(opBuilder, location, zeroLiteral);
1851 [&](mlir::OpBuilder &opBuilder, mlir::Location location) {
1852 auto isNan = cir::IsFPClassOp::create(opBuilder, location, value,
1853 cir::FPClassTest::Nan);
1854 mlir::Value nanResult =
1855 cir::TernaryOp::create(
1856 opBuilder, location, isNan,
1858 [&](mlir::OpBuilder &opBuilder, mlir::Location location) {
1860 cir::YieldOp::create(opBuilder, location, nanLiteral);
1863 [&](mlir::OpBuilder &opBuilder, mlir::Location location) {
1864 auto isInfinity = cir::IsFPClassOp::create(
1865 opBuilder, location, value,
1866 cir::FPClassTest::Infinity);
1867 mlir::Value infResult =
1868 cir::TernaryOp::create(
1869 opBuilder, location, isInfinity,
1871 [&](mlir::OpBuilder &opBuilder,
1872 mlir::Location location) {
1873 mlir::Value infinityLiteral =
1875 cir::YieldOp::create(opBuilder, location,
1879 [&](mlir::OpBuilder &opBuilder,
1880 mlir::Location location) {
1881 auto isNormal = cir::IsFPClassOp::create(
1882 opBuilder, location, value,
1883 cir::FPClassTest::Normal);
1884 mlir::Value fpNormal =
1886 mlir::Value fpSubnormal =
1889 cir::SelectOp::create(
1890 opBuilder, location, resultTy,
1891 isNormal, fpNormal, fpSubnormal);
1892 cir::YieldOp::create(opBuilder, location,
1896 cir::YieldOp::create(opBuilder, location, infResult);
1899 cir::YieldOp::create(opBuilder, location, nanResult);
1904 case Builtin::BIalloca:
1905 case Builtin::BI_alloca:
1906 case Builtin::BI__builtin_alloca_uninitialized:
1907 case Builtin::BI__builtin_alloca:
1909 case Builtin::BI__builtin_alloca_with_align_uninitialized:
1910 case Builtin::BI__builtin_alloca_with_align:
1911 case Builtin::BI__builtin_infer_alloc_token:
1913 case Builtin::BIbzero:
1914 case Builtin::BI__builtin_bzero: {
1919 mlir::Value zero = builder.getNullValue(builder.getUInt8Ty(), loc);
1921 builder.createMemSet(loc, destPtrCast, zero, size);
1925 case Builtin::BIbcopy:
1926 case Builtin::BI__builtin_bcopy: {
1938 case Builtin::BI__builtin_char_memchr:
1939 case Builtin::BI__builtin_memchr: {
1942 builder.createBitcast(srcPtr.
getPointer(), builder.getVoidPtrTy());
1949 case Builtin::BImemcpy:
1950 case Builtin::BI__builtin_memcpy:
1951 case Builtin::BImempcpy:
1952 case Builtin::BI__builtin_mempcpy:
1953 case Builtin::BI__builtin_memcpy_inline:
1954 case Builtin::BI__builtin___memcpy_chk:
1955 case Builtin::BI__builtin_objc_memmove_collectable:
1956 case Builtin::BI__builtin___memmove_chk:
1957 case Builtin::BI__builtin_trivially_relocate:
1958 case Builtin::BImemmove:
1959 case Builtin::BI__builtin_memmove:
1960 case Builtin::BImemset:
1961 case Builtin::BI__builtin_memset:
1962 case Builtin::BI__builtin_memset_inline:
1963 case Builtin::BI__builtin___memset_chk:
1964 case Builtin::BI__builtin_wmemchr:
1965 case Builtin::BI__builtin_wmemcmp:
1967 case Builtin::BI__builtin_dwarf_cfa:
1969 case Builtin::BI__builtin_return_address: {
1973 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));
1975 case Builtin::BI_ReturnAddress: {
1978 builder.getConstInt(loc, builder.getUInt32Ty(), 0)));
1980 case Builtin::BI__builtin_frame_address: {
1983 mlir::Value addr = cir::FrameAddrOp::create(
1985 builder.getConstAPInt(loc, builder.getUInt32Ty(), level));
1987 builder.createCast(loc, cir::CastKind::bitcast, addr,
voidPtrTy));
1989 case Builtin::BI__builtin_extract_return_addr:
1990 case Builtin::BI__builtin_frob_return_addr:
1991 case Builtin::BI__builtin_dwarf_sp_column:
1992 case Builtin::BI__builtin_init_dwarf_reg_size_table:
1993 case Builtin::BI__builtin_eh_return:
1994 case Builtin::BI__builtin_unwind_init:
1995 case Builtin::BI__builtin_extend_pointer:
1997 case Builtin::BI__builtin_setjmp: {
2001 cir::PointerType
voidPtrTy = builder.getVoidPtrTy();
2002 cir::PointerType ppTy = builder.getPointerTo(
voidPtrTy);
2011 mlir::Value frameAddress =
2012 cir::FrameAddrOp::create(builder, loc,
voidPtrTy,
2013 mlir::ValueRange{builder.getUInt32(0, loc)})
2016 builder.createStore(loc, frameAddress, castBuf);
2018 mlir::Value stacksave =
2019 cir::StackSaveOp::create(builder, loc,
voidPtrTy).getResult();
2020 cir::PtrStrideOp stackSaveSlot = cir::PtrStrideOp::create(
2021 builder, loc, ppTy, castBuf.
getPointer(), builder.getSInt32(2, loc));
2022 llvm::TypeSize voidPtrTySize =
2025 CharUnits().fromQuantity(2 * voidPtrTySize));
2027 builder.createStore(loc, stacksave, slotAddr);
2028 auto op = cir::EhSetjmpOp::create(builder, loc, castBuf.
getPointer());
2031 case Builtin::BI__builtin_longjmp: {
2035 cir::EhLongjmpOp::create(builder, loc, buf);
2036 cir::UnreachableOp::create(builder, loc);
2039 case Builtin::BI__builtin_launder: {
2041 QualType argTy = arg->getType()->getPointeeType();
2044 if (
cgm.getCodeGenOpts().StrictVTablePointers &&
2047 ptr = cir::LaunderOp::create(builder, loc, ptr).getResult();
2051 case Builtin::BI__builtin_clear_padding: {
2057 cgm.getASTContext().getPaddingIntervals(pointeeTy);
2060 for (
const auto &interval : padding)
2061 paddingLocs.push_back(cir::OffsetPairAttr::get(
2064 cir::ClearPaddingOp::create(
2070 case Builtin::BI__sync_fetch_and_add:
2071 case Builtin::BI__sync_fetch_and_sub:
2072 case Builtin::BI__sync_fetch_and_or:
2073 case Builtin::BI__sync_fetch_and_and:
2074 case Builtin::BI__sync_fetch_and_xor:
2075 case Builtin::BI__sync_fetch_and_nand:
2076 case Builtin::BI__sync_add_and_fetch:
2077 case Builtin::BI__sync_sub_and_fetch:
2078 case Builtin::BI__sync_and_and_fetch:
2079 case Builtin::BI__sync_or_and_fetch:
2080 case Builtin::BI__sync_xor_and_fetch:
2081 case Builtin::BI__sync_nand_and_fetch:
2082 case Builtin::BI__sync_val_compare_and_swap:
2083 case Builtin::BI__sync_bool_compare_and_swap:
2084 case Builtin::BI__sync_lock_test_and_set:
2085 case Builtin::BI__sync_lock_release:
2086 case Builtin::BI__sync_swap:
2088 case Builtin::BI__sync_fetch_and_add_1:
2089 case Builtin::BI__sync_fetch_and_add_2:
2090 case Builtin::BI__sync_fetch_and_add_4:
2091 case Builtin::BI__sync_fetch_and_add_8:
2092 case Builtin::BI__sync_fetch_and_add_16:
2094 case Builtin::BI__sync_fetch_and_sub_1:
2095 case Builtin::BI__sync_fetch_and_sub_2:
2096 case Builtin::BI__sync_fetch_and_sub_4:
2097 case Builtin::BI__sync_fetch_and_sub_8:
2098 case Builtin::BI__sync_fetch_and_sub_16:
2100 case Builtin::BI__sync_fetch_and_or_1:
2101 case Builtin::BI__sync_fetch_and_or_2:
2102 case Builtin::BI__sync_fetch_and_or_4:
2103 case Builtin::BI__sync_fetch_and_or_8:
2104 case Builtin::BI__sync_fetch_and_or_16:
2106 case Builtin::BI__sync_fetch_and_and_1:
2107 case Builtin::BI__sync_fetch_and_and_2:
2108 case Builtin::BI__sync_fetch_and_and_4:
2109 case Builtin::BI__sync_fetch_and_and_8:
2110 case Builtin::BI__sync_fetch_and_and_16:
2112 case Builtin::BI__sync_fetch_and_xor_1:
2113 case Builtin::BI__sync_fetch_and_xor_2:
2114 case Builtin::BI__sync_fetch_and_xor_4:
2115 case Builtin::BI__sync_fetch_and_xor_8:
2116 case Builtin::BI__sync_fetch_and_xor_16:
2118 case Builtin::BI__sync_fetch_and_nand_1:
2119 case Builtin::BI__sync_fetch_and_nand_2:
2120 case Builtin::BI__sync_fetch_and_nand_4:
2121 case Builtin::BI__sync_fetch_and_nand_8:
2122 case Builtin::BI__sync_fetch_and_nand_16:
2124 case Builtin::BI__sync_fetch_and_min:
2125 case Builtin::BI__sync_fetch_and_max:
2126 case Builtin::BI__sync_fetch_and_umin:
2127 case Builtin::BI__sync_fetch_and_umax:
2130 case Builtin::BI__sync_add_and_fetch_1:
2131 case Builtin::BI__sync_add_and_fetch_2:
2132 case Builtin::BI__sync_add_and_fetch_4:
2133 case Builtin::BI__sync_add_and_fetch_8:
2134 case Builtin::BI__sync_add_and_fetch_16:
2137 case Builtin::BI__sync_sub_and_fetch_1:
2138 case Builtin::BI__sync_sub_and_fetch_2:
2139 case Builtin::BI__sync_sub_and_fetch_4:
2140 case Builtin::BI__sync_sub_and_fetch_8:
2141 case Builtin::BI__sync_sub_and_fetch_16:
2144 case Builtin::BI__sync_and_and_fetch_1:
2145 case Builtin::BI__sync_and_and_fetch_2:
2146 case Builtin::BI__sync_and_and_fetch_4:
2147 case Builtin::BI__sync_and_and_fetch_8:
2148 case Builtin::BI__sync_and_and_fetch_16:
2151 case Builtin::BI__sync_or_and_fetch_1:
2152 case Builtin::BI__sync_or_and_fetch_2:
2153 case Builtin::BI__sync_or_and_fetch_4:
2154 case Builtin::BI__sync_or_and_fetch_8:
2155 case Builtin::BI__sync_or_and_fetch_16:
2157 case Builtin::BI__sync_xor_and_fetch_1:
2158 case Builtin::BI__sync_xor_and_fetch_2:
2159 case Builtin::BI__sync_xor_and_fetch_4:
2160 case Builtin::BI__sync_xor_and_fetch_8:
2161 case Builtin::BI__sync_xor_and_fetch_16:
2164 case Builtin::BI__sync_nand_and_fetch_1:
2165 case Builtin::BI__sync_nand_and_fetch_2:
2166 case Builtin::BI__sync_nand_and_fetch_4:
2167 case Builtin::BI__sync_nand_and_fetch_8:
2168 case Builtin::BI__sync_nand_and_fetch_16:
2171 case Builtin::BI__sync_val_compare_and_swap_1:
2172 case Builtin::BI__sync_val_compare_and_swap_2:
2173 case Builtin::BI__sync_val_compare_and_swap_4:
2174 case Builtin::BI__sync_val_compare_and_swap_8:
2175 case Builtin::BI__sync_val_compare_and_swap_16:
2176 case Builtin::BI__sync_bool_compare_and_swap_1:
2177 case Builtin::BI__sync_bool_compare_and_swap_2:
2178 case Builtin::BI__sync_bool_compare_and_swap_4:
2179 case Builtin::BI__sync_bool_compare_and_swap_8:
2180 case Builtin::BI__sync_bool_compare_and_swap_16:
2181 case Builtin::BI__sync_swap_1:
2182 case Builtin::BI__sync_swap_2:
2183 case Builtin::BI__sync_swap_4:
2184 case Builtin::BI__sync_swap_8:
2185 case Builtin::BI__sync_swap_16:
2186 case Builtin::BI__sync_lock_test_and_set_1:
2187 case Builtin::BI__sync_lock_test_and_set_2:
2188 case Builtin::BI__sync_lock_test_and_set_4:
2189 case Builtin::BI__sync_lock_test_and_set_8:
2190 case Builtin::BI__sync_lock_test_and_set_16:
2191 case Builtin::BI__sync_lock_release_1:
2192 case Builtin::BI__sync_lock_release_2:
2193 case Builtin::BI__sync_lock_release_4:
2194 case Builtin::BI__sync_lock_release_8:
2195 case Builtin::BI__sync_lock_release_16:
2197 case Builtin::BI__sync_synchronize: {
2205 cir::AtomicFenceOp::create(
2207 cir::MemOrder::SequentiallyConsistent,
2209 cir::SyncScopeKind::System));
2212 case Builtin::BI__builtin_nontemporal_load: {
2220 case Builtin::BI__builtin_nontemporal_store: {
2230 case Builtin::BI__c11_atomic_is_lock_free:
2231 case Builtin::BI__atomic_is_lock_free:
2233 case Builtin::BI__atomic_test_and_set:
2234 case Builtin::BI__atomic_clear:
2236 case Builtin::BI__atomic_thread_fence:
2237 case Builtin::BI__c11_atomic_thread_fence: {
2241 case Builtin::BI__atomic_signal_fence:
2242 case Builtin::BI__c11_atomic_signal_fence: {
2246 case Builtin::BI__scoped_atomic_thread_fence:
2248 case Builtin::BI__builtin_signbit:
2249 case Builtin::BI__builtin_signbitf:
2250 case Builtin::BI__builtin_signbitl: {
2254 mlir::Operation *signBitOp = cir::SignBitOp::create(builder, loc, value);
2255 mlir::Value result = builder.createBoolToInt(signBitOp->getResult(0),
2259 case Builtin::BI__warn_memset_zero_len:
2260 case Builtin::BI__annotation:
2261 case Builtin::BI__builtin_annotation:
2264 case Builtin::BI__builtin_addcb:
2265 case Builtin::BI__builtin_addcs:
2266 case Builtin::BI__builtin_addc:
2267 case Builtin::BI__builtin_addcl:
2268 case Builtin::BI__builtin_addcll:
2269 case Builtin::BI__builtin_subcb:
2270 case Builtin::BI__builtin_subcs:
2271 case Builtin::BI__builtin_subc:
2272 case Builtin::BI__builtin_subcl:
2273 case Builtin::BI__builtin_subcll: {
2289 static constexpr unsigned addcBuiltins[] = {
2290 Builtin::BI__builtin_addcb, Builtin::BI__builtin_addcs,
2291 Builtin::BI__builtin_addc, Builtin::BI__builtin_addcl,
2292 Builtin::BI__builtin_addcll};
2293 bool isAdd = llvm::is_contained(addcBuiltins, builtinID);
2295 mlir::Value sum1, carry1, sum2, carry2;
2297 std::tie(sum1, carry1) =
2300 builder, loc, resultTy, sum1, carryin);
2302 std::tie(sum1, carry1) =
2305 builder, loc, resultTy, sum1, carryin);
2309 mlir::Value carryOut = builder.createBoolToInt(
2310 builder.createOr(loc, carry1, carry2), resultTy);
2311 builder.createStore(loc, carryOut, carryOutPtr);
2315 case Builtin::BI__builtin_add_overflow:
2316 case Builtin::BI__builtin_sub_overflow:
2317 case Builtin::BI__builtin_mul_overflow: {
2325 WidthAndSignedness leftInfo =
2327 WidthAndSignedness rightInfo =
2329 WidthAndSignedness resultInfo =
2335 WidthAndSignedness encompassingInfo =
2338 auto encompassingCIRTy = cir::IntType::get(
2339 &
getMLIRContext(), encompassingInfo.width, encompassingInfo.isSigned);
2340 mlir::Type resultCIRTy =
cgm.convertType(resultQTy);
2347 if (x.getType() != encompassingCIRTy) {
2348 x = builder.createCast(mlir::isa<cir::BoolType>(x.getType())
2349 ? cir::CastKind::bool_to_int
2350 : cir::CastKind::integral,
2351 x, encompassingCIRTy);
2354 if (y.getType() != encompassingCIRTy) {
2355 y = builder.createCast(mlir::isa<cir::BoolType>(y.getType())
2356 ? cir::CastKind::bool_to_int
2357 : cir::CastKind::integral,
2358 y, encompassingCIRTy);
2363 mlir::Value result, overflow;
2364 switch (builtinID) {
2366 llvm_unreachable(
"Unknown overflow builtin id.");
2367 case Builtin::BI__builtin_add_overflow:
2368 std::tie(result, overflow) =
2371 case Builtin::BI__builtin_sub_overflow:
2372 std::tie(result, overflow) =
2375 case Builtin::BI__builtin_mul_overflow:
2376 std::tie(result, overflow) =
2394 builder.createStore(loc, result, resultPtr, isVolatile);
2399 case Builtin::BI__builtin_uadd_overflow:
2400 case Builtin::BI__builtin_uaddl_overflow:
2401 case Builtin::BI__builtin_uaddll_overflow:
2402 case Builtin::BI__builtin_usub_overflow:
2403 case Builtin::BI__builtin_usubl_overflow:
2404 case Builtin::BI__builtin_usubll_overflow:
2405 case Builtin::BI__builtin_umul_overflow:
2406 case Builtin::BI__builtin_umull_overflow:
2407 case Builtin::BI__builtin_umulll_overflow:
2408 case Builtin::BI__builtin_sadd_overflow:
2409 case Builtin::BI__builtin_saddl_overflow:
2410 case Builtin::BI__builtin_saddll_overflow:
2411 case Builtin::BI__builtin_ssub_overflow:
2412 case Builtin::BI__builtin_ssubl_overflow:
2413 case Builtin::BI__builtin_ssubll_overflow:
2414 case Builtin::BI__builtin_smul_overflow:
2415 case Builtin::BI__builtin_smull_overflow:
2416 case Builtin::BI__builtin_smulll_overflow: {
2426 auto resultCIRTy = mlir::cast<cir::IntType>(
cgm.convertType(resultQTy));
2430 mlir::Value result, overflow;
2431 switch (builtinID) {
2433 llvm_unreachable(
"Unknown overflow builtin id.");
2434 case Builtin::BI__builtin_uadd_overflow:
2435 case Builtin::BI__builtin_uaddl_overflow:
2436 case Builtin::BI__builtin_uaddll_overflow:
2437 case Builtin::BI__builtin_sadd_overflow:
2438 case Builtin::BI__builtin_saddl_overflow:
2439 case Builtin::BI__builtin_saddll_overflow:
2440 std::tie(result, overflow) =
2443 case Builtin::BI__builtin_usub_overflow:
2444 case Builtin::BI__builtin_usubl_overflow:
2445 case Builtin::BI__builtin_usubll_overflow:
2446 case Builtin::BI__builtin_ssub_overflow:
2447 case Builtin::BI__builtin_ssubl_overflow:
2448 case Builtin::BI__builtin_ssubll_overflow:
2449 std::tie(result, overflow) =
2452 case Builtin::BI__builtin_umul_overflow:
2453 case Builtin::BI__builtin_umull_overflow:
2454 case Builtin::BI__builtin_umulll_overflow:
2455 case Builtin::BI__builtin_smul_overflow:
2456 case Builtin::BI__builtin_smull_overflow:
2457 case Builtin::BI__builtin_smulll_overflow:
2458 std::tie(result, overflow) =
2465 builder.createStore(loc,
emitToMemory(result, resultQTy), resultPtr,
2471 case Builtin::BIaddressof:
2472 case Builtin::BI__addressof:
2473 case Builtin::BI__builtin_addressof:
2475 case Builtin::BI__builtin_function_start:
2477 case Builtin::BI__builtin_operator_new:
2480 case Builtin::BI__builtin_operator_delete:
2484 case Builtin::BI__builtin_is_aligned:
2485 case Builtin::BI__builtin_align_up:
2486 case Builtin::BI__builtin_align_down:
2487 case Builtin::BI__noop:
2488 case Builtin::BI__builtin_call_with_static_chain:
2489 case Builtin::BI_InterlockedExchange8:
2490 case Builtin::BI_InterlockedExchange16:
2491 case Builtin::BI_InterlockedExchange:
2492 case Builtin::BI_InterlockedExchangePointer:
2493 case Builtin::BI_InterlockedCompareExchangePointer:
2494 case Builtin::BI_InterlockedCompareExchangePointer_nf:
2495 case Builtin::BI_InterlockedCompareExchange8:
2496 case Builtin::BI_InterlockedCompareExchange16:
2497 case Builtin::BI_InterlockedCompareExchange:
2498 case Builtin::BI_InterlockedCompareExchange64:
2499 case Builtin::BI_InterlockedIncrement16:
2500 case Builtin::BI_InterlockedIncrement:
2501 case Builtin::BI_InterlockedDecrement16:
2502 case Builtin::BI_InterlockedDecrement:
2503 case Builtin::BI_InterlockedAnd8:
2504 case Builtin::BI_InterlockedAnd16:
2505 case Builtin::BI_InterlockedAnd:
2506 case Builtin::BI_InterlockedExchangeAdd8:
2507 case Builtin::BI_InterlockedExchangeAdd16:
2508 case Builtin::BI_InterlockedExchangeAdd:
2509 case Builtin::BI_InterlockedExchangeSub8:
2510 case Builtin::BI_InterlockedExchangeSub16:
2511 case Builtin::BI_InterlockedExchangeSub:
2512 case Builtin::BI_InterlockedOr8:
2513 case Builtin::BI_InterlockedOr16:
2514 case Builtin::BI_InterlockedOr:
2515 case Builtin::BI_InterlockedXor8:
2516 case Builtin::BI_InterlockedXor16:
2517 case Builtin::BI_InterlockedXor:
2518 case Builtin::BI_bittest64:
2519 case Builtin::BI_bittest:
2520 case Builtin::BI_bittestandcomplement64:
2521 case Builtin::BI_bittestandcomplement:
2522 case Builtin::BI_bittestandreset64:
2523 case Builtin::BI_bittestandreset:
2524 case Builtin::BI_bittestandset64:
2525 case Builtin::BI_bittestandset:
2526 case Builtin::BI_interlockedbittestandreset:
2527 case Builtin::BI_interlockedbittestandreset64:
2528 case Builtin::BI_interlockedbittestandreset64_acq:
2529 case Builtin::BI_interlockedbittestandreset64_rel:
2530 case Builtin::BI_interlockedbittestandreset64_nf:
2531 case Builtin::BI_interlockedbittestandset64:
2532 case Builtin::BI_interlockedbittestandset64_acq:
2533 case Builtin::BI_interlockedbittestandset64_rel:
2534 case Builtin::BI_interlockedbittestandset64_nf:
2535 case Builtin::BI_interlockedbittestandset:
2536 case Builtin::BI_interlockedbittestandset_acq:
2537 case Builtin::BI_interlockedbittestandset_rel:
2538 case Builtin::BI_interlockedbittestandset_nf:
2539 case Builtin::BI_interlockedbittestandreset_acq:
2540 case Builtin::BI_interlockedbittestandreset_rel:
2541 case Builtin::BI_interlockedbittestandreset_nf:
2542 case Builtin::BI__iso_volatile_load8:
2543 case Builtin::BI__iso_volatile_load16:
2544 case Builtin::BI__iso_volatile_load32:
2545 case Builtin::BI__iso_volatile_load64:
2546 case Builtin::BI__iso_volatile_store8:
2547 case Builtin::BI__iso_volatile_store16:
2548 case Builtin::BI__iso_volatile_store32:
2549 case Builtin::BI__iso_volatile_store64:
2550 case Builtin::BI__builtin_ptrauth_sign_constant:
2551 case Builtin::BI__builtin_ptrauth_auth:
2552 case Builtin::BI__builtin_ptrauth_auth_and_resign:
2553 case Builtin::BI__builtin_ptrauth_blend_discriminator:
2554 case Builtin::BI__builtin_ptrauth_sign_generic_data:
2555 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
2556 case Builtin::BI__builtin_ptrauth_strip:
2557 case Builtin::BI__builtin_get_vtable_pointer:
2558 case Builtin::BI__exception_code:
2559 case Builtin::BI_exception_code:
2560 case Builtin::BI__exception_info:
2561 case Builtin::BI_exception_info:
2562 case Builtin::BI__abnormal_termination:
2563 case Builtin::BI_abnormal_termination:
2565 case Builtin::BI_setjmpex:
2566 case Builtin::BI_setjmp:
2573 case Builtin::BImove:
2574 case Builtin::BImove_if_noexcept:
2575 case Builtin::BIforward:
2576 case Builtin::BIforward_like:
2577 case Builtin::BIas_const:
2579 case Builtin::BI__GetExceptionInfo:
2580 case Builtin::BI__fastfail:
2581 case Builtin::BIread_pipe:
2582 case Builtin::BIwrite_pipe:
2583 case Builtin::BIreserve_read_pipe:
2584 case Builtin::BIreserve_write_pipe:
2585 case Builtin::BIwork_group_reserve_read_pipe:
2586 case Builtin::BIwork_group_reserve_write_pipe:
2587 case Builtin::BIsub_group_reserve_read_pipe:
2588 case Builtin::BIsub_group_reserve_write_pipe:
2589 case Builtin::BIcommit_read_pipe:
2590 case Builtin::BIcommit_write_pipe:
2591 case Builtin::BIwork_group_commit_read_pipe:
2592 case Builtin::BIwork_group_commit_write_pipe:
2593 case Builtin::BIsub_group_commit_read_pipe:
2594 case Builtin::BIsub_group_commit_write_pipe:
2595 case Builtin::BIget_pipe_num_packets:
2596 case Builtin::BIget_pipe_max_packets:
2597 case Builtin::BIto_global:
2598 case Builtin::BIto_local:
2599 case Builtin::BIto_private:
2600 case Builtin::BIenqueue_kernel:
2601 case Builtin::BIget_kernel_work_group_size:
2602 case Builtin::BIget_kernel_preferred_work_group_size_multiple:
2603 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange:
2604 case Builtin::BIget_kernel_sub_group_count_for_ndrange:
2605 case Builtin::BI__builtin_store_half:
2606 case Builtin::BI__builtin_store_halff:
2607 case Builtin::BI__builtin_load_half:
2608 case Builtin::BI__builtin_load_halff:
2610 case Builtin::BI__builtin_printf:
2611 case Builtin::BIprintf:
2624 case Builtin::BI__builtin_canonicalize:
2625 case Builtin::BI__builtin_canonicalizef:
2626 case Builtin::BI__builtin_canonicalizef16:
2627 case Builtin::BI__builtin_canonicalizel:
2628 case Builtin::BI__builtin_thread_pointer:
2629 case Builtin::BI__builtin_os_log_format:
2630 case Builtin::BI__xray_customevent:
2631 case Builtin::BI__xray_typedevent:
2632 case Builtin::BI__builtin_ms_va_start:
2633 case Builtin::BI__builtin_ms_va_end:
2634 case Builtin::BI__builtin_ms_va_copy:
2635 case Builtin::BI__builtin_get_device_side_mangled_name:
2643 getContext().BuiltinInfo.isLibFunction(builtinID))
2645 cgm.getBuiltinLibFunction(fd, builtinID));
2649 if (
getContext().BuiltinInfo.isPredefinedLibFunction(builtinID))
2655 Intrinsic::ID intrinsicID = Intrinsic::not_intrinsic;
2658 if (!prefix.empty()) {
2659 intrinsicID = Intrinsic::getIntrinsicForClangBuiltin(prefix, name);
2663 if (intrinsicID == Intrinsic::not_intrinsic)
2664 intrinsicID = Intrinsic::getIntrinsicForMSBuiltin(prefix, name);
2667 if (intrinsicID != Intrinsic::not_intrinsic) {
2668 unsigned iceArguments = 0;
2673 StringRef name = Intrinsic::getName(intrinsicID);
2677 assert(name.starts_with(
"llvm.") &&
"expected llvm. prefix");
2678 name = name.drop_front(5);
2680 cir::FuncType intrinsicType =
2685 for (
unsigned i = 0; i < e->
getNumArgs(); i++) {
2686 mlir::Value argValue =
2690 mlir::Type argType = argValue.getType();
2691 mlir::Type expectedTy = intrinsicType.getInput(i);
2694 mlir::Type correctedExpectedTy = expectedTy;
2695 if (fd && i < fd->getNumParams()) {
2700 if (mlir::isa<cir::PointerType>(expectedTy)) {
2701 bool argIsPointer = mlir::isa<cir::PointerType>(argType);
2702 bool argIsVectorOfPointer =
false;
2703 if (
auto vecTy = dyn_cast<mlir::VectorType>(argType))
2704 argIsVectorOfPointer =
2705 mlir::isa<cir::PointerType>(vecTy.getElementType());
2707 if (!argIsPointer && !argIsVectorOfPointer) {
2710 "intrinsic expects a pointer type (NYI for non-pointer)");
2715 if (argType != expectedTy)
2720 if (argType != correctedExpectedTy)
2721 argValue = builder.createBitcast(argValue, correctedExpectedTy);
2724 args.push_back(argValue);
2729 mlir::Type correctedReturnType = intrinsicType.
getReturnType();
2731 correctedReturnType =
2736 cir::LLVMIntrinsicCallOp intrinsicCall = cir::LLVMIntrinsicCallOp::create(
2738 correctedReturnType, args);
2740 mlir::Value intrinsicRes = intrinsicCall.getResult();
2764 if (std::optional<mlir::Value> rst =
2766 mlir::Value v = rst.value();
2774 if (mlir::isa<cir::VoidType>(v.getType()))
2781 llvm_unreachable(
"No current target builtin returns complex");
2783 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
2787 std::string(
"unimplemented builtin call: ") +
2788 getContext().BuiltinInfo.getName(builtinID));