2648 assert(!
getContext().BuiltinInfo.isImmediate(BuiltinID) &&
2649 "Should not codegen for consteval builtins");
2656 !
Result.hasSideEffects()) {
2660 if (
Result.Val.isFloat())
2670 &
getTarget().getLongDoubleFormat() == &llvm::APFloat::IEEEquad())
2677 const unsigned BuiltinIDIfNoAsmLabel =
2678 FD->
hasAttr<AsmLabelAttr>() ? 0 : BuiltinID;
2680 std::optional<bool> ErrnoOverriden;
2686 if (OP.hasMathErrnoOverride())
2687 ErrnoOverriden = OP.getMathErrnoOverride();
2693 bool IsOptimizationEnabled =
CGM.getCodeGenOpts().OptimizationLevel != 0;
2695 bool GenerateFPMathIntrinsics =
2697 BuiltinID,
CGM.getTriple(), ErrnoOverriden,
getLangOpts().MathErrno,
2698 OptNone, IsOptimizationEnabled);
2700 if (GenerateFPMathIntrinsics) {
2701 switch (BuiltinIDIfNoAsmLabel) {
2702 case Builtin::BIacos:
2703 case Builtin::BIacosf:
2704 case Builtin::BIacosl:
2705 case Builtin::BI__builtin_acos:
2706 case Builtin::BI__builtin_acosf:
2707 case Builtin::BI__builtin_acosf16:
2708 case Builtin::BI__builtin_acosl:
2709 case Builtin::BI__builtin_acosf128:
2710 case Builtin::BI__builtin_elementwise_acos:
2712 *
this, E, Intrinsic::acos, Intrinsic::experimental_constrained_acos));
2714 case Builtin::BIasin:
2715 case Builtin::BIasinf:
2716 case Builtin::BIasinl:
2717 case Builtin::BI__builtin_asin:
2718 case Builtin::BI__builtin_asinf:
2719 case Builtin::BI__builtin_asinf16:
2720 case Builtin::BI__builtin_asinl:
2721 case Builtin::BI__builtin_asinf128:
2722 case Builtin::BI__builtin_elementwise_asin:
2724 *
this, E, Intrinsic::asin, Intrinsic::experimental_constrained_asin));
2726 case Builtin::BIatan:
2727 case Builtin::BIatanf:
2728 case Builtin::BIatanl:
2729 case Builtin::BI__builtin_atan:
2730 case Builtin::BI__builtin_atanf:
2731 case Builtin::BI__builtin_atanf16:
2732 case Builtin::BI__builtin_atanl:
2733 case Builtin::BI__builtin_atanf128:
2734 case Builtin::BI__builtin_elementwise_atan:
2736 *
this, E, Intrinsic::atan, Intrinsic::experimental_constrained_atan));
2738 case Builtin::BIatan2:
2739 case Builtin::BIatan2f:
2740 case Builtin::BIatan2l:
2741 case Builtin::BI__builtin_atan2:
2742 case Builtin::BI__builtin_atan2f:
2743 case Builtin::BI__builtin_atan2f16:
2744 case Builtin::BI__builtin_atan2l:
2745 case Builtin::BI__builtin_atan2f128:
2746 case Builtin::BI__builtin_elementwise_atan2:
2748 *
this, E, Intrinsic::atan2,
2749 Intrinsic::experimental_constrained_atan2));
2751 case Builtin::BIceil:
2752 case Builtin::BIceilf:
2753 case Builtin::BIceill:
2754 case Builtin::BI__builtin_ceil:
2755 case Builtin::BI__builtin_ceilf:
2756 case Builtin::BI__builtin_ceilf16:
2757 case Builtin::BI__builtin_ceill:
2758 case Builtin::BI__builtin_ceilf128:
2759 case Builtin::BI__builtin_elementwise_ceil:
2762 Intrinsic::experimental_constrained_ceil));
2764 case Builtin::BIcopysign:
2765 case Builtin::BIcopysignf:
2766 case Builtin::BIcopysignl:
2767 case Builtin::BI__builtin_copysign:
2768 case Builtin::BI__builtin_copysignf:
2769 case Builtin::BI__builtin_copysignf16:
2770 case Builtin::BI__builtin_copysignl:
2771 case Builtin::BI__builtin_copysignf128:
2775 case Builtin::BIcos:
2776 case Builtin::BIcosf:
2777 case Builtin::BIcosl:
2778 case Builtin::BI__builtin_cos:
2779 case Builtin::BI__builtin_cosf:
2780 case Builtin::BI__builtin_cosf16:
2781 case Builtin::BI__builtin_cosl:
2782 case Builtin::BI__builtin_cosf128:
2783 case Builtin::BI__builtin_elementwise_cos:
2786 Intrinsic::experimental_constrained_cos));
2788 case Builtin::BIcosh:
2789 case Builtin::BIcoshf:
2790 case Builtin::BIcoshl:
2791 case Builtin::BI__builtin_cosh:
2792 case Builtin::BI__builtin_coshf:
2793 case Builtin::BI__builtin_coshf16:
2794 case Builtin::BI__builtin_coshl:
2795 case Builtin::BI__builtin_coshf128:
2796 case Builtin::BI__builtin_elementwise_cosh:
2798 *
this, E, Intrinsic::cosh, Intrinsic::experimental_constrained_cosh));
2800 case Builtin::BIexp:
2801 case Builtin::BIexpf:
2802 case Builtin::BIexpl:
2803 case Builtin::BI__builtin_exp:
2804 case Builtin::BI__builtin_expf:
2805 case Builtin::BI__builtin_expf16:
2806 case Builtin::BI__builtin_expl:
2807 case Builtin::BI__builtin_expf128:
2808 case Builtin::BI__builtin_elementwise_exp:
2811 Intrinsic::experimental_constrained_exp));
2813 case Builtin::BIexp2:
2814 case Builtin::BIexp2f:
2815 case Builtin::BIexp2l:
2816 case Builtin::BI__builtin_exp2:
2817 case Builtin::BI__builtin_exp2f:
2818 case Builtin::BI__builtin_exp2f16:
2819 case Builtin::BI__builtin_exp2l:
2820 case Builtin::BI__builtin_exp2f128:
2821 case Builtin::BI__builtin_elementwise_exp2:
2824 Intrinsic::experimental_constrained_exp2));
2825 case Builtin::BI__builtin_exp10:
2826 case Builtin::BI__builtin_exp10f:
2827 case Builtin::BI__builtin_exp10f16:
2828 case Builtin::BI__builtin_exp10l:
2829 case Builtin::BI__builtin_exp10f128:
2830 case Builtin::BI__builtin_elementwise_exp10: {
2832 if (
Builder.getIsFPConstrained())
2837 case Builtin::BIfabs:
2838 case Builtin::BIfabsf:
2839 case Builtin::BIfabsl:
2840 case Builtin::BI__builtin_fabs:
2841 case Builtin::BI__builtin_fabsf:
2842 case Builtin::BI__builtin_fabsf16:
2843 case Builtin::BI__builtin_fabsl:
2844 case Builtin::BI__builtin_fabsf128:
2848 case Builtin::BIfloor:
2849 case Builtin::BIfloorf:
2850 case Builtin::BIfloorl:
2851 case Builtin::BI__builtin_floor:
2852 case Builtin::BI__builtin_floorf:
2853 case Builtin::BI__builtin_floorf16:
2854 case Builtin::BI__builtin_floorl:
2855 case Builtin::BI__builtin_floorf128:
2856 case Builtin::BI__builtin_elementwise_floor:
2859 Intrinsic::experimental_constrained_floor));
2861 case Builtin::BIfma:
2862 case Builtin::BIfmaf:
2863 case Builtin::BIfmal:
2864 case Builtin::BI__builtin_fma:
2865 case Builtin::BI__builtin_fmaf:
2866 case Builtin::BI__builtin_fmaf16:
2867 case Builtin::BI__builtin_fmal:
2868 case Builtin::BI__builtin_fmaf128:
2869 case Builtin::BI__builtin_elementwise_fma:
2872 Intrinsic::experimental_constrained_fma));
2874 case Builtin::BIfmax:
2875 case Builtin::BIfmaxf:
2876 case Builtin::BIfmaxl:
2877 case Builtin::BI__builtin_fmax:
2878 case Builtin::BI__builtin_fmaxf:
2879 case Builtin::BI__builtin_fmaxf16:
2880 case Builtin::BI__builtin_fmaxl:
2881 case Builtin::BI__builtin_fmaxf128: {
2882 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
2883 Builder.getFastMathFlags().setNoSignedZeros();
2885 *
this, E, Intrinsic::maxnum,
2886 Intrinsic::experimental_constrained_maxnum));
2889 case Builtin::BIfmin:
2890 case Builtin::BIfminf:
2891 case Builtin::BIfminl:
2892 case Builtin::BI__builtin_fmin:
2893 case Builtin::BI__builtin_fminf:
2894 case Builtin::BI__builtin_fminf16:
2895 case Builtin::BI__builtin_fminl:
2896 case Builtin::BI__builtin_fminf128: {
2897 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
2898 Builder.getFastMathFlags().setNoSignedZeros();
2900 *
this, E, Intrinsic::minnum,
2901 Intrinsic::experimental_constrained_minnum));
2904 case Builtin::BIfmaximum_num:
2905 case Builtin::BIfmaximum_numf:
2906 case Builtin::BIfmaximum_numl:
2907 case Builtin::BI__builtin_fmaximum_num:
2908 case Builtin::BI__builtin_fmaximum_numf:
2909 case Builtin::BI__builtin_fmaximum_numf16:
2910 case Builtin::BI__builtin_fmaximum_numl:
2911 case Builtin::BI__builtin_fmaximum_numf128:
2915 case Builtin::BIfminimum_num:
2916 case Builtin::BIfminimum_numf:
2917 case Builtin::BIfminimum_numl:
2918 case Builtin::BI__builtin_fminimum_num:
2919 case Builtin::BI__builtin_fminimum_numf:
2920 case Builtin::BI__builtin_fminimum_numf16:
2921 case Builtin::BI__builtin_fminimum_numl:
2922 case Builtin::BI__builtin_fminimum_numf128:
2928 case Builtin::BIfmod:
2929 case Builtin::BIfmodf:
2930 case Builtin::BIfmodl:
2931 case Builtin::BI__builtin_fmod:
2932 case Builtin::BI__builtin_fmodf:
2933 case Builtin::BI__builtin_fmodf16:
2934 case Builtin::BI__builtin_fmodl:
2935 case Builtin::BI__builtin_fmodf128:
2936 case Builtin::BI__builtin_elementwise_fmod: {
2940 if (
Builder.getIsFPConstrained()) {
2941 Function *F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_frem,
2949 case Builtin::BIlog:
2950 case Builtin::BIlogf:
2951 case Builtin::BIlogl:
2952 case Builtin::BI__builtin_log:
2953 case Builtin::BI__builtin_logf:
2954 case Builtin::BI__builtin_logf16:
2955 case Builtin::BI__builtin_logl:
2956 case Builtin::BI__builtin_logf128:
2957 case Builtin::BI__builtin_elementwise_log:
2960 Intrinsic::experimental_constrained_log));
2962 case Builtin::BIlog10:
2963 case Builtin::BIlog10f:
2964 case Builtin::BIlog10l:
2965 case Builtin::BI__builtin_log10:
2966 case Builtin::BI__builtin_log10f:
2967 case Builtin::BI__builtin_log10f16:
2968 case Builtin::BI__builtin_log10l:
2969 case Builtin::BI__builtin_log10f128:
2970 case Builtin::BI__builtin_elementwise_log10:
2973 Intrinsic::experimental_constrained_log10));
2975 case Builtin::BIlog2:
2976 case Builtin::BIlog2f:
2977 case Builtin::BIlog2l:
2978 case Builtin::BI__builtin_log2:
2979 case Builtin::BI__builtin_log2f:
2980 case Builtin::BI__builtin_log2f16:
2981 case Builtin::BI__builtin_log2l:
2982 case Builtin::BI__builtin_log2f128:
2983 case Builtin::BI__builtin_elementwise_log2:
2986 Intrinsic::experimental_constrained_log2));
2988 case Builtin::BInearbyint:
2989 case Builtin::BInearbyintf:
2990 case Builtin::BInearbyintl:
2991 case Builtin::BI__builtin_nearbyint:
2992 case Builtin::BI__builtin_nearbyintf:
2993 case Builtin::BI__builtin_nearbyintl:
2994 case Builtin::BI__builtin_nearbyintf128:
2995 case Builtin::BI__builtin_elementwise_nearbyint:
2997 Intrinsic::nearbyint,
2998 Intrinsic::experimental_constrained_nearbyint));
3000 case Builtin::BIpow:
3001 case Builtin::BIpowf:
3002 case Builtin::BIpowl:
3003 case Builtin::BI__builtin_pow:
3004 case Builtin::BI__builtin_powf:
3005 case Builtin::BI__builtin_powf16:
3006 case Builtin::BI__builtin_powl:
3007 case Builtin::BI__builtin_powf128:
3008 case Builtin::BI__builtin_elementwise_pow:
3011 Intrinsic::experimental_constrained_pow));
3013 case Builtin::BIrint:
3014 case Builtin::BIrintf:
3015 case Builtin::BIrintl:
3016 case Builtin::BI__builtin_rint:
3017 case Builtin::BI__builtin_rintf:
3018 case Builtin::BI__builtin_rintf16:
3019 case Builtin::BI__builtin_rintl:
3020 case Builtin::BI__builtin_rintf128:
3021 case Builtin::BI__builtin_elementwise_rint:
3024 Intrinsic::experimental_constrained_rint));
3026 case Builtin::BIround:
3027 case Builtin::BIroundf:
3028 case Builtin::BIroundl:
3029 case Builtin::BI__builtin_round:
3030 case Builtin::BI__builtin_roundf:
3031 case Builtin::BI__builtin_roundf16:
3032 case Builtin::BI__builtin_roundl:
3033 case Builtin::BI__builtin_roundf128:
3034 case Builtin::BI__builtin_elementwise_round:
3037 Intrinsic::experimental_constrained_round));
3039 case Builtin::BIroundeven:
3040 case Builtin::BIroundevenf:
3041 case Builtin::BIroundevenl:
3042 case Builtin::BI__builtin_roundeven:
3043 case Builtin::BI__builtin_roundevenf:
3044 case Builtin::BI__builtin_roundevenf16:
3045 case Builtin::BI__builtin_roundevenl:
3046 case Builtin::BI__builtin_roundevenf128:
3047 case Builtin::BI__builtin_elementwise_roundeven:
3049 Intrinsic::roundeven,
3050 Intrinsic::experimental_constrained_roundeven));
3052 case Builtin::BIsin:
3053 case Builtin::BIsinf:
3054 case Builtin::BIsinl:
3055 case Builtin::BI__builtin_sin:
3056 case Builtin::BI__builtin_sinf:
3057 case Builtin::BI__builtin_sinf16:
3058 case Builtin::BI__builtin_sinl:
3059 case Builtin::BI__builtin_sinf128:
3060 case Builtin::BI__builtin_elementwise_sin:
3063 Intrinsic::experimental_constrained_sin));
3065 case Builtin::BIsinh:
3066 case Builtin::BIsinhf:
3067 case Builtin::BIsinhl:
3068 case Builtin::BI__builtin_sinh:
3069 case Builtin::BI__builtin_sinhf:
3070 case Builtin::BI__builtin_sinhf16:
3071 case Builtin::BI__builtin_sinhl:
3072 case Builtin::BI__builtin_sinhf128:
3073 case Builtin::BI__builtin_elementwise_sinh:
3075 *
this, E, Intrinsic::sinh, Intrinsic::experimental_constrained_sinh));
3077 case Builtin::BI__builtin_sincospi:
3078 case Builtin::BI__builtin_sincospif:
3079 case Builtin::BI__builtin_sincospil:
3080 if (
Builder.getIsFPConstrained())
3085 case Builtin::BIsincos:
3086 case Builtin::BIsincosf:
3087 case Builtin::BIsincosl:
3088 case Builtin::BI__builtin_sincos:
3089 case Builtin::BI__builtin_sincosf:
3090 case Builtin::BI__builtin_sincosf16:
3091 case Builtin::BI__builtin_sincosl:
3092 case Builtin::BI__builtin_sincosf128:
3093 if (
Builder.getIsFPConstrained())
3098 case Builtin::BIsqrt:
3099 case Builtin::BIsqrtf:
3100 case Builtin::BIsqrtl:
3101 case Builtin::BI__builtin_sqrt:
3102 case Builtin::BI__builtin_sqrtf:
3103 case Builtin::BI__builtin_sqrtf16:
3104 case Builtin::BI__builtin_sqrtl:
3105 case Builtin::BI__builtin_sqrtf128:
3106 case Builtin::BI__builtin_elementwise_sqrt: {
3108 *
this, E, Intrinsic::sqrt, Intrinsic::experimental_constrained_sqrt);
3113 case Builtin::BItan:
3114 case Builtin::BItanf:
3115 case Builtin::BItanl:
3116 case Builtin::BI__builtin_tan:
3117 case Builtin::BI__builtin_tanf:
3118 case Builtin::BI__builtin_tanf16:
3119 case Builtin::BI__builtin_tanl:
3120 case Builtin::BI__builtin_tanf128:
3121 case Builtin::BI__builtin_elementwise_tan:
3123 *
this, E, Intrinsic::tan, Intrinsic::experimental_constrained_tan));
3125 case Builtin::BItanh:
3126 case Builtin::BItanhf:
3127 case Builtin::BItanhl:
3128 case Builtin::BI__builtin_tanh:
3129 case Builtin::BI__builtin_tanhf:
3130 case Builtin::BI__builtin_tanhf16:
3131 case Builtin::BI__builtin_tanhl:
3132 case Builtin::BI__builtin_tanhf128:
3133 case Builtin::BI__builtin_elementwise_tanh:
3135 *
this, E, Intrinsic::tanh, Intrinsic::experimental_constrained_tanh));
3137 case Builtin::BItrunc:
3138 case Builtin::BItruncf:
3139 case Builtin::BItruncl:
3140 case Builtin::BI__builtin_trunc:
3141 case Builtin::BI__builtin_truncf:
3142 case Builtin::BI__builtin_truncf16:
3143 case Builtin::BI__builtin_truncl:
3144 case Builtin::BI__builtin_truncf128:
3145 case Builtin::BI__builtin_elementwise_trunc:
3148 Intrinsic::experimental_constrained_trunc));
3150 case Builtin::BIlround:
3151 case Builtin::BIlroundf:
3152 case Builtin::BIlroundl:
3153 case Builtin::BI__builtin_lround:
3154 case Builtin::BI__builtin_lroundf:
3155 case Builtin::BI__builtin_lroundl:
3156 case Builtin::BI__builtin_lroundf128:
3158 *
this, E, Intrinsic::lround,
3159 Intrinsic::experimental_constrained_lround));
3161 case Builtin::BIllround:
3162 case Builtin::BIllroundf:
3163 case Builtin::BIllroundl:
3164 case Builtin::BI__builtin_llround:
3165 case Builtin::BI__builtin_llroundf:
3166 case Builtin::BI__builtin_llroundl:
3167 case Builtin::BI__builtin_llroundf128:
3169 *
this, E, Intrinsic::llround,
3170 Intrinsic::experimental_constrained_llround));
3172 case Builtin::BIlrint:
3173 case Builtin::BIlrintf:
3174 case Builtin::BIlrintl:
3175 case Builtin::BI__builtin_lrint:
3176 case Builtin::BI__builtin_lrintf:
3177 case Builtin::BI__builtin_lrintl:
3178 case Builtin::BI__builtin_lrintf128:
3180 *
this, E, Intrinsic::lrint,
3181 Intrinsic::experimental_constrained_lrint));
3183 case Builtin::BIllrint:
3184 case Builtin::BIllrintf:
3185 case Builtin::BIllrintl:
3186 case Builtin::BI__builtin_llrint:
3187 case Builtin::BI__builtin_llrintf:
3188 case Builtin::BI__builtin_llrintl:
3189 case Builtin::BI__builtin_llrintf128:
3191 *
this, E, Intrinsic::llrint,
3192 Intrinsic::experimental_constrained_llrint));
3193 case Builtin::BI__builtin_ldexp:
3194 case Builtin::BI__builtin_ldexpf:
3195 case Builtin::BI__builtin_ldexpl:
3196 case Builtin::BI__builtin_ldexpf16:
3197 case Builtin::BI__builtin_ldexpf128:
3198 case Builtin::BI__builtin_elementwise_ldexp:
3200 *
this, E, Intrinsic::ldexp,
3201 Intrinsic::experimental_constrained_ldexp));
3210 Value *Val = A.emitRawPointer(*
this);
3214 if (
SanOpts.has(SanitizerKind::Alignment)) {
3216 SkippedChecks.
set(SanitizerKind::All);
3217 SkippedChecks.
clear(SanitizerKind::Alignment);
3220 if (
auto *CE = dyn_cast<ImplicitCastExpr>(Arg))
3221 if (CE->getCastKind() == CK_BitCast)
3222 Arg = CE->getSubExpr();
3228 switch (BuiltinIDIfNoAsmLabel) {
3230 case Builtin::BI__builtin___CFStringMakeConstantString:
3231 case Builtin::BI__builtin___NSStringMakeConstantString:
3233 case Builtin::BI__builtin_stdarg_start:
3234 case Builtin::BI__builtin_va_start:
3235 case Builtin::BI__va_start:
3236 case Builtin::BI__builtin_c23_va_start:
3237 case Builtin::BI__builtin_va_end:
3241 BuiltinID != Builtin::BI__builtin_va_end);
3243 case Builtin::BI__builtin_va_copy: {
3246 Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::vacopy, {DstPtr->getType()}),
3250 case Builtin::BIabs:
3251 case Builtin::BIlabs:
3252 case Builtin::BIllabs:
3253 case Builtin::BI__builtin_abs:
3254 case Builtin::BI__builtin_labs:
3255 case Builtin::BI__builtin_llabs: {
3256 bool SanitizeOverflow =
SanOpts.has(SanitizerKind::SignedIntegerOverflow);
3259 switch (
getLangOpts().getSignedOverflowBehavior()) {
3264 if (!SanitizeOverflow) {
3276 case Builtin::BI__builtin_complex: {
3281 case Builtin::BI__builtin_conj:
3282 case Builtin::BI__builtin_conjf:
3283 case Builtin::BI__builtin_conjl:
3284 case Builtin::BIconj:
3285 case Builtin::BIconjf:
3286 case Builtin::BIconjl: {
3288 Value *Real = ComplexVal.first;
3289 Value *Imag = ComplexVal.second;
3290 Imag =
Builder.CreateFNeg(Imag,
"neg");
3293 case Builtin::BI__builtin_creal:
3294 case Builtin::BI__builtin_crealf:
3295 case Builtin::BI__builtin_creall:
3296 case Builtin::BIcreal:
3297 case Builtin::BIcrealf:
3298 case Builtin::BIcreall: {
3303 case Builtin::BI__builtin_preserve_access_index: {
3308 CGM.Error(E->
getExprLoc(),
"using builtin_preserve_access_index() without -g");
3314 CGM.Error(E->
getExprLoc(),
"nested builtin_preserve_access_index() not supported");
3324 case Builtin::BI__builtin_cimag:
3325 case Builtin::BI__builtin_cimagf:
3326 case Builtin::BI__builtin_cimagl:
3327 case Builtin::BIcimag:
3328 case Builtin::BIcimagf:
3329 case Builtin::BIcimagl: {
3334 case Builtin::BI__builtin_clrsb:
3335 case Builtin::BI__builtin_clrsbl:
3336 case Builtin::BI__builtin_clrsbll: {
3347 Value *Tmp =
Builder.CreateSelect(IsNeg, Inverse, ArgValue);
3355 case Builtin::BI__builtin_ctzs:
3356 case Builtin::BI__builtin_ctz:
3357 case Builtin::BI__builtin_ctzl:
3358 case Builtin::BI__builtin_ctzll:
3359 case Builtin::BI__builtin_ctzg:
3360 case Builtin::BI__builtin_elementwise_ctzg: {
3362 (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_ctzg ||
3363 BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_ctzg) &&
3376 HasFallback ||
getTarget().isCLZForZeroUndef() ||
3377 BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_ctzg);
3379 if (
Result->getType() != ResultType)
3388 Value *ResultOrFallback =
3389 Builder.CreateSelect(IsZero, FallbackValue,
Result,
"ctzg");
3392 case Builtin::BI__builtin_clzs:
3393 case Builtin::BI__builtin_clz:
3394 case Builtin::BI__builtin_clzl:
3395 case Builtin::BI__builtin_clzll:
3396 case Builtin::BI__builtin_clzg:
3397 case Builtin::BI__builtin_elementwise_clzg: {
3399 (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_clzg ||
3400 BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_clzg) &&
3413 HasFallback ||
getTarget().isCLZForZeroUndef() ||
3414 BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_clzg);
3416 if (
Result->getType() != ResultType)
3425 Value *ResultOrFallback =
3426 Builder.CreateSelect(IsZero, FallbackValue,
Result,
"clzg");
3429 case Builtin::BI__builtin_ffs:
3430 case Builtin::BI__builtin_ffsl:
3431 case Builtin::BI__builtin_ffsll: {
3440 Builder.CreateAdd(
Builder.CreateCall(F, {ArgValue, Builder.getTrue()}),
3441 llvm::ConstantInt::get(
ArgType, 1));
3445 if (
Result->getType() != ResultType)
3450 case Builtin::BI__builtin_parity:
3451 case Builtin::BI__builtin_parityl:
3452 case Builtin::BI__builtin_parityll: {
3462 if (
Result->getType() != ResultType)
3467 case Builtin::BI__lzcnt16:
3468 case Builtin::BI__lzcnt:
3469 case Builtin::BI__lzcnt64: {
3477 if (
Result->getType() != ResultType)
3482 case Builtin::BI__popcnt16:
3483 case Builtin::BI__popcnt:
3484 case Builtin::BI__popcnt64:
3485 case Builtin::BI__builtin_popcount:
3486 case Builtin::BI__builtin_popcountl:
3487 case Builtin::BI__builtin_popcountll:
3488 case Builtin::BI__builtin_popcountg: {
3496 if (
Result->getType() != ResultType)
3501 case Builtin::BI__builtin_unpredictable: {
3507 case Builtin::BI__builtin_expect: {
3515 if (
CGM.getCodeGenOpts().OptimizationLevel == 0)
3520 Builder.CreateCall(FnExpect, {ArgValue, ExpectedValue},
"expval");
3523 case Builtin::BI__builtin_expect_with_probability: {
3528 llvm::APFloat Probability(0.0);
3531 assert(EvalSucceed &&
"probability should be able to evaluate as float");
3533 bool LoseInfo =
false;
3534 Probability.convert(llvm::APFloat::IEEEdouble(),
3535 llvm::RoundingMode::Dynamic, &LoseInfo);
3537 Constant *Confidence = ConstantFP::get(Ty, Probability);
3541 if (
CGM.getCodeGenOpts().OptimizationLevel == 0)
3545 CGM.getIntrinsic(Intrinsic::expect_with_probability,
ArgType);
3547 FnExpect, {ArgValue, ExpectedValue, Confidence},
"expval");
3550 case Builtin::BI__builtin_assume_aligned: {
3553 Value *OffsetValue =
3558 if (AlignmentCI->getValue().ugt(llvm::Value::MaximumAlignment))
3559 AlignmentCI = ConstantInt::get(AlignmentCI->getIntegerType(),
3560 llvm::Value::MaximumAlignment);
3564 AlignmentCI, OffsetValue);
3567 case Builtin::BI__builtin_assume_dereferenceable: {
3575 Builder.CreateDereferenceableAssumption(PtrValue, SizeValue);
3578 case Builtin::BI__assume:
3579 case Builtin::BI__builtin_assume: {
3584 Function *FnAssume =
CGM.getIntrinsic(Intrinsic::assume);
3585 Builder.CreateCall(FnAssume, ArgValue);
3588 case Builtin::BI__builtin_assume_separate_storage: {
3595 Value *Values[] = {Value0, Value1};
3596 OperandBundleDefT<Value *> OBD(
"separate_storage", Values);
3600 case Builtin::BI__builtin_allow_runtime_check: {
3603 LLVMContext &Ctx =
CGM.getLLVMContext();
3605 CGM.getIntrinsic(Intrinsic::allow_runtime_check),
3606 llvm::MetadataAsValue::get(Ctx, llvm::MDString::get(Ctx, Kind)));
3609 case Builtin::BI__builtin_allow_sanitize_check: {
3610 Intrinsic::ID IntrID = Intrinsic::not_intrinsic;
3618 if (
getLangOpts().Sanitize.hasOneOf(SanitizerKind::Address |
3619 SanitizerKind::KernelAddress) &&
3620 (Name ==
"address" || Name ==
"kernel-address")) {
3621 IntrID = Intrinsic::allow_sanitize_address;
3622 }
else if (
getLangOpts().Sanitize.has(SanitizerKind::Thread) &&
3624 IntrID = Intrinsic::allow_sanitize_thread;
3625 }
else if (
getLangOpts().Sanitize.hasOneOf(SanitizerKind::Memory |
3626 SanitizerKind::KernelMemory) &&
3627 (Name ==
"memory" || Name ==
"kernel-memory")) {
3628 IntrID = Intrinsic::allow_sanitize_memory;
3630 SanitizerKind::HWAddress | SanitizerKind::KernelHWAddress) &&
3631 (Name ==
"hwaddress" || Name ==
"kernel-hwaddress")) {
3632 IntrID = Intrinsic::allow_sanitize_hwaddress;
3635 if (IntrID != Intrinsic::not_intrinsic) {
3644 case Builtin::BI__arithmetic_fence: {
3648 llvm::FastMathFlags FMF =
Builder.getFastMathFlags();
3649 bool isArithmeticFenceEnabled =
3650 FMF.allowReassoc() &&
3653 if (
ArgType->isComplexType()) {
3654 if (isArithmeticFenceEnabled) {
3657 Value *Real =
Builder.CreateArithmeticFence(ComplexVal.first,
3659 Value *Imag =
Builder.CreateArithmeticFence(ComplexVal.second,
3664 Value *Real = ComplexVal.first;
3665 Value *Imag = ComplexVal.second;
3669 if (isArithmeticFenceEnabled)
3674 case Builtin::BI__builtin_bswapg: {
3677 assert(
IntTy &&
"LLVM's __builtin_bswapg only supports integer variants");
3678 if (
IntTy->getBitWidth() == 1 ||
IntTy->getBitWidth() == 8)
3680 assert(((
IntTy->getBitWidth() % 16 == 0 &&
IntTy->getBitWidth() != 0)) &&
3681 "LLVM's __builtin_bswapg only supports integer variants that has a "
3682 "multiple of 16 bits as well as a single byte");
3686 case Builtin::BI__builtin_bswap16:
3687 case Builtin::BI__builtin_bswap32:
3688 case Builtin::BI__builtin_bswap64:
3689 case Builtin::BI_byteswap_ushort:
3690 case Builtin::BI_byteswap_ulong:
3691 case Builtin::BI_byteswap_uint64: {
3695 case Builtin::BI__builtin_bitreverseg: {
3699 "LLVM's __builtin_bitreverseg only support integer variants");
3700 if (
IntTy->getBitWidth() == 1)
3705 case Builtin::BI__builtin_bitreverse8:
3706 case Builtin::BI__builtin_bitreverse16:
3707 case Builtin::BI__builtin_bitreverse32:
3708 case Builtin::BI__builtin_bitreverse64: {
3712 case Builtin::BI__builtin_rotateleft8:
3713 case Builtin::BI__builtin_rotateleft16:
3714 case Builtin::BI__builtin_rotateleft32:
3715 case Builtin::BI__builtin_rotateleft64:
3716 case Builtin::BI__builtin_stdc_rotate_left:
3717 case Builtin::BI_rotl8:
3718 case Builtin::BI_rotl16:
3719 case Builtin::BI_rotl:
3720 case Builtin::BI_lrotl:
3721 case Builtin::BI_rotl64:
3724 case Builtin::BI__builtin_rotateright8:
3725 case Builtin::BI__builtin_rotateright16:
3726 case Builtin::BI__builtin_rotateright32:
3727 case Builtin::BI__builtin_rotateright64:
3728 case Builtin::BI__builtin_stdc_rotate_right:
3729 case Builtin::BI_rotr8:
3730 case Builtin::BI_rotr16:
3731 case Builtin::BI_rotr:
3732 case Builtin::BI_lrotr:
3733 case Builtin::BI_rotr64:
3736 case Builtin::BI__builtin_constant_p: {
3743 if (!
ArgType->isIntegralOrEnumerationType() && !
ArgType->isFloatingType() &&
3744 !
ArgType->isObjCObjectPointerType() && !
ArgType->isBlockPointerType())
3747 return RValue::get(ConstantInt::get(ResultType, 0));
3752 return RValue::get(ConstantInt::get(ResultType, 0));
3755 if (
ArgType->isObjCObjectPointerType()) {
3764 if (
Result->getType() != ResultType)
3768 case Builtin::BI__builtin_dynamic_object_size:
3769 case Builtin::BI__builtin_object_size: {
3776 bool IsDynamic = BuiltinID == Builtin::BI__builtin_dynamic_object_size;
3778 nullptr, IsDynamic));
3780 case Builtin::BI__builtin_counted_by_ref: {
3782 llvm::Value *
Result = llvm::ConstantPointerNull::get(
3787 if (
auto *UO = dyn_cast<UnaryOperator>(Arg);
3788 UO && UO->getOpcode() == UO_AddrOf) {
3791 if (
auto *ASE = dyn_cast<ArraySubscriptExpr>(Arg))
3795 if (
const MemberExpr *ME = dyn_cast_if_present<MemberExpr>(Arg)) {
3803 llvm::report_fatal_error(
"Cannot find the counted_by 'count' field");
3809 case Builtin::BI__builtin_prefetch: {
3813 llvm::ConstantInt::get(
Int32Ty, 0);
3815 llvm::ConstantInt::get(
Int32Ty, 3);
3821 case Builtin::BI__builtin_readcyclecounter: {
3822 Function *F =
CGM.getIntrinsic(Intrinsic::readcyclecounter);
3825 case Builtin::BI__builtin_readsteadycounter: {
3826 Function *F =
CGM.getIntrinsic(Intrinsic::readsteadycounter);
3829 case Builtin::BI__builtin___clear_cache: {
3832 Function *F =
CGM.getIntrinsic(Intrinsic::clear_cache, {
CGM.DefaultPtrTy});
3835 case Builtin::BI__builtin_trap:
3838 case Builtin::BI__builtin_verbose_trap: {
3839 llvm::DILocation *TrapLocation =
Builder.getCurrentDebugLocation();
3850 case Builtin::BI__debugbreak:
3853 case Builtin::BI__builtin_unreachable: {
3862 case Builtin::BI__builtin_powi:
3863 case Builtin::BI__builtin_powif:
3864 case Builtin::BI__builtin_powil: {
3868 if (
Builder.getIsFPConstrained()) {
3872 Function *F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_powi,
3878 { Src0->getType(), Src1->getType() });
3881 case Builtin::BI__builtin_frexpl: {
3885 if (&
getTarget().getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble())
3889 case Builtin::BI__builtin_frexp:
3890 case Builtin::BI__builtin_frexpf:
3891 case Builtin::BI__builtin_frexpf128:
3892 case Builtin::BI__builtin_frexpf16:
3894 case Builtin::BImodf:
3895 case Builtin::BImodff:
3896 case Builtin::BImodfl:
3897 case Builtin::BI__builtin_modf:
3898 case Builtin::BI__builtin_modff:
3899 case Builtin::BI__builtin_modfl:
3900 if (
Builder.getIsFPConstrained())
3903 case Builtin::BI__builtin_isgreater:
3904 case Builtin::BI__builtin_isgreaterequal:
3905 case Builtin::BI__builtin_isless:
3906 case Builtin::BI__builtin_islessequal:
3907 case Builtin::BI__builtin_islessgreater:
3908 case Builtin::BI__builtin_isunordered: {
3915 switch (BuiltinID) {
3916 default: llvm_unreachable(
"Unknown ordered comparison");
3917 case Builtin::BI__builtin_isgreater:
3918 LHS =
Builder.CreateFCmpOGT(LHS, RHS,
"cmp");
3920 case Builtin::BI__builtin_isgreaterequal:
3921 LHS =
Builder.CreateFCmpOGE(LHS, RHS,
"cmp");
3923 case Builtin::BI__builtin_isless:
3924 LHS =
Builder.CreateFCmpOLT(LHS, RHS,
"cmp");
3926 case Builtin::BI__builtin_islessequal:
3927 LHS =
Builder.CreateFCmpOLE(LHS, RHS,
"cmp");
3929 case Builtin::BI__builtin_islessgreater:
3930 LHS =
Builder.CreateFCmpONE(LHS, RHS,
"cmp");
3932 case Builtin::BI__builtin_isunordered:
3933 LHS =
Builder.CreateFCmpUNO(LHS, RHS,
"cmp");
3940 case Builtin::BI__builtin_isnan: {
3950 case Builtin::BI__builtin_issignaling: {
3958 case Builtin::BI__builtin_isinf: {
3968 case Builtin::BIfinite:
3969 case Builtin::BI__finite:
3970 case Builtin::BIfinitef:
3971 case Builtin::BI__finitef:
3972 case Builtin::BIfinitel:
3973 case Builtin::BI__finitel:
3974 case Builtin::BI__builtin_isfinite: {
3984 case Builtin::BI__builtin_isnormal: {
3992 case Builtin::BI__builtin_issubnormal: {
3996 Builder.CreateZExt(
Builder.createIsFPClass(
V, FPClassTest::fcSubnormal),
4000 case Builtin::BI__builtin_iszero: {
4008 case Builtin::BI__builtin_isfpclass: {
4012 uint64_t Test =
Result.Val.getInt().getLimitedValue();
4019 case Builtin::BI__builtin_nondeterministic_value: {
4028 case Builtin::BI__builtin_elementwise_abs: {
4033 QT = VecTy->getElementType();
4037 nullptr,
"elt.abs");
4044 case Builtin::BI__builtin_elementwise_bitreverse:
4046 *
this, E, Intrinsic::bitreverse,
"elt.bitreverse"));
4047 case Builtin::BI__builtin_elementwise_popcount:
4049 *
this, E, Intrinsic::ctpop,
"elt.ctpop"));
4050 case Builtin::BI__builtin_elementwise_canonicalize:
4052 *
this, E, Intrinsic::canonicalize,
"elt.canonicalize"));
4053 case Builtin::BI__builtin_elementwise_copysign:
4056 case Builtin::BI__builtin_elementwise_fshl:
4059 case Builtin::BI__builtin_elementwise_fshr:
4063 case Builtin::BI__builtin_elementwise_add_sat:
4064 case Builtin::BI__builtin_elementwise_sub_sat: {
4068 assert(Op0->
getType()->isIntOrIntVectorTy() &&
"integer type expected");
4071 Ty = VecTy->getElementType();
4074 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_add_sat)
4075 Opc = IsSigned ? Intrinsic::sadd_sat : Intrinsic::uadd_sat;
4077 Opc = IsSigned ? Intrinsic::ssub_sat : Intrinsic::usub_sat;
4078 Result =
Builder.CreateBinaryIntrinsic(Opc, Op0, Op1,
nullptr,
"elt.sat");
4082 case Builtin::BI__builtin_elementwise_max: {
4086 if (Op0->
getType()->isIntOrIntVectorTy()) {
4089 Ty = VecTy->getElementType();
4092 Op1,
nullptr,
"elt.max");
4094 Result =
Builder.CreateMaxNum(Op0, Op1,
nullptr,
"elt.max");
4097 case Builtin::BI__builtin_elementwise_min: {
4101 if (Op0->
getType()->isIntOrIntVectorTy()) {
4104 Ty = VecTy->getElementType();
4107 Op1,
nullptr,
"elt.min");
4109 Result =
Builder.CreateMinNum(Op0, Op1,
nullptr,
"elt.min");
4113 case Builtin::BI__builtin_elementwise_maxnum: {
4117 Op1,
nullptr,
"elt.maxnum");
4121 case Builtin::BI__builtin_elementwise_minnum: {
4125 Op1,
nullptr,
"elt.minnum");
4129 case Builtin::BI__builtin_elementwise_maximum: {
4133 nullptr,
"elt.maximum");
4137 case Builtin::BI__builtin_elementwise_minimum: {
4141 nullptr,
"elt.minimum");
4145 case Builtin::BI__builtin_elementwise_maximumnum: {
4149 Intrinsic::maximumnum, Op0, Op1,
nullptr,
"elt.maximumnum");
4153 case Builtin::BI__builtin_elementwise_minimumnum: {
4157 Intrinsic::minimumnum, Op0, Op1,
nullptr,
"elt.minimumnum");
4161 case Builtin::BI__builtin_reduce_max: {
4162 auto GetIntrinsicID = [
this](
QualType QT) {
4164 QT = VecTy->getElementType();
4165 else if (QT->isSizelessVectorType())
4166 QT = QT->getSizelessVectorEltType(
CGM.getContext());
4168 if (QT->isSignedIntegerType())
4169 return Intrinsic::vector_reduce_smax;
4170 if (QT->isUnsignedIntegerType())
4171 return Intrinsic::vector_reduce_umax;
4172 assert(QT->isFloatingType() &&
"must have a float here");
4173 return Intrinsic::vector_reduce_fmax;
4176 *
this, E, GetIntrinsicID(E->
getArg(0)->
getType()),
"rdx.min"));
4179 case Builtin::BI__builtin_reduce_min: {
4180 auto GetIntrinsicID = [
this](
QualType QT) {
4182 QT = VecTy->getElementType();
4183 else if (QT->isSizelessVectorType())
4184 QT = QT->getSizelessVectorEltType(
CGM.getContext());
4186 if (QT->isSignedIntegerType())
4187 return Intrinsic::vector_reduce_smin;
4188 if (QT->isUnsignedIntegerType())
4189 return Intrinsic::vector_reduce_umin;
4190 assert(QT->isFloatingType() &&
"must have a float here");
4191 return Intrinsic::vector_reduce_fmin;
4195 *
this, E, GetIntrinsicID(E->
getArg(0)->
getType()),
"rdx.min"));
4198 case Builtin::BI__builtin_reduce_add:
4200 *
this, E, Intrinsic::vector_reduce_add,
"rdx.add"));
4201 case Builtin::BI__builtin_reduce_mul:
4203 *
this, E, Intrinsic::vector_reduce_mul,
"rdx.mul"));
4204 case Builtin::BI__builtin_reduce_xor:
4206 *
this, E, Intrinsic::vector_reduce_xor,
"rdx.xor"));
4207 case Builtin::BI__builtin_reduce_or:
4209 *
this, E, Intrinsic::vector_reduce_or,
"rdx.or"));
4210 case Builtin::BI__builtin_reduce_and:
4212 *
this, E, Intrinsic::vector_reduce_and,
"rdx.and"));
4213 case Builtin::BI__builtin_reduce_maximum:
4215 *
this, E, Intrinsic::vector_reduce_fmaximum,
"rdx.maximum"));
4216 case Builtin::BI__builtin_reduce_minimum:
4218 *
this, E, Intrinsic::vector_reduce_fminimum,
"rdx.minimum"));
4219 case Builtin::BI__builtin_reduce_assoc_fadd:
4220 case Builtin::BI__builtin_reduce_in_order_fadd: {
4222 llvm::Type *ScalarTy =
Vector->getType()->getScalarType();
4223 llvm::Value *StartValue =
nullptr;
4226 llvm::Value *Args[] = {StartValue
4228 : llvm::ConstantFP::get(ScalarTy, -0.0F),
4231 CGM.getIntrinsic(Intrinsic::vector_reduce_fadd,
Vector->getType());
4232 llvm::CallBase *Reduce =
Builder.CreateCall(F, Args,
"rdx.addf");
4233 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_reduce_assoc_fadd) {
4236 llvm::FastMathFlags FMF;
4237 FMF.setAllowReassoc();
4243 case Builtin::BI__builtin_matrix_transpose: {
4247 Value *
Result = MB.CreateMatrixTranspose(MatValue, MatrixTy->getNumRows(),
4248 MatrixTy->getNumColumns());
4252 case Builtin::BI__builtin_matrix_column_major_load: {
4258 assert(PtrTy &&
"arg0 must be of pointer type");
4259 bool IsVolatile = PtrTy->getPointeeType().isVolatileQualified();
4268 ResultTy->getNumRows(), ResultTy->getNumColumns(),
"matrix");
4272 case Builtin::BI__builtin_matrix_column_major_store: {
4280 assert(PtrTy &&
"arg1 must be of pointer type");
4281 bool IsVolatile = PtrTy->getPointeeType().isVolatileQualified();
4289 MatrixTy->getNumRows(), MatrixTy->getNumColumns());
4294 case Builtin::BI__builtin_masked_load:
4295 case Builtin::BI__builtin_masked_expand_load: {
4299 llvm::Type *RetTy =
CGM.getTypes().ConvertType(E->
getType());
4300 llvm::Value *PassThru = llvm::PoisonValue::get(RetTy);
4308 if (BuiltinID == Builtin::BI__builtin_masked_load) {
4310 PassThru,
"masked_load");
4312 Function *F =
CGM.getIntrinsic(Intrinsic::masked_expandload, {RetTy});
4314 Builder.CreateCall(F, {Ptr, Mask, PassThru},
"masked_expand_load");
4318 case Builtin::BI__builtin_masked_gather: {
4323 llvm::Type *RetTy =
CGM.getTypes().ConvertType(E->
getType());
4327 llvm::Value *PassThru = llvm::PoisonValue::get(RetTy);
4331 llvm::Type *ElemTy =
CGM.getTypes().ConvertType(
4333 llvm::Value *PtrVec =
Builder.CreateGEP(ElemTy, Ptr, Idx);
4336 RetTy, PtrVec, Align.
getAsAlign(), Mask, PassThru,
"masked_gather");
4339 case Builtin::BI__builtin_masked_store:
4340 case Builtin::BI__builtin_masked_compress_store: {
4346 llvm::Type *ValLLTy =
CGM.getTypes().ConvertType(ValTy);
4352 if (BuiltinID == Builtin::BI__builtin_masked_store) {
4356 CGM.getIntrinsic(llvm::Intrinsic::masked_compressstore, {ValLLTy});
4357 Builder.CreateCall(F, {Val, Ptr, Mask});
4361 case Builtin::BI__builtin_masked_scatter: {
4371 llvm::Type *ElemTy =
CGM.getTypes().ConvertType(
4373 llvm::Value *PtrVec =
Builder.CreateGEP(ElemTy, Ptr, Idx);
4378 case Builtin::BI__builtin_isinf_sign: {
4385 AbsArg, ConstantFP::getInfinity(Arg->
getType()),
"isinf");
4391 Value *NegativeOne = ConstantInt::getAllOnesValue(
IntTy);
4392 Value *SignResult =
Builder.CreateSelect(IsNeg, NegativeOne, One);
4397 case Builtin::BI__builtin_flt_rounds: {
4398 Function *F =
CGM.getIntrinsic(Intrinsic::get_rounding);
4402 if (
Result->getType() != ResultType)
4408 case Builtin::BI__builtin_set_flt_rounds: {
4409 Function *F =
CGM.getIntrinsic(Intrinsic::set_rounding);
4416 case Builtin::BI__builtin_fpclassify: {
4423 BasicBlock *Begin =
Builder.GetInsertBlock();
4428 "fpclassify_result");
4431 Builder.SetInsertPoint(Begin);
4432 Value *IsZero =
Builder.CreateFCmpOEQ(
V, Constant::getNullValue(Ty),
4436 Builder.CreateCondBr(IsZero, End, NotZero);
4437 Result->addIncoming(ZeroLiteral, Begin);
4440 Builder.SetInsertPoint(NotZero);
4444 Builder.CreateCondBr(IsNan, End, NotNan);
4445 Result->addIncoming(NanLiteral, NotZero);
4448 Builder.SetInsertPoint(NotNan);
4451 Builder.CreateFCmpOEQ(VAbs, ConstantFP::getInfinity(
V->getType()),
4455 Builder.CreateCondBr(IsInf, End, NotInf);
4456 Result->addIncoming(InfLiteral, NotNan);
4459 Builder.SetInsertPoint(NotInf);
4460 APFloat Smallest = APFloat::getSmallestNormalized(
4463 Builder.CreateFCmpUGE(VAbs, ConstantFP::get(
V->getContext(), Smallest),
4465 Value *NormalResult =
4469 Result->addIncoming(NormalResult, NotInf);
4482 case Builtin::BIalloca:
4483 case Builtin::BI_alloca:
4484 case Builtin::BI__builtin_alloca_uninitialized:
4485 case Builtin::BI__builtin_alloca: {
4489 const Align SuitableAlignmentInBytes =
4493 AllocaInst *AI =
Builder.CreateAlloca(
Builder.getInt8Ty(), Size);
4494 AI->setAlignment(SuitableAlignmentInBytes);
4495 if (BuiltinID != Builtin::BI__builtin_alloca_uninitialized)
4497 if (AI->getAddressSpace() !=
4498 CGM.getContext().getTargetAddressSpace(
4500 llvm::Type *Ty =
CGM.getTypes().ConvertType(E->
getType());
4506 case Builtin::BI__builtin_alloca_with_align_uninitialized:
4507 case Builtin::BI__builtin_alloca_with_align: {
4511 unsigned AlignmentInBits = AlignmentInBitsCI->getZExtValue();
4512 const Align AlignmentInBytes =
4513 CGM.getContext().toCharUnitsFromBits(AlignmentInBits).getAsAlign();
4514 AllocaInst *AI =
Builder.CreateAlloca(
Builder.getInt8Ty(), Size);
4515 AI->setAlignment(AlignmentInBytes);
4516 if (BuiltinID != Builtin::BI__builtin_alloca_with_align_uninitialized)
4518 if (AI->getAddressSpace() !=
4519 CGM.getContext().getTargetAddressSpace(
4521 llvm::Type *Ty =
CGM.getTypes().ConvertType(E->
getType());
4527 case Builtin::BI__builtin_infer_alloc_token: {
4531 CGM.getIntrinsic(llvm::Intrinsic::alloc_token_id, {
IntPtrTy});
4532 llvm::CallBase *TokenID =
Builder.CreateCall(F, MDV);
4536 case Builtin::BIbzero:
4537 case Builtin::BI__builtin_bzero: {
4542 auto *I =
Builder.CreateMemSet(Dest,
Builder.getInt8(0), SizeVal,
false);
4547 case Builtin::BIbcopy:
4548 case Builtin::BI__builtin_bcopy: {
4558 auto *I =
Builder.CreateMemMove(Dest, Src, SizeVal,
false);
4563 case Builtin::BImemcpy:
4564 case Builtin::BI__builtin_memcpy:
4565 case Builtin::BImempcpy:
4566 case Builtin::BI__builtin_mempcpy: {
4572 auto *I =
Builder.CreateMemCpy(Dest, Src, SizeVal,
false);
4574 if (BuiltinID == Builtin::BImempcpy ||
4575 BuiltinID == Builtin::BI__builtin_mempcpy)
4582 case Builtin::BI__builtin_memcpy_inline: {
4589 auto *I =
Builder.CreateMemCpyInline(Dest, Src, Size);
4594 case Builtin::BI__builtin_char_memchr:
4595 BuiltinID = Builtin::BI__builtin_memchr;
4598 case Builtin::BI__builtin___memcpy_chk: {
4604 llvm::APSInt Size = SizeResult.
Val.
getInt();
4605 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
4606 if (Size.ugt(DstSize))
4610 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
4611 auto *I =
Builder.CreateMemCpy(Dest, Src, SizeVal,
false);
4616 case Builtin::BI__builtin_objc_memmove_collectable: {
4620 CGM.getObjCRuntime().EmitGCMemmoveCollectable(*
this,
4621 DestAddr, SrcAddr, SizeVal);
4625 case Builtin::BI__builtin___memmove_chk: {
4631 llvm::APSInt Size = SizeResult.
Val.
getInt();
4632 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
4633 if (Size.ugt(DstSize))
4637 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
4638 auto *I =
Builder.CreateMemMove(Dest, Src, SizeVal,
false);
4643 case Builtin::BI__builtin_trivially_relocate:
4644 case Builtin::BImemmove:
4645 case Builtin::BI__builtin_memmove: {
4649 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_trivially_relocate)
4659 auto *I =
Builder.CreateMemMove(Dest, Src, SizeVal,
false);
4663 case Builtin::BImemset:
4664 case Builtin::BI__builtin_memset: {
4671 auto *I =
Builder.CreateMemSet(Dest, ByteVal, SizeVal,
false);
4675 case Builtin::BI__builtin_memset_inline: {
4684 auto *I =
Builder.CreateMemSetInline(Dest, ByteVal, Size);
4688 case Builtin::BI__builtin___memset_chk: {
4694 llvm::APSInt Size = SizeResult.
Val.
getInt();
4695 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
4696 if (Size.ugt(DstSize))
4701 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
4702 auto *I =
Builder.CreateMemSet(Dest, ByteVal, SizeVal,
false);
4706 case Builtin::BI__builtin_wmemchr: {
4717 BasicBlock *Entry =
Builder.GetInsertBlock();
4722 Builder.CreateCondBr(SizeEq0, Exit, CmpEq);
4726 StrPhi->addIncoming(Str, Entry);
4728 SizePhi->addIncoming(Size, Entry);
4731 Value *StrCh =
Builder.CreateAlignedLoad(WCharTy, StrPhi, WCharAlign);
4732 Value *FoundChr =
Builder.CreateConstInBoundsGEP1_32(WCharTy, StrPhi, 0);
4737 Value *NextStr =
Builder.CreateConstInBoundsGEP1_32(WCharTy, StrPhi, 1);
4739 Value *NextSizeEq0 =
4740 Builder.CreateICmpEQ(NextSize, ConstantInt::get(
SizeTy, 0));
4741 Builder.CreateCondBr(NextSizeEq0, Exit, CmpEq);
4742 StrPhi->addIncoming(NextStr,
Next);
4743 SizePhi->addIncoming(NextSize,
Next);
4747 Ret->addIncoming(llvm::Constant::getNullValue(Str->
getType()), Entry);
4748 Ret->addIncoming(llvm::Constant::getNullValue(Str->
getType()),
Next);
4749 Ret->addIncoming(FoundChr, CmpEq);
4752 case Builtin::BI__builtin_wmemcmp: {
4764 BasicBlock *Entry =
Builder.GetInsertBlock();
4770 Builder.CreateCondBr(SizeEq0, Exit, CmpGT);
4774 DstPhi->addIncoming(Dst, Entry);
4776 SrcPhi->addIncoming(Src, Entry);
4778 SizePhi->addIncoming(Size, Entry);
4781 Value *DstCh =
Builder.CreateAlignedLoad(WCharTy, DstPhi, WCharAlign);
4782 Value *SrcCh =
Builder.CreateAlignedLoad(WCharTy, SrcPhi, WCharAlign);
4784 Builder.CreateCondBr(DstGtSrc, Exit, CmpLT);
4791 Value *NextDst =
Builder.CreateConstInBoundsGEP1_32(WCharTy, DstPhi, 1);
4792 Value *NextSrc =
Builder.CreateConstInBoundsGEP1_32(WCharTy, SrcPhi, 1);
4794 Value *NextSizeEq0 =
4795 Builder.CreateICmpEQ(NextSize, ConstantInt::get(
SizeTy, 0));
4796 Builder.CreateCondBr(NextSizeEq0, Exit, CmpGT);
4797 DstPhi->addIncoming(NextDst,
Next);
4798 SrcPhi->addIncoming(NextSrc,
Next);
4799 SizePhi->addIncoming(NextSize,
Next);
4803 Ret->addIncoming(ConstantInt::get(
IntTy, 0), Entry);
4804 Ret->addIncoming(ConstantInt::get(
IntTy, 1), CmpGT);
4805 Ret->addIncoming(ConstantInt::getAllOnesValue(
IntTy), CmpLT);
4806 Ret->addIncoming(ConstantInt::get(
IntTy, 0),
Next);
4809 case Builtin::BI__builtin_dwarf_cfa: {
4820 Function *F =
CGM.getIntrinsic(Intrinsic::eh_dwarf_cfa);
4822 llvm::ConstantInt::get(
Int32Ty, Offset)));
4824 case Builtin::BI__builtin_return_address: {
4828 CGM.getIntrinsic(Intrinsic::returnaddress, {
CGM.ProgramPtrTy});
4831 case Builtin::BI_ReturnAddress: {
4833 CGM.getIntrinsic(Intrinsic::returnaddress, {
CGM.ProgramPtrTy});
4836 case Builtin::BI__builtin_frame_address: {
4842 case Builtin::BI__builtin_stack_address: {
4846 case Builtin::BI__builtin_extract_return_addr: {
4851 case Builtin::BI__builtin_frob_return_addr: {
4856 case Builtin::BI__builtin_dwarf_sp_column: {
4857 llvm::IntegerType *Ty
4861 CGM.ErrorUnsupported(E,
"__builtin_dwarf_sp_column");
4866 case Builtin::BI__builtin_init_dwarf_reg_size_table: {
4869 CGM.ErrorUnsupported(E,
"__builtin_init_dwarf_reg_size_table");
4872 case Builtin::BI__builtin_eh_return: {
4877 assert((
IntTy->getBitWidth() == 32 ||
IntTy->getBitWidth() == 64) &&
4878 "LLVM's __builtin_eh_return only supports 32- and 64-bit variants");
4880 CGM.getIntrinsic(
IntTy->getBitWidth() == 32 ? Intrinsic::eh_return_i32
4881 : Intrinsic::eh_return_i64);
4882 Builder.CreateCall(F, {Int, Ptr});
4890 case Builtin::BI__builtin_unwind_init: {
4891 Function *F =
CGM.getIntrinsic(Intrinsic::eh_unwind_init);
4895 case Builtin::BI__builtin_extend_pointer: {
4920 case Builtin::BI__builtin_setjmp: {
4928 Function *F =
CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
4935 ConstantInt::get(
Int32Ty, 0));
4936 Builder.CreateStore(FrameAddr, Buf);
4943 Builder.CreateStore(StackAddr, StackSaveSlot);
4946 Function *F =
CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
4949 case Builtin::BI__builtin_longjmp: {
4953 Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::eh_sjlj_longjmp), Buf);
4963 case Builtin::BI__builtin_launder: {
4968 Ptr =
Builder.CreateLaunderInvariantGroup(Ptr);
4972 case Builtin::BI__sync_fetch_and_add:
4973 case Builtin::BI__sync_fetch_and_sub:
4974 case Builtin::BI__sync_fetch_and_or:
4975 case Builtin::BI__sync_fetch_and_and:
4976 case Builtin::BI__sync_fetch_and_xor:
4977 case Builtin::BI__sync_fetch_and_nand:
4978 case Builtin::BI__sync_add_and_fetch:
4979 case Builtin::BI__sync_sub_and_fetch:
4980 case Builtin::BI__sync_and_and_fetch:
4981 case Builtin::BI__sync_or_and_fetch:
4982 case Builtin::BI__sync_xor_and_fetch:
4983 case Builtin::BI__sync_nand_and_fetch:
4984 case Builtin::BI__sync_val_compare_and_swap:
4985 case Builtin::BI__sync_bool_compare_and_swap:
4986 case Builtin::BI__sync_lock_test_and_set:
4987 case Builtin::BI__sync_lock_release:
4988 case Builtin::BI__sync_swap:
4989 llvm_unreachable(
"Shouldn't make it through sema");
4990 case Builtin::BI__sync_fetch_and_add_1:
4991 case Builtin::BI__sync_fetch_and_add_2:
4992 case Builtin::BI__sync_fetch_and_add_4:
4993 case Builtin::BI__sync_fetch_and_add_8:
4994 case Builtin::BI__sync_fetch_and_add_16:
4996 case Builtin::BI__sync_fetch_and_sub_1:
4997 case Builtin::BI__sync_fetch_and_sub_2:
4998 case Builtin::BI__sync_fetch_and_sub_4:
4999 case Builtin::BI__sync_fetch_and_sub_8:
5000 case Builtin::BI__sync_fetch_and_sub_16:
5002 case Builtin::BI__sync_fetch_and_or_1:
5003 case Builtin::BI__sync_fetch_and_or_2:
5004 case Builtin::BI__sync_fetch_and_or_4:
5005 case Builtin::BI__sync_fetch_and_or_8:
5006 case Builtin::BI__sync_fetch_and_or_16:
5008 case Builtin::BI__sync_fetch_and_and_1:
5009 case Builtin::BI__sync_fetch_and_and_2:
5010 case Builtin::BI__sync_fetch_and_and_4:
5011 case Builtin::BI__sync_fetch_and_and_8:
5012 case Builtin::BI__sync_fetch_and_and_16:
5014 case Builtin::BI__sync_fetch_and_xor_1:
5015 case Builtin::BI__sync_fetch_and_xor_2:
5016 case Builtin::BI__sync_fetch_and_xor_4:
5017 case Builtin::BI__sync_fetch_and_xor_8:
5018 case Builtin::BI__sync_fetch_and_xor_16:
5020 case Builtin::BI__sync_fetch_and_nand_1:
5021 case Builtin::BI__sync_fetch_and_nand_2:
5022 case Builtin::BI__sync_fetch_and_nand_4:
5023 case Builtin::BI__sync_fetch_and_nand_8:
5024 case Builtin::BI__sync_fetch_and_nand_16:
5028 case Builtin::BI__sync_fetch_and_min:
5030 case Builtin::BI__sync_fetch_and_max:
5032 case Builtin::BI__sync_fetch_and_umin:
5034 case Builtin::BI__sync_fetch_and_umax:
5037 case Builtin::BI__sync_add_and_fetch_1:
5038 case Builtin::BI__sync_add_and_fetch_2:
5039 case Builtin::BI__sync_add_and_fetch_4:
5040 case Builtin::BI__sync_add_and_fetch_8:
5041 case Builtin::BI__sync_add_and_fetch_16:
5043 llvm::Instruction::Add);
5044 case Builtin::BI__sync_sub_and_fetch_1:
5045 case Builtin::BI__sync_sub_and_fetch_2:
5046 case Builtin::BI__sync_sub_and_fetch_4:
5047 case Builtin::BI__sync_sub_and_fetch_8:
5048 case Builtin::BI__sync_sub_and_fetch_16:
5050 llvm::Instruction::Sub);
5051 case Builtin::BI__sync_and_and_fetch_1:
5052 case Builtin::BI__sync_and_and_fetch_2:
5053 case Builtin::BI__sync_and_and_fetch_4:
5054 case Builtin::BI__sync_and_and_fetch_8:
5055 case Builtin::BI__sync_and_and_fetch_16:
5057 llvm::Instruction::And);
5058 case Builtin::BI__sync_or_and_fetch_1:
5059 case Builtin::BI__sync_or_and_fetch_2:
5060 case Builtin::BI__sync_or_and_fetch_4:
5061 case Builtin::BI__sync_or_and_fetch_8:
5062 case Builtin::BI__sync_or_and_fetch_16:
5064 llvm::Instruction::Or);
5065 case Builtin::BI__sync_xor_and_fetch_1:
5066 case Builtin::BI__sync_xor_and_fetch_2:
5067 case Builtin::BI__sync_xor_and_fetch_4:
5068 case Builtin::BI__sync_xor_and_fetch_8:
5069 case Builtin::BI__sync_xor_and_fetch_16:
5071 llvm::Instruction::Xor);
5072 case Builtin::BI__sync_nand_and_fetch_1:
5073 case Builtin::BI__sync_nand_and_fetch_2:
5074 case Builtin::BI__sync_nand_and_fetch_4:
5075 case Builtin::BI__sync_nand_and_fetch_8:
5076 case Builtin::BI__sync_nand_and_fetch_16:
5078 llvm::Instruction::And,
true);
5080 case Builtin::BI__sync_val_compare_and_swap_1:
5081 case Builtin::BI__sync_val_compare_and_swap_2:
5082 case Builtin::BI__sync_val_compare_and_swap_4:
5083 case Builtin::BI__sync_val_compare_and_swap_8:
5084 case Builtin::BI__sync_val_compare_and_swap_16:
5086 *
this, E,
false, AtomicOrdering::SequentiallyConsistent,
5087 AtomicOrdering::SequentiallyConsistent));
5089 case Builtin::BI__sync_bool_compare_and_swap_1:
5090 case Builtin::BI__sync_bool_compare_and_swap_2:
5091 case Builtin::BI__sync_bool_compare_and_swap_4:
5092 case Builtin::BI__sync_bool_compare_and_swap_8:
5093 case Builtin::BI__sync_bool_compare_and_swap_16:
5095 *
this, E,
true, AtomicOrdering::SequentiallyConsistent,
5096 AtomicOrdering::SequentiallyConsistent));
5098 case Builtin::BI__sync_swap_1:
5099 case Builtin::BI__sync_swap_2:
5100 case Builtin::BI__sync_swap_4:
5101 case Builtin::BI__sync_swap_8:
5102 case Builtin::BI__sync_swap_16:
5105 case Builtin::BI__sync_lock_test_and_set_1:
5106 case Builtin::BI__sync_lock_test_and_set_2:
5107 case Builtin::BI__sync_lock_test_and_set_4:
5108 case Builtin::BI__sync_lock_test_and_set_8:
5109 case Builtin::BI__sync_lock_test_and_set_16:
5112 case Builtin::BI__sync_lock_release_1:
5113 case Builtin::BI__sync_lock_release_2:
5114 case Builtin::BI__sync_lock_release_4:
5115 case Builtin::BI__sync_lock_release_8:
5116 case Builtin::BI__sync_lock_release_16: {
5122 llvm::StoreInst *Store =
5123 Builder.CreateStore(llvm::Constant::getNullValue(ITy), Ptr);
5124 Store->setAtomic(llvm::AtomicOrdering::Release);
5128 case Builtin::BI__sync_synchronize: {
5136 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent);
5140 case Builtin::BI__builtin_nontemporal_load:
5142 case Builtin::BI__builtin_nontemporal_store:
5144 case Builtin::BI__c11_atomic_is_lock_free:
5145 case Builtin::BI__atomic_is_lock_free: {
5149 const char *LibCallName =
"__atomic_is_lock_free";
5153 if (BuiltinID == Builtin::BI__atomic_is_lock_free)
5160 CGM.getTypes().arrangeBuiltinFunctionCall(E->
getType(), Args);
5161 llvm::FunctionType *FTy =
CGM.getTypes().GetFunctionType(FuncInfo);
5162 llvm::FunctionCallee
Func =
CGM.CreateRuntimeFunction(FTy, LibCallName);
5167 case Builtin::BI__atomic_thread_fence:
5168 case Builtin::BI__atomic_signal_fence:
5169 case Builtin::BI__c11_atomic_thread_fence:
5170 case Builtin::BI__c11_atomic_signal_fence: {
5171 llvm::SyncScope::ID SSID;
5172 if (BuiltinID == Builtin::BI__atomic_signal_fence ||
5173 BuiltinID == Builtin::BI__c11_atomic_signal_fence)
5174 SSID = llvm::SyncScope::SingleThread;
5176 SSID = llvm::SyncScope::System;
5186 Builder.CreateFence(llvm::AtomicOrdering::Acquire, SSID);
5189 Builder.CreateFence(llvm::AtomicOrdering::Release, SSID);
5192 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, SSID);
5195 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, SSID);
5201 llvm::BasicBlock *AcquireBB, *ReleaseBB, *AcqRelBB, *SeqCstBB;
5208 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5209 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, ContBB);
5211 Builder.SetInsertPoint(AcquireBB);
5212 Builder.CreateFence(llvm::AtomicOrdering::Acquire, SSID);
5214 SI->addCase(
Builder.getInt32(1), AcquireBB);
5215 SI->addCase(
Builder.getInt32(2), AcquireBB);
5217 Builder.SetInsertPoint(ReleaseBB);
5218 Builder.CreateFence(llvm::AtomicOrdering::Release, SSID);
5220 SI->addCase(
Builder.getInt32(3), ReleaseBB);
5222 Builder.SetInsertPoint(AcqRelBB);
5223 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, SSID);
5225 SI->addCase(
Builder.getInt32(4), AcqRelBB);
5227 Builder.SetInsertPoint(SeqCstBB);
5228 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, SSID);
5230 SI->addCase(
Builder.getInt32(5), SeqCstBB);
5232 Builder.SetInsertPoint(ContBB);
5235 case Builtin::BI__scoped_atomic_thread_fence: {
5240 auto Ord = dyn_cast<llvm::ConstantInt>(Order);
5241 auto Scp = dyn_cast<llvm::ConstantInt>(
Scope);
5243 SyncScope SS = ScopeModel->isValid(Scp->getZExtValue())
5244 ? ScopeModel->map(Scp->getZExtValue())
5245 : ScopeModel->map(ScopeModel->getFallBackValue());
5246 switch (Ord->getZExtValue()) {
5253 llvm::AtomicOrdering::Acquire,
5255 llvm::AtomicOrdering::Acquire,
5260 llvm::AtomicOrdering::Release,
5262 llvm::AtomicOrdering::Release,
5266 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease,
5269 llvm::AtomicOrdering::AcquireRelease,
5273 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
5276 llvm::AtomicOrdering::SequentiallyConsistent,
5288 switch (Ord->getZExtValue()) {
5291 ContBB->eraseFromParent();
5295 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5296 llvm::AtomicOrdering::Acquire);
5299 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5300 llvm::AtomicOrdering::Release);
5303 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5304 llvm::AtomicOrdering::AcquireRelease);
5307 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5308 llvm::AtomicOrdering::SequentiallyConsistent);
5317 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5318 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, ContBB);
5319 SI->addCase(
Builder.getInt32(1), AcquireBB);
5320 SI->addCase(
Builder.getInt32(2), AcquireBB);
5321 SI->addCase(
Builder.getInt32(3), ReleaseBB);
5322 SI->addCase(
Builder.getInt32(4), AcqRelBB);
5323 SI->addCase(
Builder.getInt32(5), SeqCstBB);
5325 OrderBBs.emplace_back(AcquireBB, llvm::AtomicOrdering::Acquire);
5326 OrderBBs.emplace_back(ReleaseBB, llvm::AtomicOrdering::Release);
5327 OrderBBs.emplace_back(AcqRelBB, llvm::AtomicOrdering::AcquireRelease);
5328 OrderBBs.emplace_back(SeqCstBB,
5329 llvm::AtomicOrdering::SequentiallyConsistent);
5332 for (
auto &[OrderBB, Ordering] : OrderBBs) {
5333 Builder.SetInsertPoint(OrderBB);
5335 SyncScope SS = ScopeModel->isValid(Scp->getZExtValue())
5336 ? ScopeModel->map(Scp->getZExtValue())
5337 : ScopeModel->map(ScopeModel->getFallBackValue());
5343 llvm::DenseMap<unsigned, llvm::BasicBlock *> BBs;
5344 for (
unsigned Scp : ScopeModel->getRuntimeValues())
5348 llvm::SwitchInst *SI =
Builder.CreateSwitch(SC, ContBB);
5349 for (
unsigned Scp : ScopeModel->getRuntimeValues()) {
5351 SI->addCase(
Builder.getInt32(Scp), B);
5362 Builder.SetInsertPoint(ContBB);
5366 case Builtin::BI__builtin_signbit:
5367 case Builtin::BI__builtin_signbitf:
5368 case Builtin::BI__builtin_signbitl: {
5373 case Builtin::BI__warn_memset_zero_len:
5375 case Builtin::BI__annotation: {
5380 assert(Str->getCharByteWidth() == 2);
5381 StringRef WideBytes = Str->getBytes();
5382 std::string StrUtf8;
5383 if (!convertUTF16ToUTF8String(
5384 ArrayRef(WideBytes.data(), WideBytes.size()), StrUtf8)) {
5385 CGM.ErrorUnsupported(E,
"non-UTF16 __annotation argument");
5388 Strings.push_back(llvm::MDString::get(
getLLVMContext(), StrUtf8));
5392 llvm::Function *F =
CGM.getIntrinsic(Intrinsic::codeview_annotation, {});
5397 case Builtin::BI__builtin_annotation: {
5399 llvm::Function *F =
CGM.getIntrinsic(
5400 Intrinsic::annotation, {AnnVal->getType(),
CGM.ConstGlobalsPtrTy});
5409 case Builtin::BI__builtin_addcb:
5410 case Builtin::BI__builtin_addcs:
5411 case Builtin::BI__builtin_addc:
5412 case Builtin::BI__builtin_addcl:
5413 case Builtin::BI__builtin_addcll:
5414 case Builtin::BI__builtin_subcb:
5415 case Builtin::BI__builtin_subcs:
5416 case Builtin::BI__builtin_subc:
5417 case Builtin::BI__builtin_subcl:
5418 case Builtin::BI__builtin_subcll: {
5444 Intrinsic::ID IntrinsicId;
5445 switch (BuiltinID) {
5446 default: llvm_unreachable(
"Unknown multiprecision builtin id.");
5447 case Builtin::BI__builtin_addcb:
5448 case Builtin::BI__builtin_addcs:
5449 case Builtin::BI__builtin_addc:
5450 case Builtin::BI__builtin_addcl:
5451 case Builtin::BI__builtin_addcll:
5452 IntrinsicId = Intrinsic::uadd_with_overflow;
5454 case Builtin::BI__builtin_subcb:
5455 case Builtin::BI__builtin_subcs:
5456 case Builtin::BI__builtin_subc:
5457 case Builtin::BI__builtin_subcl:
5458 case Builtin::BI__builtin_subcll:
5459 IntrinsicId = Intrinsic::usub_with_overflow;
5464 llvm::Value *Carry1;
5467 llvm::Value *Carry2;
5469 Sum1, Carryin, Carry2);
5470 llvm::Value *CarryOut =
Builder.CreateZExt(
Builder.CreateOr(Carry1, Carry2),
5472 Builder.CreateStore(CarryOut, CarryOutPtr);
5476 case Builtin::BI__builtin_add_overflow:
5477 case Builtin::BI__builtin_sub_overflow:
5478 case Builtin::BI__builtin_mul_overflow: {
5486 WidthAndSignedness LeftInfo =
5488 WidthAndSignedness RightInfo =
5490 WidthAndSignedness ResultInfo =
5497 RightInfo, ResultArg, ResultQTy,
5503 *
this, LeftArg, LeftInfo, RightArg, RightInfo, ResultArg, ResultQTy,
5506 WidthAndSignedness EncompassingInfo =
5509 llvm::Type *EncompassingLLVMTy =
5510 llvm::IntegerType::get(
CGM.getLLVMContext(), EncompassingInfo.Width);
5512 llvm::Type *ResultLLVMTy =
CGM.getTypes().ConvertType(ResultQTy);
5514 Intrinsic::ID IntrinsicId;
5515 switch (BuiltinID) {
5517 llvm_unreachable(
"Unknown overflow builtin id.");
5518 case Builtin::BI__builtin_add_overflow:
5519 IntrinsicId = EncompassingInfo.Signed ? Intrinsic::sadd_with_overflow
5520 : Intrinsic::uadd_with_overflow;
5522 case Builtin::BI__builtin_sub_overflow:
5523 IntrinsicId = EncompassingInfo.Signed ? Intrinsic::ssub_with_overflow
5524 : Intrinsic::usub_with_overflow;
5526 case Builtin::BI__builtin_mul_overflow:
5527 IntrinsicId = EncompassingInfo.Signed ? Intrinsic::smul_with_overflow
5528 : Intrinsic::umul_with_overflow;
5537 Left =
Builder.CreateIntCast(Left, EncompassingLLVMTy, LeftInfo.Signed);
5538 Right =
Builder.CreateIntCast(Right, EncompassingLLVMTy, RightInfo.Signed);
5541 llvm::Value *Overflow, *
Result;
5544 if (EncompassingInfo.Width > ResultInfo.Width) {
5547 llvm::Value *ResultTrunc =
Builder.CreateTrunc(
Result, ResultLLVMTy);
5551 llvm::Value *ResultTruncExt =
Builder.CreateIntCast(
5552 ResultTrunc, EncompassingLLVMTy, ResultInfo.Signed);
5553 llvm::Value *TruncationOverflow =
5556 Overflow =
Builder.CreateOr(Overflow, TruncationOverflow);
5568 case Builtin::BI__builtin_uadd_overflow:
5569 case Builtin::BI__builtin_uaddl_overflow:
5570 case Builtin::BI__builtin_uaddll_overflow:
5571 case Builtin::BI__builtin_usub_overflow:
5572 case Builtin::BI__builtin_usubl_overflow:
5573 case Builtin::BI__builtin_usubll_overflow:
5574 case Builtin::BI__builtin_umul_overflow:
5575 case Builtin::BI__builtin_umull_overflow:
5576 case Builtin::BI__builtin_umulll_overflow:
5577 case Builtin::BI__builtin_sadd_overflow:
5578 case Builtin::BI__builtin_saddl_overflow:
5579 case Builtin::BI__builtin_saddll_overflow:
5580 case Builtin::BI__builtin_ssub_overflow:
5581 case Builtin::BI__builtin_ssubl_overflow:
5582 case Builtin::BI__builtin_ssubll_overflow:
5583 case Builtin::BI__builtin_smul_overflow:
5584 case Builtin::BI__builtin_smull_overflow:
5585 case Builtin::BI__builtin_smulll_overflow: {
5595 Intrinsic::ID IntrinsicId;
5596 switch (BuiltinID) {
5597 default: llvm_unreachable(
"Unknown overflow builtin id.");
5598 case Builtin::BI__builtin_uadd_overflow:
5599 case Builtin::BI__builtin_uaddl_overflow:
5600 case Builtin::BI__builtin_uaddll_overflow:
5601 IntrinsicId = Intrinsic::uadd_with_overflow;
5603 case Builtin::BI__builtin_usub_overflow:
5604 case Builtin::BI__builtin_usubl_overflow:
5605 case Builtin::BI__builtin_usubll_overflow:
5606 IntrinsicId = Intrinsic::usub_with_overflow;
5608 case Builtin::BI__builtin_umul_overflow:
5609 case Builtin::BI__builtin_umull_overflow:
5610 case Builtin::BI__builtin_umulll_overflow:
5611 IntrinsicId = Intrinsic::umul_with_overflow;
5613 case Builtin::BI__builtin_sadd_overflow:
5614 case Builtin::BI__builtin_saddl_overflow:
5615 case Builtin::BI__builtin_saddll_overflow:
5616 IntrinsicId = Intrinsic::sadd_with_overflow;
5618 case Builtin::BI__builtin_ssub_overflow:
5619 case Builtin::BI__builtin_ssubl_overflow:
5620 case Builtin::BI__builtin_ssubll_overflow:
5621 IntrinsicId = Intrinsic::ssub_with_overflow;
5623 case Builtin::BI__builtin_smul_overflow:
5624 case Builtin::BI__builtin_smull_overflow:
5625 case Builtin::BI__builtin_smulll_overflow:
5626 IntrinsicId = Intrinsic::smul_with_overflow;
5633 Builder.CreateStore(Sum, SumOutPtr);
5637 case Builtin::BIaddressof:
5638 case Builtin::BI__addressof:
5639 case Builtin::BI__builtin_addressof:
5641 case Builtin::BI__builtin_function_start:
5644 case Builtin::BI__builtin_operator_new:
5647 case Builtin::BI__builtin_operator_delete:
5652 case Builtin::BI__builtin_is_aligned:
5654 case Builtin::BI__builtin_align_up:
5656 case Builtin::BI__builtin_align_down:
5659 case Builtin::BI__noop:
5662 case Builtin::BI__builtin_call_with_static_chain: {
5669 case Builtin::BI_InterlockedExchange8:
5670 case Builtin::BI_InterlockedExchange16:
5671 case Builtin::BI_InterlockedExchange:
5672 case Builtin::BI_InterlockedExchangePointer:
5675 case Builtin::BI_InterlockedCompareExchangePointer:
5678 case Builtin::BI_InterlockedCompareExchangePointer_nf:
5681 case Builtin::BI_InterlockedCompareExchange8:
5682 case Builtin::BI_InterlockedCompareExchange16:
5683 case Builtin::BI_InterlockedCompareExchange:
5684 case Builtin::BI_InterlockedCompareExchange64:
5686 case Builtin::BI_InterlockedIncrement16:
5687 case Builtin::BI_InterlockedIncrement:
5690 case Builtin::BI_InterlockedDecrement16:
5691 case Builtin::BI_InterlockedDecrement:
5694 case Builtin::BI_InterlockedAnd8:
5695 case Builtin::BI_InterlockedAnd16:
5696 case Builtin::BI_InterlockedAnd:
5698 case Builtin::BI_InterlockedExchangeAdd8:
5699 case Builtin::BI_InterlockedExchangeAdd16:
5700 case Builtin::BI_InterlockedExchangeAdd:
5703 case Builtin::BI_InterlockedExchangeSub8:
5704 case Builtin::BI_InterlockedExchangeSub16:
5705 case Builtin::BI_InterlockedExchangeSub:
5708 case Builtin::BI_InterlockedOr8:
5709 case Builtin::BI_InterlockedOr16:
5710 case Builtin::BI_InterlockedOr:
5712 case Builtin::BI_InterlockedXor8:
5713 case Builtin::BI_InterlockedXor16:
5714 case Builtin::BI_InterlockedXor:
5717 case Builtin::BI_bittest64:
5718 case Builtin::BI_bittest:
5719 case Builtin::BI_bittestandcomplement64:
5720 case Builtin::BI_bittestandcomplement:
5721 case Builtin::BI_bittestandreset64:
5722 case Builtin::BI_bittestandreset:
5723 case Builtin::BI_bittestandset64:
5724 case Builtin::BI_bittestandset:
5725 case Builtin::BI_interlockedbittestandreset:
5726 case Builtin::BI_interlockedbittestandreset64:
5727 case Builtin::BI_interlockedbittestandreset64_acq:
5728 case Builtin::BI_interlockedbittestandreset64_rel:
5729 case Builtin::BI_interlockedbittestandreset64_nf:
5730 case Builtin::BI_interlockedbittestandset64:
5731 case Builtin::BI_interlockedbittestandset64_acq:
5732 case Builtin::BI_interlockedbittestandset64_rel:
5733 case Builtin::BI_interlockedbittestandset64_nf:
5734 case Builtin::BI_interlockedbittestandset:
5735 case Builtin::BI_interlockedbittestandset_acq:
5736 case Builtin::BI_interlockedbittestandset_rel:
5737 case Builtin::BI_interlockedbittestandset_nf:
5738 case Builtin::BI_interlockedbittestandreset_acq:
5739 case Builtin::BI_interlockedbittestandreset_rel:
5740 case Builtin::BI_interlockedbittestandreset_nf:
5745 case Builtin::BI__iso_volatile_load8:
5746 case Builtin::BI__iso_volatile_load16:
5747 case Builtin::BI__iso_volatile_load32:
5748 case Builtin::BI__iso_volatile_load64:
5750 case Builtin::BI__iso_volatile_store8:
5751 case Builtin::BI__iso_volatile_store16:
5752 case Builtin::BI__iso_volatile_store32:
5753 case Builtin::BI__iso_volatile_store64:
5756 case Builtin::BI__builtin_ptrauth_sign_constant:
5759 case Builtin::BI__builtin_ptrauth_auth:
5760 case Builtin::BI__builtin_ptrauth_auth_and_resign:
5761 case Builtin::BI__builtin_ptrauth_auth_load_relative_and_sign:
5762 case Builtin::BI__builtin_ptrauth_blend_discriminator:
5763 case Builtin::BI__builtin_ptrauth_sign_generic_data:
5764 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
5765 case Builtin::BI__builtin_ptrauth_strip: {
5772 llvm::Type *OrigValueType = Args[0]->getType();
5773 if (OrigValueType->isPointerTy())
5776 switch (BuiltinID) {
5777 case Builtin::BI__builtin_ptrauth_auth_and_resign:
5778 case Builtin::BI__builtin_ptrauth_auth_load_relative_and_sign:
5779 if (Args[4]->
getType()->isPointerTy())
5783 case Builtin::BI__builtin_ptrauth_auth:
5784 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
5785 if (Args[2]->
getType()->isPointerTy())
5789 case Builtin::BI__builtin_ptrauth_sign_generic_data:
5790 if (Args[1]->
getType()->isPointerTy())
5794 case Builtin::BI__builtin_ptrauth_blend_discriminator:
5795 case Builtin::BI__builtin_ptrauth_strip:
5800 auto IntrinsicID = [&]() ->
unsigned {
5801 switch (BuiltinID) {
5802 case Builtin::BI__builtin_ptrauth_auth:
5803 return Intrinsic::ptrauth_auth;
5804 case Builtin::BI__builtin_ptrauth_auth_and_resign:
5805 return Intrinsic::ptrauth_resign;
5806 case Builtin::BI__builtin_ptrauth_auth_load_relative_and_sign:
5807 return Intrinsic::ptrauth_resign_load_relative;
5808 case Builtin::BI__builtin_ptrauth_blend_discriminator:
5809 return Intrinsic::ptrauth_blend;
5810 case Builtin::BI__builtin_ptrauth_sign_generic_data:
5811 return Intrinsic::ptrauth_sign_generic;
5812 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
5813 return Intrinsic::ptrauth_sign;
5814 case Builtin::BI__builtin_ptrauth_strip:
5815 return Intrinsic::ptrauth_strip;
5817 llvm_unreachable(
"bad ptrauth intrinsic");
5819 auto Intrinsic =
CGM.getIntrinsic(IntrinsicID);
5822 if (BuiltinID != Builtin::BI__builtin_ptrauth_sign_generic_data &&
5823 BuiltinID != Builtin::BI__builtin_ptrauth_blend_discriminator &&
5824 OrigValueType->isPointerTy()) {
5830 case Builtin::BI__builtin_get_vtable_pointer: {
5836 assert(ThisAddress.isValid());
5837 llvm::Value *VTablePointer =
5842 case Builtin::BI__exception_code:
5843 case Builtin::BI_exception_code:
5845 case Builtin::BI__exception_info:
5846 case Builtin::BI_exception_info:
5848 case Builtin::BI__abnormal_termination:
5849 case Builtin::BI_abnormal_termination:
5851 case Builtin::BI_setjmpex:
5856 case Builtin::BI_setjmp:
5868 case Builtin::BImove:
5869 case Builtin::BImove_if_noexcept:
5870 case Builtin::BIforward:
5871 case Builtin::BIforward_like:
5872 case Builtin::BIas_const:
5874 case Builtin::BI__GetExceptionInfo: {
5875 if (llvm::GlobalVariable *GV =
5881 case Builtin::BI__fastfail:
5884 case Builtin::BI__builtin_coro_id:
5886 case Builtin::BI__builtin_coro_promise:
5888 case Builtin::BI__builtin_coro_resume:
5891 case Builtin::BI__builtin_coro_frame:
5893 case Builtin::BI__builtin_coro_noop:
5895 case Builtin::BI__builtin_coro_free:
5897 case Builtin::BI__builtin_coro_destroy:
5900 case Builtin::BI__builtin_coro_done:
5902 case Builtin::BI__builtin_coro_alloc:
5904 case Builtin::BI__builtin_coro_begin:
5906 case Builtin::BI__builtin_coro_end:
5908 case Builtin::BI__builtin_coro_suspend:
5910 case Builtin::BI__builtin_coro_size:
5912 case Builtin::BI__builtin_coro_align:
5916 case Builtin::BIread_pipe:
5917 case Builtin::BIwrite_pipe: {
5925 unsigned GenericAS =
5927 llvm::Type *I8PTy = llvm::PointerType::get(
getLLVMContext(), GenericAS);
5931 const char *Name = (BuiltinID == Builtin::BIread_pipe) ?
"__read_pipe_2"
5936 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
5937 Value *ACast =
Builder.CreateAddrSpaceCast(Arg1, I8PTy);
5940 {Arg0, ACast, PacketSize, PacketAlign}));
5943 "Illegal number of parameters to pipe function");
5944 const char *Name = (BuiltinID == Builtin::BIread_pipe) ?
"__read_pipe_4"
5947 llvm::Type *ArgTys[] = {Arg0->
getType(), Arg1->getType(),
Int32Ty, I8PTy,
5951 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
5952 Value *ACast =
Builder.CreateAddrSpaceCast(Arg3, I8PTy);
5959 {Arg0, Arg1, Arg2, ACast, PacketSize, PacketAlign}));
5964 case Builtin::BIreserve_read_pipe:
5965 case Builtin::BIreserve_write_pipe:
5966 case Builtin::BIwork_group_reserve_read_pipe:
5967 case Builtin::BIwork_group_reserve_write_pipe:
5968 case Builtin::BIsub_group_reserve_read_pipe:
5969 case Builtin::BIsub_group_reserve_write_pipe: {
5972 if (BuiltinID == Builtin::BIreserve_read_pipe)
5973 Name =
"__reserve_read_pipe";
5974 else if (BuiltinID == Builtin::BIreserve_write_pipe)
5975 Name =
"__reserve_write_pipe";
5976 else if (BuiltinID == Builtin::BIwork_group_reserve_read_pipe)
5977 Name =
"__work_group_reserve_read_pipe";
5978 else if (BuiltinID == Builtin::BIwork_group_reserve_write_pipe)
5979 Name =
"__work_group_reserve_write_pipe";
5980 else if (BuiltinID == Builtin::BIsub_group_reserve_read_pipe)
5981 Name =
"__sub_group_reserve_read_pipe";
5983 Name =
"__sub_group_reserve_write_pipe";
5994 llvm::FunctionType *FTy =
5995 llvm::FunctionType::get(ReservedIDTy, ArgTys,
false);
5998 if (Arg1->getType() !=
Int32Ty)
6001 {Arg0, Arg1, PacketSize, PacketAlign}));
6005 case Builtin::BIcommit_read_pipe:
6006 case Builtin::BIcommit_write_pipe:
6007 case Builtin::BIwork_group_commit_read_pipe:
6008 case Builtin::BIwork_group_commit_write_pipe:
6009 case Builtin::BIsub_group_commit_read_pipe:
6010 case Builtin::BIsub_group_commit_write_pipe: {
6012 if (BuiltinID == Builtin::BIcommit_read_pipe)
6013 Name =
"__commit_read_pipe";
6014 else if (BuiltinID == Builtin::BIcommit_write_pipe)
6015 Name =
"__commit_write_pipe";
6016 else if (BuiltinID == Builtin::BIwork_group_commit_read_pipe)
6017 Name =
"__work_group_commit_read_pipe";
6018 else if (BuiltinID == Builtin::BIwork_group_commit_write_pipe)
6019 Name =
"__work_group_commit_write_pipe";
6020 else if (BuiltinID == Builtin::BIsub_group_commit_read_pipe)
6021 Name =
"__sub_group_commit_read_pipe";
6023 Name =
"__sub_group_commit_write_pipe";
6033 llvm::FunctionType *FTy = llvm::FunctionType::get(
6037 {Arg0, Arg1, PacketSize, PacketAlign}));
6040 case Builtin::BIget_pipe_num_packets:
6041 case Builtin::BIget_pipe_max_packets: {
6042 const char *BaseName;
6044 if (BuiltinID == Builtin::BIget_pipe_num_packets)
6045 BaseName =
"__get_pipe_num_packets";
6047 BaseName =
"__get_pipe_max_packets";
6048 std::string Name = std::string(BaseName) +
6049 std::string(PipeTy->isReadOnly() ?
"_ro" :
"_wo");
6057 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6060 {Arg0, PacketSize, PacketAlign}));
6064 case Builtin::BIto_global:
6065 case Builtin::BIto_local:
6066 case Builtin::BIto_private: {
6068 auto NewArgT = llvm::PointerType::get(
6071 auto NewRetT = llvm::PointerType::get(
6073 CGM.getContext().getTargetAddressSpace(
6075 auto FTy = llvm::FunctionType::get(NewRetT, {NewArgT},
false);
6076 llvm::Value *NewArg;
6077 if (Arg0->getType()->getPointerAddressSpace() !=
6078 NewArgT->getPointerAddressSpace())
6079 NewArg =
Builder.CreateAddrSpaceCast(Arg0, NewArgT);
6081 NewArg =
Builder.CreateBitOrPointerCast(Arg0, NewArgT);
6097 case Builtin::BIenqueue_kernel: {
6102 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6119 Range = Range->stripPointerCasts();
6121 llvm::Type *RangePtrTy = Range->getType();
6126 Name =
"__enqueue_kernel_basic";
6127 llvm::Type *ArgTys[] = {QueueTy,
Int32Ty, RangePtrTy, GenericVoidPtrTy,
6129 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6132 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(3));
6134 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6135 llvm::Value *
Block =
6136 Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6139 {Queue, Flags, Range, Kernel, Block});
6142 assert(NumArgs >= 5 &&
"Invalid enqueue_kernel signature");
6146 auto CreateArrayForSizeVar =
6147 [=](
unsigned First) -> std::pair<llvm::Value *, llvm::Value *> {
6148 llvm::APInt ArraySize(32, NumArgs -
First);
6150 getContext().getSizeType(), ArraySize,
nullptr,
6154 llvm::Value *TmpPtr = Tmp.getPointer();
6159 llvm::Value *Alloca = TmpPtr->stripPointerCasts();
6160 llvm::Value *ElemPtr;
6164 auto *
Zero = llvm::ConstantInt::get(
IntTy, 0);
6165 for (
unsigned I =
First; I < NumArgs; ++I) {
6166 auto *Index = llvm::ConstantInt::get(
IntTy, I -
First);
6168 Builder.CreateGEP(Tmp.getElementType(), Alloca, {Zero, Index});
6174 V, GEP,
CGM.getDataLayout().getPrefTypeAlign(
SizeTy));
6178 return {ElemPtr, Alloca};
6184 Name =
"__enqueue_kernel_varargs";
6186 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(3));
6188 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6189 auto *
Block =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6190 auto [ElemPtr, TmpPtr] = CreateArrayForSizeVar(4);
6194 llvm::Value *
const Args[] = {Queue, Flags,
6198 llvm::Type *
const ArgTys[] = {
6199 QueueTy,
IntTy, RangePtrTy, GenericVoidPtrTy,
6200 GenericVoidPtrTy,
IntTy, ElemPtr->getType()};
6202 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6210 llvm::PointerType *PtrTy = llvm::PointerType::get(
6211 CGM.getLLVMContext(),
6214 llvm::Value *NumEvents =
6220 llvm::Value *EventWaitList =
nullptr;
6223 EventWaitList = llvm::ConstantPointerNull::get(PtrTy);
6230 EventWaitList =
Builder.CreatePointerCast(EventWaitList, PtrTy);
6232 llvm::Value *EventRet =
nullptr;
6235 EventRet = llvm::ConstantPointerNull::get(PtrTy);
6242 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(6));
6244 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6245 llvm::Value *
Block =
6246 Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6248 std::vector<llvm::Type *> ArgTys = {
6250 PtrTy, PtrTy, GenericVoidPtrTy, GenericVoidPtrTy};
6252 std::vector<llvm::Value *> Args = {Queue, Flags, Range,
6253 NumEvents, EventWaitList, EventRet,
6258 Name =
"__enqueue_kernel_basic_events";
6259 llvm::FunctionType *FTy =
6260 llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6266 Args.push_back(ConstantInt::get(
Int32Ty, NumArgs - 7));
6268 Name =
"__enqueue_kernel_events_varargs";
6270 auto [ElemPtr, TmpPtr] = CreateArrayForSizeVar(7);
6271 Args.push_back(ElemPtr);
6272 ArgTys.push_back(ElemPtr->getType());
6274 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6280 llvm_unreachable(
"Unexpected enqueue_kernel signature");
6284 case Builtin::BIget_kernel_work_group_size: {
6285 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6288 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(0));
6290 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6291 Value *Arg =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6293 CGM.CreateRuntimeFunction(
6294 llvm::FunctionType::get(
IntTy, {GenericVoidPtrTy, GenericVoidPtrTy},
6296 "__get_kernel_work_group_size_impl"),
6299 case Builtin::BIget_kernel_preferred_work_group_size_multiple: {
6300 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6303 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(0));
6305 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6306 Value *Arg =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6308 CGM.CreateRuntimeFunction(
6309 llvm::FunctionType::get(
IntTy, {GenericVoidPtrTy, GenericVoidPtrTy},
6311 "__get_kernel_preferred_work_group_size_multiple_impl"),
6314 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange:
6315 case Builtin::BIget_kernel_sub_group_count_for_ndrange: {
6316 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6321 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(1));
6323 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6326 BuiltinID == Builtin::BIget_kernel_max_sub_group_size_for_ndrange
6327 ?
"__get_kernel_max_sub_group_size_for_ndrange_impl"
6328 :
"__get_kernel_sub_group_count_for_ndrange_impl";
6330 CGM.CreateRuntimeFunction(
6331 llvm::FunctionType::get(
6332 IntTy, {NDRange->getType(), GenericVoidPtrTy, GenericVoidPtrTy},
6335 {NDRange, Kernel, Block}));
6337 case Builtin::BI__builtin_store_half:
6338 case Builtin::BI__builtin_store_halff: {
6346 case Builtin::BI__builtin_load_half: {
6351 case Builtin::BI__builtin_load_halff: {
6356 case Builtin::BI__builtin_printf:
6357 case Builtin::BIprintf:
6371 case Builtin::BI__builtin_canonicalize:
6372 case Builtin::BI__builtin_canonicalizef:
6373 case Builtin::BI__builtin_canonicalizef16:
6374 case Builtin::BI__builtin_canonicalizel:
6378 case Builtin::BI__builtin_thread_pointer: {
6379 if (!
getContext().getTargetInfo().isTLSSupported())
6380 CGM.ErrorUnsupported(E,
"__builtin_thread_pointer");
6383 {GlobalsInt8PtrTy}, {}));
6385 case Builtin::BI__builtin_os_log_format:
6388 case Builtin::BI__xray_customevent: {
6392 if (!
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
6396 if (
const auto *XRayAttr =
CurFuncDecl->getAttr<XRayInstrumentAttr>())
6400 Function *F =
CGM.getIntrinsic(Intrinsic::xray_customevent);
6401 auto FTy = F->getFunctionType();
6402 auto Arg0 = E->
getArg(0);
6404 auto Arg0Ty = Arg0->getType();
6405 auto PTy0 = FTy->getParamType(0);
6406 if (PTy0 != Arg0Val->getType()) {
6407 if (Arg0Ty->isArrayType())
6410 Arg0Val =
Builder.CreatePointerCast(Arg0Val, PTy0);
6413 auto PTy1 = FTy->getParamType(1);
6414 if (PTy1 != Arg1->getType())
6415 Arg1 =
Builder.CreateTruncOrBitCast(Arg1, PTy1);
6419 case Builtin::BI__xray_typedevent: {
6426 if (!
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
6430 if (
const auto *XRayAttr =
CurFuncDecl->getAttr<XRayInstrumentAttr>())
6434 Function *F =
CGM.getIntrinsic(Intrinsic::xray_typedevent);
6435 auto FTy = F->getFunctionType();
6437 auto PTy0 = FTy->getParamType(0);
6438 if (PTy0 != Arg0->getType())
6439 Arg0 =
Builder.CreateTruncOrBitCast(Arg0, PTy0);
6440 auto Arg1 = E->
getArg(1);
6442 auto Arg1Ty = Arg1->getType();
6443 auto PTy1 = FTy->getParamType(1);
6444 if (PTy1 != Arg1Val->getType()) {
6445 if (Arg1Ty->isArrayType())
6448 Arg1Val =
Builder.CreatePointerCast(Arg1Val, PTy1);
6451 auto PTy2 = FTy->getParamType(2);
6452 if (PTy2 != Arg2->getType())
6453 Arg2 =
Builder.CreateTruncOrBitCast(Arg2, PTy2);
6457 case Builtin::BI__builtin_ms_va_start:
6458 case Builtin::BI__builtin_ms_va_end:
6461 BuiltinID == Builtin::BI__builtin_ms_va_start));
6463 case Builtin::BI__builtin_ms_va_copy: {
6480 case Builtin::BI__builtin_get_device_side_mangled_name: {
6481 auto Name =
CGM.getCUDARuntime().getDeviceSideName(
6483 auto Str =
CGM.GetAddrOfConstantCString(Name,
"");
6493 BI.isLibFunction(BuiltinID))
6495 CGM.getBuiltinLibFunction(FD, BuiltinID));
6499 if (BI.isPredefinedLibFunction(BuiltinID))
6509 if (
unsigned VectorWidth =
getContext().BuiltinInfo.getRequiredVectorWidth(BuiltinID))
6510 LargestVectorWidth = std::max(LargestVectorWidth, VectorWidth);
6514 Intrinsic::ID IntrinsicID = Intrinsic::not_intrinsic;
6517 if (!Prefix.empty()) {
6518 IntrinsicID = Intrinsic::getIntrinsicForClangBuiltin(Prefix.data(), Name);
6519 if (IntrinsicID == Intrinsic::not_intrinsic && Prefix ==
"spv" &&
6521 IntrinsicID = Intrinsic::getIntrinsicForClangBuiltin(
"amdgcn", Name);
6525 if (IntrinsicID == Intrinsic::not_intrinsic)
6526 IntrinsicID = Intrinsic::getIntrinsicForMSBuiltin(Prefix.data(), Name);
6529 if (IntrinsicID != Intrinsic::not_intrinsic) {
6534 unsigned ICEArguments = 0;
6540 llvm::FunctionType *FTy = F->getFunctionType();
6542 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
6546 llvm::Type *PTy = FTy->getParamType(i);
6547 if (PTy != ArgValue->
getType()) {
6549 if (
auto *PtrTy = dyn_cast<llvm::PointerType>(PTy)) {
6550 if (PtrTy->getAddressSpace() !=
6551 ArgValue->
getType()->getPointerAddressSpace()) {
6552 ArgValue =
Builder.CreateAddrSpaceCast(
6554 PtrTy->getAddressSpace()));
6560 if (PTy->isX86_AMXTy())
6561 ArgValue =
Builder.CreateIntrinsic(Intrinsic::x86_cast_vector_to_tile,
6562 {ArgValue->
getType()}, {ArgValue});
6564 ArgValue =
Builder.CreateBitCast(ArgValue, PTy);
6567 Args.push_back(ArgValue);
6573 llvm::Type *RetTy =
VoidTy;
6577 if (RetTy !=
V->getType()) {
6579 if (
auto *PtrTy = dyn_cast<llvm::PointerType>(RetTy)) {
6580 if (PtrTy->getAddressSpace() !=
V->getType()->getPointerAddressSpace()) {
6583 PtrTy->getAddressSpace()));
6589 if (
V->getType()->isX86_AMXTy())
6590 V =
Builder.CreateIntrinsic(Intrinsic::x86_cast_tile_to_vector, {RetTy},
6596 if (RetTy->isVoidTy())
6616 if (
V->getType()->isVoidTy())
6623 llvm_unreachable(
"No current target builtin returns complex");
6625 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
6632 if (
V->getType()->isVoidTy())
6639 llvm_unreachable(
"No current hlsl builtin returns complex");
6641 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");