2722 assert(!
getContext().BuiltinInfo.isImmediate(BuiltinID) &&
2723 "Should not codegen for consteval builtins");
2730 !
Result.hasSideEffects()) {
2734 if (
Result.Val.isFloat())
2744 &
getTarget().getLongDoubleFormat() == &llvm::APFloat::IEEEquad())
2751 const unsigned BuiltinIDIfNoAsmLabel =
2752 FD->
hasAttr<AsmLabelAttr>() ? 0 : BuiltinID;
2754 std::optional<bool> ErrnoOverriden;
2760 if (OP.hasMathErrnoOverride())
2761 ErrnoOverriden = OP.getMathErrnoOverride();
2767 bool IsOptimizationEnabled =
CGM.getCodeGenOpts().OptimizationLevel != 0;
2769 bool GenerateFPMathIntrinsics =
2771 BuiltinID,
CGM.getTriple(), ErrnoOverriden,
getLangOpts().MathErrno,
2772 OptNone, IsOptimizationEnabled);
2774 if (GenerateFPMathIntrinsics) {
2775 switch (BuiltinIDIfNoAsmLabel) {
2776 case Builtin::BIacos:
2777 case Builtin::BIacosf:
2778 case Builtin::BIacosl:
2779 case Builtin::BI__builtin_acos:
2780 case Builtin::BI__builtin_acosf:
2781 case Builtin::BI__builtin_acosf16:
2782 case Builtin::BI__builtin_acosl:
2783 case Builtin::BI__builtin_acosf128:
2784 case Builtin::BI__builtin_elementwise_acos:
2786 *
this, E, Intrinsic::acos, Intrinsic::experimental_constrained_acos));
2788 case Builtin::BIasin:
2789 case Builtin::BIasinf:
2790 case Builtin::BIasinl:
2791 case Builtin::BI__builtin_asin:
2792 case Builtin::BI__builtin_asinf:
2793 case Builtin::BI__builtin_asinf16:
2794 case Builtin::BI__builtin_asinl:
2795 case Builtin::BI__builtin_asinf128:
2796 case Builtin::BI__builtin_elementwise_asin:
2798 *
this, E, Intrinsic::asin, Intrinsic::experimental_constrained_asin));
2800 case Builtin::BIatan:
2801 case Builtin::BIatanf:
2802 case Builtin::BIatanl:
2803 case Builtin::BI__builtin_atan:
2804 case Builtin::BI__builtin_atanf:
2805 case Builtin::BI__builtin_atanf16:
2806 case Builtin::BI__builtin_atanl:
2807 case Builtin::BI__builtin_atanf128:
2808 case Builtin::BI__builtin_elementwise_atan:
2810 *
this, E, Intrinsic::atan, Intrinsic::experimental_constrained_atan));
2812 case Builtin::BIatan2:
2813 case Builtin::BIatan2f:
2814 case Builtin::BIatan2l:
2815 case Builtin::BI__builtin_atan2:
2816 case Builtin::BI__builtin_atan2f:
2817 case Builtin::BI__builtin_atan2f16:
2818 case Builtin::BI__builtin_atan2l:
2819 case Builtin::BI__builtin_atan2f128:
2820 case Builtin::BI__builtin_elementwise_atan2:
2822 *
this, E, Intrinsic::atan2,
2823 Intrinsic::experimental_constrained_atan2));
2825 case Builtin::BIceil:
2826 case Builtin::BIceilf:
2827 case Builtin::BIceill:
2828 case Builtin::BI__builtin_ceil:
2829 case Builtin::BI__builtin_ceilf:
2830 case Builtin::BI__builtin_ceilf16:
2831 case Builtin::BI__builtin_ceill:
2832 case Builtin::BI__builtin_ceilf128:
2833 case Builtin::BI__builtin_elementwise_ceil:
2836 Intrinsic::experimental_constrained_ceil));
2838 case Builtin::BIcopysign:
2839 case Builtin::BIcopysignf:
2840 case Builtin::BIcopysignl:
2841 case Builtin::BI__builtin_copysign:
2842 case Builtin::BI__builtin_copysignf:
2843 case Builtin::BI__builtin_copysignf16:
2844 case Builtin::BI__builtin_copysignl:
2845 case Builtin::BI__builtin_copysignf128:
2849 case Builtin::BIcos:
2850 case Builtin::BIcosf:
2851 case Builtin::BIcosl:
2852 case Builtin::BI__builtin_cos:
2853 case Builtin::BI__builtin_cosf:
2854 case Builtin::BI__builtin_cosf16:
2855 case Builtin::BI__builtin_cosl:
2856 case Builtin::BI__builtin_cosf128:
2857 case Builtin::BI__builtin_elementwise_cos:
2860 Intrinsic::experimental_constrained_cos));
2862 case Builtin::BIcosh:
2863 case Builtin::BIcoshf:
2864 case Builtin::BIcoshl:
2865 case Builtin::BI__builtin_cosh:
2866 case Builtin::BI__builtin_coshf:
2867 case Builtin::BI__builtin_coshf16:
2868 case Builtin::BI__builtin_coshl:
2869 case Builtin::BI__builtin_coshf128:
2870 case Builtin::BI__builtin_elementwise_cosh:
2872 *
this, E, Intrinsic::cosh, Intrinsic::experimental_constrained_cosh));
2874 case Builtin::BIexp:
2875 case Builtin::BIexpf:
2876 case Builtin::BIexpl:
2877 case Builtin::BI__builtin_exp:
2878 case Builtin::BI__builtin_expf:
2879 case Builtin::BI__builtin_expf16:
2880 case Builtin::BI__builtin_expl:
2881 case Builtin::BI__builtin_expf128:
2882 case Builtin::BI__builtin_elementwise_exp:
2885 Intrinsic::experimental_constrained_exp));
2887 case Builtin::BIexp2:
2888 case Builtin::BIexp2f:
2889 case Builtin::BIexp2l:
2890 case Builtin::BI__builtin_exp2:
2891 case Builtin::BI__builtin_exp2f:
2892 case Builtin::BI__builtin_exp2f16:
2893 case Builtin::BI__builtin_exp2l:
2894 case Builtin::BI__builtin_exp2f128:
2895 case Builtin::BI__builtin_elementwise_exp2:
2898 Intrinsic::experimental_constrained_exp2));
2899 case Builtin::BI__builtin_exp10:
2900 case Builtin::BI__builtin_exp10f:
2901 case Builtin::BI__builtin_exp10f16:
2902 case Builtin::BI__builtin_exp10l:
2903 case Builtin::BI__builtin_exp10f128:
2904 case Builtin::BI__builtin_elementwise_exp10: {
2906 if (
Builder.getIsFPConstrained())
2911 case Builtin::BIfabs:
2912 case Builtin::BIfabsf:
2913 case Builtin::BIfabsl:
2914 case Builtin::BI__builtin_fabs:
2915 case Builtin::BI__builtin_fabsf:
2916 case Builtin::BI__builtin_fabsf16:
2917 case Builtin::BI__builtin_fabsl:
2918 case Builtin::BI__builtin_fabsf128:
2922 case Builtin::BIfloor:
2923 case Builtin::BIfloorf:
2924 case Builtin::BIfloorl:
2925 case Builtin::BI__builtin_floor:
2926 case Builtin::BI__builtin_floorf:
2927 case Builtin::BI__builtin_floorf16:
2928 case Builtin::BI__builtin_floorl:
2929 case Builtin::BI__builtin_floorf128:
2930 case Builtin::BI__builtin_elementwise_floor:
2933 Intrinsic::experimental_constrained_floor));
2935 case Builtin::BIfma:
2936 case Builtin::BIfmaf:
2937 case Builtin::BIfmal:
2938 case Builtin::BI__builtin_fma:
2939 case Builtin::BI__builtin_fmaf:
2940 case Builtin::BI__builtin_fmaf16:
2941 case Builtin::BI__builtin_fmal:
2942 case Builtin::BI__builtin_fmaf128:
2943 case Builtin::BI__builtin_elementwise_fma:
2946 Intrinsic::experimental_constrained_fma));
2948 case Builtin::BIfmax:
2949 case Builtin::BIfmaxf:
2950 case Builtin::BIfmaxl:
2951 case Builtin::BI__builtin_fmax:
2952 case Builtin::BI__builtin_fmaxf:
2953 case Builtin::BI__builtin_fmaxf16:
2954 case Builtin::BI__builtin_fmaxl:
2955 case Builtin::BI__builtin_fmaxf128: {
2956 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
2957 Builder.getFastMathFlags().setNoSignedZeros();
2959 *
this, E, Intrinsic::maxnum,
2960 Intrinsic::experimental_constrained_maxnum));
2963 case Builtin::BIfmin:
2964 case Builtin::BIfminf:
2965 case Builtin::BIfminl:
2966 case Builtin::BI__builtin_fmin:
2967 case Builtin::BI__builtin_fminf:
2968 case Builtin::BI__builtin_fminf16:
2969 case Builtin::BI__builtin_fminl:
2970 case Builtin::BI__builtin_fminf128: {
2971 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
2972 Builder.getFastMathFlags().setNoSignedZeros();
2974 *
this, E, Intrinsic::minnum,
2975 Intrinsic::experimental_constrained_minnum));
2978 case Builtin::BIfmaximum_num:
2979 case Builtin::BIfmaximum_numf:
2980 case Builtin::BIfmaximum_numl:
2981 case Builtin::BI__builtin_fmaximum_num:
2982 case Builtin::BI__builtin_fmaximum_numf:
2983 case Builtin::BI__builtin_fmaximum_numf16:
2984 case Builtin::BI__builtin_fmaximum_numl:
2985 case Builtin::BI__builtin_fmaximum_numf128:
2989 case Builtin::BIfminimum_num:
2990 case Builtin::BIfminimum_numf:
2991 case Builtin::BIfminimum_numl:
2992 case Builtin::BI__builtin_fminimum_num:
2993 case Builtin::BI__builtin_fminimum_numf:
2994 case Builtin::BI__builtin_fminimum_numf16:
2995 case Builtin::BI__builtin_fminimum_numl:
2996 case Builtin::BI__builtin_fminimum_numf128:
3002 case Builtin::BIfmod:
3003 case Builtin::BIfmodf:
3004 case Builtin::BIfmodl:
3005 case Builtin::BI__builtin_fmod:
3006 case Builtin::BI__builtin_fmodf:
3007 case Builtin::BI__builtin_fmodf16:
3008 case Builtin::BI__builtin_fmodl:
3009 case Builtin::BI__builtin_fmodf128:
3010 case Builtin::BI__builtin_elementwise_fmod: {
3014 if (
Builder.getIsFPConstrained()) {
3015 Function *F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_frem,
3023 case Builtin::BIlog:
3024 case Builtin::BIlogf:
3025 case Builtin::BIlogl:
3026 case Builtin::BI__builtin_log:
3027 case Builtin::BI__builtin_logf:
3028 case Builtin::BI__builtin_logf16:
3029 case Builtin::BI__builtin_logl:
3030 case Builtin::BI__builtin_logf128:
3031 case Builtin::BI__builtin_elementwise_log:
3034 Intrinsic::experimental_constrained_log));
3036 case Builtin::BIlog10:
3037 case Builtin::BIlog10f:
3038 case Builtin::BIlog10l:
3039 case Builtin::BI__builtin_log10:
3040 case Builtin::BI__builtin_log10f:
3041 case Builtin::BI__builtin_log10f16:
3042 case Builtin::BI__builtin_log10l:
3043 case Builtin::BI__builtin_log10f128:
3044 case Builtin::BI__builtin_elementwise_log10:
3047 Intrinsic::experimental_constrained_log10));
3049 case Builtin::BIlog2:
3050 case Builtin::BIlog2f:
3051 case Builtin::BIlog2l:
3052 case Builtin::BI__builtin_log2:
3053 case Builtin::BI__builtin_log2f:
3054 case Builtin::BI__builtin_log2f16:
3055 case Builtin::BI__builtin_log2l:
3056 case Builtin::BI__builtin_log2f128:
3057 case Builtin::BI__builtin_elementwise_log2:
3060 Intrinsic::experimental_constrained_log2));
3062 case Builtin::BInearbyint:
3063 case Builtin::BInearbyintf:
3064 case Builtin::BInearbyintl:
3065 case Builtin::BI__builtin_nearbyint:
3066 case Builtin::BI__builtin_nearbyintf:
3067 case Builtin::BI__builtin_nearbyintl:
3068 case Builtin::BI__builtin_nearbyintf128:
3069 case Builtin::BI__builtin_elementwise_nearbyint:
3071 Intrinsic::nearbyint,
3072 Intrinsic::experimental_constrained_nearbyint));
3074 case Builtin::BIpow:
3075 case Builtin::BIpowf:
3076 case Builtin::BIpowl:
3077 case Builtin::BI__builtin_pow:
3078 case Builtin::BI__builtin_powf:
3079 case Builtin::BI__builtin_powf16:
3080 case Builtin::BI__builtin_powl:
3081 case Builtin::BI__builtin_powf128:
3082 case Builtin::BI__builtin_elementwise_pow:
3085 Intrinsic::experimental_constrained_pow));
3087 case Builtin::BIrint:
3088 case Builtin::BIrintf:
3089 case Builtin::BIrintl:
3090 case Builtin::BI__builtin_rint:
3091 case Builtin::BI__builtin_rintf:
3092 case Builtin::BI__builtin_rintf16:
3093 case Builtin::BI__builtin_rintl:
3094 case Builtin::BI__builtin_rintf128:
3095 case Builtin::BI__builtin_elementwise_rint:
3098 Intrinsic::experimental_constrained_rint));
3100 case Builtin::BIround:
3101 case Builtin::BIroundf:
3102 case Builtin::BIroundl:
3103 case Builtin::BI__builtin_round:
3104 case Builtin::BI__builtin_roundf:
3105 case Builtin::BI__builtin_roundf16:
3106 case Builtin::BI__builtin_roundl:
3107 case Builtin::BI__builtin_roundf128:
3108 case Builtin::BI__builtin_elementwise_round:
3111 Intrinsic::experimental_constrained_round));
3113 case Builtin::BIroundeven:
3114 case Builtin::BIroundevenf:
3115 case Builtin::BIroundevenl:
3116 case Builtin::BI__builtin_roundeven:
3117 case Builtin::BI__builtin_roundevenf:
3118 case Builtin::BI__builtin_roundevenf16:
3119 case Builtin::BI__builtin_roundevenl:
3120 case Builtin::BI__builtin_roundevenf128:
3121 case Builtin::BI__builtin_elementwise_roundeven:
3123 Intrinsic::roundeven,
3124 Intrinsic::experimental_constrained_roundeven));
3126 case Builtin::BIsin:
3127 case Builtin::BIsinf:
3128 case Builtin::BIsinl:
3129 case Builtin::BI__builtin_sin:
3130 case Builtin::BI__builtin_sinf:
3131 case Builtin::BI__builtin_sinf16:
3132 case Builtin::BI__builtin_sinl:
3133 case Builtin::BI__builtin_sinf128:
3134 case Builtin::BI__builtin_elementwise_sin:
3137 Intrinsic::experimental_constrained_sin));
3139 case Builtin::BIsinh:
3140 case Builtin::BIsinhf:
3141 case Builtin::BIsinhl:
3142 case Builtin::BI__builtin_sinh:
3143 case Builtin::BI__builtin_sinhf:
3144 case Builtin::BI__builtin_sinhf16:
3145 case Builtin::BI__builtin_sinhl:
3146 case Builtin::BI__builtin_sinhf128:
3147 case Builtin::BI__builtin_elementwise_sinh:
3149 *
this, E, Intrinsic::sinh, Intrinsic::experimental_constrained_sinh));
3151 case Builtin::BI__builtin_sincospi:
3152 case Builtin::BI__builtin_sincospif:
3153 case Builtin::BI__builtin_sincospil:
3154 if (
Builder.getIsFPConstrained())
3159 case Builtin::BIsincos:
3160 case Builtin::BIsincosf:
3161 case Builtin::BIsincosl:
3162 case Builtin::BI__builtin_sincos:
3163 case Builtin::BI__builtin_sincosf:
3164 case Builtin::BI__builtin_sincosf16:
3165 case Builtin::BI__builtin_sincosl:
3166 case Builtin::BI__builtin_sincosf128:
3167 if (
Builder.getIsFPConstrained())
3172 case Builtin::BIsqrt:
3173 case Builtin::BIsqrtf:
3174 case Builtin::BIsqrtl:
3175 case Builtin::BI__builtin_sqrt:
3176 case Builtin::BI__builtin_sqrtf:
3177 case Builtin::BI__builtin_sqrtf16:
3178 case Builtin::BI__builtin_sqrtl:
3179 case Builtin::BI__builtin_sqrtf128:
3180 case Builtin::BI__builtin_elementwise_sqrt: {
3182 *
this, E, Intrinsic::sqrt, Intrinsic::experimental_constrained_sqrt);
3187 case Builtin::BItan:
3188 case Builtin::BItanf:
3189 case Builtin::BItanl:
3190 case Builtin::BI__builtin_tan:
3191 case Builtin::BI__builtin_tanf:
3192 case Builtin::BI__builtin_tanf16:
3193 case Builtin::BI__builtin_tanl:
3194 case Builtin::BI__builtin_tanf128:
3195 case Builtin::BI__builtin_elementwise_tan:
3197 *
this, E, Intrinsic::tan, Intrinsic::experimental_constrained_tan));
3199 case Builtin::BItanh:
3200 case Builtin::BItanhf:
3201 case Builtin::BItanhl:
3202 case Builtin::BI__builtin_tanh:
3203 case Builtin::BI__builtin_tanhf:
3204 case Builtin::BI__builtin_tanhf16:
3205 case Builtin::BI__builtin_tanhl:
3206 case Builtin::BI__builtin_tanhf128:
3207 case Builtin::BI__builtin_elementwise_tanh:
3209 *
this, E, Intrinsic::tanh, Intrinsic::experimental_constrained_tanh));
3211 case Builtin::BItrunc:
3212 case Builtin::BItruncf:
3213 case Builtin::BItruncl:
3214 case Builtin::BI__builtin_trunc:
3215 case Builtin::BI__builtin_truncf:
3216 case Builtin::BI__builtin_truncf16:
3217 case Builtin::BI__builtin_truncl:
3218 case Builtin::BI__builtin_truncf128:
3219 case Builtin::BI__builtin_elementwise_trunc:
3222 Intrinsic::experimental_constrained_trunc));
3224 case Builtin::BIlround:
3225 case Builtin::BIlroundf:
3226 case Builtin::BIlroundl:
3227 case Builtin::BI__builtin_lround:
3228 case Builtin::BI__builtin_lroundf:
3229 case Builtin::BI__builtin_lroundl:
3230 case Builtin::BI__builtin_lroundf128:
3232 *
this, E, Intrinsic::lround,
3233 Intrinsic::experimental_constrained_lround));
3235 case Builtin::BIllround:
3236 case Builtin::BIllroundf:
3237 case Builtin::BIllroundl:
3238 case Builtin::BI__builtin_llround:
3239 case Builtin::BI__builtin_llroundf:
3240 case Builtin::BI__builtin_llroundl:
3241 case Builtin::BI__builtin_llroundf128:
3243 *
this, E, Intrinsic::llround,
3244 Intrinsic::experimental_constrained_llround));
3246 case Builtin::BIlrint:
3247 case Builtin::BIlrintf:
3248 case Builtin::BIlrintl:
3249 case Builtin::BI__builtin_lrint:
3250 case Builtin::BI__builtin_lrintf:
3251 case Builtin::BI__builtin_lrintl:
3252 case Builtin::BI__builtin_lrintf128:
3254 *
this, E, Intrinsic::lrint,
3255 Intrinsic::experimental_constrained_lrint));
3257 case Builtin::BIllrint:
3258 case Builtin::BIllrintf:
3259 case Builtin::BIllrintl:
3260 case Builtin::BI__builtin_llrint:
3261 case Builtin::BI__builtin_llrintf:
3262 case Builtin::BI__builtin_llrintl:
3263 case Builtin::BI__builtin_llrintf128:
3265 *
this, E, Intrinsic::llrint,
3266 Intrinsic::experimental_constrained_llrint));
3267 case Builtin::BI__builtin_ldexp:
3268 case Builtin::BI__builtin_ldexpf:
3269 case Builtin::BI__builtin_ldexpl:
3270 case Builtin::BI__builtin_ldexpf16:
3271 case Builtin::BI__builtin_ldexpf128:
3272 case Builtin::BI__builtin_elementwise_ldexp:
3274 *
this, E, Intrinsic::ldexp,
3275 Intrinsic::experimental_constrained_ldexp));
3284 Value *Val = A.emitRawPointer(*
this);
3288 if (
SanOpts.has(SanitizerKind::Alignment)) {
3290 SkippedChecks.
set(SanitizerKind::All);
3291 SkippedChecks.
clear(SanitizerKind::Alignment);
3294 if (
auto *CE = dyn_cast<ImplicitCastExpr>(Arg))
3295 if (CE->getCastKind() == CK_BitCast)
3296 Arg = CE->getSubExpr();
3302 switch (BuiltinIDIfNoAsmLabel) {
3304 case Builtin::BI__builtin___CFStringMakeConstantString:
3305 case Builtin::BI__builtin___NSStringMakeConstantString:
3307 case Builtin::BI__builtin_stdarg_start:
3308 case Builtin::BI__builtin_va_start:
3309 case Builtin::BI__va_start:
3310 case Builtin::BI__builtin_c23_va_start:
3311 case Builtin::BI__builtin_va_end:
3315 BuiltinID != Builtin::BI__builtin_va_end);
3317 case Builtin::BI__builtin_va_copy: {
3320 Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::vacopy, {DstPtr->getType()}),
3324 case Builtin::BIabs:
3325 case Builtin::BIlabs:
3326 case Builtin::BIllabs:
3327 case Builtin::BI__builtin_abs:
3328 case Builtin::BI__builtin_labs:
3329 case Builtin::BI__builtin_llabs: {
3330 bool SanitizeOverflow =
SanOpts.has(SanitizerKind::SignedIntegerOverflow);
3333 switch (
getLangOpts().getSignedOverflowBehavior()) {
3338 if (!SanitizeOverflow) {
3350 case Builtin::BI__builtin_complex: {
3355 case Builtin::BI__builtin_conj:
3356 case Builtin::BI__builtin_conjf:
3357 case Builtin::BI__builtin_conjl:
3358 case Builtin::BIconj:
3359 case Builtin::BIconjf:
3360 case Builtin::BIconjl: {
3362 Value *Real = ComplexVal.first;
3363 Value *Imag = ComplexVal.second;
3364 Imag =
Builder.CreateFNeg(Imag,
"neg");
3367 case Builtin::BI__builtin_creal:
3368 case Builtin::BI__builtin_crealf:
3369 case Builtin::BI__builtin_creall:
3370 case Builtin::BIcreal:
3371 case Builtin::BIcrealf:
3372 case Builtin::BIcreall: {
3377 case Builtin::BI__builtin_preserve_access_index: {
3382 CGM.Error(E->
getExprLoc(),
"using builtin_preserve_access_index() without -g");
3388 CGM.Error(E->
getExprLoc(),
"nested builtin_preserve_access_index() not supported");
3398 case Builtin::BI__builtin_cimag:
3399 case Builtin::BI__builtin_cimagf:
3400 case Builtin::BI__builtin_cimagl:
3401 case Builtin::BIcimag:
3402 case Builtin::BIcimagf:
3403 case Builtin::BIcimagl: {
3408 case Builtin::BI__builtin_clrsb:
3409 case Builtin::BI__builtin_clrsbl:
3410 case Builtin::BI__builtin_clrsbll: {
3421 Value *Tmp =
Builder.CreateSelect(IsNeg, Inverse, ArgValue);
3429 case Builtin::BI__builtin_ctzs:
3430 case Builtin::BI__builtin_ctz:
3431 case Builtin::BI__builtin_ctzl:
3432 case Builtin::BI__builtin_ctzll:
3433 case Builtin::BI__builtin_ctzg:
3434 case Builtin::BI__builtin_elementwise_ctzg: {
3436 (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_ctzg ||
3437 BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_ctzg) &&
3450 HasFallback ||
getTarget().isCLZForZeroUndef() ||
3451 BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_ctzg);
3453 if (
Result->getType() != ResultType)
3462 Value *ResultOrFallback =
3463 Builder.CreateSelect(IsZero, FallbackValue,
Result,
"ctzg");
3466 case Builtin::BI__builtin_clzs:
3467 case Builtin::BI__builtin_clz:
3468 case Builtin::BI__builtin_clzl:
3469 case Builtin::BI__builtin_clzll:
3470 case Builtin::BI__builtin_clzg:
3471 case Builtin::BI__builtin_elementwise_clzg: {
3473 (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_clzg ||
3474 BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_clzg) &&
3487 HasFallback ||
getTarget().isCLZForZeroUndef() ||
3488 BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_clzg);
3490 if (
Result->getType() != ResultType)
3499 Value *ResultOrFallback =
3500 Builder.CreateSelect(IsZero, FallbackValue,
Result,
"clzg");
3503 case Builtin::BI__builtin_ffs:
3504 case Builtin::BI__builtin_ffsl:
3505 case Builtin::BI__builtin_ffsll: {
3514 Builder.CreateAdd(
Builder.CreateCall(F, {ArgValue, Builder.getTrue()}),
3515 llvm::ConstantInt::get(
ArgType, 1));
3519 if (
Result->getType() != ResultType)
3524 case Builtin::BI__builtin_parity:
3525 case Builtin::BI__builtin_parityl:
3526 case Builtin::BI__builtin_parityll: {
3536 if (
Result->getType() != ResultType)
3541 case Builtin::BI__lzcnt16:
3542 case Builtin::BI__lzcnt:
3543 case Builtin::BI__lzcnt64: {
3551 if (
Result->getType() != ResultType)
3556 case Builtin::BI__popcnt16:
3557 case Builtin::BI__popcnt:
3558 case Builtin::BI__popcnt64:
3559 case Builtin::BI__builtin_popcount:
3560 case Builtin::BI__builtin_popcountl:
3561 case Builtin::BI__builtin_popcountll:
3562 case Builtin::BI__builtin_popcountg: {
3570 if (
Result->getType() != ResultType)
3575 case Builtin::BI__builtin_unpredictable: {
3581 case Builtin::BI__builtin_expect: {
3589 if (
CGM.getCodeGenOpts().OptimizationLevel == 0)
3594 Builder.CreateCall(FnExpect, {ArgValue, ExpectedValue},
"expval");
3597 case Builtin::BI__builtin_expect_with_probability: {
3602 llvm::APFloat Probability(0.0);
3605 assert(EvalSucceed &&
"probability should be able to evaluate as float");
3607 bool LoseInfo =
false;
3608 Probability.convert(llvm::APFloat::IEEEdouble(),
3609 llvm::RoundingMode::Dynamic, &LoseInfo);
3611 Constant *Confidence = ConstantFP::get(Ty, Probability);
3615 if (
CGM.getCodeGenOpts().OptimizationLevel == 0)
3619 CGM.getIntrinsic(Intrinsic::expect_with_probability,
ArgType);
3621 FnExpect, {ArgValue, ExpectedValue, Confidence},
"expval");
3624 case Builtin::BI__builtin_assume_aligned: {
3627 Value *OffsetValue =
3632 if (AlignmentCI->getValue().ugt(llvm::Value::MaximumAlignment))
3633 AlignmentCI = ConstantInt::get(AlignmentCI->getIntegerType(),
3634 llvm::Value::MaximumAlignment);
3638 AlignmentCI, OffsetValue);
3641 case Builtin::BI__builtin_assume_dereferenceable: {
3649 Builder.CreateDereferenceableAssumption(PtrValue, SizeValue);
3652 case Builtin::BI__assume:
3653 case Builtin::BI__builtin_assume: {
3658 Function *FnAssume =
CGM.getIntrinsic(Intrinsic::assume);
3659 Builder.CreateCall(FnAssume, ArgValue);
3662 case Builtin::BI__builtin_assume_separate_storage: {
3669 Value *Values[] = {Value0, Value1};
3670 OperandBundleDefT<Value *> OBD(
"separate_storage", Values);
3671 Builder.CreateAssumption({OBD});
3674 case Builtin::BI__builtin_allow_runtime_check: {
3677 LLVMContext &Ctx =
CGM.getLLVMContext();
3679 CGM.getIntrinsic(Intrinsic::allow_runtime_check),
3680 llvm::MetadataAsValue::get(Ctx, llvm::MDString::get(Ctx, Kind)));
3683 case Builtin::BI__builtin_allow_sanitize_check: {
3684 Intrinsic::ID IntrID = Intrinsic::not_intrinsic;
3692 if (
getLangOpts().Sanitize.hasOneOf(SanitizerKind::Address |
3693 SanitizerKind::KernelAddress) &&
3694 (Name ==
"address" || Name ==
"kernel-address")) {
3695 IntrID = Intrinsic::allow_sanitize_address;
3696 }
else if (
getLangOpts().Sanitize.has(SanitizerKind::Thread) &&
3698 IntrID = Intrinsic::allow_sanitize_thread;
3699 }
else if (
getLangOpts().Sanitize.hasOneOf(SanitizerKind::Memory |
3700 SanitizerKind::KernelMemory) &&
3701 (Name ==
"memory" || Name ==
"kernel-memory")) {
3702 IntrID = Intrinsic::allow_sanitize_memory;
3704 SanitizerKind::HWAddress | SanitizerKind::KernelHWAddress) &&
3705 (Name ==
"hwaddress" || Name ==
"kernel-hwaddress")) {
3706 IntrID = Intrinsic::allow_sanitize_hwaddress;
3709 if (IntrID != Intrinsic::not_intrinsic) {
3718 case Builtin::BI__arithmetic_fence: {
3722 llvm::FastMathFlags FMF =
Builder.getFastMathFlags();
3723 bool isArithmeticFenceEnabled =
3724 FMF.allowReassoc() &&
3727 if (
ArgType->isComplexType()) {
3728 if (isArithmeticFenceEnabled) {
3731 Value *Real =
Builder.CreateArithmeticFence(ComplexVal.first,
3733 Value *Imag =
Builder.CreateArithmeticFence(ComplexVal.second,
3738 Value *Real = ComplexVal.first;
3739 Value *Imag = ComplexVal.second;
3743 if (isArithmeticFenceEnabled)
3748 case Builtin::BI__builtin_bswapg: {
3751 assert(
IntTy &&
"LLVM's __builtin_bswapg only supports integer variants");
3752 if (
IntTy->getBitWidth() == 1 ||
IntTy->getBitWidth() == 8)
3754 assert(((
IntTy->getBitWidth() % 16 == 0 &&
IntTy->getBitWidth() != 0)) &&
3755 "LLVM's __builtin_bswapg only supports integer variants that has a "
3756 "multiple of 16 bits as well as a single byte");
3760 case Builtin::BI__builtin_bswap16:
3761 case Builtin::BI__builtin_bswap32:
3762 case Builtin::BI__builtin_bswap64:
3763 case Builtin::BI_byteswap_ushort:
3764 case Builtin::BI_byteswap_ulong:
3765 case Builtin::BI_byteswap_uint64: {
3769 case Builtin::BI__builtin_bitreverseg: {
3773 "LLVM's __builtin_bitreverseg only support integer variants");
3774 if (
IntTy->getBitWidth() == 1)
3779 case Builtin::BI__builtin_bitreverse8:
3780 case Builtin::BI__builtin_bitreverse16:
3781 case Builtin::BI__builtin_bitreverse32:
3782 case Builtin::BI__builtin_bitreverse64: {
3786 case Builtin::BI__builtin_rotateleft8:
3787 case Builtin::BI__builtin_rotateleft16:
3788 case Builtin::BI__builtin_rotateleft32:
3789 case Builtin::BI__builtin_rotateleft64:
3790 case Builtin::BI__builtin_stdc_rotate_left:
3791 case Builtin::BIstdc_rotate_left_uc:
3792 case Builtin::BIstdc_rotate_left_us:
3793 case Builtin::BIstdc_rotate_left_ui:
3794 case Builtin::BIstdc_rotate_left_ul:
3795 case Builtin::BIstdc_rotate_left_ull:
3796 case Builtin::BI_rotl8:
3797 case Builtin::BI_rotl16:
3798 case Builtin::BI_rotl:
3799 case Builtin::BI_lrotl:
3800 case Builtin::BI_rotl64:
3803 case Builtin::BI__builtin_rotateright8:
3804 case Builtin::BI__builtin_rotateright16:
3805 case Builtin::BI__builtin_rotateright32:
3806 case Builtin::BI__builtin_rotateright64:
3807 case Builtin::BI__builtin_stdc_rotate_right:
3808 case Builtin::BIstdc_rotate_right_uc:
3809 case Builtin::BIstdc_rotate_right_us:
3810 case Builtin::BIstdc_rotate_right_ui:
3811 case Builtin::BIstdc_rotate_right_ul:
3812 case Builtin::BIstdc_rotate_right_ull:
3813 case Builtin::BI_rotr8:
3814 case Builtin::BI_rotr16:
3815 case Builtin::BI_rotr:
3816 case Builtin::BI_lrotr:
3817 case Builtin::BI_rotr64:
3820 case Builtin::BIstdc_leading_zeros_uc:
3821 case Builtin::BIstdc_leading_zeros_us:
3822 case Builtin::BIstdc_leading_zeros_ui:
3823 case Builtin::BIstdc_leading_zeros_ul:
3824 case Builtin::BIstdc_leading_zeros_ull:
3825 case Builtin::BI__builtin_stdc_leading_zeros:
3827 case Builtin::BIstdc_leading_ones_uc:
3828 case Builtin::BIstdc_leading_ones_us:
3829 case Builtin::BIstdc_leading_ones_ui:
3830 case Builtin::BIstdc_leading_ones_ul:
3831 case Builtin::BIstdc_leading_ones_ull:
3832 case Builtin::BI__builtin_stdc_leading_ones:
3834 case Builtin::BIstdc_trailing_zeros_uc:
3835 case Builtin::BIstdc_trailing_zeros_us:
3836 case Builtin::BIstdc_trailing_zeros_ui:
3837 case Builtin::BIstdc_trailing_zeros_ul:
3838 case Builtin::BIstdc_trailing_zeros_ull:
3839 case Builtin::BI__builtin_stdc_trailing_zeros:
3841 case Builtin::BIstdc_trailing_ones_uc:
3842 case Builtin::BIstdc_trailing_ones_us:
3843 case Builtin::BIstdc_trailing_ones_ui:
3844 case Builtin::BIstdc_trailing_ones_ul:
3845 case Builtin::BIstdc_trailing_ones_ull:
3846 case Builtin::BI__builtin_stdc_trailing_ones:
3848 case Builtin::BIstdc_first_leading_zero_uc:
3849 case Builtin::BIstdc_first_leading_zero_us:
3850 case Builtin::BIstdc_first_leading_zero_ui:
3851 case Builtin::BIstdc_first_leading_zero_ul:
3852 case Builtin::BIstdc_first_leading_zero_ull:
3853 case Builtin::BI__builtin_stdc_first_leading_zero:
3855 case Builtin::BIstdc_first_leading_one_uc:
3856 case Builtin::BIstdc_first_leading_one_us:
3857 case Builtin::BIstdc_first_leading_one_ui:
3858 case Builtin::BIstdc_first_leading_one_ul:
3859 case Builtin::BIstdc_first_leading_one_ull:
3860 case Builtin::BI__builtin_stdc_first_leading_one:
3862 case Builtin::BIstdc_first_trailing_zero_uc:
3863 case Builtin::BIstdc_first_trailing_zero_us:
3864 case Builtin::BIstdc_first_trailing_zero_ui:
3865 case Builtin::BIstdc_first_trailing_zero_ul:
3866 case Builtin::BIstdc_first_trailing_zero_ull:
3867 case Builtin::BI__builtin_stdc_first_trailing_zero:
3869 case Builtin::BIstdc_first_trailing_one_uc:
3870 case Builtin::BIstdc_first_trailing_one_us:
3871 case Builtin::BIstdc_first_trailing_one_ui:
3872 case Builtin::BIstdc_first_trailing_one_ul:
3873 case Builtin::BIstdc_first_trailing_one_ull:
3874 case Builtin::BI__builtin_stdc_first_trailing_one:
3876 case Builtin::BIstdc_count_zeros_uc:
3877 case Builtin::BIstdc_count_zeros_us:
3878 case Builtin::BIstdc_count_zeros_ui:
3879 case Builtin::BIstdc_count_zeros_ul:
3880 case Builtin::BIstdc_count_zeros_ull:
3881 case Builtin::BI__builtin_stdc_count_zeros:
3883 case Builtin::BIstdc_count_ones_uc:
3884 case Builtin::BIstdc_count_ones_us:
3885 case Builtin::BIstdc_count_ones_ui:
3886 case Builtin::BIstdc_count_ones_ul:
3887 case Builtin::BIstdc_count_ones_ull:
3888 case Builtin::BI__builtin_stdc_count_ones:
3891 case Builtin::BIstdc_has_single_bit_uc:
3892 case Builtin::BIstdc_has_single_bit_us:
3893 case Builtin::BIstdc_has_single_bit_ui:
3894 case Builtin::BIstdc_has_single_bit_ul:
3895 case Builtin::BIstdc_has_single_bit_ull:
3896 case Builtin::BI__builtin_stdc_has_single_bit: {
3904 case Builtin::BIstdc_bit_width_uc:
3905 case Builtin::BIstdc_bit_width_us:
3906 case Builtin::BIstdc_bit_width_ui:
3907 case Builtin::BIstdc_bit_width_ul:
3908 case Builtin::BIstdc_bit_width_ull:
3909 case Builtin::BI__builtin_stdc_bit_width:
3911 case Builtin::BIstdc_bit_floor_uc:
3912 case Builtin::BIstdc_bit_floor_us:
3913 case Builtin::BIstdc_bit_floor_ui:
3914 case Builtin::BIstdc_bit_floor_ul:
3915 case Builtin::BIstdc_bit_floor_ull:
3916 case Builtin::BI__builtin_stdc_bit_floor: {
3919 unsigned BitWidth =
ArgType->getIntegerBitWidth();
3931 case Builtin::BIstdc_bit_ceil_uc:
3932 case Builtin::BIstdc_bit_ceil_us:
3933 case Builtin::BIstdc_bit_ceil_ui:
3934 case Builtin::BIstdc_bit_ceil_ul:
3935 case Builtin::BIstdc_bit_ceil_ull:
3936 case Builtin::BI__builtin_stdc_bit_ceil: {
3940 Value *IsLEOne =
Builder.CreateICmpULE(ArgValue, One,
"isleone");
3942 BasicBlock *EntryBB =
Builder.GetInsertBlock();
3946 Builder.CreateCondBr(IsLEOne, MergeBB, CalcBB);
3948 Builder.SetInsertPoint(CalcBB);
3955 unsigned BitWidth =
ArgType->getIntegerBitWidth();
3962 Builder.SetInsertPoint(MergeBB);
3964 Phi->addIncoming(One, EntryBB);
3965 Phi->addIncoming(Tmp, CalcBB);
3970 case Builtin::BIstdc_memreverse8u8:
3973 case Builtin::BIstdc_memreverse8u16:
3974 case Builtin::BIstdc_memreverse8u32:
3975 case Builtin::BIstdc_memreverse8u64:
3979 case Builtin::BIstdc_memreverse8:
3980 case Builtin::BI__builtin_stdc_memreverse8: {
3983 uint64_t Size = R.Val.getInt().getZExtValue();
3988 if (Size == 2 || Size == 4 || Size == 8) {
4006 case Builtin::BIstdc_load8_leu8:
4007 case Builtin::BIstdc_load8_les8:
4008 case Builtin::BIstdc_load8_beu8:
4009 case Builtin::BIstdc_load8_bes8:
4010 case Builtin::BIstdc_load8_aligned_leu8:
4011 case Builtin::BIstdc_load8_aligned_les8:
4012 case Builtin::BIstdc_load8_aligned_beu8:
4013 case Builtin::BIstdc_load8_aligned_bes8:
4014 case Builtin::BIstdc_load8_leu16:
4015 case Builtin::BIstdc_load8_les16:
4016 case Builtin::BIstdc_load8_beu16:
4017 case Builtin::BIstdc_load8_bes16:
4018 case Builtin::BIstdc_load8_aligned_leu16:
4019 case Builtin::BIstdc_load8_aligned_les16:
4020 case Builtin::BIstdc_load8_aligned_beu16:
4021 case Builtin::BIstdc_load8_aligned_bes16:
4022 case Builtin::BIstdc_load8_leu32:
4023 case Builtin::BIstdc_load8_les32:
4024 case Builtin::BIstdc_load8_beu32:
4025 case Builtin::BIstdc_load8_bes32:
4026 case Builtin::BIstdc_load8_aligned_leu32:
4027 case Builtin::BIstdc_load8_aligned_les32:
4028 case Builtin::BIstdc_load8_aligned_beu32:
4029 case Builtin::BIstdc_load8_aligned_bes32:
4030 case Builtin::BIstdc_load8_leu64:
4031 case Builtin::BIstdc_load8_les64:
4032 case Builtin::BIstdc_load8_beu64:
4033 case Builtin::BIstdc_load8_bes64:
4034 case Builtin::BIstdc_load8_aligned_leu64:
4035 case Builtin::BIstdc_load8_aligned_les64:
4036 case Builtin::BIstdc_load8_aligned_beu64:
4037 case Builtin::BIstdc_load8_aligned_bes64: {
4038 bool IsBE = BuiltinID == Builtin::BIstdc_load8_beu8 ||
4039 BuiltinID == Builtin::BIstdc_load8_bes8 ||
4040 BuiltinID == Builtin::BIstdc_load8_beu16 ||
4041 BuiltinID == Builtin::BIstdc_load8_bes16 ||
4042 BuiltinID == Builtin::BIstdc_load8_beu32 ||
4043 BuiltinID == Builtin::BIstdc_load8_bes32 ||
4044 BuiltinID == Builtin::BIstdc_load8_beu64 ||
4045 BuiltinID == Builtin::BIstdc_load8_bes64 ||
4046 BuiltinID == Builtin::BIstdc_load8_aligned_beu8 ||
4047 BuiltinID == Builtin::BIstdc_load8_aligned_bes8 ||
4048 BuiltinID == Builtin::BIstdc_load8_aligned_beu16 ||
4049 BuiltinID == Builtin::BIstdc_load8_aligned_bes16 ||
4050 BuiltinID == Builtin::BIstdc_load8_aligned_beu32 ||
4051 BuiltinID == Builtin::BIstdc_load8_aligned_bes32 ||
4052 BuiltinID == Builtin::BIstdc_load8_aligned_beu64 ||
4053 BuiltinID == Builtin::BIstdc_load8_aligned_bes64;
4054 bool IsAligned = BuiltinID == Builtin::BIstdc_load8_aligned_leu8 ||
4055 BuiltinID == Builtin::BIstdc_load8_aligned_les8 ||
4056 BuiltinID == Builtin::BIstdc_load8_aligned_beu8 ||
4057 BuiltinID == Builtin::BIstdc_load8_aligned_bes8 ||
4058 BuiltinID == Builtin::BIstdc_load8_aligned_leu16 ||
4059 BuiltinID == Builtin::BIstdc_load8_aligned_les16 ||
4060 BuiltinID == Builtin::BIstdc_load8_aligned_beu16 ||
4061 BuiltinID == Builtin::BIstdc_load8_aligned_bes16 ||
4062 BuiltinID == Builtin::BIstdc_load8_aligned_leu32 ||
4063 BuiltinID == Builtin::BIstdc_load8_aligned_les32 ||
4064 BuiltinID == Builtin::BIstdc_load8_aligned_beu32 ||
4065 BuiltinID == Builtin::BIstdc_load8_aligned_bes32 ||
4066 BuiltinID == Builtin::BIstdc_load8_aligned_leu64 ||
4067 BuiltinID == Builtin::BIstdc_load8_aligned_les64 ||
4068 BuiltinID == Builtin::BIstdc_load8_aligned_beu64 ||
4069 BuiltinID == Builtin::BIstdc_load8_aligned_bes64;
4072 unsigned BitWidth =
IntTy->getIntegerBitWidth();
4074 (BitWidth == 8 || BitWidth == 16 || BitWidth == 32 || BitWidth == 64) &&
4075 "unexpected bit width for stdc_load8_*");
4079 Addr =
Addr.withAlignment(std::max(
Addr.getAlignment(), TypeAlign));
4083 if ((BitWidth == 16 || BitWidth == 32 || BitWidth == 64) &&
4085 Val =
Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::bswap,
IntTy), Val);
4090 case Builtin::BI__builtin_constant_p: {
4097 if (!
ArgType->isIntegralOrEnumerationType() && !
ArgType->isFloatingType() &&
4098 !
ArgType->isObjCObjectPointerType() && !
ArgType->isBlockPointerType())
4101 return RValue::get(ConstantInt::get(ResultType, 0));
4106 return RValue::get(ConstantInt::get(ResultType, 0));
4109 if (
ArgType->isObjCObjectPointerType()) {
4118 if (
Result->getType() != ResultType)
4122 case Builtin::BI__builtin_dynamic_object_size:
4123 case Builtin::BI__builtin_object_size: {
4130 bool IsDynamic = BuiltinID == Builtin::BI__builtin_dynamic_object_size;
4132 nullptr, IsDynamic));
4134 case Builtin::BI__builtin_counted_by_ref: {
4136 llvm::Value *
Result = llvm::ConstantPointerNull::get(
4141 if (
auto *UO = dyn_cast<UnaryOperator>(Arg);
4142 UO && UO->getOpcode() == UO_AddrOf) {
4145 if (
auto *ASE = dyn_cast<ArraySubscriptExpr>(Arg))
4149 if (
const MemberExpr *ME = dyn_cast_if_present<MemberExpr>(Arg)) {
4157 llvm::report_fatal_error(
"Cannot find the counted_by 'count' field");
4163 case Builtin::BI__builtin_prefetch: {
4165 unsigned ICEArguments = (1 << 1) | (1 << 2);
4167 : llvm::ConstantInt::get(
Int32Ty, 0);
4171 : llvm::ConstantInt::get(
Int32Ty, 3);
4178 case Builtin::BI__builtin_readcyclecounter: {
4179 Function *F =
CGM.getIntrinsic(Intrinsic::readcyclecounter);
4182 case Builtin::BI__builtin_readsteadycounter: {
4183 Function *F =
CGM.getIntrinsic(Intrinsic::readsteadycounter);
4186 case Builtin::BI__builtin___clear_cache: {
4189 Function *F =
CGM.getIntrinsic(Intrinsic::clear_cache, {
CGM.DefaultPtrTy});
4192 case Builtin::BI__builtin_trap:
4195 case Builtin::BI__builtin_verbose_trap: {
4196 llvm::DebugLoc CallLocation =
Builder.getCurrentDebugLocation();
4197 llvm::DILocation *TrapLocation = CallLocation;
4204 TrapLocation = llvm::DILocation::get(
4206 TrapLocation->getScope(), TrapLocation->getInlinedAt());
4213 case Builtin::BI__debugbreak:
4216 case Builtin::BI__builtin_unreachable: {
4225 case Builtin::BI__builtin_powi:
4226 case Builtin::BI__builtin_powif:
4227 case Builtin::BI__builtin_powil: {
4231 if (
Builder.getIsFPConstrained()) {
4235 Function *F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_powi,
4241 { Src0->getType(), Src1->getType() });
4244 case Builtin::BI__builtin_frexpl: {
4248 if (&
getTarget().getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble())
4252 case Builtin::BI__builtin_frexp:
4253 case Builtin::BI__builtin_frexpf:
4254 case Builtin::BI__builtin_frexpf128:
4255 case Builtin::BI__builtin_frexpf16:
4257 case Builtin::BImodf:
4258 case Builtin::BImodff:
4259 case Builtin::BImodfl:
4260 case Builtin::BI__builtin_modf:
4261 case Builtin::BI__builtin_modff:
4262 case Builtin::BI__builtin_modfl:
4263 if (
Builder.getIsFPConstrained())
4266 case Builtin::BI__builtin_isgreater:
4267 case Builtin::BI__builtin_isgreaterequal:
4268 case Builtin::BI__builtin_isless:
4269 case Builtin::BI__builtin_islessequal:
4270 case Builtin::BI__builtin_islessgreater:
4271 case Builtin::BI__builtin_isunordered: {
4278 switch (BuiltinID) {
4279 default: llvm_unreachable(
"Unknown ordered comparison");
4280 case Builtin::BI__builtin_isgreater:
4281 LHS =
Builder.CreateFCmpOGT(LHS, RHS,
"cmp");
4283 case Builtin::BI__builtin_isgreaterequal:
4284 LHS =
Builder.CreateFCmpOGE(LHS, RHS,
"cmp");
4286 case Builtin::BI__builtin_isless:
4287 LHS =
Builder.CreateFCmpOLT(LHS, RHS,
"cmp");
4289 case Builtin::BI__builtin_islessequal:
4290 LHS =
Builder.CreateFCmpOLE(LHS, RHS,
"cmp");
4292 case Builtin::BI__builtin_islessgreater:
4293 LHS =
Builder.CreateFCmpONE(LHS, RHS,
"cmp");
4295 case Builtin::BI__builtin_isunordered:
4296 LHS =
Builder.CreateFCmpUNO(LHS, RHS,
"cmp");
4303 case Builtin::BI__builtin_isnan: {
4313 case Builtin::BI__builtin_issignaling: {
4321 case Builtin::BI__builtin_isinf: {
4331 case Builtin::BIfinite:
4332 case Builtin::BI__finite:
4333 case Builtin::BIfinitef:
4334 case Builtin::BI__finitef:
4335 case Builtin::BIfinitel:
4336 case Builtin::BI__finitel:
4337 case Builtin::BI__builtin_isfinite: {
4347 case Builtin::BI__builtin_isnormal: {
4355 case Builtin::BI__builtin_issubnormal: {
4359 Builder.CreateZExt(
Builder.createIsFPClass(
V, FPClassTest::fcSubnormal),
4363 case Builtin::BI__builtin_iszero: {
4371 case Builtin::BI__builtin_isfpclass: {
4375 uint64_t Test =
Result.Val.getInt().getLimitedValue();
4382 case Builtin::BI__builtin_nondeterministic_value: {
4391 case Builtin::BI__builtin_elementwise_abs: {
4396 QT = VecTy->getElementType();
4398 QT = MatTy->getElementType();
4402 nullptr,
"elt.abs");
4409 case Builtin::BI__builtin_elementwise_bitreverse:
4411 *
this, E, Intrinsic::bitreverse,
"elt.bitreverse"));
4412 case Builtin::BI__builtin_elementwise_popcount:
4414 *
this, E, Intrinsic::ctpop,
"elt.ctpop"));
4415 case Builtin::BI__builtin_elementwise_canonicalize:
4417 *
this, E, Intrinsic::canonicalize,
"elt.canonicalize"));
4418 case Builtin::BI__builtin_elementwise_copysign:
4421 case Builtin::BI__builtin_elementwise_fshl:
4424 case Builtin::BI__builtin_elementwise_fshr:
4427 case Builtin::BI__builtin_elementwise_clmul:
4430 case Builtin::BI__builtin_elementwise_pext:
4433 case Builtin::BI__builtin_elementwise_pdep:
4437 case Builtin::BI__builtin_elementwise_add_sat:
4438 case Builtin::BI__builtin_elementwise_sub_sat: {
4442 assert(Op0->
getType()->isIntOrIntVectorTy() &&
"integer type expected");
4445 Ty = VecTy->getElementType();
4448 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_add_sat)
4449 Opc = IsSigned ? Intrinsic::sadd_sat : Intrinsic::uadd_sat;
4451 Opc = IsSigned ? Intrinsic::ssub_sat : Intrinsic::usub_sat;
4452 Result =
Builder.CreateBinaryIntrinsic(Opc, Op0, Op1,
nullptr,
"elt.sat");
4456 case Builtin::BI__builtin_elementwise_max: {
4460 if (Op0->
getType()->isIntOrIntVectorTy()) {
4465 Op0, Op1,
nullptr,
"elt.max");
4467 Result =
Builder.CreateMaxNum(Op0, Op1,
nullptr,
"elt.max");
4470 case Builtin::BI__builtin_elementwise_min: {
4474 if (Op0->
getType()->isIntOrIntVectorTy()) {
4479 Op0, Op1,
nullptr,
"elt.min");
4481 Result =
Builder.CreateMinNum(Op0, Op1,
nullptr,
"elt.min");
4485 case Builtin::BI__builtin_elementwise_maxnum: {
4489 Op1,
nullptr,
"elt.maxnum");
4493 case Builtin::BI__builtin_elementwise_minnum: {
4497 Op1,
nullptr,
"elt.minnum");
4501 case Builtin::BI__builtin_elementwise_maximum: {
4505 nullptr,
"elt.maximum");
4509 case Builtin::BI__builtin_elementwise_minimum: {
4513 nullptr,
"elt.minimum");
4517 case Builtin::BI__builtin_elementwise_maximumnum: {
4521 Intrinsic::maximumnum, Op0, Op1,
nullptr,
"elt.maximumnum");
4525 case Builtin::BI__builtin_elementwise_minimumnum: {
4529 Intrinsic::minimumnum, Op0, Op1,
nullptr,
"elt.minimumnum");
4533 case Builtin::BI__builtin_reduce_max: {
4534 auto GetIntrinsicID = [
this](
QualType QT) {
4536 QT = VecTy->getElementType();
4537 else if (QT->isSizelessVectorType())
4538 QT = QT->getSizelessVectorEltType(
CGM.getContext());
4540 if (QT->isSignedIntegerType())
4541 return Intrinsic::vector_reduce_smax;
4542 if (QT->isUnsignedIntegerType())
4543 return Intrinsic::vector_reduce_umax;
4544 assert(QT->isFloatingType() &&
"must have a float here");
4545 return Intrinsic::vector_reduce_fmax;
4548 *
this, E, GetIntrinsicID(E->
getArg(0)->
getType()),
"rdx.min"));
4551 case Builtin::BI__builtin_reduce_min: {
4552 auto GetIntrinsicID = [
this](
QualType QT) {
4554 QT = VecTy->getElementType();
4555 else if (QT->isSizelessVectorType())
4556 QT = QT->getSizelessVectorEltType(
CGM.getContext());
4558 if (QT->isSignedIntegerType())
4559 return Intrinsic::vector_reduce_smin;
4560 if (QT->isUnsignedIntegerType())
4561 return Intrinsic::vector_reduce_umin;
4562 assert(QT->isFloatingType() &&
"must have a float here");
4563 return Intrinsic::vector_reduce_fmin;
4567 *
this, E, GetIntrinsicID(E->
getArg(0)->
getType()),
"rdx.min"));
4570 case Builtin::BI__builtin_reduce_add:
4572 *
this, E, Intrinsic::vector_reduce_add,
"rdx.add"));
4573 case Builtin::BI__builtin_reduce_mul:
4575 *
this, E, Intrinsic::vector_reduce_mul,
"rdx.mul"));
4576 case Builtin::BI__builtin_reduce_xor:
4578 *
this, E, Intrinsic::vector_reduce_xor,
"rdx.xor"));
4579 case Builtin::BI__builtin_reduce_or:
4581 *
this, E, Intrinsic::vector_reduce_or,
"rdx.or"));
4582 case Builtin::BI__builtin_reduce_and:
4584 *
this, E, Intrinsic::vector_reduce_and,
"rdx.and"));
4585 case Builtin::BI__builtin_reduce_maximum:
4587 *
this, E, Intrinsic::vector_reduce_fmaximum,
"rdx.maximum"));
4588 case Builtin::BI__builtin_reduce_minimum:
4590 *
this, E, Intrinsic::vector_reduce_fminimum,
"rdx.minimum"));
4591 case Builtin::BI__builtin_reduce_assoc_fadd:
4592 case Builtin::BI__builtin_reduce_in_order_fadd: {
4594 llvm::Type *ScalarTy =
Vector->getType()->getScalarType();
4595 llvm::Value *StartValue =
nullptr;
4598 llvm::Value *Args[] = {StartValue
4600 : llvm::ConstantFP::get(ScalarTy, -0.0F),
4603 CGM.getIntrinsic(Intrinsic::vector_reduce_fadd,
Vector->getType());
4604 llvm::CallBase *Reduce =
Builder.CreateCall(F, Args,
"rdx.addf");
4605 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_reduce_assoc_fadd) {
4608 llvm::FastMathFlags FMF;
4609 FMF.setAllowReassoc();
4615 case Builtin::BI__builtin_matrix_transpose: {
4619 Value *
Result = MB.CreateMatrixTranspose(MatValue, MatrixTy->getNumRows(),
4620 MatrixTy->getNumColumns());
4624 case Builtin::BI__builtin_matrix_column_major_load: {
4630 assert(PtrTy &&
"arg0 must be of pointer type");
4631 bool IsVolatile = PtrTy->getPointeeType().isVolatileQualified();
4640 ResultTy->getNumRows(), ResultTy->getNumColumns(),
"matrix");
4644 case Builtin::BI__builtin_matrix_column_major_store: {
4652 assert(PtrTy &&
"arg1 must be of pointer type");
4653 bool IsVolatile = PtrTy->getPointeeType().isVolatileQualified();
4661 MatrixTy->getNumRows(), MatrixTy->getNumColumns());
4666 case Builtin::BI__builtin_masked_load:
4667 case Builtin::BI__builtin_masked_expand_load: {
4671 llvm::Type *RetTy =
CGM.getTypes().ConvertType(E->
getType());
4672 llvm::Value *PassThru = llvm::PoisonValue::get(RetTy);
4680 if (BuiltinID == Builtin::BI__builtin_masked_load)
4682 PassThru,
"masked_load");
4684 Result =
Builder.CreateMaskedExpandLoad(RetTy, Ptr, MaybeAlign(), Mask,
4685 PassThru,
"masked_expand_load");
4689 case Builtin::BI__builtin_masked_gather: {
4694 llvm::Type *RetTy =
CGM.getTypes().ConvertType(E->
getType());
4698 llvm::Value *PassThru = llvm::PoisonValue::get(RetTy);
4702 llvm::Type *ElemTy =
CGM.getTypes().ConvertType(
4704 llvm::Value *PtrVec =
Builder.CreateGEP(ElemTy, Ptr, Idx);
4707 RetTy, PtrVec, Align.
getAsAlign(), Mask, PassThru,
"masked_gather");
4710 case Builtin::BI__builtin_masked_store:
4711 case Builtin::BI__builtin_masked_compress_store: {
4720 if (BuiltinID == Builtin::BI__builtin_masked_store)
4723 Builder.CreateMaskedCompressStore(Val, Ptr, MaybeAlign(), Mask);
4727 case Builtin::BI__builtin_masked_scatter: {
4737 llvm::Type *ElemTy =
CGM.getTypes().ConvertType(
4739 llvm::Value *PtrVec =
Builder.CreateGEP(ElemTy, Ptr, Idx);
4744 case Builtin::BI__builtin_isinf_sign: {
4751 AbsArg, ConstantFP::getInfinity(Arg->
getType()),
"isinf");
4757 Value *NegativeOne = ConstantInt::getAllOnesValue(
IntTy);
4758 Value *SignResult =
Builder.CreateSelect(IsNeg, NegativeOne, One);
4763 case Builtin::BI__builtin_flt_rounds: {
4764 Function *F =
CGM.getIntrinsic(Intrinsic::get_rounding);
4768 if (
Result->getType() != ResultType)
4774 case Builtin::BI__builtin_set_flt_rounds: {
4775 Function *F =
CGM.getIntrinsic(Intrinsic::set_rounding);
4782 case Builtin::BI__builtin_fpclassify: {
4789 BasicBlock *Begin =
Builder.GetInsertBlock();
4794 "fpclassify_result");
4797 Builder.SetInsertPoint(Begin);
4798 Value *IsZero =
Builder.CreateFCmpOEQ(
V, Constant::getNullValue(Ty),
4802 Builder.CreateCondBr(IsZero, End, NotZero);
4803 Result->addIncoming(ZeroLiteral, Begin);
4806 Builder.SetInsertPoint(NotZero);
4810 Builder.CreateCondBr(IsNan, End, NotNan);
4811 Result->addIncoming(NanLiteral, NotZero);
4814 Builder.SetInsertPoint(NotNan);
4817 Builder.CreateFCmpOEQ(VAbs, ConstantFP::getInfinity(
V->getType()),
4821 Builder.CreateCondBr(IsInf, End, NotInf);
4822 Result->addIncoming(InfLiteral, NotNan);
4825 Builder.SetInsertPoint(NotInf);
4826 APFloat Smallest = APFloat::getSmallestNormalized(
4829 Builder.CreateFCmpUGE(VAbs, ConstantFP::get(
V->getContext(), Smallest),
4831 Value *NormalResult =
4835 Result->addIncoming(NormalResult, NotInf);
4848 case Builtin::BIalloca:
4849 case Builtin::BI_alloca:
4850 case Builtin::BI__builtin_alloca_uninitialized:
4851 case Builtin::BI__builtin_alloca: {
4855 const Align SuitableAlignmentInBytes =
4859 AllocaInst *AI =
Builder.CreateAlloca(
Builder.getInt8Ty(), Size);
4860 AI->setAlignment(SuitableAlignmentInBytes);
4861 if (BuiltinID != Builtin::BI__builtin_alloca_uninitialized)
4863 if (AI->getAddressSpace() !=
4864 CGM.getContext().getTargetAddressSpace(
4866 llvm::Type *Ty =
CGM.getTypes().ConvertType(E->
getType());
4872 case Builtin::BI__builtin_alloca_with_align_uninitialized:
4873 case Builtin::BI__builtin_alloca_with_align: {
4877 unsigned AlignmentInBits = AlignmentInBitsCI->getZExtValue();
4878 const Align AlignmentInBytes =
4879 CGM.getContext().toCharUnitsFromBits(AlignmentInBits).getAsAlign();
4880 AllocaInst *AI =
Builder.CreateAlloca(
Builder.getInt8Ty(), Size);
4881 AI->setAlignment(AlignmentInBytes);
4882 if (BuiltinID != Builtin::BI__builtin_alloca_with_align_uninitialized)
4884 if (AI->getAddressSpace() !=
4885 CGM.getContext().getTargetAddressSpace(
4887 llvm::Type *Ty =
CGM.getTypes().ConvertType(E->
getType());
4893 case Builtin::BI__builtin_infer_alloc_token: {
4897 CGM.getIntrinsic(llvm::Intrinsic::alloc_token_id, {
IntPtrTy});
4898 llvm::CallBase *TokenID =
Builder.CreateCall(F, MDV);
4902 case Builtin::BIbzero:
4903 case Builtin::BI__builtin_bzero: {
4908 auto *I =
Builder.CreateMemSet(Dest,
Builder.getInt8(0), SizeVal,
false);
4913 case Builtin::BIbcopy:
4914 case Builtin::BI__builtin_bcopy: {
4924 auto *I =
Builder.CreateMemMove(Dest, Src, SizeVal,
false);
4929 case Builtin::BImemcpy:
4930 case Builtin::BI__builtin_memcpy:
4931 case Builtin::BImempcpy:
4932 case Builtin::BI__builtin_mempcpy: {
4938 auto *I =
Builder.CreateMemCpy(Dest, Src, SizeVal,
false);
4940 if (BuiltinID == Builtin::BImempcpy ||
4941 BuiltinID == Builtin::BI__builtin_mempcpy)
4948 case Builtin::BI__builtin_memcpy_inline: {
4955 auto *I =
Builder.CreateMemCpyInline(Dest, Src, Size);
4960 case Builtin::BI__builtin_char_memchr:
4961 BuiltinID = Builtin::BI__builtin_memchr;
4964 case Builtin::BI__builtin___memcpy_chk: {
4970 llvm::APSInt Size = SizeResult.
Val.
getInt();
4971 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
4972 if (Size.ugt(DstSize))
4976 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
4977 auto *I =
Builder.CreateMemCpy(Dest, Src, SizeVal,
false);
4982 case Builtin::BI__builtin_objc_memmove_collectable: {
4986 CGM.getObjCRuntime().EmitGCMemmoveCollectable(*
this,
4987 DestAddr, SrcAddr, SizeVal);
4991 case Builtin::BI__builtin___memmove_chk: {
4997 llvm::APSInt Size = SizeResult.
Val.
getInt();
4998 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
4999 if (Size.ugt(DstSize))
5003 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
5004 auto *I =
Builder.CreateMemMove(Dest, Src, SizeVal,
false);
5009 case Builtin::BI__builtin_trivially_relocate:
5010 case Builtin::BImemmove:
5011 case Builtin::BI__builtin_memmove: {
5015 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_trivially_relocate)
5025 auto *I =
Builder.CreateMemMove(Dest, Src, SizeVal,
false);
5029 case Builtin::BImemset:
5030 case Builtin::BI__builtin_memset: {
5037 auto *I =
Builder.CreateMemSet(Dest, ByteVal, SizeVal,
false);
5041 case Builtin::BI__builtin_memset_inline: {
5050 auto *I =
Builder.CreateMemSetInline(Dest, ByteVal, Size);
5054 case Builtin::BI__builtin___memset_chk: {
5060 llvm::APSInt Size = SizeResult.
Val.
getInt();
5061 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
5062 if (Size.ugt(DstSize))
5067 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
5068 auto *I =
Builder.CreateMemSet(Dest, ByteVal, SizeVal,
false);
5072 case Builtin::BI__builtin_wmemchr: {
5083 BasicBlock *Entry =
Builder.GetInsertBlock();
5088 Builder.CreateCondBr(SizeEq0, Exit, CmpEq);
5092 StrPhi->addIncoming(Str, Entry);
5094 SizePhi->addIncoming(Size, Entry);
5097 Value *StrCh =
Builder.CreateAlignedLoad(WCharTy, StrPhi, WCharAlign);
5098 Value *FoundChr =
Builder.CreateConstInBoundsGEP1_32(WCharTy, StrPhi, 0);
5103 Value *NextStr =
Builder.CreateConstInBoundsGEP1_32(WCharTy, StrPhi, 1);
5105 Value *NextSizeEq0 =
5106 Builder.CreateICmpEQ(NextSize, ConstantInt::get(
SizeTy, 0));
5107 Builder.CreateCondBr(NextSizeEq0, Exit, CmpEq);
5108 StrPhi->addIncoming(NextStr,
Next);
5109 SizePhi->addIncoming(NextSize,
Next);
5113 Ret->addIncoming(llvm::Constant::getNullValue(Str->
getType()), Entry);
5114 Ret->addIncoming(llvm::Constant::getNullValue(Str->
getType()),
Next);
5115 Ret->addIncoming(FoundChr, CmpEq);
5118 case Builtin::BI__builtin_wmemcmp: {
5130 BasicBlock *Entry =
Builder.GetInsertBlock();
5136 Builder.CreateCondBr(SizeEq0, Exit, CmpGT);
5140 DstPhi->addIncoming(Dst, Entry);
5142 SrcPhi->addIncoming(Src, Entry);
5144 SizePhi->addIncoming(Size, Entry);
5147 Value *DstCh =
Builder.CreateAlignedLoad(WCharTy, DstPhi, WCharAlign);
5148 Value *SrcCh =
Builder.CreateAlignedLoad(WCharTy, SrcPhi, WCharAlign);
5150 Builder.CreateCondBr(DstGtSrc, Exit, CmpLT);
5157 Value *NextDst =
Builder.CreateConstInBoundsGEP1_32(WCharTy, DstPhi, 1);
5158 Value *NextSrc =
Builder.CreateConstInBoundsGEP1_32(WCharTy, SrcPhi, 1);
5160 Value *NextSizeEq0 =
5161 Builder.CreateICmpEQ(NextSize, ConstantInt::get(
SizeTy, 0));
5162 Builder.CreateCondBr(NextSizeEq0, Exit, CmpGT);
5163 DstPhi->addIncoming(NextDst,
Next);
5164 SrcPhi->addIncoming(NextSrc,
Next);
5165 SizePhi->addIncoming(NextSize,
Next);
5169 Ret->addIncoming(ConstantInt::get(
IntTy, 0), Entry);
5170 Ret->addIncoming(ConstantInt::get(
IntTy, 1), CmpGT);
5171 Ret->addIncoming(ConstantInt::getAllOnesValue(
IntTy), CmpLT);
5172 Ret->addIncoming(ConstantInt::get(
IntTy, 0),
Next);
5175 case Builtin::BI__builtin_dwarf_cfa: {
5186 Function *F =
CGM.getIntrinsic(Intrinsic::eh_dwarf_cfa);
5188 llvm::ConstantInt::get(
Int32Ty, Offset)));
5190 case Builtin::BI__builtin_return_address: {
5195 CGM.getIntrinsic(Intrinsic::returnaddress, {
CGM.ProgramPtrTy});
5198 case Builtin::BI_ReturnAddress: {
5200 CGM.getIntrinsic(Intrinsic::returnaddress, {
CGM.ProgramPtrTy});
5203 case Builtin::BI__builtin_frame_address: {
5210 case Builtin::BI__builtin_stack_address: {
5214 case Builtin::BI__builtin_extract_return_addr: {
5219 case Builtin::BI__builtin_frob_return_addr: {
5224 case Builtin::BI__builtin_dwarf_sp_column: {
5225 llvm::IntegerType *Ty
5229 CGM.ErrorUnsupported(E,
"__builtin_dwarf_sp_column");
5234 case Builtin::BI__builtin_init_dwarf_reg_size_table: {
5237 CGM.ErrorUnsupported(E,
"__builtin_init_dwarf_reg_size_table");
5240 case Builtin::BI__builtin_eh_return: {
5245 assert((
IntTy->getBitWidth() == 32 ||
IntTy->getBitWidth() == 64) &&
5246 "LLVM's __builtin_eh_return only supports 32- and 64-bit variants");
5248 CGM.getIntrinsic(
IntTy->getBitWidth() == 32 ? Intrinsic::eh_return_i32
5249 : Intrinsic::eh_return_i64);
5258 case Builtin::BI__builtin_unwind_init: {
5259 Function *F =
CGM.getIntrinsic(Intrinsic::eh_unwind_init);
5263 case Builtin::BI__builtin_extend_pointer: {
5288 case Builtin::BI__builtin_setjmp: {
5296 Function *F =
CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
5303 ConstantInt::get(
Int32Ty, 0));
5304 Builder.CreateStore(FrameAddr, Buf);
5311 Builder.CreateStore(StackAddr, StackSaveSlot);
5314 Function *F =
CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
5317 case Builtin::BI__builtin_longjmp: {
5321 Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::eh_sjlj_longjmp), Buf);
5331 case Builtin::BI__builtin_launder: {
5336 Ptr =
Builder.CreateLaunderInvariantGroup(Ptr);
5340 case Builtin::BI__builtin_clear_padding: {
5346 for (
const auto &Interval : Padding)
5351 case Builtin::BI__sync_fetch_and_add:
5352 case Builtin::BI__sync_fetch_and_sub:
5353 case Builtin::BI__sync_fetch_and_or:
5354 case Builtin::BI__sync_fetch_and_and:
5355 case Builtin::BI__sync_fetch_and_xor:
5356 case Builtin::BI__sync_fetch_and_nand:
5357 case Builtin::BI__sync_add_and_fetch:
5358 case Builtin::BI__sync_sub_and_fetch:
5359 case Builtin::BI__sync_and_and_fetch:
5360 case Builtin::BI__sync_or_and_fetch:
5361 case Builtin::BI__sync_xor_and_fetch:
5362 case Builtin::BI__sync_nand_and_fetch:
5363 case Builtin::BI__sync_val_compare_and_swap:
5364 case Builtin::BI__sync_bool_compare_and_swap:
5365 case Builtin::BI__sync_lock_test_and_set:
5366 case Builtin::BI__sync_lock_release:
5367 case Builtin::BI__sync_swap:
5368 llvm_unreachable(
"Shouldn't make it through sema");
5369 case Builtin::BI__sync_fetch_and_add_1:
5370 case Builtin::BI__sync_fetch_and_add_2:
5371 case Builtin::BI__sync_fetch_and_add_4:
5372 case Builtin::BI__sync_fetch_and_add_8:
5373 case Builtin::BI__sync_fetch_and_add_16:
5375 case Builtin::BI__sync_fetch_and_sub_1:
5376 case Builtin::BI__sync_fetch_and_sub_2:
5377 case Builtin::BI__sync_fetch_and_sub_4:
5378 case Builtin::BI__sync_fetch_and_sub_8:
5379 case Builtin::BI__sync_fetch_and_sub_16:
5381 case Builtin::BI__sync_fetch_and_or_1:
5382 case Builtin::BI__sync_fetch_and_or_2:
5383 case Builtin::BI__sync_fetch_and_or_4:
5384 case Builtin::BI__sync_fetch_and_or_8:
5385 case Builtin::BI__sync_fetch_and_or_16:
5387 case Builtin::BI__sync_fetch_and_and_1:
5388 case Builtin::BI__sync_fetch_and_and_2:
5389 case Builtin::BI__sync_fetch_and_and_4:
5390 case Builtin::BI__sync_fetch_and_and_8:
5391 case Builtin::BI__sync_fetch_and_and_16:
5393 case Builtin::BI__sync_fetch_and_xor_1:
5394 case Builtin::BI__sync_fetch_and_xor_2:
5395 case Builtin::BI__sync_fetch_and_xor_4:
5396 case Builtin::BI__sync_fetch_and_xor_8:
5397 case Builtin::BI__sync_fetch_and_xor_16:
5399 case Builtin::BI__sync_fetch_and_nand_1:
5400 case Builtin::BI__sync_fetch_and_nand_2:
5401 case Builtin::BI__sync_fetch_and_nand_4:
5402 case Builtin::BI__sync_fetch_and_nand_8:
5403 case Builtin::BI__sync_fetch_and_nand_16:
5407 case Builtin::BI__sync_fetch_and_min:
5409 case Builtin::BI__sync_fetch_and_max:
5411 case Builtin::BI__sync_fetch_and_umin:
5413 case Builtin::BI__sync_fetch_and_umax:
5416 case Builtin::BI__sync_add_and_fetch_1:
5417 case Builtin::BI__sync_add_and_fetch_2:
5418 case Builtin::BI__sync_add_and_fetch_4:
5419 case Builtin::BI__sync_add_and_fetch_8:
5420 case Builtin::BI__sync_add_and_fetch_16:
5422 llvm::Instruction::Add);
5423 case Builtin::BI__sync_sub_and_fetch_1:
5424 case Builtin::BI__sync_sub_and_fetch_2:
5425 case Builtin::BI__sync_sub_and_fetch_4:
5426 case Builtin::BI__sync_sub_and_fetch_8:
5427 case Builtin::BI__sync_sub_and_fetch_16:
5429 llvm::Instruction::Sub);
5430 case Builtin::BI__sync_and_and_fetch_1:
5431 case Builtin::BI__sync_and_and_fetch_2:
5432 case Builtin::BI__sync_and_and_fetch_4:
5433 case Builtin::BI__sync_and_and_fetch_8:
5434 case Builtin::BI__sync_and_and_fetch_16:
5436 llvm::Instruction::And);
5437 case Builtin::BI__sync_or_and_fetch_1:
5438 case Builtin::BI__sync_or_and_fetch_2:
5439 case Builtin::BI__sync_or_and_fetch_4:
5440 case Builtin::BI__sync_or_and_fetch_8:
5441 case Builtin::BI__sync_or_and_fetch_16:
5443 llvm::Instruction::Or);
5444 case Builtin::BI__sync_xor_and_fetch_1:
5445 case Builtin::BI__sync_xor_and_fetch_2:
5446 case Builtin::BI__sync_xor_and_fetch_4:
5447 case Builtin::BI__sync_xor_and_fetch_8:
5448 case Builtin::BI__sync_xor_and_fetch_16:
5450 llvm::Instruction::Xor);
5451 case Builtin::BI__sync_nand_and_fetch_1:
5452 case Builtin::BI__sync_nand_and_fetch_2:
5453 case Builtin::BI__sync_nand_and_fetch_4:
5454 case Builtin::BI__sync_nand_and_fetch_8:
5455 case Builtin::BI__sync_nand_and_fetch_16:
5457 llvm::Instruction::And,
true);
5459 case Builtin::BI__sync_val_compare_and_swap_1:
5460 case Builtin::BI__sync_val_compare_and_swap_2:
5461 case Builtin::BI__sync_val_compare_and_swap_4:
5462 case Builtin::BI__sync_val_compare_and_swap_8:
5463 case Builtin::BI__sync_val_compare_and_swap_16:
5465 *
this, E,
false, AtomicOrdering::SequentiallyConsistent,
5466 AtomicOrdering::SequentiallyConsistent));
5468 case Builtin::BI__sync_bool_compare_and_swap_1:
5469 case Builtin::BI__sync_bool_compare_and_swap_2:
5470 case Builtin::BI__sync_bool_compare_and_swap_4:
5471 case Builtin::BI__sync_bool_compare_and_swap_8:
5472 case Builtin::BI__sync_bool_compare_and_swap_16:
5474 *
this, E,
true, AtomicOrdering::SequentiallyConsistent,
5475 AtomicOrdering::SequentiallyConsistent));
5477 case Builtin::BI__sync_swap_1:
5478 case Builtin::BI__sync_swap_2:
5479 case Builtin::BI__sync_swap_4:
5480 case Builtin::BI__sync_swap_8:
5481 case Builtin::BI__sync_swap_16:
5484 case Builtin::BI__sync_lock_test_and_set_1:
5485 case Builtin::BI__sync_lock_test_and_set_2:
5486 case Builtin::BI__sync_lock_test_and_set_4:
5487 case Builtin::BI__sync_lock_test_and_set_8:
5488 case Builtin::BI__sync_lock_test_and_set_16:
5491 case Builtin::BI__sync_lock_release_1:
5492 case Builtin::BI__sync_lock_release_2:
5493 case Builtin::BI__sync_lock_release_4:
5494 case Builtin::BI__sync_lock_release_8:
5495 case Builtin::BI__sync_lock_release_16: {
5501 llvm::StoreInst *Store =
5502 Builder.CreateStore(llvm::Constant::getNullValue(ITy), Ptr);
5503 Store->setAtomic(llvm::AtomicOrdering::Release);
5507 case Builtin::BI__sync_synchronize: {
5515 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent);
5519 case Builtin::BI__builtin_nontemporal_load:
5521 case Builtin::BI__builtin_nontemporal_store:
5523 case Builtin::BI__c11_atomic_is_lock_free:
5524 case Builtin::BI__atomic_is_lock_free: {
5528 const char *LibCallName =
"__atomic_is_lock_free";
5532 if (BuiltinID == Builtin::BI__atomic_is_lock_free)
5539 CGM.getTypes().arrangeBuiltinFunctionCall(E->
getType(), Args);
5540 llvm::FunctionType *FTy =
CGM.getTypes().GetFunctionType(FuncInfo);
5541 llvm::FunctionCallee
Func =
CGM.CreateRuntimeFunction(FTy, LibCallName);
5546 case Builtin::BI__atomic_thread_fence:
5547 case Builtin::BI__atomic_signal_fence:
5548 case Builtin::BI__c11_atomic_thread_fence:
5549 case Builtin::BI__c11_atomic_signal_fence: {
5550 llvm::SyncScope::ID SSID;
5551 if (BuiltinID == Builtin::BI__atomic_signal_fence ||
5552 BuiltinID == Builtin::BI__c11_atomic_signal_fence)
5553 SSID = llvm::SyncScope::SingleThread;
5555 SSID = llvm::SyncScope::System;
5580 llvm::BasicBlock *AcquireBB, *ReleaseBB, *AcqRelBB, *SeqCstBB;
5587 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5588 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, ContBB);
5590 Builder.SetInsertPoint(AcquireBB);
5593 SI->addCase(
Builder.getInt32(1), AcquireBB);
5594 SI->addCase(
Builder.getInt32(2), AcquireBB);
5596 Builder.SetInsertPoint(ReleaseBB);
5599 SI->addCase(
Builder.getInt32(3), ReleaseBB);
5601 Builder.SetInsertPoint(AcqRelBB);
5604 SI->addCase(
Builder.getInt32(4), AcqRelBB);
5606 Builder.SetInsertPoint(SeqCstBB);
5609 SI->addCase(
Builder.getInt32(5), SeqCstBB);
5611 Builder.SetInsertPoint(ContBB);
5614 case Builtin::BI__scoped_atomic_thread_fence: {
5619 auto Ord = dyn_cast<llvm::ConstantInt>(Order);
5620 auto Scp = dyn_cast<llvm::ConstantInt>(
Scope);
5622 SyncScope SS = ScopeModel->isValid(Scp->getZExtValue())
5623 ? ScopeModel->map(Scp->getZExtValue())
5624 : ScopeModel->map(ScopeModel->getFallBackValue());
5625 switch (Ord->getZExtValue()) {
5646 llvm::AtomicOrdering::AcquireRelease,
5653 llvm::AtomicOrdering::SequentiallyConsistent,
5665 switch (Ord->getZExtValue()) {
5668 ContBB->eraseFromParent();
5672 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5673 llvm::AtomicOrdering::Acquire);
5676 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5677 llvm::AtomicOrdering::Release);
5680 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5681 llvm::AtomicOrdering::AcquireRelease);
5684 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5685 llvm::AtomicOrdering::SequentiallyConsistent);
5694 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5695 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, ContBB);
5696 SI->addCase(
Builder.getInt32(1), AcquireBB);
5697 SI->addCase(
Builder.getInt32(2), AcquireBB);
5698 SI->addCase(
Builder.getInt32(3), ReleaseBB);
5699 SI->addCase(
Builder.getInt32(4), AcqRelBB);
5700 SI->addCase(
Builder.getInt32(5), SeqCstBB);
5702 OrderBBs.emplace_back(AcquireBB, llvm::AtomicOrdering::Acquire);
5703 OrderBBs.emplace_back(ReleaseBB, llvm::AtomicOrdering::Release);
5704 OrderBBs.emplace_back(AcqRelBB, llvm::AtomicOrdering::AcquireRelease);
5705 OrderBBs.emplace_back(SeqCstBB,
5706 llvm::AtomicOrdering::SequentiallyConsistent);
5709 for (
auto &[OrderBB, Ordering] : OrderBBs) {
5710 Builder.SetInsertPoint(OrderBB);
5712 SyncScope SS = ScopeModel->isValid(Scp->getZExtValue())
5713 ? ScopeModel->map(Scp->getZExtValue())
5714 : ScopeModel->map(ScopeModel->getFallBackValue());
5720 llvm::DenseMap<unsigned, llvm::BasicBlock *> BBs;
5721 for (
unsigned Scp : ScopeModel->getRuntimeValues())
5725 llvm::SwitchInst *SI =
Builder.CreateSwitch(SC, ContBB);
5726 for (
unsigned Scp : ScopeModel->getRuntimeValues()) {
5728 SI->addCase(
Builder.getInt32(Scp), B);
5739 Builder.SetInsertPoint(ContBB);
5743 case Builtin::BI__builtin_signbit:
5744 case Builtin::BI__builtin_signbitf:
5745 case Builtin::BI__builtin_signbitl: {
5750 case Builtin::BI__warn_memset_zero_len:
5752 case Builtin::BI__annotation: {
5757 assert(Str->getCharByteWidth() == 2 || Str->getCharByteWidth() == 4);
5758 StringRef WideBytes = Str->getBytes();
5759 std::string StrUtf8;
5761 (Str->getCharByteWidth() == 2)
5762 ? convertUTF16ToUTF8String(
5763 ArrayRef(WideBytes.data(), WideBytes.size()), StrUtf8)
5764 : convertUTF32ToUTF8String(
5765 ArrayRef(WideBytes.data(), WideBytes.size()), StrUtf8);
5767 CGM.ErrorUnsupported(E,
"non-Unicode __annotation argument");
5770 Strings.push_back(llvm::MDString::get(
getLLVMContext(), StrUtf8));
5774 llvm::Function *F =
CGM.getIntrinsic(Intrinsic::codeview_annotation, {});
5779 case Builtin::BI__builtin_annotation: {
5781 llvm::Function *F =
CGM.getIntrinsic(
5782 Intrinsic::annotation, {AnnVal->getType(),
CGM.ConstGlobalsPtrTy});
5791 case Builtin::BI__builtin_addcb:
5792 case Builtin::BI__builtin_addcs:
5793 case Builtin::BI__builtin_addc:
5794 case Builtin::BI__builtin_addcl:
5795 case Builtin::BI__builtin_addcll:
5796 case Builtin::BI__builtin_subcb:
5797 case Builtin::BI__builtin_subcs:
5798 case Builtin::BI__builtin_subc:
5799 case Builtin::BI__builtin_subcl:
5800 case Builtin::BI__builtin_subcll: {
5826 Intrinsic::ID IntrinsicId;
5827 switch (BuiltinID) {
5828 default: llvm_unreachable(
"Unknown multiprecision builtin id.");
5829 case Builtin::BI__builtin_addcb:
5830 case Builtin::BI__builtin_addcs:
5831 case Builtin::BI__builtin_addc:
5832 case Builtin::BI__builtin_addcl:
5833 case Builtin::BI__builtin_addcll:
5834 IntrinsicId = Intrinsic::uadd_with_overflow;
5836 case Builtin::BI__builtin_subcb:
5837 case Builtin::BI__builtin_subcs:
5838 case Builtin::BI__builtin_subc:
5839 case Builtin::BI__builtin_subcl:
5840 case Builtin::BI__builtin_subcll:
5841 IntrinsicId = Intrinsic::usub_with_overflow;
5846 llvm::Value *Carry1;
5849 llvm::Value *Carry2;
5851 Sum1, Carryin, Carry2);
5852 llvm::Value *CarryOut =
Builder.CreateZExt(
Builder.CreateOr(Carry1, Carry2),
5854 Builder.CreateStore(CarryOut, CarryOutPtr);
5858 case Builtin::BI__builtin_add_overflow:
5859 case Builtin::BI__builtin_sub_overflow:
5860 case Builtin::BI__builtin_mul_overflow: {
5868 WidthAndSignedness LeftInfo =
5870 WidthAndSignedness RightInfo =
5872 WidthAndSignedness ResultInfo =
5879 RightInfo, ResultArg, ResultQTy,
5885 *
this, LeftArg, LeftInfo, RightArg, RightInfo, ResultArg, ResultQTy,
5888 WidthAndSignedness EncompassingInfo =
5891 llvm::Type *EncompassingLLVMTy =
5892 llvm::IntegerType::get(
CGM.getLLVMContext(), EncompassingInfo.Width);
5894 llvm::Type *ResultLLVMTy =
CGM.getTypes().ConvertType(ResultQTy);
5896 Intrinsic::ID IntrinsicId;
5897 switch (BuiltinID) {
5899 llvm_unreachable(
"Unknown overflow builtin id.");
5900 case Builtin::BI__builtin_add_overflow:
5901 IntrinsicId = EncompassingInfo.Signed ? Intrinsic::sadd_with_overflow
5902 : Intrinsic::uadd_with_overflow;
5904 case Builtin::BI__builtin_sub_overflow:
5905 IntrinsicId = EncompassingInfo.Signed ? Intrinsic::ssub_with_overflow
5906 : Intrinsic::usub_with_overflow;
5908 case Builtin::BI__builtin_mul_overflow:
5909 IntrinsicId = EncompassingInfo.Signed ? Intrinsic::smul_with_overflow
5910 : Intrinsic::umul_with_overflow;
5919 Left =
Builder.CreateIntCast(Left, EncompassingLLVMTy, LeftInfo.Signed);
5920 Right =
Builder.CreateIntCast(Right, EncompassingLLVMTy, RightInfo.Signed);
5923 llvm::Value *Overflow, *
Result;
5926 if (EncompassingInfo.Width > ResultInfo.Width) {
5929 llvm::Value *ResultTrunc =
Builder.CreateTrunc(
Result, ResultLLVMTy);
5933 llvm::Value *ResultTruncExt =
Builder.CreateIntCast(
5934 ResultTrunc, EncompassingLLVMTy, ResultInfo.Signed);
5935 llvm::Value *TruncationOverflow =
5938 Overflow =
Builder.CreateOr(Overflow, TruncationOverflow);
5950 case Builtin::BI__builtin_uadd_overflow:
5951 case Builtin::BI__builtin_uaddl_overflow:
5952 case Builtin::BI__builtin_uaddll_overflow:
5953 case Builtin::BI__builtin_usub_overflow:
5954 case Builtin::BI__builtin_usubl_overflow:
5955 case Builtin::BI__builtin_usubll_overflow:
5956 case Builtin::BI__builtin_umul_overflow:
5957 case Builtin::BI__builtin_umull_overflow:
5958 case Builtin::BI__builtin_umulll_overflow:
5959 case Builtin::BI__builtin_sadd_overflow:
5960 case Builtin::BI__builtin_saddl_overflow:
5961 case Builtin::BI__builtin_saddll_overflow:
5962 case Builtin::BI__builtin_ssub_overflow:
5963 case Builtin::BI__builtin_ssubl_overflow:
5964 case Builtin::BI__builtin_ssubll_overflow:
5965 case Builtin::BI__builtin_smul_overflow:
5966 case Builtin::BI__builtin_smull_overflow:
5967 case Builtin::BI__builtin_smulll_overflow: {
5977 Intrinsic::ID IntrinsicId;
5978 switch (BuiltinID) {
5979 default: llvm_unreachable(
"Unknown overflow builtin id.");
5980 case Builtin::BI__builtin_uadd_overflow:
5981 case Builtin::BI__builtin_uaddl_overflow:
5982 case Builtin::BI__builtin_uaddll_overflow:
5983 IntrinsicId = Intrinsic::uadd_with_overflow;
5985 case Builtin::BI__builtin_usub_overflow:
5986 case Builtin::BI__builtin_usubl_overflow:
5987 case Builtin::BI__builtin_usubll_overflow:
5988 IntrinsicId = Intrinsic::usub_with_overflow;
5990 case Builtin::BI__builtin_umul_overflow:
5991 case Builtin::BI__builtin_umull_overflow:
5992 case Builtin::BI__builtin_umulll_overflow:
5993 IntrinsicId = Intrinsic::umul_with_overflow;
5995 case Builtin::BI__builtin_sadd_overflow:
5996 case Builtin::BI__builtin_saddl_overflow:
5997 case Builtin::BI__builtin_saddll_overflow:
5998 IntrinsicId = Intrinsic::sadd_with_overflow;
6000 case Builtin::BI__builtin_ssub_overflow:
6001 case Builtin::BI__builtin_ssubl_overflow:
6002 case Builtin::BI__builtin_ssubll_overflow:
6003 IntrinsicId = Intrinsic::ssub_with_overflow;
6005 case Builtin::BI__builtin_smul_overflow:
6006 case Builtin::BI__builtin_smull_overflow:
6007 case Builtin::BI__builtin_smulll_overflow:
6008 IntrinsicId = Intrinsic::smul_with_overflow;
6015 Builder.CreateStore(Sum, SumOutPtr);
6019 case Builtin::BIaddressof:
6020 case Builtin::BI__addressof:
6021 case Builtin::BI__builtin_addressof:
6023 case Builtin::BI__builtin_function_start:
6026 case Builtin::BI__builtin_operator_new:
6029 case Builtin::BI__builtin_operator_delete:
6034 case Builtin::BI__builtin_is_aligned:
6036 case Builtin::BI__builtin_align_up:
6038 case Builtin::BI__builtin_align_down:
6041 case Builtin::BI__noop:
6044 case Builtin::BI__builtin_call_with_static_chain: {
6051 case Builtin::BI_InterlockedExchange8:
6052 case Builtin::BI_InterlockedExchange16:
6053 case Builtin::BI_InterlockedExchange:
6054 case Builtin::BI_InterlockedExchangePointer:
6057 case Builtin::BI_InterlockedCompareExchangePointer:
6060 case Builtin::BI_InterlockedCompareExchangePointer_nf:
6063 case Builtin::BI_InterlockedCompareExchange8:
6064 case Builtin::BI_InterlockedCompareExchange16:
6065 case Builtin::BI_InterlockedCompareExchange:
6066 case Builtin::BI_InterlockedCompareExchange64:
6068 case Builtin::BI_InterlockedIncrement16:
6069 case Builtin::BI_InterlockedIncrement:
6072 case Builtin::BI_InterlockedDecrement16:
6073 case Builtin::BI_InterlockedDecrement:
6076 case Builtin::BI_InterlockedAnd8:
6077 case Builtin::BI_InterlockedAnd16:
6078 case Builtin::BI_InterlockedAnd:
6080 case Builtin::BI_InterlockedExchangeAdd8:
6081 case Builtin::BI_InterlockedExchangeAdd16:
6082 case Builtin::BI_InterlockedExchangeAdd:
6085 case Builtin::BI_InterlockedExchangeSub8:
6086 case Builtin::BI_InterlockedExchangeSub16:
6087 case Builtin::BI_InterlockedExchangeSub:
6090 case Builtin::BI_InterlockedOr8:
6091 case Builtin::BI_InterlockedOr16:
6092 case Builtin::BI_InterlockedOr:
6094 case Builtin::BI_InterlockedXor8:
6095 case Builtin::BI_InterlockedXor16:
6096 case Builtin::BI_InterlockedXor:
6099 case Builtin::BI_bittest64:
6100 case Builtin::BI_bittest:
6101 case Builtin::BI_bittestandcomplement64:
6102 case Builtin::BI_bittestandcomplement:
6103 case Builtin::BI_bittestandreset64:
6104 case Builtin::BI_bittestandreset:
6105 case Builtin::BI_bittestandset64:
6106 case Builtin::BI_bittestandset:
6107 case Builtin::BI_interlockedbittestandreset:
6108 case Builtin::BI_interlockedbittestandreset64:
6109 case Builtin::BI_interlockedbittestandreset64_acq:
6110 case Builtin::BI_interlockedbittestandreset64_rel:
6111 case Builtin::BI_interlockedbittestandreset64_nf:
6112 case Builtin::BI_interlockedbittestandset64:
6113 case Builtin::BI_interlockedbittestandset64_acq:
6114 case Builtin::BI_interlockedbittestandset64_rel:
6115 case Builtin::BI_interlockedbittestandset64_nf:
6116 case Builtin::BI_interlockedbittestandset:
6117 case Builtin::BI_interlockedbittestandset_acq:
6118 case Builtin::BI_interlockedbittestandset_rel:
6119 case Builtin::BI_interlockedbittestandset_nf:
6120 case Builtin::BI_interlockedbittestandreset_acq:
6121 case Builtin::BI_interlockedbittestandreset_rel:
6122 case Builtin::BI_interlockedbittestandreset_nf:
6127 case Builtin::BI__iso_volatile_load8:
6128 case Builtin::BI__iso_volatile_load16:
6129 case Builtin::BI__iso_volatile_load32:
6130 case Builtin::BI__iso_volatile_load64:
6132 case Builtin::BI__iso_volatile_store8:
6133 case Builtin::BI__iso_volatile_store16:
6134 case Builtin::BI__iso_volatile_store32:
6135 case Builtin::BI__iso_volatile_store64:
6138 case Builtin::BI__builtin_ptrauth_sign_constant:
6141 case Builtin::BI__builtin_ptrauth_auth:
6142 case Builtin::BI__builtin_ptrauth_auth_and_resign:
6143 case Builtin::BI__builtin_ptrauth_auth_with_pc_and_resign:
6144 case Builtin::BI__builtin_ptrauth_auth_load_relative_and_sign:
6145 case Builtin::BI__builtin_ptrauth_blend_discriminator:
6146 case Builtin::BI__builtin_ptrauth_sign_generic_data:
6147 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
6148 case Builtin::BI__builtin_ptrauth_strip: {
6155 llvm::Type *OrigValueType = Args[0]->getType();
6156 if (OrigValueType->isPointerTy())
6159 switch (BuiltinID) {
6160 case Builtin::BI__builtin_ptrauth_auth_with_pc_and_resign:
6163 if (Args[2]->
getType()->isPointerTy())
6165 if (Args[3]->
getType()->isPointerTy())
6167 if (Args[5]->
getType()->isPointerTy())
6171 case Builtin::BI__builtin_ptrauth_auth_and_resign:
6172 case Builtin::BI__builtin_ptrauth_auth_load_relative_and_sign:
6173 if (Args[4]->
getType()->isPointerTy())
6177 case Builtin::BI__builtin_ptrauth_auth:
6178 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
6179 if (Args[2]->
getType()->isPointerTy())
6183 case Builtin::BI__builtin_ptrauth_sign_generic_data:
6184 if (Args[1]->
getType()->isPointerTy())
6188 case Builtin::BI__builtin_ptrauth_blend_discriminator:
6189 case Builtin::BI__builtin_ptrauth_strip:
6194 auto IntrinsicID = [&]() ->
unsigned {
6195 switch (BuiltinID) {
6196 case Builtin::BI__builtin_ptrauth_auth:
6197 return Intrinsic::ptrauth_auth;
6198 case Builtin::BI__builtin_ptrauth_auth_and_resign:
6199 return Intrinsic::ptrauth_resign;
6200 case Builtin::BI__builtin_ptrauth_auth_with_pc_and_resign:
6201 return Intrinsic::ptrauth_auth_with_pc_and_resign;
6202 case Builtin::BI__builtin_ptrauth_auth_load_relative_and_sign:
6203 return Intrinsic::ptrauth_resign_load_relative;
6204 case Builtin::BI__builtin_ptrauth_blend_discriminator:
6205 return Intrinsic::ptrauth_blend;
6206 case Builtin::BI__builtin_ptrauth_sign_generic_data:
6207 return Intrinsic::ptrauth_sign_generic;
6208 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
6209 return Intrinsic::ptrauth_sign;
6210 case Builtin::BI__builtin_ptrauth_strip:
6211 return Intrinsic::ptrauth_strip;
6213 llvm_unreachable(
"bad ptrauth intrinsic");
6215 auto Intrinsic =
CGM.getIntrinsic(IntrinsicID);
6218 if (BuiltinID != Builtin::BI__builtin_ptrauth_sign_generic_data &&
6219 BuiltinID != Builtin::BI__builtin_ptrauth_blend_discriminator &&
6220 OrigValueType->isPointerTy()) {
6226 case Builtin::BI__builtin_get_vtable_pointer: {
6232 assert(ThisAddress.isValid());
6233 llvm::Value *VTablePointer =
6238 case Builtin::BI__exception_code:
6239 case Builtin::BI_exception_code:
6241 case Builtin::BI__exception_info:
6242 case Builtin::BI_exception_info:
6244 case Builtin::BI__abnormal_termination:
6245 case Builtin::BI_abnormal_termination:
6247 case Builtin::BI_setjmpex:
6252 case Builtin::BI_setjmp:
6264 case Builtin::BImove:
6265 case Builtin::BImove_if_noexcept:
6266 case Builtin::BIforward:
6267 case Builtin::BIforward_like:
6268 case Builtin::BIas_const:
6270 case Builtin::BI__GetExceptionInfo: {
6271 if (llvm::GlobalVariable *GV =
6277 case Builtin::BI__fastfail:
6280 case Builtin::BI__builtin_coro_id:
6282 case Builtin::BI__builtin_coro_promise:
6284 case Builtin::BI__builtin_coro_resume:
6287 case Builtin::BI__builtin_coro_frame:
6289 case Builtin::BI__builtin_coro_noop:
6291 case Builtin::BI__builtin_coro_free:
6293 case Builtin::BI__builtin_coro_destroy:
6296 case Builtin::BI__builtin_coro_done:
6298 case Builtin::BI__builtin_coro_alloc:
6300 case Builtin::BI__builtin_coro_begin:
6302 case Builtin::BI__builtin_coro_end:
6304 case Builtin::BI__builtin_coro_suspend:
6306 case Builtin::BI__builtin_coro_size:
6308 case Builtin::BI__builtin_coro_align:
6312 case Builtin::BIread_pipe:
6313 case Builtin::BIwrite_pipe: {
6321 unsigned GenericAS =
6323 llvm::Type *I8PTy = llvm::PointerType::get(
getLLVMContext(), GenericAS);
6327 const char *Name = (BuiltinID == Builtin::BIread_pipe) ?
"__read_pipe_2"
6332 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6333 Value *ACast =
Builder.CreateAddrSpaceCast(Arg1, I8PTy);
6336 {Arg0, ACast, PacketSize, PacketAlign}));
6339 "Illegal number of parameters to pipe function");
6340 const char *Name = (BuiltinID == Builtin::BIread_pipe) ?
"__read_pipe_4"
6343 llvm::Type *ArgTys[] = {Arg0->
getType(), Arg1->getType(),
Int32Ty, I8PTy,
6347 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6348 Value *ACast =
Builder.CreateAddrSpaceCast(Arg3, I8PTy);
6355 {Arg0, Arg1, Arg2, ACast, PacketSize, PacketAlign}));
6360 case Builtin::BIreserve_read_pipe:
6361 case Builtin::BIreserve_write_pipe:
6362 case Builtin::BIwork_group_reserve_read_pipe:
6363 case Builtin::BIwork_group_reserve_write_pipe:
6364 case Builtin::BIsub_group_reserve_read_pipe:
6365 case Builtin::BIsub_group_reserve_write_pipe: {
6368 if (BuiltinID == Builtin::BIreserve_read_pipe)
6369 Name =
"__reserve_read_pipe";
6370 else if (BuiltinID == Builtin::BIreserve_write_pipe)
6371 Name =
"__reserve_write_pipe";
6372 else if (BuiltinID == Builtin::BIwork_group_reserve_read_pipe)
6373 Name =
"__work_group_reserve_read_pipe";
6374 else if (BuiltinID == Builtin::BIwork_group_reserve_write_pipe)
6375 Name =
"__work_group_reserve_write_pipe";
6376 else if (BuiltinID == Builtin::BIsub_group_reserve_read_pipe)
6377 Name =
"__sub_group_reserve_read_pipe";
6379 Name =
"__sub_group_reserve_write_pipe";
6390 llvm::FunctionType *FTy =
6391 llvm::FunctionType::get(ReservedIDTy, ArgTys,
false);
6394 if (Arg1->getType() !=
Int32Ty)
6397 {Arg0, Arg1, PacketSize, PacketAlign}));
6401 case Builtin::BIcommit_read_pipe:
6402 case Builtin::BIcommit_write_pipe:
6403 case Builtin::BIwork_group_commit_read_pipe:
6404 case Builtin::BIwork_group_commit_write_pipe:
6405 case Builtin::BIsub_group_commit_read_pipe:
6406 case Builtin::BIsub_group_commit_write_pipe: {
6408 if (BuiltinID == Builtin::BIcommit_read_pipe)
6409 Name =
"__commit_read_pipe";
6410 else if (BuiltinID == Builtin::BIcommit_write_pipe)
6411 Name =
"__commit_write_pipe";
6412 else if (BuiltinID == Builtin::BIwork_group_commit_read_pipe)
6413 Name =
"__work_group_commit_read_pipe";
6414 else if (BuiltinID == Builtin::BIwork_group_commit_write_pipe)
6415 Name =
"__work_group_commit_write_pipe";
6416 else if (BuiltinID == Builtin::BIsub_group_commit_read_pipe)
6417 Name =
"__sub_group_commit_read_pipe";
6419 Name =
"__sub_group_commit_write_pipe";
6429 llvm::FunctionType *FTy = llvm::FunctionType::get(
6433 {Arg0, Arg1, PacketSize, PacketAlign}));
6436 case Builtin::BIget_pipe_num_packets:
6437 case Builtin::BIget_pipe_max_packets: {
6438 const char *BaseName;
6440 if (BuiltinID == Builtin::BIget_pipe_num_packets)
6441 BaseName =
"__get_pipe_num_packets";
6443 BaseName =
"__get_pipe_max_packets";
6444 std::string Name = std::string(BaseName) +
6445 std::string(PipeTy->isReadOnly() ?
"_ro" :
"_wo");
6453 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6456 {Arg0, PacketSize, PacketAlign}));
6460 case Builtin::BIto_global:
6461 case Builtin::BIto_local:
6462 case Builtin::BIto_private: {
6464 auto NewArgT = llvm::PointerType::get(
6467 auto NewRetT = llvm::PointerType::get(
6469 CGM.getContext().getTargetAddressSpace(
6471 auto FTy = llvm::FunctionType::get(NewRetT, {NewArgT},
false);
6472 llvm::Value *NewArg;
6473 if (Arg0->getType()->getPointerAddressSpace() !=
6474 NewArgT->getPointerAddressSpace())
6475 NewArg =
Builder.CreateAddrSpaceCast(Arg0, NewArgT);
6477 NewArg =
Builder.CreateBitOrPointerCast(Arg0, NewArgT);
6493 case Builtin::BIenqueue_kernel: {
6498 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6515 Range = Range->stripPointerCasts();
6517 llvm::Type *RangePtrTy = Range->getType();
6522 Name =
"__enqueue_kernel_basic";
6523 llvm::Type *ArgTys[] = {QueueTy,
Int32Ty, RangePtrTy, GenericVoidPtrTy,
6525 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6528 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(3));
6530 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6531 llvm::Value *
Block =
6532 Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6535 {Queue, Flags, Range, Kernel, Block});
6538 assert(NumArgs >= 5 &&
"Invalid enqueue_kernel signature");
6542 auto CreateArrayForSizeVar =
6543 [=](
unsigned First) -> std::pair<llvm::Value *, llvm::Value *> {
6544 llvm::APInt ArraySize(32, NumArgs -
First);
6546 getContext().getSizeType(), ArraySize,
nullptr,
6550 llvm::Value *Alloca = Tmp.getPointer();
6551 llvm::Value *ElemPtr;
6555 auto *
Zero = llvm::ConstantInt::get(
IntTy, 0);
6556 for (
unsigned I =
First; I < NumArgs; ++I) {
6557 auto *Index = llvm::ConstantInt::get(
IntTy, I -
First);
6559 Builder.CreateGEP(Tmp.getElementType(), Alloca, {Zero, Index});
6565 V, GEP,
CGM.getDataLayout().getPrefTypeAlign(
SizeTy));
6567 return {ElemPtr, Alloca};
6573 Name =
"__enqueue_kernel_varargs";
6575 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(3));
6577 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6578 auto *
Block =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6579 auto [ElemPtr, TmpPtr] = CreateArrayForSizeVar(4);
6583 llvm::Value *
const Args[] = {Queue, Flags,
6587 llvm::Type *
const ArgTys[] = {
6588 QueueTy,
IntTy, RangePtrTy, GenericVoidPtrTy,
6589 GenericVoidPtrTy,
IntTy, ElemPtr->getType()};
6591 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6599 llvm::PointerType *PtrTy = llvm::PointerType::get(
6600 CGM.getLLVMContext(),
6603 llvm::Value *NumEvents =
6609 llvm::Value *EventWaitList =
nullptr;
6612 EventWaitList = llvm::ConstantPointerNull::get(PtrTy);
6619 EventWaitList =
Builder.CreatePointerCast(EventWaitList, PtrTy);
6621 llvm::Value *EventRet =
nullptr;
6624 EventRet = llvm::ConstantPointerNull::get(PtrTy);
6631 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(6));
6633 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6634 llvm::Value *
Block =
6635 Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6637 std::vector<llvm::Type *> ArgTys = {
6639 PtrTy, PtrTy, GenericVoidPtrTy, GenericVoidPtrTy};
6641 std::vector<llvm::Value *> Args = {Queue, Flags, Range,
6642 NumEvents, EventWaitList, EventRet,
6647 Name =
"__enqueue_kernel_basic_events";
6648 llvm::FunctionType *FTy =
6649 llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6655 Args.push_back(ConstantInt::get(
Int32Ty, NumArgs - 7));
6657 Name =
"__enqueue_kernel_events_varargs";
6659 auto [ElemPtr, TmpPtr] = CreateArrayForSizeVar(7);
6660 Args.push_back(ElemPtr);
6661 ArgTys.push_back(ElemPtr->getType());
6663 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6669 llvm_unreachable(
"Unexpected enqueue_kernel signature");
6673 case Builtin::BIget_kernel_work_group_size: {
6674 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6677 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(0));
6679 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6680 Value *Arg =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6682 CGM.CreateRuntimeFunction(
6683 llvm::FunctionType::get(
IntTy, {GenericVoidPtrTy, GenericVoidPtrTy},
6685 "__get_kernel_work_group_size_impl"),
6688 case Builtin::BIget_kernel_preferred_work_group_size_multiple: {
6689 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6692 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(0));
6694 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6695 Value *Arg =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6697 CGM.CreateRuntimeFunction(
6698 llvm::FunctionType::get(
IntTy, {GenericVoidPtrTy, GenericVoidPtrTy},
6700 "__get_kernel_preferred_work_group_size_multiple_impl"),
6703 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange:
6704 case Builtin::BIget_kernel_sub_group_count_for_ndrange: {
6705 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6710 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(1));
6712 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6715 BuiltinID == Builtin::BIget_kernel_max_sub_group_size_for_ndrange
6716 ?
"__get_kernel_max_sub_group_size_for_ndrange_impl"
6717 :
"__get_kernel_sub_group_count_for_ndrange_impl";
6719 CGM.CreateRuntimeFunction(
6720 llvm::FunctionType::get(
6721 IntTy, {NDRange->getType(), GenericVoidPtrTy, GenericVoidPtrTy},
6724 {NDRange, Kernel, Block}));
6726 case Builtin::BI__builtin_store_half:
6727 case Builtin::BI__builtin_store_halff: {
6735 case Builtin::BI__builtin_load_half: {
6740 case Builtin::BI__builtin_load_halff: {
6745 case Builtin::BI__builtin_printf:
6746 case Builtin::BIprintf:
6760 case Builtin::BI__builtin_canonicalize:
6761 case Builtin::BI__builtin_canonicalizef:
6762 case Builtin::BI__builtin_canonicalizef16:
6763 case Builtin::BI__builtin_canonicalizel:
6767 case Builtin::BI__builtin_thread_pointer: {
6768 if (!
getContext().getTargetInfo().isTLSSupported())
6769 CGM.ErrorUnsupported(E,
"__builtin_thread_pointer");
6772 {GlobalsInt8PtrTy}, {}));
6774 case Builtin::BI__builtin_os_log_format:
6777 case Builtin::BI__xray_customevent: {
6781 if (!
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
6785 if (
const auto *XRayAttr =
CurFuncDecl->getAttr<XRayInstrumentAttr>())
6789 Function *F =
CGM.getIntrinsic(Intrinsic::xray_customevent);
6790 auto FTy = F->getFunctionType();
6791 auto Arg0 = E->
getArg(0);
6793 auto Arg0Ty = Arg0->getType();
6794 auto PTy0 = FTy->getParamType(0);
6795 if (PTy0 != Arg0Val->getType()) {
6796 if (Arg0Ty->isArrayType())
6799 Arg0Val =
Builder.CreatePointerCast(Arg0Val, PTy0);
6802 auto PTy1 = FTy->getParamType(1);
6803 if (PTy1 != Arg1->getType())
6804 Arg1 =
Builder.CreateTruncOrBitCast(Arg1, PTy1);
6808 case Builtin::BI__xray_typedevent: {
6815 if (!
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
6819 if (
const auto *XRayAttr =
CurFuncDecl->getAttr<XRayInstrumentAttr>())
6823 Function *F =
CGM.getIntrinsic(Intrinsic::xray_typedevent);
6824 auto FTy = F->getFunctionType();
6826 auto PTy0 = FTy->getParamType(0);
6827 if (PTy0 != Arg0->getType())
6828 Arg0 =
Builder.CreateTruncOrBitCast(Arg0, PTy0);
6829 auto Arg1 = E->
getArg(1);
6831 auto Arg1Ty = Arg1->getType();
6832 auto PTy1 = FTy->getParamType(1);
6833 if (PTy1 != Arg1Val->getType()) {
6834 if (Arg1Ty->isArrayType())
6837 Arg1Val =
Builder.CreatePointerCast(Arg1Val, PTy1);
6840 auto PTy2 = FTy->getParamType(2);
6841 if (PTy2 != Arg2->getType())
6842 Arg2 =
Builder.CreateTruncOrBitCast(Arg2, PTy2);
6846 case Builtin::BI__builtin_ms_va_start:
6847 case Builtin::BI__builtin_ms_va_end:
6850 BuiltinID == Builtin::BI__builtin_ms_va_start));
6852 case Builtin::BI__builtin_ms_va_copy: {
6869 case Builtin::BI__builtin_zos_va_start:
6870 case Builtin::BI__builtin_zos_va_end: {
6883 BuiltinID == Builtin::BI__builtin_zos_va_start));
6885 case Builtin::BI__builtin_zos_va_copy: {
6890 uint64_t SizeBytes =
6891 CGM.getDataLayout().getTypeAllocSize(VAListTy).getFixedValue();
6892 Value *SizeVal = llvm::ConstantInt::get(
Int64Ty, SizeBytes);
6893 Builder.CreateMemCpy(Dest, Src, SizeVal,
false);
6897 case Builtin::BI__builtin_get_device_side_mangled_name: {
6898 auto Name =
CGM.getCUDARuntime().getDeviceSideName(
6900 auto Str =
CGM.GetAddrOfConstantCString(Name,
"");
6910 BI.isLibFunction(BuiltinID))
6912 CGM.getBuiltinLibFunction(FD, BuiltinID));
6916 if (BI.isPredefinedLibFunction(BuiltinID))
6926 if (
unsigned VectorWidth =
getContext().BuiltinInfo.getRequiredVectorWidth(BuiltinID))
6927 LargestVectorWidth = std::max(LargestVectorWidth, VectorWidth);
6931 Intrinsic::ID IntrinsicID = Intrinsic::not_intrinsic;
6934 if (!Prefix.empty()) {
6935 IntrinsicID = Intrinsic::getIntrinsicForClangBuiltin(Prefix.data(), Name);
6936 if (IntrinsicID == Intrinsic::not_intrinsic && Prefix ==
"spv" &&
6938 IntrinsicID = Intrinsic::getIntrinsicForClangBuiltin(
"amdgcn", Name);
6942 if (IntrinsicID == Intrinsic::not_intrinsic)
6943 IntrinsicID = Intrinsic::getIntrinsicForMSBuiltin(Prefix.data(), Name);
6946 if (IntrinsicID != Intrinsic::not_intrinsic) {
6951 unsigned ICEArguments = 0;
6957 llvm::FunctionType *FTy = F->getFunctionType();
6959 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
6963 llvm::Type *PTy = FTy->getParamType(i);
6964 if (PTy != ArgValue->
getType()) {
6966 if (
auto *PtrTy = dyn_cast<llvm::PointerType>(PTy)) {
6967 if (PtrTy->getAddressSpace() !=
6968 ArgValue->
getType()->getPointerAddressSpace()) {
6969 ArgValue =
Builder.CreateAddrSpaceCast(
6971 PtrTy->getAddressSpace()));
6977 if (PTy->isX86_AMXTy())
6978 ArgValue =
Builder.CreateIntrinsic(Intrinsic::x86_cast_vector_to_tile,
6979 {ArgValue->
getType()}, {ArgValue});
6981 ArgValue =
Builder.CreateBitCast(ArgValue, PTy);
6984 Args.push_back(ArgValue);
6992 llvm::Type *RetTy =
VoidTy;
6996 if (RetTy !=
V->getType()) {
6998 if (
auto *PtrTy = dyn_cast<llvm::PointerType>(RetTy)) {
6999 if (PtrTy->getAddressSpace() !=
V->getType()->getPointerAddressSpace()) {
7002 PtrTy->getAddressSpace()));
7008 if (
V->getType()->isX86_AMXTy())
7009 V =
Builder.CreateIntrinsic(Intrinsic::x86_cast_tile_to_vector, {RetTy},
7015 if (RetTy->isVoidTy())
7035 if (
V->getType()->isVoidTy())
7042 llvm_unreachable(
"No current target builtin returns complex");
7044 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
7051 if (
V->getType()->isVoidTy())
7058 llvm_unreachable(
"No current hlsl builtin returns complex");
7060 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");