754 unsigned builtinID) {
757 case Builtin::BIacos:
758 case Builtin::BIacosf:
759 case Builtin::BIacosl:
760 case Builtin::BI__builtin_acos:
761 case Builtin::BI__builtin_acosf:
762 case Builtin::BI__builtin_acosf16:
763 case Builtin::BI__builtin_acosl:
764 case Builtin::BI__builtin_acosf128:
765 case Builtin::BI__builtin_elementwise_acos:
767 case Builtin::BIasin:
768 case Builtin::BIasinf:
769 case Builtin::BIasinl:
770 case Builtin::BI__builtin_asin:
771 case Builtin::BI__builtin_asinf:
772 case Builtin::BI__builtin_asinf16:
773 case Builtin::BI__builtin_asinl:
774 case Builtin::BI__builtin_asinf128:
775 case Builtin::BI__builtin_elementwise_asin:
777 case Builtin::BIatan:
778 case Builtin::BIatanf:
779 case Builtin::BIatanl:
780 case Builtin::BI__builtin_atan:
781 case Builtin::BI__builtin_atanf:
782 case Builtin::BI__builtin_atanf16:
783 case Builtin::BI__builtin_atanl:
784 case Builtin::BI__builtin_atanf128:
785 case Builtin::BI__builtin_elementwise_atan:
787 case Builtin::BIatan2:
788 case Builtin::BIatan2f:
789 case Builtin::BIatan2l:
790 case Builtin::BI__builtin_atan2:
791 case Builtin::BI__builtin_atan2f:
792 case Builtin::BI__builtin_atan2f16:
793 case Builtin::BI__builtin_atan2l:
794 case Builtin::BI__builtin_atan2f128:
795 case Builtin::BI__builtin_elementwise_atan2:
798 case Builtin::BIceil:
799 case Builtin::BIceilf:
800 case Builtin::BIceill:
801 case Builtin::BI__builtin_ceil:
802 case Builtin::BI__builtin_ceilf:
803 case Builtin::BI__builtin_ceilf16:
804 case Builtin::BI__builtin_ceill:
805 case Builtin::BI__builtin_ceilf128:
806 case Builtin::BI__builtin_elementwise_ceil:
808 case Builtin::BIcopysign:
809 case Builtin::BIcopysignf:
810 case Builtin::BIcopysignl:
811 case Builtin::BI__builtin_copysign:
812 case Builtin::BI__builtin_copysignf:
813 case Builtin::BI__builtin_copysignf16:
814 case Builtin::BI__builtin_copysignl:
815 case Builtin::BI__builtin_copysignf128:
818 case Builtin::BIcosf:
819 case Builtin::BIcosl:
820 case Builtin::BI__builtin_cos:
821 case Builtin::BI__builtin_cosf:
822 case Builtin::BI__builtin_cosf16:
823 case Builtin::BI__builtin_cosl:
824 case Builtin::BI__builtin_cosf128:
825 case Builtin::BI__builtin_elementwise_cos:
827 case Builtin::BIcosh:
828 case Builtin::BIcoshf:
829 case Builtin::BIcoshl:
830 case Builtin::BI__builtin_cosh:
831 case Builtin::BI__builtin_coshf:
832 case Builtin::BI__builtin_coshf16:
833 case Builtin::BI__builtin_coshl:
834 case Builtin::BI__builtin_coshf128:
835 case Builtin::BI__builtin_elementwise_cosh:
838 case Builtin::BIexpf:
839 case Builtin::BIexpl:
840 case Builtin::BI__builtin_exp:
841 case Builtin::BI__builtin_expf:
842 case Builtin::BI__builtin_expf16:
843 case Builtin::BI__builtin_expl:
844 case Builtin::BI__builtin_expf128:
845 case Builtin::BI__builtin_elementwise_exp:
847 case Builtin::BIexp2:
848 case Builtin::BIexp2f:
849 case Builtin::BIexp2l:
850 case Builtin::BI__builtin_exp2:
851 case Builtin::BI__builtin_exp2f:
852 case Builtin::BI__builtin_exp2f16:
853 case Builtin::BI__builtin_exp2l:
854 case Builtin::BI__builtin_exp2f128:
855 case Builtin::BI__builtin_elementwise_exp2:
857 case Builtin::BI__builtin_exp10:
858 case Builtin::BI__builtin_exp10f:
859 case Builtin::BI__builtin_exp10f16:
860 case Builtin::BI__builtin_exp10l:
861 case Builtin::BI__builtin_exp10f128:
862 case Builtin::BI__builtin_elementwise_exp10:
864 case Builtin::BIfabs:
865 case Builtin::BIfabsf:
866 case Builtin::BIfabsl:
867 case Builtin::BI__builtin_fabs:
868 case Builtin::BI__builtin_fabsf:
869 case Builtin::BI__builtin_fabsf16:
870 case Builtin::BI__builtin_fabsl:
871 case Builtin::BI__builtin_fabsf128:
873 case Builtin::BIfloor:
874 case Builtin::BIfloorf:
875 case Builtin::BIfloorl:
876 case Builtin::BI__builtin_floor:
877 case Builtin::BI__builtin_floorf:
878 case Builtin::BI__builtin_floorf16:
879 case Builtin::BI__builtin_floorl:
880 case Builtin::BI__builtin_floorf128:
881 case Builtin::BI__builtin_elementwise_floor:
884 case Builtin::BIfmaf:
885 case Builtin::BIfmal:
886 case Builtin::BI__builtin_fma:
887 case Builtin::BI__builtin_fmaf:
888 case Builtin::BI__builtin_fmaf16:
889 case Builtin::BI__builtin_fmal:
890 case Builtin::BI__builtin_fmaf128:
891 case Builtin::BI__builtin_elementwise_fma:
893 case Builtin::BIfmax:
894 case Builtin::BIfmaxf:
895 case Builtin::BIfmaxl:
896 case Builtin::BI__builtin_fmax:
897 case Builtin::BI__builtin_fmaxf:
898 case Builtin::BI__builtin_fmaxf16:
899 case Builtin::BI__builtin_fmaxl:
900 case Builtin::BI__builtin_fmaxf128:
903 case Builtin::BIfmin:
904 case Builtin::BIfminf:
905 case Builtin::BIfminl:
906 case Builtin::BI__builtin_fmin:
907 case Builtin::BI__builtin_fminf:
908 case Builtin::BI__builtin_fminf16:
909 case Builtin::BI__builtin_fminl:
910 case Builtin::BI__builtin_fminf128:
913 case Builtin::BIfmaximum_num:
914 case Builtin::BIfmaximum_numf:
915 case Builtin::BIfmaximum_numl:
916 case Builtin::BI__builtin_fmaximum_num:
917 case Builtin::BI__builtin_fmaximum_numf:
918 case Builtin::BI__builtin_fmaximum_numf16:
919 case Builtin::BI__builtin_fmaximum_numl:
920 case Builtin::BI__builtin_fmaximum_numf128:
921 case Builtin::BIfminimum_num:
922 case Builtin::BIfminimum_numf:
923 case Builtin::BIfminimum_numl:
924 case Builtin::BI__builtin_fminimum_num:
925 case Builtin::BI__builtin_fminimum_numf:
926 case Builtin::BI__builtin_fminimum_numf16:
927 case Builtin::BI__builtin_fminimum_numl:
928 case Builtin::BI__builtin_fminimum_numf128:
930 case Builtin::BIfmod:
931 case Builtin::BIfmodf:
932 case Builtin::BIfmodl:
933 case Builtin::BI__builtin_fmod:
934 case Builtin::BI__builtin_fmodf:
935 case Builtin::BI__builtin_fmodf16:
936 case Builtin::BI__builtin_fmodl:
937 case Builtin::BI__builtin_fmodf128:
938 case Builtin::BI__builtin_elementwise_fmod:
942 case Builtin::BIlogf:
943 case Builtin::BIlogl:
944 case Builtin::BI__builtin_log:
945 case Builtin::BI__builtin_logf:
946 case Builtin::BI__builtin_logf16:
947 case Builtin::BI__builtin_logl:
948 case Builtin::BI__builtin_logf128:
949 case Builtin::BI__builtin_elementwise_log:
951 case Builtin::BIlog10:
952 case Builtin::BIlog10f:
953 case Builtin::BIlog10l:
954 case Builtin::BI__builtin_log10:
955 case Builtin::BI__builtin_log10f:
956 case Builtin::BI__builtin_log10f16:
957 case Builtin::BI__builtin_log10l:
958 case Builtin::BI__builtin_log10f128:
959 case Builtin::BI__builtin_elementwise_log10:
961 case Builtin::BIlog2:
962 case Builtin::BIlog2f:
963 case Builtin::BIlog2l:
964 case Builtin::BI__builtin_log2:
965 case Builtin::BI__builtin_log2f:
966 case Builtin::BI__builtin_log2f16:
967 case Builtin::BI__builtin_log2l:
968 case Builtin::BI__builtin_log2f128:
969 case Builtin::BI__builtin_elementwise_log2:
971 case Builtin::BInearbyint:
972 case Builtin::BInearbyintf:
973 case Builtin::BInearbyintl:
974 case Builtin::BI__builtin_nearbyint:
975 case Builtin::BI__builtin_nearbyintf:
976 case Builtin::BI__builtin_nearbyintl:
977 case Builtin::BI__builtin_nearbyintf128:
978 case Builtin::BI__builtin_elementwise_nearbyint:
981 case Builtin::BIpowf:
982 case Builtin::BIpowl:
983 case Builtin::BI__builtin_pow:
984 case Builtin::BI__builtin_powf:
985 case Builtin::BI__builtin_powf16:
986 case Builtin::BI__builtin_powl:
987 case Builtin::BI__builtin_powf128:
990 case Builtin::BI__builtin_elementwise_pow:
992 case Builtin::BIrint:
993 case Builtin::BIrintf:
994 case Builtin::BIrintl:
995 case Builtin::BI__builtin_rint:
996 case Builtin::BI__builtin_rintf:
997 case Builtin::BI__builtin_rintf16:
998 case Builtin::BI__builtin_rintl:
999 case Builtin::BI__builtin_rintf128:
1000 case Builtin::BI__builtin_elementwise_rint:
1002 case Builtin::BIround:
1003 case Builtin::BIroundf:
1004 case Builtin::BIroundl:
1005 case Builtin::BI__builtin_round:
1006 case Builtin::BI__builtin_roundf:
1007 case Builtin::BI__builtin_roundf16:
1008 case Builtin::BI__builtin_roundl:
1009 case Builtin::BI__builtin_roundf128:
1010 case Builtin::BI__builtin_elementwise_round:
1012 case Builtin::BIroundeven:
1013 case Builtin::BIroundevenf:
1014 case Builtin::BIroundevenl:
1015 case Builtin::BI__builtin_roundeven:
1016 case Builtin::BI__builtin_roundevenf:
1017 case Builtin::BI__builtin_roundevenf16:
1018 case Builtin::BI__builtin_roundevenl:
1019 case Builtin::BI__builtin_roundevenf128:
1020 case Builtin::BI__builtin_elementwise_roundeven:
1022 case Builtin::BIsin:
1023 case Builtin::BIsinf:
1024 case Builtin::BIsinl:
1025 case Builtin::BI__builtin_sin:
1026 case Builtin::BI__builtin_sinf:
1027 case Builtin::BI__builtin_sinf16:
1028 case Builtin::BI__builtin_sinl:
1029 case Builtin::BI__builtin_sinf128:
1030 case Builtin::BI__builtin_elementwise_sin:
1032 case Builtin::BIsinh:
1033 case Builtin::BIsinhf:
1034 case Builtin::BIsinhl:
1035 case Builtin::BI__builtin_sinh:
1036 case Builtin::BI__builtin_sinhf:
1037 case Builtin::BI__builtin_sinhf16:
1038 case Builtin::BI__builtin_sinhl:
1039 case Builtin::BI__builtin_sinhf128:
1040 case Builtin::BI__builtin_elementwise_sinh:
1042 case Builtin::BI__builtin_sincospi:
1043 case Builtin::BI__builtin_sincospif:
1044 case Builtin::BI__builtin_sincospil:
1045 case Builtin::BIsincos:
1046 case Builtin::BIsincosf:
1047 case Builtin::BIsincosl:
1048 case Builtin::BI__builtin_sincos:
1049 case Builtin::BI__builtin_sincosf:
1050 case Builtin::BI__builtin_sincosf16:
1051 case Builtin::BI__builtin_sincosl:
1052 case Builtin::BI__builtin_sincosf128:
1054 case Builtin::BIsqrt:
1055 case Builtin::BIsqrtf:
1056 case Builtin::BIsqrtl:
1057 case Builtin::BI__builtin_sqrt:
1058 case Builtin::BI__builtin_sqrtf:
1059 case Builtin::BI__builtin_sqrtf16:
1060 case Builtin::BI__builtin_sqrtl:
1061 case Builtin::BI__builtin_sqrtf128:
1062 case Builtin::BI__builtin_elementwise_sqrt:
1064 case Builtin::BItan:
1065 case Builtin::BItanf:
1066 case Builtin::BItanl:
1067 case Builtin::BI__builtin_tan:
1068 case Builtin::BI__builtin_tanf:
1069 case Builtin::BI__builtin_tanf16:
1070 case Builtin::BI__builtin_tanl:
1071 case Builtin::BI__builtin_tanf128:
1072 case Builtin::BI__builtin_elementwise_tan:
1074 case Builtin::BItanh:
1075 case Builtin::BItanhf:
1076 case Builtin::BItanhl:
1077 case Builtin::BI__builtin_tanh:
1078 case Builtin::BI__builtin_tanhf:
1079 case Builtin::BI__builtin_tanhf16:
1080 case Builtin::BI__builtin_tanhl:
1081 case Builtin::BI__builtin_tanhf128:
1082 case Builtin::BI__builtin_elementwise_tanh:
1084 case Builtin::BItrunc:
1085 case Builtin::BItruncf:
1086 case Builtin::BItruncl:
1087 case Builtin::BI__builtin_trunc:
1088 case Builtin::BI__builtin_truncf:
1089 case Builtin::BI__builtin_truncf16:
1090 case Builtin::BI__builtin_truncl:
1091 case Builtin::BI__builtin_truncf128:
1092 case Builtin::BI__builtin_elementwise_trunc:
1094 case Builtin::BIlround:
1095 case Builtin::BIlroundf:
1096 case Builtin::BIlroundl:
1097 case Builtin::BI__builtin_lround:
1098 case Builtin::BI__builtin_lroundf:
1099 case Builtin::BI__builtin_lroundl:
1100 case Builtin::BI__builtin_lroundf128:
1102 case Builtin::BIllround:
1103 case Builtin::BIllroundf:
1104 case Builtin::BIllroundl:
1105 case Builtin::BI__builtin_llround:
1106 case Builtin::BI__builtin_llroundf:
1107 case Builtin::BI__builtin_llroundl:
1108 case Builtin::BI__builtin_llroundf128:
1110 case Builtin::BIlrint:
1111 case Builtin::BIlrintf:
1112 case Builtin::BIlrintl:
1113 case Builtin::BI__builtin_lrint:
1114 case Builtin::BI__builtin_lrintf:
1115 case Builtin::BI__builtin_lrintl:
1116 case Builtin::BI__builtin_lrintf128:
1118 case Builtin::BIllrint:
1119 case Builtin::BIllrintf:
1120 case Builtin::BIllrintl:
1121 case Builtin::BI__builtin_llrint:
1122 case Builtin::BI__builtin_llrintf:
1123 case Builtin::BI__builtin_llrintl:
1124 case Builtin::BI__builtin_llrintf128:
1126 case Builtin::BI__builtin_ldexp:
1127 case Builtin::BI__builtin_ldexpf:
1128 case Builtin::BI__builtin_ldexpl:
1129 case Builtin::BI__builtin_ldexpf16:
1130 case Builtin::BI__builtin_ldexpf128:
1131 case Builtin::BI__builtin_elementwise_ldexp:
1298 if (
type->isBooleanType())
1300 builder.getBool(result.
Val.
getInt().getBoolValue(), loc));
1322 unsigned builtinIDIfNoAsmLabel = fd->
hasAttr<AsmLabelAttr>() ? 0 : builtinID;
1324 bool generateFPMathIntrinsics =
1327 if (generateFPMathIntrinsics) {
1339 switch (builtinIDIfNoAsmLabel) {
1344 case Builtin::BI__builtin_stdarg_start:
1345 case Builtin::BI__builtin_va_start:
1346 case Builtin::BI__va_start:
1347 case Builtin::BI__builtin_c23_va_start: {
1348 mlir::Value vaList = builtinID == Builtin::BI__va_start
1355 case Builtin::BI__builtin_va_end:
1358 case Builtin::BI__builtin_va_copy: {
1361 cir::VACopyOp::create(builder, dstPtr.getLoc(), dstPtr, srcPtr);
1365 case Builtin::BIabs:
1366 case Builtin::BIlabs:
1367 case Builtin::BIllabs:
1368 case Builtin::BI__builtin_abs:
1369 case Builtin::BI__builtin_labs:
1370 case Builtin::BI__builtin_llabs: {
1371 bool sanitizeOverflow =
sanOpts.has(SanitizerKind::SignedIntegerOverflow);
1374 switch (
getLangOpts().getSignedOverflowBehavior()) {
1376 result = cir::AbsOp::create(builder, loc, arg.getType(), arg,
1380 if (!sanitizeOverflow) {
1381 result = cir::AbsOp::create(builder, loc, arg.getType(), arg,
1393 case Builtin::BI__builtin_complex: {
1396 mlir::Value complex = builder.createComplexCreate(loc, real, imag);
1400 case Builtin::BI__builtin_conj:
1401 case Builtin::BI__builtin_conjf:
1402 case Builtin::BI__builtin_conjl:
1403 case Builtin::BIconj:
1404 case Builtin::BIconjf:
1405 case Builtin::BIconjl: {
1407 mlir::Value
conj = builder.createComplexConj(loc, complex);
1411 case Builtin::BI__builtin_creal:
1412 case Builtin::BI__builtin_crealf:
1413 case Builtin::BI__builtin_creall:
1414 case Builtin::BIcreal:
1415 case Builtin::BIcrealf:
1416 case Builtin::BIcreall: {
1418 mlir::Value real = builder.createComplexReal(loc, complex);
1422 case Builtin::BI__builtin_cimag:
1423 case Builtin::BI__builtin_cimagf:
1424 case Builtin::BI__builtin_cimagl:
1425 case Builtin::BIcimag:
1426 case Builtin::BIcimagf:
1427 case Builtin::BIcimagl: {
1429 mlir::Value imag = builder.createComplexImag(loc, complex);
1433 case Builtin::BI__builtin_clrsb:
1434 case Builtin::BI__builtin_clrsbl:
1435 case Builtin::BI__builtin_clrsbll:
1438 case Builtin::BI__builtin_ctzs:
1439 case Builtin::BI__builtin_ctz:
1440 case Builtin::BI__builtin_ctzl:
1441 case Builtin::BI__builtin_ctzll:
1445 case Builtin::BI__builtin_ctzg:
1447 case Builtin::BI__builtin_elementwise_ctzg:
1451 case Builtin::BI__builtin_clzs:
1452 case Builtin::BI__builtin_clz:
1453 case Builtin::BI__builtin_clzl:
1454 case Builtin::BI__builtin_clzll:
1458 case Builtin::BI__builtin_clzg:
1460 case Builtin::BI__builtin_elementwise_clzg:
1464 case Builtin::BI__builtin_ffs:
1465 case Builtin::BI__builtin_ffsl:
1466 case Builtin::BI__builtin_ffsll:
1469 case Builtin::BI__builtin_parity:
1470 case Builtin::BI__builtin_parityl:
1471 case Builtin::BI__builtin_parityll:
1474 case Builtin::BI__lzcnt16:
1475 case Builtin::BI__lzcnt:
1476 case Builtin::BI__lzcnt64:
1479 case Builtin::BI__popcnt16:
1480 case Builtin::BI__popcnt:
1481 case Builtin::BI__popcnt64:
1482 case Builtin::BI__builtin_popcount:
1483 case Builtin::BI__builtin_popcountl:
1484 case Builtin::BI__builtin_popcountll:
1485 case Builtin::BI__builtin_popcountg:
1492 case Builtin::BI__builtin_unpredictable: {
1496 case Builtin::BI__builtin_expect:
1497 case Builtin::BI__builtin_expect_with_probability: {
1499 if (
cgm.getCodeGenOpts().OptimizationLevel == 0)
1504 mlir::FloatAttr probAttr;
1505 if (builtinIDIfNoAsmLabel == Builtin::BI__builtin_expect_with_probability) {
1506 llvm::APFloat probability(0.0);
1508 [[maybe_unused]]
bool evalSucceeded =
1510 assert(evalSucceeded &&
1511 "probability should be able to evaluate as float");
1512 bool loseInfo =
false;
1513 probability.convert(llvm::APFloat::IEEEdouble(),
1514 llvm::RoundingMode::Dynamic, &loseInfo);
1515 probAttr = mlir::FloatAttr::get(mlir::Float64Type::get(&
getMLIRContext()),
1519 auto result = cir::ExpectOp::create(builder, loc, argValue.getType(),
1520 argValue, expectedValue, probAttr);
1524 case Builtin::BI__builtin_assume_aligned: {
1527 mlir::Value offsetValue =
1530 std::optional<llvm::APSInt> alignment =
1532 assert(alignment.has_value() &&
1533 "the second argument to __builtin_assume_aligned must be an "
1534 "integral constant expression");
1536 mlir::Value result =
1538 alignment->getSExtValue(), offsetValue);
1542 case Builtin::BI__builtin_assume_dereferenceable: {
1548 if (sizeValue.getType() != uintPtrTy)
1549 sizeValue = builder.createIntCast(sizeValue, uintPtrTy);
1550 mlir::Value cond = builder.getBool(
true, loc);
1551 cir::AssumeOp::create(builder, loc, cond,
1552 cir::AssumeBundleKind::Dereferenceable,
1553 mlir::ValueRange{ptrValue, sizeValue});
1557 case Builtin::BI__assume:
1558 case Builtin::BI__builtin_assume: {
1563 cir::AssumeOp::create(builder, loc, argValue, cir::AssumeBundleKind::None,
1564 mlir::ValueRange{});
1568 case Builtin::BI__builtin_assume_separate_storage: {
1571 mlir::Value cond = builder.getBool(
true, loc);
1572 cir::AssumeOp::create(builder, loc, cond,
1573 cir::AssumeBundleKind::SeparateStorage,
1574 mlir::ValueRange{value0, value1});
1578 case Builtin::BI__arithmetic_fence: {
1582 if (fpFeatures.getAllowFPReassociate() &&
1583 getContext().getTargetInfo().checkArithmeticFenceSupported()) {
1591 case Builtin::BI__builtin_bswapg: {
1596 if (mlir::isa<cir::BoolType>(arg.getType()))
1598 auto argTy = mlir::cast<cir::IntType>(arg.getType());
1600 if (argTy.getWidth() == 1 || argTy.getWidth() == 8)
1602 assert(argTy.getWidth() % 16 == 0 &&
1603 "__builtin_bswapg requires a single byte or a multiple of 16 bits");
1607 if (argTy.isSigned())
1608 arg = builder.createIntCast(arg, builder.getUIntNTy(argTy.getWidth()));
1612 case Builtin::BI__builtin_bswap16:
1613 case Builtin::BI__builtin_bswap32:
1614 case Builtin::BI__builtin_bswap64:
1615 case Builtin::BI_byteswap_ushort:
1616 case Builtin::BI_byteswap_ulong:
1617 case Builtin::BI_byteswap_uint64: {
1619 return RValue::get(cir::ByteSwapOp::create(builder, loc, arg));
1622 case Builtin::BI__builtin_bitreverse8:
1623 case Builtin::BI__builtin_bitreverse16:
1624 case Builtin::BI__builtin_bitreverse32:
1625 case Builtin::BI__builtin_bitreverse64: {
1627 return RValue::get(cir::BitReverseOp::create(builder, loc, arg));
1630 case Builtin::BI__builtin_rotateleft8:
1631 case Builtin::BI__builtin_rotateleft16:
1632 case Builtin::BI__builtin_rotateleft32:
1633 case Builtin::BI__builtin_rotateleft64:
1634 case Builtin::BI__builtin_stdc_rotate_left:
1635 case Builtin::BIstdc_rotate_left_uc:
1636 case Builtin::BIstdc_rotate_left_us:
1637 case Builtin::BIstdc_rotate_left_ui:
1638 case Builtin::BIstdc_rotate_left_ul:
1639 case Builtin::BIstdc_rotate_left_ull:
1642 case Builtin::BI__builtin_rotateright8:
1643 case Builtin::BI__builtin_rotateright16:
1644 case Builtin::BI__builtin_rotateright32:
1645 case Builtin::BI__builtin_rotateright64:
1646 case Builtin::BI__builtin_stdc_rotate_right:
1647 case Builtin::BIstdc_rotate_right_uc:
1648 case Builtin::BIstdc_rotate_right_us:
1649 case Builtin::BIstdc_rotate_right_ui:
1650 case Builtin::BIstdc_rotate_right_ul:
1651 case Builtin::BIstdc_rotate_right_ull:
1654 case Builtin::BIstdc_leading_zeros_uc:
1655 case Builtin::BIstdc_leading_zeros_us:
1656 case Builtin::BIstdc_leading_zeros_ui:
1657 case Builtin::BIstdc_leading_zeros_ul:
1658 case Builtin::BIstdc_leading_zeros_ull:
1659 case Builtin::BI__builtin_stdc_leading_zeros:
1663 case Builtin::BIstdc_leading_ones_uc:
1664 case Builtin::BIstdc_leading_ones_us:
1665 case Builtin::BIstdc_leading_ones_ui:
1666 case Builtin::BIstdc_leading_ones_ul:
1667 case Builtin::BIstdc_leading_ones_ull:
1668 case Builtin::BI__builtin_stdc_leading_ones:
1672 case Builtin::BIstdc_trailing_zeros_uc:
1673 case Builtin::BIstdc_trailing_zeros_us:
1674 case Builtin::BIstdc_trailing_zeros_ui:
1675 case Builtin::BIstdc_trailing_zeros_ul:
1676 case Builtin::BIstdc_trailing_zeros_ull:
1677 case Builtin::BI__builtin_stdc_trailing_zeros:
1681 case Builtin::BIstdc_trailing_ones_uc:
1682 case Builtin::BIstdc_trailing_ones_us:
1683 case Builtin::BIstdc_trailing_ones_ui:
1684 case Builtin::BIstdc_trailing_ones_ul:
1685 case Builtin::BIstdc_trailing_ones_ull:
1686 case Builtin::BI__builtin_stdc_trailing_ones:
1690 case Builtin::BIstdc_first_leading_zero_uc:
1691 case Builtin::BIstdc_first_leading_zero_us:
1692 case Builtin::BIstdc_first_leading_zero_ui:
1693 case Builtin::BIstdc_first_leading_zero_ul:
1694 case Builtin::BIstdc_first_leading_zero_ull:
1695 case Builtin::BI__builtin_stdc_first_leading_zero:
1699 case Builtin::BIstdc_first_leading_one_uc:
1700 case Builtin::BIstdc_first_leading_one_us:
1701 case Builtin::BIstdc_first_leading_one_ui:
1702 case Builtin::BIstdc_first_leading_one_ul:
1703 case Builtin::BIstdc_first_leading_one_ull:
1704 case Builtin::BI__builtin_stdc_first_leading_one:
1708 case Builtin::BIstdc_first_trailing_zero_uc:
1709 case Builtin::BIstdc_first_trailing_zero_us:
1710 case Builtin::BIstdc_first_trailing_zero_ui:
1711 case Builtin::BIstdc_first_trailing_zero_ul:
1712 case Builtin::BIstdc_first_trailing_zero_ull:
1713 case Builtin::BI__builtin_stdc_first_trailing_zero:
1717 case Builtin::BIstdc_first_trailing_one_uc:
1718 case Builtin::BIstdc_first_trailing_one_us:
1719 case Builtin::BIstdc_first_trailing_one_ui:
1720 case Builtin::BIstdc_first_trailing_one_ul:
1721 case Builtin::BIstdc_first_trailing_one_ull:
1722 case Builtin::BI__builtin_stdc_first_trailing_one:
1726 case Builtin::BIstdc_count_zeros_uc:
1727 case Builtin::BIstdc_count_zeros_us:
1728 case Builtin::BIstdc_count_zeros_ui:
1729 case Builtin::BIstdc_count_zeros_ul:
1730 case Builtin::BIstdc_count_zeros_ull:
1731 case Builtin::BI__builtin_stdc_count_zeros:
1734 case Builtin::BIstdc_count_ones_uc:
1735 case Builtin::BIstdc_count_ones_us:
1736 case Builtin::BIstdc_count_ones_ui:
1737 case Builtin::BIstdc_count_ones_ul:
1738 case Builtin::BIstdc_count_ones_ull:
1739 case Builtin::BI__builtin_stdc_count_ones:
1743 case Builtin::BIstdc_has_single_bit_uc:
1744 case Builtin::BIstdc_has_single_bit_us:
1745 case Builtin::BIstdc_has_single_bit_ui:
1746 case Builtin::BIstdc_has_single_bit_ul:
1747 case Builtin::BIstdc_has_single_bit_ull:
1748 case Builtin::BI__builtin_stdc_has_single_bit:
1751 case Builtin::BIstdc_bit_width_uc:
1752 case Builtin::BIstdc_bit_width_us:
1753 case Builtin::BIstdc_bit_width_ui:
1754 case Builtin::BIstdc_bit_width_ul:
1755 case Builtin::BIstdc_bit_width_ull:
1756 case Builtin::BI__builtin_stdc_bit_width:
1760 case Builtin::BIstdc_bit_floor_uc:
1761 case Builtin::BIstdc_bit_floor_us:
1762 case Builtin::BIstdc_bit_floor_ui:
1763 case Builtin::BIstdc_bit_floor_ul:
1764 case Builtin::BIstdc_bit_floor_ull:
1765 case Builtin::BI__builtin_stdc_bit_floor:
1768 case Builtin::BIstdc_bit_ceil_uc:
1769 case Builtin::BIstdc_bit_ceil_us:
1770 case Builtin::BIstdc_bit_ceil_ui:
1771 case Builtin::BIstdc_bit_ceil_ul:
1772 case Builtin::BIstdc_bit_ceil_ull:
1773 case Builtin::BI__builtin_stdc_bit_ceil:
1777 case Builtin::BIstdc_memreverse8u8:
1779 case Builtin::BIstdc_memreverse8u16:
1780 case Builtin::BIstdc_memreverse8u32:
1781 case Builtin::BIstdc_memreverse8u64: {
1783 return RValue::get(cir::ByteSwapOp::create(builder, loc, arg));
1785 case Builtin::BIstdc_memreverse8:
1786 case Builtin::BI__builtin_stdc_memreverse8: {
1789 uint64_t size = result.
Val.
getInt().getZExtValue();
1794 if (size == 2 || size == 4 || size == 8) {
1797 mlir::Type intTy = builder.getUIntNTy(size * 8);
1798 Address addr = builder.createElementBitCast(loc, ptrAddr, intTy);
1799 mlir::Value val = builder.createLoad(loc, addr);
1800 mlir::Value swapped = cir::ByteSwapOp::create(builder, loc, val);
1801 builder.createStore(loc, swapped, addr);
1809 case Builtin::BI__builtin_constant_p: {
1822 mlir::cast<cir::IntType>(resultType), 0));
1830 mlir::cast<cir::IntType>(resultType), 0));
1836 "__builtin_constant_p: Obj-C object pointer");
1839 argValue = builder.createBitcast(argValue,
convertType(argType));
1841 mlir::Value result = cir::IsConstantOp::create(
1844 result = builder.createBoolToInt(result, resultType);
1847 case Builtin::BI__builtin_dynamic_object_size:
1848 case Builtin::BI__builtin_object_size: {
1855 bool isDynamic = builtinID == Builtin::BI__builtin_dynamic_object_size;
1857 nullptr, isDynamic));
1860 case Builtin::BI__builtin_prefetch: {
1861 auto evaluateOperandAsInt = [&](
const Expr *arg) {
1863 [[maybe_unused]]
bool evalSucceed =
1864 arg->EvaluateAsInt(res,
cgm.getASTContext());
1865 assert(evalSucceed &&
"expression should be able to evaluate as int");
1869 bool isWrite =
false;
1871 isWrite = evaluateOperandAsInt(e->
getArg(1));
1875 locality = evaluateOperandAsInt(e->
getArg(2));
1878 cir::PrefetchOp::create(builder, loc, address, locality, isWrite);
1881 case Builtin::BI__builtin_readcyclecounter:
1884 case Builtin::BI__builtin_readsteadycounter:
1887 case Builtin::BI__builtin___clear_cache: {
1895 case Builtin::BI__builtin_trap:
1898 case Builtin::BI__builtin_verbose_trap:
1902 case Builtin::BI__debugbreak:
1904 case Builtin::BI__builtin_unreachable:
1907 case Builtin::BI__builtin_powi:
1908 case Builtin::BI__builtin_powif:
1909 case Builtin::BI__builtin_powil: {
1914 mlir::ValueRange{src0, src1}));
1916 case Builtin::BI__builtin_frexpl:
1917 case Builtin::BI__builtin_frexp:
1918 case Builtin::BI__builtin_frexpf:
1919 case Builtin::BI__builtin_frexpf128:
1920 case Builtin::BI__builtin_frexpf16: {
1923 mlir::Type fpTy = val.getType();
1927 auto frexpOp = cir::FrexpOp::create(builder, callLoc, fpTy, intTy, val);
1932 case Builtin::BImodf:
1933 case Builtin::BImodff:
1934 case Builtin::BImodfl:
1935 case Builtin::BI__builtin_modf:
1936 case Builtin::BI__builtin_modff:
1937 case Builtin::BI__builtin_modfl: {
1940 mlir::Type fpTy = val.getType();
1942 auto modfOp = cir::ModfOp::create(builder, callLoc, fpTy, fpTy, val);
1948 case Builtin::BI__builtin_isgreater:
1949 case Builtin::BI__builtin_isgreaterequal:
1950 case Builtin::BI__builtin_isless:
1951 case Builtin::BI__builtin_islessequal:
1952 case Builtin::BI__builtin_islessgreater:
1953 case Builtin::BI__builtin_isunordered: {
1960 mlir::Value cmpResult;
1961 switch (builtinID) {
1962 case Builtin::BI__builtin_isgreater:
1963 cmpResult = builder.createCompare(loc, cir::CmpOpKind::gt, lhs, rhs);
1965 case Builtin::BI__builtin_isgreaterequal:
1966 cmpResult = builder.createCompare(loc, cir::CmpOpKind::ge, lhs, rhs);
1968 case Builtin::BI__builtin_isless:
1969 cmpResult = builder.createCompare(loc, cir::CmpOpKind::lt, lhs, rhs);
1971 case Builtin::BI__builtin_islessequal:
1972 cmpResult = builder.createCompare(loc, cir::CmpOpKind::le, lhs, rhs);
1974 case Builtin::BI__builtin_islessgreater:
1975 cmpResult = builder.createCompare(loc, cir::CmpOpKind::one, lhs, rhs);
1977 case Builtin::BI__builtin_isunordered:
1978 cmpResult = builder.createCompare(loc, cir::CmpOpKind::uno, lhs, rhs);
1981 llvm_unreachable(
"Unknown ordered comparison");
1983 return RValue::get(builder.createBoolToInt(cmpResult, intTy));
1991 case Builtin::BI__builtin_isnan: {
1996 builder.createIsFPClass(loc, v, cir::FPClassTest::Nan),
2000 case Builtin::BI__builtin_issignaling: {
2005 builder.createIsFPClass(loc, v, cir::FPClassTest::SignalingNaN),
2009 case Builtin::BI__builtin_isinf: {
2014 builder.createIsFPClass(loc, v, cir::FPClassTest::Infinity),
2017 case Builtin::BIfinite:
2018 case Builtin::BI__finite:
2019 case Builtin::BIfinitef:
2020 case Builtin::BI__finitef:
2021 case Builtin::BIfinitel:
2022 case Builtin::BI__finitel:
2023 case Builtin::BI__builtin_isfinite: {
2027 builder.createIsFPClass(loc, v, cir::FPClassTest::Finite),
2031 case Builtin::BI__builtin_isnormal: {
2035 builder.createIsFPClass(loc, v, cir::FPClassTest::Normal),
2039 case Builtin::BI__builtin_issubnormal: {
2043 builder.createIsFPClass(loc, v, cir::FPClassTest::Subnormal),
2047 case Builtin::BI__builtin_iszero: {
2051 builder.createIsFPClass(loc, v, cir::FPClassTest::Zero),
2054 case Builtin::BI__builtin_isfpclass: {
2061 uint64_t test = result.
Val.
getInt().getLimitedValue();
2064 builder.createIsFPClass(loc, v, cir::FPClassTest(test)),
2067 case Builtin::BI__builtin_nondeterministic_value: {
2069 mlir::Value result =
2070 cir::ConstantOp::create(builder, loc, ty, cir::PoisonAttr::get(ty));
2071 result = cir::FreezeOp::create(builder, loc, result);
2074 case Builtin::BI__builtin_elementwise_abs: {
2076 bool isIntTy = cir::isIntOrVectorOfIntType(cirTy);
2081 arg.getType(), arg,
false);
2084 case Builtin::BI__builtin_elementwise_bitreverse:
2085 case Builtin::BI__builtin_elementwise_popcount:
2086 case Builtin::BI__builtin_elementwise_canonicalize:
2087 case Builtin::BI__builtin_elementwise_copysign:
2089 case Builtin::BI__builtin_elementwise_fshl:
2091 case Builtin::BI__builtin_elementwise_fshr:
2093 case Builtin::BI__builtin_elementwise_clmul:
2094 case Builtin::BI__builtin_elementwise_pext:
2095 case Builtin::BI__builtin_elementwise_pdep:
2097 case Builtin::BI__builtin_elementwise_add_sat:
2098 case Builtin::BI__builtin_elementwise_sub_sat: {
2107 "saturating add/sub on a boolean operand");
2113 assert(cir::isIntOrVectorOfIntType(op0.getType()) &&
2114 "elementwise saturating add/sub requires integer operands");
2116 builtinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_add_sat
2118 : builder.createSub(loc, op0, op1,
2122 case Builtin::BI__builtin_elementwise_max: {
2127 return RValue::get(builder.createMax(loc, op0, op1));
2132 case Builtin::BI__builtin_elementwise_min: {
2137 return RValue::get(builder.createMin(loc, op0, op1));
2142 case Builtin::BI__builtin_elementwise_maxnum:
2145 case Builtin::BI__builtin_elementwise_minnum:
2148 case Builtin::BI__builtin_elementwise_maximum:
2151 case Builtin::BI__builtin_elementwise_minimum:
2155 case Builtin::BI__builtin_elementwise_maximumnum:
2156 case Builtin::BI__builtin_elementwise_minimumnum:
2158 case Builtin::BI__builtin_reduce_max:
2159 case Builtin::BI__builtin_reduce_min: {
2163 type = vecTy->getElementType();
2164 else if (
type->isSizelessVectorType())
2169 const bool isMax = builtinIDIfNoAsmLabel == Builtin::BI__builtin_reduce_max;
2171 if (
type->isSignedIntegerType()) {
2174 cir::VecReduceSMaxOp::create(builder, loc, input).getResult());
2176 cir::VecReduceSMinOp::create(builder, loc, input).getResult());
2179 if (
type->isUnsignedIntegerType()) {
2182 cir::VecReduceUMaxOp::create(builder, loc, input).getResult());
2184 cir::VecReduceUMinOp::create(builder, loc, input).getResult());
2187 assert(
type->isFloatingType() &&
"must have a float here");
2188 cir::FastMathFlagsAttr fastMath =
2192 cir::VecReduceFMaxOp::create(builder, loc, input, fastMath)
2195 cir::VecReduceFMinOp::create(builder, loc, input, fastMath)
2198 case Builtin::BI__builtin_reduce_add:
2200 case Builtin::BI__builtin_reduce_mul:
2202 case Builtin::BI__builtin_reduce_xor:
2204 case Builtin::BI__builtin_reduce_or:
2206 case Builtin::BI__builtin_reduce_and:
2208 case Builtin::BI__builtin_reduce_maximum:
2209 case Builtin::BI__builtin_reduce_minimum:
2211 case Builtin::BI__builtin_reduce_assoc_fadd:
2212 case Builtin::BI__builtin_reduce_in_order_fadd: {
2214 bool isAssociative =
2215 builtinIDIfNoAsmLabel == Builtin::BI__builtin_reduce_assoc_fadd;
2219 "invalid argument count for floating-point reduction");
2222 mlir::Type scalarTy = vectorTy.getElementType();
2224 mlir::Value startValue;
2227 if (startValue.getType() != scalarTy)
2230 cir::CastKind::floating, startValue, scalarTy);
2233 startValue = cir::ConstantOp::create(
2235 cir::FPAttr::get(scalarTy,
2236 llvm::APFloat::getZero(fpTy.getFloatSemantics(),
2242 fastMathFlags |= cir::FastMathFlags::reassoc;
2245 auto reduction = cir::VecReduceFAddOp::create(builder, loc, startValue,
2249 case Builtin::BI__builtin_matrix_transpose: {
2251 mlir::Value result = builder.createMatrixTranspose(loc, matrix);
2254 case Builtin::BI__builtin_matrix_column_major_load: {
2260 assert(ptrTy &&
"arg0 must be of pointer type");
2261 bool isVolatile = ptrTy->getPointeeType().isVolatileQualified();
2267 mlir::Value result = builder.createMatrixColumnMajorLoad(
2268 loc, resultType, dataPtr, stride, isVolatile);
2271 case Builtin::BI__builtin_matrix_column_major_store: {
2277 assert(ptrTy &&
"arg1 must be of pointer type");
2278 bool isVolatile = ptrTy->getPointeeType().isVolatileQualified();
2283 builder.createMatrixColumnMajorStore(loc, matrix, dst.
emitRawPointer(),
2284 stride, isVolatile);
2287 case Builtin::BI__builtin_masked_load:
2288 case Builtin::BI__builtin_masked_expand_load:
2289 case Builtin::BI__builtin_masked_gather:
2290 case Builtin::BI__builtin_masked_store:
2291 case Builtin::BI__builtin_masked_compress_store:
2292 case Builtin::BI__builtin_masked_scatter:
2294 case Builtin::BI__builtin_isinf_sign: {
2299 builder.createIsFPClass(loc, arg, cir::FPClassTest::Infinity);
2302 cir::ConstantOp zero = builder.getNullValue(intTy, loc);
2303 cir::ConstantOp one = builder.getConstant(loc, cir::IntAttr::get(intTy, 1));
2304 cir::ConstantOp negativeOne =
2305 builder.getConstant(loc, cir::IntAttr::get(intTy, -1));
2306 mlir::Value signResult = builder.createSelect(loc, isNeg, negativeOne, one);
2307 mlir::Value result = builder.createSelect(loc, isInf, signResult, zero);
2310 case Builtin::BI__builtin_flt_rounds: {
2313 mlir::Value result =
2314 builder.emitIntrinsicCallOp(loc,
"get.rounding", resultType);
2315 if (result.getType() != resultType)
2317 builder.createCast(loc, cir::CastKind::integral, result, resultType);
2320 case Builtin::BI__builtin_set_flt_rounds: {
2323 builder.emitIntrinsicCallOp(loc,
"set.rounding", builder.getVoidTy(),
2324 mlir::ValueRange{v});
2327 case Builtin::BI__builtin_fpclassify: {
2343 cir::IsFPClassOp::create(builder, loc, value, cir::FPClassTest::Zero);
2344 mlir::Value result =
2345 cir::TernaryOp::create(
2346 builder, loc, isZero,
2348 [&](mlir::OpBuilder &opBuilder, mlir::Location location) {
2350 cir::YieldOp::create(opBuilder, location, zeroLiteral);
2353 [&](mlir::OpBuilder &opBuilder, mlir::Location location) {
2354 auto isNan = cir::IsFPClassOp::create(opBuilder, location, value,
2355 cir::FPClassTest::Nan);
2356 mlir::Value nanResult =
2357 cir::TernaryOp::create(
2358 opBuilder, location, isNan,
2360 [&](mlir::OpBuilder &opBuilder, mlir::Location location) {
2362 cir::YieldOp::create(opBuilder, location, nanLiteral);
2365 [&](mlir::OpBuilder &opBuilder, mlir::Location location) {
2366 auto isInfinity = cir::IsFPClassOp::create(
2367 opBuilder, location, value,
2368 cir::FPClassTest::Infinity);
2369 mlir::Value infResult =
2370 cir::TernaryOp::create(
2371 opBuilder, location, isInfinity,
2373 [&](mlir::OpBuilder &opBuilder,
2374 mlir::Location location) {
2375 mlir::Value infinityLiteral =
2377 cir::YieldOp::create(opBuilder, location,
2381 [&](mlir::OpBuilder &opBuilder,
2382 mlir::Location location) {
2383 auto isNormal = cir::IsFPClassOp::create(
2384 opBuilder, location, value,
2385 cir::FPClassTest::Normal);
2386 mlir::Value fpNormal =
2388 mlir::Value fpSubnormal =
2391 cir::SelectOp::create(
2392 opBuilder, location, resultTy,
2393 isNormal, fpNormal, fpSubnormal);
2394 cir::YieldOp::create(opBuilder, location,
2398 cir::YieldOp::create(opBuilder, location, infResult);
2401 cir::YieldOp::create(opBuilder, location, nanResult);
2406 case Builtin::BIalloca:
2407 case Builtin::BI_alloca:
2408 case Builtin::BI__builtin_alloca_uninitialized:
2409 case Builtin::BI__builtin_alloca:
2411 case Builtin::BI__builtin_alloca_with_align_uninitialized:
2412 case Builtin::BI__builtin_alloca_with_align:
2413 case Builtin::BI__builtin_infer_alloc_token:
2415 case Builtin::BIbzero:
2416 case Builtin::BI__builtin_bzero: {
2421 mlir::Value zero = builder.getNullValue(builder.getUInt8Ty(), loc);
2423 builder.createMemSet(loc, destPtrCast, zero, size);
2427 case Builtin::BIbcopy:
2428 case Builtin::BI__builtin_bcopy: {
2439 case Builtin::BImemcpy:
2440 case Builtin::BI__builtin_memcpy:
2441 case Builtin::BImempcpy:
2442 case Builtin::BI__builtin_mempcpy: {
2450 builder.createMemCpy(loc, destCast, srcCast, sizeVal);
2452 if (builtinID == Builtin::BImempcpy ||
2453 builtinID == Builtin::BI__builtin_mempcpy) {
2455 mlir::Value end = builder.createPtrStride(loc, destPtr, sizeVal);
2460 case Builtin::BI__builtin_memcpy_inline:
2462 case Builtin::BI__builtin_char_memchr:
2463 case Builtin::BI__builtin_memchr: {
2466 builder.createBitcast(srcPtr.
getPointer(), builder.getVoidPtrTy());
2476 case Builtin::BI__builtin___memcpy_chk:
2477 case Builtin::BI__builtin_objc_memmove_collectable:
2478 case Builtin::BI__builtin___memmove_chk:
2480 case Builtin::BI__builtin_trivially_relocate:
2481 case Builtin::BImemmove:
2482 case Builtin::BI__builtin_memmove: {
2487 if (builtinIDIfNoAsmLabel == Builtin::BI__builtin_trivially_relocate) {
2490 mlir::Value eltSizeVal =
2491 builder.getConstInt(loc, sizeVal.getType(), eltSize.
getQuantity());
2492 sizeVal = builder.createMul(loc, sizeVal, eltSizeVal);
2501 builder.createMemMove(loc, destCast, srcCast, sizeVal);
2505 case Builtin::BImemset:
2506 case Builtin::BI__builtin_memset: {
2509 builder.getUInt8Ty());
2517 case Builtin::BI__builtin_memset_inline:
2518 case Builtin::BI__builtin___memset_chk:
2519 case Builtin::BI__builtin_wmemchr:
2520 case Builtin::BI__builtin_wmemcmp:
2522 case Builtin::BI__builtin_dwarf_cfa:
2524 case Builtin::BI__builtin_return_address: {
2528 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));
2530 case Builtin::BI_ReturnAddress: {
2533 builder.getConstInt(loc, builder.getUInt32Ty(), 0)));
2535 case Builtin::BI__builtin_frame_address: {
2538 mlir::Value addr = cir::FrameAddrOp::create(
2540 builder.getConstAPInt(loc, builder.getUInt32Ty(), level));
2542 builder.createCast(loc, cir::CastKind::bitcast, addr,
voidPtrTy));
2544 case Builtin::BI__builtin_extract_return_addr:
2545 case Builtin::BI__builtin_frob_return_addr:
2546 case Builtin::BI__builtin_dwarf_sp_column:
2547 case Builtin::BI__builtin_init_dwarf_reg_size_table:
2548 case Builtin::BI__builtin_eh_return:
2549 case Builtin::BI__builtin_unwind_init:
2550 case Builtin::BI__builtin_extend_pointer:
2552 case Builtin::BI__builtin_setjmp: {
2556 cir::PointerType
voidPtrTy = builder.getVoidPtrTy();
2557 cir::PointerType ppTy = builder.getPointerTo(
voidPtrTy);
2566 mlir::Value frameAddress =
2567 cir::FrameAddrOp::create(builder, loc,
voidPtrTy,
2568 mlir::ValueRange{builder.getUInt32(0, loc)})
2571 builder.createStore(loc, frameAddress, castBuf);
2573 mlir::Value stacksave =
2574 cir::StackSaveOp::create(builder, loc,
voidPtrTy).getResult();
2575 cir::PtrStrideOp stackSaveSlot = cir::PtrStrideOp::create(
2576 builder, loc, ppTy, castBuf.
getPointer(), builder.getSInt32(2, loc));
2577 llvm::TypeSize voidPtrTySize =
2580 CharUnits().fromQuantity(2 * voidPtrTySize));
2582 builder.createStore(loc, stacksave, slotAddr);
2583 auto op = cir::EhSetjmpOp::create(builder, loc, castBuf.
getPointer());
2586 case Builtin::BI__builtin_longjmp: {
2590 cir::EhLongjmpOp::create(builder, loc, buf);
2591 cir::UnreachableOp::create(builder, loc);
2594 case Builtin::BI__builtin_launder: {
2596 QualType argTy = arg->getType()->getPointeeType();
2599 if (
cgm.getCodeGenOpts().StrictVTablePointers &&
2602 ptr = cir::LaunderOp::create(builder, loc, ptr).getResult();
2606 case Builtin::BI__builtin_clear_padding: {
2612 cgm.getASTContext().getPaddingIntervals(pointeeTy);
2615 for (
const auto &interval : padding)
2616 paddingLocs.push_back(cir::OffsetPairAttr::get(
2619 cir::ClearPaddingOp::create(
2625 case Builtin::BI__sync_fetch_and_add:
2626 case Builtin::BI__sync_fetch_and_sub:
2627 case Builtin::BI__sync_fetch_and_or:
2628 case Builtin::BI__sync_fetch_and_and:
2629 case Builtin::BI__sync_fetch_and_xor:
2630 case Builtin::BI__sync_fetch_and_nand:
2631 case Builtin::BI__sync_add_and_fetch:
2632 case Builtin::BI__sync_sub_and_fetch:
2633 case Builtin::BI__sync_and_and_fetch:
2634 case Builtin::BI__sync_or_and_fetch:
2635 case Builtin::BI__sync_xor_and_fetch:
2636 case Builtin::BI__sync_nand_and_fetch:
2637 case Builtin::BI__sync_val_compare_and_swap:
2638 case Builtin::BI__sync_bool_compare_and_swap:
2639 case Builtin::BI__sync_lock_test_and_set:
2640 case Builtin::BI__sync_lock_release:
2641 case Builtin::BI__sync_swap:
2642 llvm_unreachable(
"Shouldn't make it through sema");
2643 case Builtin::BI__sync_fetch_and_add_1:
2644 case Builtin::BI__sync_fetch_and_add_2:
2645 case Builtin::BI__sync_fetch_and_add_4:
2646 case Builtin::BI__sync_fetch_and_add_8:
2647 case Builtin::BI__sync_fetch_and_add_16:
2649 case Builtin::BI__sync_fetch_and_sub_1:
2650 case Builtin::BI__sync_fetch_and_sub_2:
2651 case Builtin::BI__sync_fetch_and_sub_4:
2652 case Builtin::BI__sync_fetch_and_sub_8:
2653 case Builtin::BI__sync_fetch_and_sub_16:
2655 case Builtin::BI__sync_fetch_and_or_1:
2656 case Builtin::BI__sync_fetch_and_or_2:
2657 case Builtin::BI__sync_fetch_and_or_4:
2658 case Builtin::BI__sync_fetch_and_or_8:
2659 case Builtin::BI__sync_fetch_and_or_16:
2661 case Builtin::BI__sync_fetch_and_and_1:
2662 case Builtin::BI__sync_fetch_and_and_2:
2663 case Builtin::BI__sync_fetch_and_and_4:
2664 case Builtin::BI__sync_fetch_and_and_8:
2665 case Builtin::BI__sync_fetch_and_and_16:
2667 case Builtin::BI__sync_fetch_and_xor_1:
2668 case Builtin::BI__sync_fetch_and_xor_2:
2669 case Builtin::BI__sync_fetch_and_xor_4:
2670 case Builtin::BI__sync_fetch_and_xor_8:
2671 case Builtin::BI__sync_fetch_and_xor_16:
2673 case Builtin::BI__sync_fetch_and_nand_1:
2674 case Builtin::BI__sync_fetch_and_nand_2:
2675 case Builtin::BI__sync_fetch_and_nand_4:
2676 case Builtin::BI__sync_fetch_and_nand_8:
2677 case Builtin::BI__sync_fetch_and_nand_16:
2679 case Builtin::BI__sync_fetch_and_min:
2680 case Builtin::BI__sync_fetch_and_max:
2681 case Builtin::BI__sync_fetch_and_umin:
2682 case Builtin::BI__sync_fetch_and_umax:
2685 case Builtin::BI__sync_add_and_fetch_1:
2686 case Builtin::BI__sync_add_and_fetch_2:
2687 case Builtin::BI__sync_add_and_fetch_4:
2688 case Builtin::BI__sync_add_and_fetch_8:
2689 case Builtin::BI__sync_add_and_fetch_16:
2692 case Builtin::BI__sync_sub_and_fetch_1:
2693 case Builtin::BI__sync_sub_and_fetch_2:
2694 case Builtin::BI__sync_sub_and_fetch_4:
2695 case Builtin::BI__sync_sub_and_fetch_8:
2696 case Builtin::BI__sync_sub_and_fetch_16:
2699 case Builtin::BI__sync_and_and_fetch_1:
2700 case Builtin::BI__sync_and_and_fetch_2:
2701 case Builtin::BI__sync_and_and_fetch_4:
2702 case Builtin::BI__sync_and_and_fetch_8:
2703 case Builtin::BI__sync_and_and_fetch_16:
2706 case Builtin::BI__sync_or_and_fetch_1:
2707 case Builtin::BI__sync_or_and_fetch_2:
2708 case Builtin::BI__sync_or_and_fetch_4:
2709 case Builtin::BI__sync_or_and_fetch_8:
2710 case Builtin::BI__sync_or_and_fetch_16:
2712 case Builtin::BI__sync_xor_and_fetch_1:
2713 case Builtin::BI__sync_xor_and_fetch_2:
2714 case Builtin::BI__sync_xor_and_fetch_4:
2715 case Builtin::BI__sync_xor_and_fetch_8:
2716 case Builtin::BI__sync_xor_and_fetch_16:
2719 case Builtin::BI__sync_nand_and_fetch_1:
2720 case Builtin::BI__sync_nand_and_fetch_2:
2721 case Builtin::BI__sync_nand_and_fetch_4:
2722 case Builtin::BI__sync_nand_and_fetch_8:
2723 case Builtin::BI__sync_nand_and_fetch_16:
2726 case Builtin::BI__sync_val_compare_and_swap_1:
2727 case Builtin::BI__sync_val_compare_and_swap_2:
2728 case Builtin::BI__sync_val_compare_and_swap_4:
2729 case Builtin::BI__sync_val_compare_and_swap_8:
2731 case Builtin::BI__sync_val_compare_and_swap_16:
2733 case Builtin::BI__sync_bool_compare_and_swap_1:
2734 case Builtin::BI__sync_bool_compare_and_swap_2:
2735 case Builtin::BI__sync_bool_compare_and_swap_4:
2736 case Builtin::BI__sync_bool_compare_and_swap_8:
2738 case Builtin::BI__sync_bool_compare_and_swap_16:
2740 case Builtin::BI__sync_swap_1:
2741 case Builtin::BI__sync_swap_2:
2742 case Builtin::BI__sync_swap_4:
2743 case Builtin::BI__sync_swap_8:
2744 return emitAtomicXchg(*
this, e, cir::MemOrder::SequentiallyConsistent);
2745 case Builtin::BI__sync_swap_16:
2747 case Builtin::BI__sync_lock_test_and_set_1:
2748 case Builtin::BI__sync_lock_test_and_set_2:
2749 case Builtin::BI__sync_lock_test_and_set_4:
2750 case Builtin::BI__sync_lock_test_and_set_8:
2751 return emitAtomicXchg(*
this, e, cir::MemOrder::SequentiallyConsistent);
2752 case Builtin::BI__sync_lock_test_and_set_16:
2754 case Builtin::BI__sync_lock_release_1:
2755 case Builtin::BI__sync_lock_release_2:
2756 case Builtin::BI__sync_lock_release_4:
2757 case Builtin::BI__sync_lock_release_8:
2760 case Builtin::BI__sync_lock_release_16:
2762 case Builtin::BI__sync_synchronize: {
2770 cir::AtomicFenceOp::create(
2772 cir::MemOrder::SequentiallyConsistent,
2774 cir::SyncScopeKind::System));
2777 case Builtin::BI__builtin_nontemporal_load: {
2785 case Builtin::BI__builtin_nontemporal_store: {
2795 case Builtin::BI__c11_atomic_is_lock_free:
2796 case Builtin::BI__atomic_is_lock_free:
2798 case Builtin::BI__atomic_test_and_set:
2799 case Builtin::BI__atomic_clear:
2801 case Builtin::BI__atomic_thread_fence:
2802 case Builtin::BI__atomic_signal_fence:
2803 case Builtin::BI__c11_atomic_thread_fence:
2804 case Builtin::BI__c11_atomic_signal_fence: {
2805 cir::SyncScopeKind syncScope =
2806 builtinID == Builtin::BI__atomic_signal_fence ||
2807 builtinID == Builtin::BI__c11_atomic_signal_fence
2808 ? cir::SyncScopeKind::SingleThread
2809 : cir::SyncScopeKind::System;
2813 case Builtin::BI__scoped_atomic_thread_fence:
2815 case Builtin::BI__builtin_signbit:
2816 case Builtin::BI__builtin_signbitf:
2817 case Builtin::BI__builtin_signbitl: {
2821 mlir::Operation *signBitOp = cir::SignBitOp::create(builder, loc, value);
2822 mlir::Value result = builder.createBoolToInt(signBitOp->getResult(0),
2826 case Builtin::BI__warn_memset_zero_len:
2827 case Builtin::BI__annotation:
2828 case Builtin::BI__builtin_annotation:
2831 case Builtin::BI__builtin_addcb:
2832 case Builtin::BI__builtin_addcs:
2833 case Builtin::BI__builtin_addc:
2834 case Builtin::BI__builtin_addcl:
2835 case Builtin::BI__builtin_addcll:
2836 case Builtin::BI__builtin_subcb:
2837 case Builtin::BI__builtin_subcs:
2838 case Builtin::BI__builtin_subc:
2839 case Builtin::BI__builtin_subcl:
2840 case Builtin::BI__builtin_subcll: {
2856 static constexpr unsigned addcBuiltins[] = {
2857 Builtin::BI__builtin_addcb, Builtin::BI__builtin_addcs,
2858 Builtin::BI__builtin_addc, Builtin::BI__builtin_addcl,
2859 Builtin::BI__builtin_addcll};
2860 bool isAdd = llvm::is_contained(addcBuiltins, builtinID);
2862 mlir::Value sum1, carry1, sum2, carry2;
2864 std::tie(sum1, carry1) =
2867 builder, loc, resultTy, sum1, carryin);
2869 std::tie(sum1, carry1) =
2872 builder, loc, resultTy, sum1, carryin);
2876 mlir::Value carryOut = builder.createBoolToInt(
2877 builder.createOr(loc, carry1, carry2), resultTy);
2878 builder.createStore(loc, carryOut, carryOutPtr);
2882 case Builtin::BI__builtin_add_overflow:
2883 case Builtin::BI__builtin_sub_overflow:
2884 case Builtin::BI__builtin_mul_overflow: {
2892 WidthAndSignedness leftInfo =
2894 WidthAndSignedness rightInfo =
2896 WidthAndSignedness resultInfo =
2902 WidthAndSignedness encompassingInfo =
2905 auto encompassingCIRTy = cir::IntType::get(
2906 &
getMLIRContext(), encompassingInfo.width, encompassingInfo.isSigned);
2907 mlir::Type resultCIRTy =
cgm.convertType(resultQTy);
2914 if (x.getType() != encompassingCIRTy) {
2915 x = builder.createCast(mlir::isa<cir::BoolType>(x.getType())
2916 ? cir::CastKind::bool_to_int
2917 : cir::CastKind::integral,
2918 x, encompassingCIRTy);
2921 if (y.getType() != encompassingCIRTy) {
2922 y = builder.createCast(mlir::isa<cir::BoolType>(y.getType())
2923 ? cir::CastKind::bool_to_int
2924 : cir::CastKind::integral,
2925 y, encompassingCIRTy);
2930 mlir::Value result, overflow;
2931 switch (builtinID) {
2933 llvm_unreachable(
"Unknown overflow builtin id.");
2934 case Builtin::BI__builtin_add_overflow:
2935 std::tie(result, overflow) =
2938 case Builtin::BI__builtin_sub_overflow:
2939 std::tie(result, overflow) =
2942 case Builtin::BI__builtin_mul_overflow:
2943 std::tie(result, overflow) =
2961 builder.createStore(loc, result, resultPtr, isVolatile);
2966 case Builtin::BI__builtin_uadd_overflow:
2967 case Builtin::BI__builtin_uaddl_overflow:
2968 case Builtin::BI__builtin_uaddll_overflow:
2969 case Builtin::BI__builtin_usub_overflow:
2970 case Builtin::BI__builtin_usubl_overflow:
2971 case Builtin::BI__builtin_usubll_overflow:
2972 case Builtin::BI__builtin_umul_overflow:
2973 case Builtin::BI__builtin_umull_overflow:
2974 case Builtin::BI__builtin_umulll_overflow:
2975 case Builtin::BI__builtin_sadd_overflow:
2976 case Builtin::BI__builtin_saddl_overflow:
2977 case Builtin::BI__builtin_saddll_overflow:
2978 case Builtin::BI__builtin_ssub_overflow:
2979 case Builtin::BI__builtin_ssubl_overflow:
2980 case Builtin::BI__builtin_ssubll_overflow:
2981 case Builtin::BI__builtin_smul_overflow:
2982 case Builtin::BI__builtin_smull_overflow:
2983 case Builtin::BI__builtin_smulll_overflow: {
2993 auto resultCIRTy = mlir::cast<cir::IntType>(
cgm.convertType(resultQTy));
2997 mlir::Value result, overflow;
2998 switch (builtinID) {
3000 llvm_unreachable(
"Unknown overflow builtin id.");
3001 case Builtin::BI__builtin_uadd_overflow:
3002 case Builtin::BI__builtin_uaddl_overflow:
3003 case Builtin::BI__builtin_uaddll_overflow:
3004 case Builtin::BI__builtin_sadd_overflow:
3005 case Builtin::BI__builtin_saddl_overflow:
3006 case Builtin::BI__builtin_saddll_overflow:
3007 std::tie(result, overflow) =
3010 case Builtin::BI__builtin_usub_overflow:
3011 case Builtin::BI__builtin_usubl_overflow:
3012 case Builtin::BI__builtin_usubll_overflow:
3013 case Builtin::BI__builtin_ssub_overflow:
3014 case Builtin::BI__builtin_ssubl_overflow:
3015 case Builtin::BI__builtin_ssubll_overflow:
3016 std::tie(result, overflow) =
3019 case Builtin::BI__builtin_umul_overflow:
3020 case Builtin::BI__builtin_umull_overflow:
3021 case Builtin::BI__builtin_umulll_overflow:
3022 case Builtin::BI__builtin_smul_overflow:
3023 case Builtin::BI__builtin_smull_overflow:
3024 case Builtin::BI__builtin_smulll_overflow:
3025 std::tie(result, overflow) =
3032 builder.createStore(loc,
emitToMemory(result, resultQTy), resultPtr,
3038 case Builtin::BIaddressof:
3039 case Builtin::BI__addressof:
3040 case Builtin::BI__builtin_addressof:
3042 case Builtin::BI__builtin_function_start:
3044 case Builtin::BI__builtin_operator_new:
3047 case Builtin::BI__builtin_operator_delete:
3051 case Builtin::BI__builtin_is_aligned:
3052 case Builtin::BI__builtin_align_up:
3053 case Builtin::BI__builtin_align_down:
3054 case Builtin::BI__noop:
3055 case Builtin::BI__builtin_call_with_static_chain:
3056 case Builtin::BI_InterlockedExchange8:
3057 case Builtin::BI_InterlockedExchange16:
3058 case Builtin::BI_InterlockedExchange:
3059 case Builtin::BI_InterlockedExchangePointer:
3060 case Builtin::BI_InterlockedCompareExchangePointer:
3061 case Builtin::BI_InterlockedCompareExchangePointer_nf:
3062 case Builtin::BI_InterlockedCompareExchange8:
3063 case Builtin::BI_InterlockedCompareExchange16:
3064 case Builtin::BI_InterlockedCompareExchange:
3065 case Builtin::BI_InterlockedCompareExchange64:
3066 case Builtin::BI_InterlockedIncrement16:
3067 case Builtin::BI_InterlockedIncrement:
3068 case Builtin::BI_InterlockedDecrement16:
3069 case Builtin::BI_InterlockedDecrement:
3070 case Builtin::BI_InterlockedAnd8:
3071 case Builtin::BI_InterlockedAnd16:
3072 case Builtin::BI_InterlockedAnd:
3073 case Builtin::BI_InterlockedExchangeAdd8:
3074 case Builtin::BI_InterlockedExchangeAdd16:
3075 case Builtin::BI_InterlockedExchangeAdd:
3076 case Builtin::BI_InterlockedExchangeSub8:
3077 case Builtin::BI_InterlockedExchangeSub16:
3078 case Builtin::BI_InterlockedExchangeSub:
3079 case Builtin::BI_InterlockedOr8:
3080 case Builtin::BI_InterlockedOr16:
3081 case Builtin::BI_InterlockedOr:
3082 case Builtin::BI_InterlockedXor8:
3083 case Builtin::BI_InterlockedXor16:
3084 case Builtin::BI_InterlockedXor:
3085 case Builtin::BI_bittest64:
3086 case Builtin::BI_bittest:
3087 case Builtin::BI_bittestandcomplement64:
3088 case Builtin::BI_bittestandcomplement:
3089 case Builtin::BI_bittestandreset64:
3090 case Builtin::BI_bittestandreset:
3091 case Builtin::BI_bittestandset64:
3092 case Builtin::BI_bittestandset:
3093 case Builtin::BI_interlockedbittestandreset:
3094 case Builtin::BI_interlockedbittestandreset64:
3095 case Builtin::BI_interlockedbittestandreset64_acq:
3096 case Builtin::BI_interlockedbittestandreset64_rel:
3097 case Builtin::BI_interlockedbittestandreset64_nf:
3098 case Builtin::BI_interlockedbittestandset64:
3099 case Builtin::BI_interlockedbittestandset64_acq:
3100 case Builtin::BI_interlockedbittestandset64_rel:
3101 case Builtin::BI_interlockedbittestandset64_nf:
3102 case Builtin::BI_interlockedbittestandset:
3103 case Builtin::BI_interlockedbittestandset_acq:
3104 case Builtin::BI_interlockedbittestandset_rel:
3105 case Builtin::BI_interlockedbittestandset_nf:
3106 case Builtin::BI_interlockedbittestandreset_acq:
3107 case Builtin::BI_interlockedbittestandreset_rel:
3108 case Builtin::BI_interlockedbittestandreset_nf:
3109 case Builtin::BI__iso_volatile_load8:
3110 case Builtin::BI__iso_volatile_load16:
3111 case Builtin::BI__iso_volatile_load32:
3112 case Builtin::BI__iso_volatile_load64:
3113 case Builtin::BI__iso_volatile_store8:
3114 case Builtin::BI__iso_volatile_store16:
3115 case Builtin::BI__iso_volatile_store32:
3116 case Builtin::BI__iso_volatile_store64:
3117 case Builtin::BI__builtin_ptrauth_sign_constant:
3118 case Builtin::BI__builtin_ptrauth_auth:
3119 case Builtin::BI__builtin_ptrauth_auth_and_resign:
3120 case Builtin::BI__builtin_ptrauth_blend_discriminator:
3121 case Builtin::BI__builtin_ptrauth_sign_generic_data:
3122 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
3123 case Builtin::BI__builtin_ptrauth_strip:
3124 case Builtin::BI__builtin_get_vtable_pointer:
3125 case Builtin::BI__exception_code:
3126 case Builtin::BI_exception_code:
3127 case Builtin::BI__exception_info:
3128 case Builtin::BI_exception_info:
3129 case Builtin::BI__abnormal_termination:
3130 case Builtin::BI_abnormal_termination:
3132 case Builtin::BI_setjmpex:
3133 case Builtin::BI_setjmp:
3140 case Builtin::BImove:
3141 case Builtin::BImove_if_noexcept:
3142 case Builtin::BIforward:
3143 case Builtin::BIforward_like:
3144 case Builtin::BIas_const:
3146 case Builtin::BI__GetExceptionInfo:
3147 case Builtin::BI__fastfail:
3149 case Builtin::BI__builtin_coro_id:
3151 case Builtin::BI__builtin_coro_promise:
3153 case Builtin::BI__builtin_coro_resume: {
3157 case Builtin::BI__builtin_coro_frame: {
3160 case Builtin::BI__builtin_coro_noop:
3162 case Builtin::BI__builtin_coro_free: {
3164 return coroFree ?
RValue::get(coroFree.getResult())
3167 case Builtin::BI__builtin_coro_destroy: {
3171 case Builtin::BI__builtin_coro_done:
3173 case Builtin::BI__builtin_coro_alloc: {
3175 return coroAlloc ?
RValue::get(coroAlloc.getResult())
3178 case Builtin::BI__builtin_coro_begin: {
3183 case Builtin::BI__builtin_coro_end:
3185 case Builtin::BI__builtin_coro_suspend: {
3190 case Builtin::BI__builtin_coro_size: {
3193 case Builtin::BI__builtin_coro_align:
3195 case Builtin::BIread_pipe:
3196 case Builtin::BIwrite_pipe:
3197 case Builtin::BIreserve_read_pipe:
3198 case Builtin::BIreserve_write_pipe:
3199 case Builtin::BIwork_group_reserve_read_pipe:
3200 case Builtin::BIwork_group_reserve_write_pipe:
3201 case Builtin::BIsub_group_reserve_read_pipe:
3202 case Builtin::BIsub_group_reserve_write_pipe:
3203 case Builtin::BIcommit_read_pipe:
3204 case Builtin::BIcommit_write_pipe:
3205 case Builtin::BIwork_group_commit_read_pipe:
3206 case Builtin::BIwork_group_commit_write_pipe:
3207 case Builtin::BIsub_group_commit_read_pipe:
3208 case Builtin::BIsub_group_commit_write_pipe:
3209 case Builtin::BIget_pipe_num_packets:
3210 case Builtin::BIget_pipe_max_packets:
3211 case Builtin::BIto_global:
3212 case Builtin::BIto_local:
3213 case Builtin::BIto_private:
3214 case Builtin::BIenqueue_kernel:
3215 case Builtin::BIget_kernel_work_group_size:
3216 case Builtin::BIget_kernel_preferred_work_group_size_multiple:
3217 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange:
3218 case Builtin::BIget_kernel_sub_group_count_for_ndrange:
3219 case Builtin::BI__builtin_store_half:
3220 case Builtin::BI__builtin_store_halff:
3221 case Builtin::BI__builtin_load_half:
3222 case Builtin::BI__builtin_load_halff:
3224 case Builtin::BI__builtin_printf:
3225 case Builtin::BIprintf:
3232 case Builtin::BI__builtin_canonicalize:
3233 case Builtin::BI__builtin_canonicalizef:
3234 case Builtin::BI__builtin_canonicalizef16:
3235 case Builtin::BI__builtin_canonicalizel:
3236 case Builtin::BI__builtin_thread_pointer:
3237 case Builtin::BI__builtin_os_log_format:
3238 case Builtin::BI__xray_customevent:
3239 case Builtin::BI__xray_typedevent:
3240 case Builtin::BI__builtin_ms_va_start:
3241 case Builtin::BI__builtin_ms_va_end:
3242 case Builtin::BI__builtin_ms_va_copy:
3243 case Builtin::BI__builtin_get_device_side_mangled_name:
3251 getContext().BuiltinInfo.isLibFunction(builtinID))
3253 cgm.getBuiltinLibFunction(fd, builtinID));
3257 if (
getContext().BuiltinInfo.isPredefinedLibFunction(builtinID))
3270 Intrinsic::ID intrinsicID = Intrinsic::not_intrinsic;
3273 if (!prefix.empty()) {
3274 intrinsicID = Intrinsic::getIntrinsicForClangBuiltin(prefix, name);
3275 if (intrinsicID == Intrinsic::not_intrinsic && prefix ==
"spv" &&
3277 intrinsicID = Intrinsic::getIntrinsicForClangBuiltin(
"amdgcn", name);
3281 if (intrinsicID == Intrinsic::not_intrinsic)
3282 intrinsicID = Intrinsic::getIntrinsicForMSBuiltin(prefix, name);
3285 if (intrinsicID != Intrinsic::not_intrinsic) {
3286 unsigned iceArguments = 0;
3291 StringRef name = Intrinsic::getName(intrinsicID);
3295 assert(name.starts_with(
"llvm.") &&
"expected llvm. prefix");
3296 name = name.drop_front(5);
3302 for (
unsigned i = 0; i < e->
getNumArgs(); i++) {
3303 mlir::Value argValue =
3307 mlir::Type argType = argValue.getType();
3308 mlir::Type expectedTy = intrinsicType.getInput(i);
3311 mlir::Type correctedExpectedTy = expectedTy;
3312 if (fd && i < fd->getNumParams()) {
3317 if (mlir::isa<cir::PointerType>(expectedTy)) {
3318 bool argIsPointer = mlir::isa<cir::PointerType>(argType);
3319 bool argIsVectorOfPointer =
false;
3320 if (
auto vecTy = dyn_cast<mlir::VectorType>(argType))
3321 argIsVectorOfPointer =
3322 mlir::isa<cir::PointerType>(vecTy.getElementType());
3324 if (!argIsPointer && !argIsVectorOfPointer) {
3327 "intrinsic expects a pointer type (NYI for non-pointer)");
3332 if (argType != expectedTy)
3337 if (argType != correctedExpectedTy)
3338 argValue = builder.createBitcast(argValue, correctedExpectedTy);
3341 args.push_back(argValue);
3346 mlir::Type correctedReturnType =
3349 cir::LLVMIntrinsicCallOp intrinsicCall = cir::LLVMIntrinsicCallOp::create(
3351 correctedReturnType, args);
3353 mlir::Value intrinsicRes = intrinsicCall.getResult();
3377 if (std::optional<mlir::Value> rst =
3379 mlir::Value v = rst.value();
3387 if (mlir::isa<cir::VoidType>(v.getType()))
3394 llvm_unreachable(
"No current target builtin returns complex");
3396 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
3400 std::string(
"unimplemented builtin call: ") +
3401 getContext().BuiltinInfo.getName(builtinID));