2950 assert(!
getContext().BuiltinInfo.isImmediate(BuiltinID) &&
2951 "Should not codegen for consteval builtins");
2958 !
Result.hasSideEffects()) {
2962 if (
Result.Val.isFloat())
2972 &
getTarget().getLongDoubleFormat() == &llvm::APFloat::IEEEquad())
2979 const unsigned BuiltinIDIfNoAsmLabel =
2980 FD->
hasAttr<AsmLabelAttr>() ? 0 : BuiltinID;
2982 std::optional<bool> ErrnoOverriden;
2988 if (OP.hasMathErrnoOverride())
2989 ErrnoOverriden = OP.getMathErrnoOverride();
2995 bool IsOptimizationEnabled =
CGM.getCodeGenOpts().OptimizationLevel != 0;
2997 bool GenerateFPMathIntrinsics =
2999 BuiltinID,
CGM.getTriple(), ErrnoOverriden,
getLangOpts().MathErrno,
3000 OptNone, IsOptimizationEnabled);
3002 if (GenerateFPMathIntrinsics) {
3003 switch (BuiltinIDIfNoAsmLabel) {
3004 case Builtin::BIacos:
3005 case Builtin::BIacosf:
3006 case Builtin::BIacosl:
3007 case Builtin::BI__builtin_acos:
3008 case Builtin::BI__builtin_acosf:
3009 case Builtin::BI__builtin_acosf16:
3010 case Builtin::BI__builtin_acosl:
3011 case Builtin::BI__builtin_acosf128:
3012 case Builtin::BI__builtin_elementwise_acos:
3014 *
this, E, Intrinsic::acos, Intrinsic::experimental_constrained_acos));
3016 case Builtin::BIasin:
3017 case Builtin::BIasinf:
3018 case Builtin::BIasinl:
3019 case Builtin::BI__builtin_asin:
3020 case Builtin::BI__builtin_asinf:
3021 case Builtin::BI__builtin_asinf16:
3022 case Builtin::BI__builtin_asinl:
3023 case Builtin::BI__builtin_asinf128:
3024 case Builtin::BI__builtin_elementwise_asin:
3026 *
this, E, Intrinsic::asin, Intrinsic::experimental_constrained_asin));
3028 case Builtin::BIatan:
3029 case Builtin::BIatanf:
3030 case Builtin::BIatanl:
3031 case Builtin::BI__builtin_atan:
3032 case Builtin::BI__builtin_atanf:
3033 case Builtin::BI__builtin_atanf16:
3034 case Builtin::BI__builtin_atanl:
3035 case Builtin::BI__builtin_atanf128:
3036 case Builtin::BI__builtin_elementwise_atan:
3038 *
this, E, Intrinsic::atan, Intrinsic::experimental_constrained_atan));
3040 case Builtin::BIatan2:
3041 case Builtin::BIatan2f:
3042 case Builtin::BIatan2l:
3043 case Builtin::BI__builtin_atan2:
3044 case Builtin::BI__builtin_atan2f:
3045 case Builtin::BI__builtin_atan2f16:
3046 case Builtin::BI__builtin_atan2l:
3047 case Builtin::BI__builtin_atan2f128:
3048 case Builtin::BI__builtin_elementwise_atan2:
3050 *
this, E, Intrinsic::atan2,
3051 Intrinsic::experimental_constrained_atan2));
3053 case Builtin::BIceil:
3054 case Builtin::BIceilf:
3055 case Builtin::BIceill:
3056 case Builtin::BI__builtin_ceil:
3057 case Builtin::BI__builtin_ceilf:
3058 case Builtin::BI__builtin_ceilf16:
3059 case Builtin::BI__builtin_ceill:
3060 case Builtin::BI__builtin_ceilf128:
3061 case Builtin::BI__builtin_elementwise_ceil:
3064 Intrinsic::experimental_constrained_ceil));
3066 case Builtin::BIcopysign:
3067 case Builtin::BIcopysignf:
3068 case Builtin::BIcopysignl:
3069 case Builtin::BI__builtin_copysign:
3070 case Builtin::BI__builtin_copysignf:
3071 case Builtin::BI__builtin_copysignf16:
3072 case Builtin::BI__builtin_copysignl:
3073 case Builtin::BI__builtin_copysignf128:
3077 case Builtin::BIcos:
3078 case Builtin::BIcosf:
3079 case Builtin::BIcosl:
3080 case Builtin::BI__builtin_cos:
3081 case Builtin::BI__builtin_cosf:
3082 case Builtin::BI__builtin_cosf16:
3083 case Builtin::BI__builtin_cosl:
3084 case Builtin::BI__builtin_cosf128:
3085 case Builtin::BI__builtin_elementwise_cos:
3088 Intrinsic::experimental_constrained_cos));
3090 case Builtin::BIcosh:
3091 case Builtin::BIcoshf:
3092 case Builtin::BIcoshl:
3093 case Builtin::BI__builtin_cosh:
3094 case Builtin::BI__builtin_coshf:
3095 case Builtin::BI__builtin_coshf16:
3096 case Builtin::BI__builtin_coshl:
3097 case Builtin::BI__builtin_coshf128:
3098 case Builtin::BI__builtin_elementwise_cosh:
3100 *
this, E, Intrinsic::cosh, Intrinsic::experimental_constrained_cosh));
3102 case Builtin::BIexp:
3103 case Builtin::BIexpf:
3104 case Builtin::BIexpl:
3105 case Builtin::BI__builtin_exp:
3106 case Builtin::BI__builtin_expf:
3107 case Builtin::BI__builtin_expf16:
3108 case Builtin::BI__builtin_expl:
3109 case Builtin::BI__builtin_expf128:
3110 case Builtin::BI__builtin_elementwise_exp:
3113 Intrinsic::experimental_constrained_exp));
3115 case Builtin::BIexp2:
3116 case Builtin::BIexp2f:
3117 case Builtin::BIexp2l:
3118 case Builtin::BI__builtin_exp2:
3119 case Builtin::BI__builtin_exp2f:
3120 case Builtin::BI__builtin_exp2f16:
3121 case Builtin::BI__builtin_exp2l:
3122 case Builtin::BI__builtin_exp2f128:
3123 case Builtin::BI__builtin_elementwise_exp2:
3126 Intrinsic::experimental_constrained_exp2));
3127 case Builtin::BI__builtin_exp10:
3128 case Builtin::BI__builtin_exp10f:
3129 case Builtin::BI__builtin_exp10f16:
3130 case Builtin::BI__builtin_exp10l:
3131 case Builtin::BI__builtin_exp10f128:
3132 case Builtin::BI__builtin_elementwise_exp10: {
3134 if (
Builder.getIsFPConstrained())
3139 case Builtin::BIfabs:
3140 case Builtin::BIfabsf:
3141 case Builtin::BIfabsl:
3142 case Builtin::BI__builtin_fabs:
3143 case Builtin::BI__builtin_fabsf:
3144 case Builtin::BI__builtin_fabsf16:
3145 case Builtin::BI__builtin_fabsl:
3146 case Builtin::BI__builtin_fabsf128:
3150 case Builtin::BIfloor:
3151 case Builtin::BIfloorf:
3152 case Builtin::BIfloorl:
3153 case Builtin::BI__builtin_floor:
3154 case Builtin::BI__builtin_floorf:
3155 case Builtin::BI__builtin_floorf16:
3156 case Builtin::BI__builtin_floorl:
3157 case Builtin::BI__builtin_floorf128:
3158 case Builtin::BI__builtin_elementwise_floor:
3161 Intrinsic::experimental_constrained_floor));
3163 case Builtin::BIfma:
3164 case Builtin::BIfmaf:
3165 case Builtin::BIfmal:
3166 case Builtin::BI__builtin_fma:
3167 case Builtin::BI__builtin_fmaf:
3168 case Builtin::BI__builtin_fmaf16:
3169 case Builtin::BI__builtin_fmal:
3170 case Builtin::BI__builtin_fmaf128:
3171 case Builtin::BI__builtin_elementwise_fma:
3174 Intrinsic::experimental_constrained_fma));
3176 case Builtin::BIfmax:
3177 case Builtin::BIfmaxf:
3178 case Builtin::BIfmaxl:
3179 case Builtin::BI__builtin_fmax:
3180 case Builtin::BI__builtin_fmaxf:
3181 case Builtin::BI__builtin_fmaxf16:
3182 case Builtin::BI__builtin_fmaxl:
3183 case Builtin::BI__builtin_fmaxf128: {
3184 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
3185 Builder.getFastMathFlags().setNoSignedZeros();
3187 *
this, E, Intrinsic::maxnum,
3188 Intrinsic::experimental_constrained_maxnum));
3191 case Builtin::BIfmin:
3192 case Builtin::BIfminf:
3193 case Builtin::BIfminl:
3194 case Builtin::BI__builtin_fmin:
3195 case Builtin::BI__builtin_fminf:
3196 case Builtin::BI__builtin_fminf16:
3197 case Builtin::BI__builtin_fminl:
3198 case Builtin::BI__builtin_fminf128: {
3199 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
3200 Builder.getFastMathFlags().setNoSignedZeros();
3202 *
this, E, Intrinsic::minnum,
3203 Intrinsic::experimental_constrained_minnum));
3206 case Builtin::BIfmaximum_num:
3207 case Builtin::BIfmaximum_numf:
3208 case Builtin::BIfmaximum_numl:
3209 case Builtin::BI__builtin_fmaximum_num:
3210 case Builtin::BI__builtin_fmaximum_numf:
3211 case Builtin::BI__builtin_fmaximum_numf16:
3212 case Builtin::BI__builtin_fmaximum_numl:
3213 case Builtin::BI__builtin_fmaximum_numf128:
3217 case Builtin::BIfminimum_num:
3218 case Builtin::BIfminimum_numf:
3219 case Builtin::BIfminimum_numl:
3220 case Builtin::BI__builtin_fminimum_num:
3221 case Builtin::BI__builtin_fminimum_numf:
3222 case Builtin::BI__builtin_fminimum_numf16:
3223 case Builtin::BI__builtin_fminimum_numl:
3224 case Builtin::BI__builtin_fminimum_numf128:
3230 case Builtin::BIfmod:
3231 case Builtin::BIfmodf:
3232 case Builtin::BIfmodl:
3233 case Builtin::BI__builtin_fmod:
3234 case Builtin::BI__builtin_fmodf:
3235 case Builtin::BI__builtin_fmodf16:
3236 case Builtin::BI__builtin_fmodl:
3237 case Builtin::BI__builtin_fmodf128:
3238 case Builtin::BI__builtin_elementwise_fmod: {
3242 if (
Builder.getIsFPConstrained()) {
3243 Function *F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_frem,
3251 case Builtin::BIlog:
3252 case Builtin::BIlogf:
3253 case Builtin::BIlogl:
3254 case Builtin::BI__builtin_log:
3255 case Builtin::BI__builtin_logf:
3256 case Builtin::BI__builtin_logf16:
3257 case Builtin::BI__builtin_logl:
3258 case Builtin::BI__builtin_logf128:
3259 case Builtin::BI__builtin_elementwise_log:
3262 Intrinsic::experimental_constrained_log));
3264 case Builtin::BIlog10:
3265 case Builtin::BIlog10f:
3266 case Builtin::BIlog10l:
3267 case Builtin::BI__builtin_log10:
3268 case Builtin::BI__builtin_log10f:
3269 case Builtin::BI__builtin_log10f16:
3270 case Builtin::BI__builtin_log10l:
3271 case Builtin::BI__builtin_log10f128:
3272 case Builtin::BI__builtin_elementwise_log10:
3275 Intrinsic::experimental_constrained_log10));
3277 case Builtin::BIlog2:
3278 case Builtin::BIlog2f:
3279 case Builtin::BIlog2l:
3280 case Builtin::BI__builtin_log2:
3281 case Builtin::BI__builtin_log2f:
3282 case Builtin::BI__builtin_log2f16:
3283 case Builtin::BI__builtin_log2l:
3284 case Builtin::BI__builtin_log2f128:
3285 case Builtin::BI__builtin_elementwise_log2:
3288 Intrinsic::experimental_constrained_log2));
3290 case Builtin::BInearbyint:
3291 case Builtin::BInearbyintf:
3292 case Builtin::BInearbyintl:
3293 case Builtin::BI__builtin_nearbyint:
3294 case Builtin::BI__builtin_nearbyintf:
3295 case Builtin::BI__builtin_nearbyintl:
3296 case Builtin::BI__builtin_nearbyintf128:
3297 case Builtin::BI__builtin_elementwise_nearbyint:
3299 Intrinsic::nearbyint,
3300 Intrinsic::experimental_constrained_nearbyint));
3302 case Builtin::BIpow:
3303 case Builtin::BIpowf:
3304 case Builtin::BIpowl:
3305 case Builtin::BI__builtin_pow:
3306 case Builtin::BI__builtin_powf:
3307 case Builtin::BI__builtin_powf16:
3308 case Builtin::BI__builtin_powl:
3309 case Builtin::BI__builtin_powf128:
3310 case Builtin::BI__builtin_elementwise_pow:
3313 Intrinsic::experimental_constrained_pow));
3315 case Builtin::BIrint:
3316 case Builtin::BIrintf:
3317 case Builtin::BIrintl:
3318 case Builtin::BI__builtin_rint:
3319 case Builtin::BI__builtin_rintf:
3320 case Builtin::BI__builtin_rintf16:
3321 case Builtin::BI__builtin_rintl:
3322 case Builtin::BI__builtin_rintf128:
3323 case Builtin::BI__builtin_elementwise_rint:
3326 Intrinsic::experimental_constrained_rint));
3328 case Builtin::BIround:
3329 case Builtin::BIroundf:
3330 case Builtin::BIroundl:
3331 case Builtin::BI__builtin_round:
3332 case Builtin::BI__builtin_roundf:
3333 case Builtin::BI__builtin_roundf16:
3334 case Builtin::BI__builtin_roundl:
3335 case Builtin::BI__builtin_roundf128:
3336 case Builtin::BI__builtin_elementwise_round:
3339 Intrinsic::experimental_constrained_round));
3341 case Builtin::BIroundeven:
3342 case Builtin::BIroundevenf:
3343 case Builtin::BIroundevenl:
3344 case Builtin::BI__builtin_roundeven:
3345 case Builtin::BI__builtin_roundevenf:
3346 case Builtin::BI__builtin_roundevenf16:
3347 case Builtin::BI__builtin_roundevenl:
3348 case Builtin::BI__builtin_roundevenf128:
3349 case Builtin::BI__builtin_elementwise_roundeven:
3351 Intrinsic::roundeven,
3352 Intrinsic::experimental_constrained_roundeven));
3354 case Builtin::BIsin:
3355 case Builtin::BIsinf:
3356 case Builtin::BIsinl:
3357 case Builtin::BI__builtin_sin:
3358 case Builtin::BI__builtin_sinf:
3359 case Builtin::BI__builtin_sinf16:
3360 case Builtin::BI__builtin_sinl:
3361 case Builtin::BI__builtin_sinf128:
3362 case Builtin::BI__builtin_elementwise_sin:
3365 Intrinsic::experimental_constrained_sin));
3367 case Builtin::BIsinh:
3368 case Builtin::BIsinhf:
3369 case Builtin::BIsinhl:
3370 case Builtin::BI__builtin_sinh:
3371 case Builtin::BI__builtin_sinhf:
3372 case Builtin::BI__builtin_sinhf16:
3373 case Builtin::BI__builtin_sinhl:
3374 case Builtin::BI__builtin_sinhf128:
3375 case Builtin::BI__builtin_elementwise_sinh:
3377 *
this, E, Intrinsic::sinh, Intrinsic::experimental_constrained_sinh));
3379 case Builtin::BI__builtin_sincospi:
3380 case Builtin::BI__builtin_sincospif:
3381 case Builtin::BI__builtin_sincospil:
3382 if (
Builder.getIsFPConstrained())
3387 case Builtin::BIsincos:
3388 case Builtin::BIsincosf:
3389 case Builtin::BIsincosl:
3390 case Builtin::BI__builtin_sincos:
3391 case Builtin::BI__builtin_sincosf:
3392 case Builtin::BI__builtin_sincosf16:
3393 case Builtin::BI__builtin_sincosl:
3394 case Builtin::BI__builtin_sincosf128:
3395 if (
Builder.getIsFPConstrained())
3400 case Builtin::BIsqrt:
3401 case Builtin::BIsqrtf:
3402 case Builtin::BIsqrtl:
3403 case Builtin::BI__builtin_sqrt:
3404 case Builtin::BI__builtin_sqrtf:
3405 case Builtin::BI__builtin_sqrtf16:
3406 case Builtin::BI__builtin_sqrtl:
3407 case Builtin::BI__builtin_sqrtf128:
3408 case Builtin::BI__builtin_elementwise_sqrt: {
3410 *
this, E, Intrinsic::sqrt, Intrinsic::experimental_constrained_sqrt);
3415 case Builtin::BItan:
3416 case Builtin::BItanf:
3417 case Builtin::BItanl:
3418 case Builtin::BI__builtin_tan:
3419 case Builtin::BI__builtin_tanf:
3420 case Builtin::BI__builtin_tanf16:
3421 case Builtin::BI__builtin_tanl:
3422 case Builtin::BI__builtin_tanf128:
3423 case Builtin::BI__builtin_elementwise_tan:
3425 *
this, E, Intrinsic::tan, Intrinsic::experimental_constrained_tan));
3427 case Builtin::BItanh:
3428 case Builtin::BItanhf:
3429 case Builtin::BItanhl:
3430 case Builtin::BI__builtin_tanh:
3431 case Builtin::BI__builtin_tanhf:
3432 case Builtin::BI__builtin_tanhf16:
3433 case Builtin::BI__builtin_tanhl:
3434 case Builtin::BI__builtin_tanhf128:
3435 case Builtin::BI__builtin_elementwise_tanh:
3437 *
this, E, Intrinsic::tanh, Intrinsic::experimental_constrained_tanh));
3439 case Builtin::BItrunc:
3440 case Builtin::BItruncf:
3441 case Builtin::BItruncl:
3442 case Builtin::BI__builtin_trunc:
3443 case Builtin::BI__builtin_truncf:
3444 case Builtin::BI__builtin_truncf16:
3445 case Builtin::BI__builtin_truncl:
3446 case Builtin::BI__builtin_truncf128:
3447 case Builtin::BI__builtin_elementwise_trunc:
3450 Intrinsic::experimental_constrained_trunc));
3452 case Builtin::BIlround:
3453 case Builtin::BIlroundf:
3454 case Builtin::BIlroundl:
3455 case Builtin::BI__builtin_lround:
3456 case Builtin::BI__builtin_lroundf:
3457 case Builtin::BI__builtin_lroundl:
3458 case Builtin::BI__builtin_lroundf128:
3460 *
this, E, Intrinsic::lround,
3461 Intrinsic::experimental_constrained_lround));
3463 case Builtin::BIllround:
3464 case Builtin::BIllroundf:
3465 case Builtin::BIllroundl:
3466 case Builtin::BI__builtin_llround:
3467 case Builtin::BI__builtin_llroundf:
3468 case Builtin::BI__builtin_llroundl:
3469 case Builtin::BI__builtin_llroundf128:
3471 *
this, E, Intrinsic::llround,
3472 Intrinsic::experimental_constrained_llround));
3474 case Builtin::BIlrint:
3475 case Builtin::BIlrintf:
3476 case Builtin::BIlrintl:
3477 case Builtin::BI__builtin_lrint:
3478 case Builtin::BI__builtin_lrintf:
3479 case Builtin::BI__builtin_lrintl:
3480 case Builtin::BI__builtin_lrintf128:
3482 *
this, E, Intrinsic::lrint,
3483 Intrinsic::experimental_constrained_lrint));
3485 case Builtin::BIllrint:
3486 case Builtin::BIllrintf:
3487 case Builtin::BIllrintl:
3488 case Builtin::BI__builtin_llrint:
3489 case Builtin::BI__builtin_llrintf:
3490 case Builtin::BI__builtin_llrintl:
3491 case Builtin::BI__builtin_llrintf128:
3493 *
this, E, Intrinsic::llrint,
3494 Intrinsic::experimental_constrained_llrint));
3495 case Builtin::BI__builtin_ldexp:
3496 case Builtin::BI__builtin_ldexpf:
3497 case Builtin::BI__builtin_ldexpl:
3498 case Builtin::BI__builtin_ldexpf16:
3499 case Builtin::BI__builtin_ldexpf128:
3500 case Builtin::BI__builtin_elementwise_ldexp:
3502 *
this, E, Intrinsic::ldexp,
3503 Intrinsic::experimental_constrained_ldexp));
3512 Value *Val = A.emitRawPointer(*
this);
3516 if (
SanOpts.has(SanitizerKind::Alignment)) {
3518 SkippedChecks.
set(SanitizerKind::All);
3519 SkippedChecks.
clear(SanitizerKind::Alignment);
3522 if (
auto *CE = dyn_cast<ImplicitCastExpr>(Arg))
3523 if (CE->getCastKind() == CK_BitCast)
3524 Arg = CE->getSubExpr();
3530 switch (BuiltinIDIfNoAsmLabel) {
3532 case Builtin::BI__builtin___CFStringMakeConstantString:
3533 case Builtin::BI__builtin___NSStringMakeConstantString:
3535 case Builtin::BI__builtin_stdarg_start:
3536 case Builtin::BI__builtin_va_start:
3537 case Builtin::BI__va_start:
3538 case Builtin::BI__builtin_c23_va_start:
3539 case Builtin::BI__builtin_va_end:
3543 BuiltinID != Builtin::BI__builtin_va_end);
3545 case Builtin::BI__builtin_va_copy: {
3548 Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::vacopy, {DstPtr->getType()}),
3552 case Builtin::BIabs:
3553 case Builtin::BIlabs:
3554 case Builtin::BIllabs:
3555 case Builtin::BI__builtin_abs:
3556 case Builtin::BI__builtin_labs:
3557 case Builtin::BI__builtin_llabs: {
3558 bool SanitizeOverflow =
SanOpts.has(SanitizerKind::SignedIntegerOverflow);
3561 switch (
getLangOpts().getSignedOverflowBehavior()) {
3566 if (!SanitizeOverflow) {
3578 case Builtin::BI__builtin_complex: {
3583 case Builtin::BI__builtin_conj:
3584 case Builtin::BI__builtin_conjf:
3585 case Builtin::BI__builtin_conjl:
3586 case Builtin::BIconj:
3587 case Builtin::BIconjf:
3588 case Builtin::BIconjl: {
3590 Value *Real = ComplexVal.first;
3591 Value *Imag = ComplexVal.second;
3592 Imag =
Builder.CreateFNeg(Imag,
"neg");
3595 case Builtin::BI__builtin_creal:
3596 case Builtin::BI__builtin_crealf:
3597 case Builtin::BI__builtin_creall:
3598 case Builtin::BIcreal:
3599 case Builtin::BIcrealf:
3600 case Builtin::BIcreall: {
3605 case Builtin::BI__builtin_preserve_access_index: {
3610 CGM.Error(E->
getExprLoc(),
"using builtin_preserve_access_index() without -g");
3616 CGM.Error(E->
getExprLoc(),
"nested builtin_preserve_access_index() not supported");
3626 case Builtin::BI__builtin_cimag:
3627 case Builtin::BI__builtin_cimagf:
3628 case Builtin::BI__builtin_cimagl:
3629 case Builtin::BIcimag:
3630 case Builtin::BIcimagf:
3631 case Builtin::BIcimagl: {
3636 case Builtin::BI__builtin_clrsb:
3637 case Builtin::BI__builtin_clrsbl:
3638 case Builtin::BI__builtin_clrsbll: {
3649 Value *Tmp =
Builder.CreateSelect(IsNeg, Inverse, ArgValue);
3657 case Builtin::BI__builtin_ctzs:
3658 case Builtin::BI__builtin_ctz:
3659 case Builtin::BI__builtin_ctzl:
3660 case Builtin::BI__builtin_ctzll:
3661 case Builtin::BI__builtin_ctzg:
3662 case Builtin::BI__builtin_elementwise_ctzg: {
3664 (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_ctzg ||
3665 BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_ctzg) &&
3678 HasFallback ||
getTarget().isCLZForZeroUndef() ||
3679 BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_ctzg);
3681 if (
Result->getType() != ResultType)
3690 Value *ResultOrFallback =
3691 Builder.CreateSelect(IsZero, FallbackValue,
Result,
"ctzg");
3694 case Builtin::BI__builtin_clzs:
3695 case Builtin::BI__builtin_clz:
3696 case Builtin::BI__builtin_clzl:
3697 case Builtin::BI__builtin_clzll:
3698 case Builtin::BI__builtin_clzg:
3699 case Builtin::BI__builtin_elementwise_clzg: {
3701 (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_clzg ||
3702 BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_clzg) &&
3715 HasFallback ||
getTarget().isCLZForZeroUndef() ||
3716 BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_clzg);
3718 if (
Result->getType() != ResultType)
3727 Value *ResultOrFallback =
3728 Builder.CreateSelect(IsZero, FallbackValue,
Result,
"clzg");
3731 case Builtin::BI__builtin_ffs:
3732 case Builtin::BI__builtin_ffsl:
3733 case Builtin::BI__builtin_ffsll: {
3742 Builder.CreateAdd(
Builder.CreateCall(F, {ArgValue, Builder.getTrue()}),
3743 llvm::ConstantInt::get(
ArgType, 1));
3747 if (
Result->getType() != ResultType)
3752 case Builtin::BI__builtin_parity:
3753 case Builtin::BI__builtin_parityl:
3754 case Builtin::BI__builtin_parityll: {
3764 if (
Result->getType() != ResultType)
3769 case Builtin::BI__lzcnt16:
3770 case Builtin::BI__lzcnt:
3771 case Builtin::BI__lzcnt64: {
3779 if (
Result->getType() != ResultType)
3784 case Builtin::BI__popcnt16:
3785 case Builtin::BI__popcnt:
3786 case Builtin::BI__popcnt64:
3787 case Builtin::BI__builtin_popcount:
3788 case Builtin::BI__builtin_popcountl:
3789 case Builtin::BI__builtin_popcountll:
3790 case Builtin::BI__builtin_popcountg: {
3798 if (
Result->getType() != ResultType)
3803 case Builtin::BI__builtin_unpredictable: {
3809 case Builtin::BI__builtin_expect: {
3817 if (
CGM.getCodeGenOpts().OptimizationLevel == 0)
3822 Builder.CreateCall(FnExpect, {ArgValue, ExpectedValue},
"expval");
3825 case Builtin::BI__builtin_expect_with_probability: {
3830 llvm::APFloat Probability(0.0);
3833 assert(EvalSucceed &&
"probability should be able to evaluate as float");
3835 bool LoseInfo =
false;
3836 Probability.convert(llvm::APFloat::IEEEdouble(),
3837 llvm::RoundingMode::Dynamic, &LoseInfo);
3839 Constant *Confidence = ConstantFP::get(Ty, Probability);
3843 if (
CGM.getCodeGenOpts().OptimizationLevel == 0)
3847 CGM.getIntrinsic(Intrinsic::expect_with_probability,
ArgType);
3849 FnExpect, {ArgValue, ExpectedValue, Confidence},
"expval");
3852 case Builtin::BI__builtin_assume_aligned: {
3855 Value *OffsetValue =
3860 if (AlignmentCI->getValue().ugt(llvm::Value::MaximumAlignment))
3861 AlignmentCI = ConstantInt::get(AlignmentCI->getIntegerType(),
3862 llvm::Value::MaximumAlignment);
3866 AlignmentCI, OffsetValue);
3869 case Builtin::BI__builtin_assume_dereferenceable: {
3877 Builder.CreateDereferenceableAssumption(PtrValue, SizeValue);
3880 case Builtin::BI__assume:
3881 case Builtin::BI__builtin_assume: {
3886 Function *FnAssume =
CGM.getIntrinsic(Intrinsic::assume);
3887 Builder.CreateCall(FnAssume, ArgValue);
3890 case Builtin::BI__builtin_assume_separate_storage: {
3897 Value *Values[] = {Value0, Value1};
3898 OperandBundleDefT<Value *> OBD(
"separate_storage", Values);
3899 Builder.CreateAssumption({OBD});
3902 case Builtin::BI__builtin_allow_runtime_check: {
3905 LLVMContext &Ctx =
CGM.getLLVMContext();
3907 CGM.getIntrinsic(Intrinsic::allow_runtime_check),
3908 llvm::MetadataAsValue::get(Ctx, llvm::MDString::get(Ctx, Kind)));
3911 case Builtin::BI__builtin_allow_sanitize_check: {
3912 Intrinsic::ID IntrID = Intrinsic::not_intrinsic;
3920 if (
getLangOpts().Sanitize.hasOneOf(SanitizerKind::Address |
3921 SanitizerKind::KernelAddress) &&
3922 (Name ==
"address" || Name ==
"kernel-address")) {
3923 IntrID = Intrinsic::allow_sanitize_address;
3924 }
else if (
getLangOpts().Sanitize.has(SanitizerKind::Thread) &&
3926 IntrID = Intrinsic::allow_sanitize_thread;
3927 }
else if (
getLangOpts().Sanitize.hasOneOf(SanitizerKind::Memory |
3928 SanitizerKind::KernelMemory) &&
3929 (Name ==
"memory" || Name ==
"kernel-memory")) {
3930 IntrID = Intrinsic::allow_sanitize_memory;
3932 SanitizerKind::HWAddress | SanitizerKind::KernelHWAddress) &&
3933 (Name ==
"hwaddress" || Name ==
"kernel-hwaddress")) {
3934 IntrID = Intrinsic::allow_sanitize_hwaddress;
3937 if (IntrID != Intrinsic::not_intrinsic) {
3946 case Builtin::BI__arithmetic_fence: {
3950 llvm::FastMathFlags FMF =
Builder.getFastMathFlags();
3951 bool isArithmeticFenceEnabled =
3952 FMF.allowReassoc() &&
3955 if (
ArgType->isComplexType()) {
3956 if (isArithmeticFenceEnabled) {
3959 Value *Real =
Builder.CreateArithmeticFence(ComplexVal.first,
3961 Value *Imag =
Builder.CreateArithmeticFence(ComplexVal.second,
3966 Value *Real = ComplexVal.first;
3967 Value *Imag = ComplexVal.second;
3971 if (isArithmeticFenceEnabled)
3976 case Builtin::BI__builtin_bswapg: {
3979 assert(
IntTy &&
"LLVM's __builtin_bswapg only supports integer variants");
3980 if (
IntTy->getBitWidth() == 1 ||
IntTy->getBitWidth() == 8)
3982 assert(((
IntTy->getBitWidth() % 16 == 0 &&
IntTy->getBitWidth() != 0)) &&
3983 "LLVM's __builtin_bswapg only supports integer variants that has a "
3984 "multiple of 16 bits as well as a single byte");
3988 case Builtin::BI__builtin_bswap16:
3989 case Builtin::BI__builtin_bswap32:
3990 case Builtin::BI__builtin_bswap64:
3991 case Builtin::BI_byteswap_ushort:
3992 case Builtin::BI_byteswap_ulong:
3993 case Builtin::BI_byteswap_uint64: {
3997 case Builtin::BI__builtin_bitreverseg: {
4001 "LLVM's __builtin_bitreverseg only support integer variants");
4002 if (
IntTy->getBitWidth() == 1)
4007 case Builtin::BI__builtin_bitreverse8:
4008 case Builtin::BI__builtin_bitreverse16:
4009 case Builtin::BI__builtin_bitreverse32:
4010 case Builtin::BI__builtin_bitreverse64: {
4014 case Builtin::BI__builtin_rotateleft8:
4015 case Builtin::BI__builtin_rotateleft16:
4016 case Builtin::BI__builtin_rotateleft32:
4017 case Builtin::BI__builtin_rotateleft64:
4018 case Builtin::BI__builtin_stdc_rotate_left:
4019 case Builtin::BIstdc_rotate_left_uc:
4020 case Builtin::BIstdc_rotate_left_us:
4021 case Builtin::BIstdc_rotate_left_ui:
4022 case Builtin::BIstdc_rotate_left_ul:
4023 case Builtin::BIstdc_rotate_left_ull:
4024 case Builtin::BI_rotl8:
4025 case Builtin::BI_rotl16:
4026 case Builtin::BI_rotl:
4027 case Builtin::BI_lrotl:
4028 case Builtin::BI_rotl64:
4031 case Builtin::BI__builtin_rotateright8:
4032 case Builtin::BI__builtin_rotateright16:
4033 case Builtin::BI__builtin_rotateright32:
4034 case Builtin::BI__builtin_rotateright64:
4035 case Builtin::BI__builtin_stdc_rotate_right:
4036 case Builtin::BIstdc_rotate_right_uc:
4037 case Builtin::BIstdc_rotate_right_us:
4038 case Builtin::BIstdc_rotate_right_ui:
4039 case Builtin::BIstdc_rotate_right_ul:
4040 case Builtin::BIstdc_rotate_right_ull:
4041 case Builtin::BI_rotr8:
4042 case Builtin::BI_rotr16:
4043 case Builtin::BI_rotr:
4044 case Builtin::BI_lrotr:
4045 case Builtin::BI_rotr64:
4048 case Builtin::BIstdc_leading_zeros_uc:
4049 case Builtin::BIstdc_leading_zeros_us:
4050 case Builtin::BIstdc_leading_zeros_ui:
4051 case Builtin::BIstdc_leading_zeros_ul:
4052 case Builtin::BIstdc_leading_zeros_ull:
4053 case Builtin::BI__builtin_stdc_leading_zeros:
4055 case Builtin::BIstdc_leading_ones_uc:
4056 case Builtin::BIstdc_leading_ones_us:
4057 case Builtin::BIstdc_leading_ones_ui:
4058 case Builtin::BIstdc_leading_ones_ul:
4059 case Builtin::BIstdc_leading_ones_ull:
4060 case Builtin::BI__builtin_stdc_leading_ones:
4062 case Builtin::BIstdc_trailing_zeros_uc:
4063 case Builtin::BIstdc_trailing_zeros_us:
4064 case Builtin::BIstdc_trailing_zeros_ui:
4065 case Builtin::BIstdc_trailing_zeros_ul:
4066 case Builtin::BIstdc_trailing_zeros_ull:
4067 case Builtin::BI__builtin_stdc_trailing_zeros:
4069 case Builtin::BIstdc_trailing_ones_uc:
4070 case Builtin::BIstdc_trailing_ones_us:
4071 case Builtin::BIstdc_trailing_ones_ui:
4072 case Builtin::BIstdc_trailing_ones_ul:
4073 case Builtin::BIstdc_trailing_ones_ull:
4074 case Builtin::BI__builtin_stdc_trailing_ones:
4076 case Builtin::BIstdc_first_leading_zero_uc:
4077 case Builtin::BIstdc_first_leading_zero_us:
4078 case Builtin::BIstdc_first_leading_zero_ui:
4079 case Builtin::BIstdc_first_leading_zero_ul:
4080 case Builtin::BIstdc_first_leading_zero_ull:
4081 case Builtin::BI__builtin_stdc_first_leading_zero:
4083 case Builtin::BIstdc_first_leading_one_uc:
4084 case Builtin::BIstdc_first_leading_one_us:
4085 case Builtin::BIstdc_first_leading_one_ui:
4086 case Builtin::BIstdc_first_leading_one_ul:
4087 case Builtin::BIstdc_first_leading_one_ull:
4088 case Builtin::BI__builtin_stdc_first_leading_one:
4090 case Builtin::BIstdc_first_trailing_zero_uc:
4091 case Builtin::BIstdc_first_trailing_zero_us:
4092 case Builtin::BIstdc_first_trailing_zero_ui:
4093 case Builtin::BIstdc_first_trailing_zero_ul:
4094 case Builtin::BIstdc_first_trailing_zero_ull:
4095 case Builtin::BI__builtin_stdc_first_trailing_zero:
4097 case Builtin::BIstdc_first_trailing_one_uc:
4098 case Builtin::BIstdc_first_trailing_one_us:
4099 case Builtin::BIstdc_first_trailing_one_ui:
4100 case Builtin::BIstdc_first_trailing_one_ul:
4101 case Builtin::BIstdc_first_trailing_one_ull:
4102 case Builtin::BI__builtin_stdc_first_trailing_one:
4104 case Builtin::BIstdc_count_zeros_uc:
4105 case Builtin::BIstdc_count_zeros_us:
4106 case Builtin::BIstdc_count_zeros_ui:
4107 case Builtin::BIstdc_count_zeros_ul:
4108 case Builtin::BIstdc_count_zeros_ull:
4109 case Builtin::BI__builtin_stdc_count_zeros:
4111 case Builtin::BIstdc_count_ones_uc:
4112 case Builtin::BIstdc_count_ones_us:
4113 case Builtin::BIstdc_count_ones_ui:
4114 case Builtin::BIstdc_count_ones_ul:
4115 case Builtin::BIstdc_count_ones_ull:
4116 case Builtin::BI__builtin_stdc_count_ones:
4119 case Builtin::BIstdc_has_single_bit_uc:
4120 case Builtin::BIstdc_has_single_bit_us:
4121 case Builtin::BIstdc_has_single_bit_ui:
4122 case Builtin::BIstdc_has_single_bit_ul:
4123 case Builtin::BIstdc_has_single_bit_ull:
4124 case Builtin::BI__builtin_stdc_has_single_bit: {
4132 case Builtin::BIstdc_bit_width_uc:
4133 case Builtin::BIstdc_bit_width_us:
4134 case Builtin::BIstdc_bit_width_ui:
4135 case Builtin::BIstdc_bit_width_ul:
4136 case Builtin::BIstdc_bit_width_ull:
4137 case Builtin::BI__builtin_stdc_bit_width:
4139 case Builtin::BIstdc_bit_floor_uc:
4140 case Builtin::BIstdc_bit_floor_us:
4141 case Builtin::BIstdc_bit_floor_ui:
4142 case Builtin::BIstdc_bit_floor_ul:
4143 case Builtin::BIstdc_bit_floor_ull:
4144 case Builtin::BI__builtin_stdc_bit_floor: {
4147 unsigned BitWidth =
ArgType->getIntegerBitWidth();
4159 case Builtin::BIstdc_bit_ceil_uc:
4160 case Builtin::BIstdc_bit_ceil_us:
4161 case Builtin::BIstdc_bit_ceil_ui:
4162 case Builtin::BIstdc_bit_ceil_ul:
4163 case Builtin::BIstdc_bit_ceil_ull:
4164 case Builtin::BI__builtin_stdc_bit_ceil: {
4167 unsigned BitWidth =
ArgType->getIntegerBitWidth();
4171 Value *IsLEOne =
Builder.CreateICmpULE(ArgValue, One,
"isleone");
4173 BasicBlock *EntryBB =
Builder.GetInsertBlock();
4177 Builder.CreateCondBr(IsLEOne, MergeBB, CalcBB);
4179 Builder.SetInsertPoint(CalcBB);
4191 Builder.SetInsertPoint(MergeBB);
4193 Phi->addIncoming(One, EntryBB);
4194 Phi->addIncoming(Tmp, CalcBB);
4199 case Builtin::BIstdc_memreverse8u8:
4202 case Builtin::BIstdc_memreverse8u16:
4203 case Builtin::BIstdc_memreverse8u32:
4204 case Builtin::BIstdc_memreverse8u64:
4208 case Builtin::BIstdc_memreverse8:
4209 case Builtin::BI__builtin_stdc_memreverse8: {
4212 uint64_t Size = R.Val.getInt().getZExtValue();
4217 if (Size == 2 || Size == 4 || Size == 8) {
4233 case Builtin::BI__builtin_constant_p: {
4240 if (!
ArgType->isIntegralOrEnumerationType() && !
ArgType->isFloatingType() &&
4241 !
ArgType->isObjCObjectPointerType() && !
ArgType->isBlockPointerType())
4244 return RValue::get(ConstantInt::get(ResultType, 0));
4249 return RValue::get(ConstantInt::get(ResultType, 0));
4252 if (
ArgType->isObjCObjectPointerType()) {
4261 if (
Result->getType() != ResultType)
4265 case Builtin::BI__builtin_dynamic_object_size:
4266 case Builtin::BI__builtin_object_size: {
4273 bool IsDynamic = BuiltinID == Builtin::BI__builtin_dynamic_object_size;
4275 nullptr, IsDynamic));
4277 case Builtin::BI__builtin_counted_by_ref: {
4279 llvm::Value *
Result = llvm::ConstantPointerNull::get(
4284 if (
auto *UO = dyn_cast<UnaryOperator>(Arg);
4285 UO && UO->getOpcode() == UO_AddrOf) {
4288 if (
auto *ASE = dyn_cast<ArraySubscriptExpr>(Arg))
4292 if (
const MemberExpr *ME = dyn_cast_if_present<MemberExpr>(Arg)) {
4300 llvm::report_fatal_error(
"Cannot find the counted_by 'count' field");
4306 case Builtin::BI__builtin_prefetch: {
4308 unsigned ICEArguments = (1 << 1) | (1 << 2);
4311 : llvm::ConstantInt::get(
Int32Ty, 0);
4314 : llvm::ConstantInt::get(
Int32Ty, 3);
4320 case Builtin::BI__builtin_readcyclecounter: {
4321 Function *F =
CGM.getIntrinsic(Intrinsic::readcyclecounter);
4324 case Builtin::BI__builtin_readsteadycounter: {
4325 Function *F =
CGM.getIntrinsic(Intrinsic::readsteadycounter);
4328 case Builtin::BI__builtin___clear_cache: {
4331 Function *F =
CGM.getIntrinsic(Intrinsic::clear_cache, {
CGM.DefaultPtrTy});
4334 case Builtin::BI__builtin_trap:
4337 case Builtin::BI__builtin_verbose_trap: {
4338 llvm::DILocation *TrapLocation =
Builder.getCurrentDebugLocation();
4349 case Builtin::BI__debugbreak:
4352 case Builtin::BI__builtin_unreachable: {
4361 case Builtin::BI__builtin_powi:
4362 case Builtin::BI__builtin_powif:
4363 case Builtin::BI__builtin_powil: {
4367 if (
Builder.getIsFPConstrained()) {
4371 Function *F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_powi,
4377 { Src0->getType(), Src1->getType() });
4380 case Builtin::BI__builtin_frexpl: {
4384 if (&
getTarget().getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble())
4388 case Builtin::BI__builtin_frexp:
4389 case Builtin::BI__builtin_frexpf:
4390 case Builtin::BI__builtin_frexpf128:
4391 case Builtin::BI__builtin_frexpf16:
4393 case Builtin::BImodf:
4394 case Builtin::BImodff:
4395 case Builtin::BImodfl:
4396 case Builtin::BI__builtin_modf:
4397 case Builtin::BI__builtin_modff:
4398 case Builtin::BI__builtin_modfl:
4399 if (
Builder.getIsFPConstrained())
4402 case Builtin::BI__builtin_isgreater:
4403 case Builtin::BI__builtin_isgreaterequal:
4404 case Builtin::BI__builtin_isless:
4405 case Builtin::BI__builtin_islessequal:
4406 case Builtin::BI__builtin_islessgreater:
4407 case Builtin::BI__builtin_isunordered: {
4414 switch (BuiltinID) {
4415 default: llvm_unreachable(
"Unknown ordered comparison");
4416 case Builtin::BI__builtin_isgreater:
4417 LHS =
Builder.CreateFCmpOGT(LHS, RHS,
"cmp");
4419 case Builtin::BI__builtin_isgreaterequal:
4420 LHS =
Builder.CreateFCmpOGE(LHS, RHS,
"cmp");
4422 case Builtin::BI__builtin_isless:
4423 LHS =
Builder.CreateFCmpOLT(LHS, RHS,
"cmp");
4425 case Builtin::BI__builtin_islessequal:
4426 LHS =
Builder.CreateFCmpOLE(LHS, RHS,
"cmp");
4428 case Builtin::BI__builtin_islessgreater:
4429 LHS =
Builder.CreateFCmpONE(LHS, RHS,
"cmp");
4431 case Builtin::BI__builtin_isunordered:
4432 LHS =
Builder.CreateFCmpUNO(LHS, RHS,
"cmp");
4439 case Builtin::BI__builtin_isnan: {
4449 case Builtin::BI__builtin_issignaling: {
4457 case Builtin::BI__builtin_isinf: {
4467 case Builtin::BIfinite:
4468 case Builtin::BI__finite:
4469 case Builtin::BIfinitef:
4470 case Builtin::BI__finitef:
4471 case Builtin::BIfinitel:
4472 case Builtin::BI__finitel:
4473 case Builtin::BI__builtin_isfinite: {
4483 case Builtin::BI__builtin_isnormal: {
4491 case Builtin::BI__builtin_issubnormal: {
4495 Builder.CreateZExt(
Builder.createIsFPClass(
V, FPClassTest::fcSubnormal),
4499 case Builtin::BI__builtin_iszero: {
4507 case Builtin::BI__builtin_isfpclass: {
4511 uint64_t Test =
Result.Val.getInt().getLimitedValue();
4518 case Builtin::BI__builtin_nondeterministic_value: {
4527 case Builtin::BI__builtin_elementwise_abs: {
4532 QT = VecTy->getElementType();
4536 nullptr,
"elt.abs");
4543 case Builtin::BI__builtin_elementwise_bitreverse:
4545 *
this, E, Intrinsic::bitreverse,
"elt.bitreverse"));
4546 case Builtin::BI__builtin_elementwise_popcount:
4548 *
this, E, Intrinsic::ctpop,
"elt.ctpop"));
4549 case Builtin::BI__builtin_elementwise_canonicalize:
4551 *
this, E, Intrinsic::canonicalize,
"elt.canonicalize"));
4552 case Builtin::BI__builtin_elementwise_copysign:
4555 case Builtin::BI__builtin_elementwise_fshl:
4558 case Builtin::BI__builtin_elementwise_fshr:
4561 case Builtin::BI__builtin_elementwise_clmul:
4564 case Builtin::BI__builtin_elementwise_pext:
4567 case Builtin::BI__builtin_elementwise_pdep:
4571 case Builtin::BI__builtin_elementwise_add_sat:
4572 case Builtin::BI__builtin_elementwise_sub_sat: {
4576 assert(Op0->
getType()->isIntOrIntVectorTy() &&
"integer type expected");
4579 Ty = VecTy->getElementType();
4582 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_add_sat)
4583 Opc = IsSigned ? Intrinsic::sadd_sat : Intrinsic::uadd_sat;
4585 Opc = IsSigned ? Intrinsic::ssub_sat : Intrinsic::usub_sat;
4586 Result =
Builder.CreateBinaryIntrinsic(Opc, Op0, Op1,
nullptr,
"elt.sat");
4590 case Builtin::BI__builtin_elementwise_max: {
4594 if (Op0->
getType()->isIntOrIntVectorTy()) {
4597 Ty = VecTy->getElementType();
4600 Op1,
nullptr,
"elt.max");
4602 Result =
Builder.CreateMaxNum(Op0, Op1,
nullptr,
"elt.max");
4605 case Builtin::BI__builtin_elementwise_min: {
4609 if (Op0->
getType()->isIntOrIntVectorTy()) {
4612 Ty = VecTy->getElementType();
4615 Op1,
nullptr,
"elt.min");
4617 Result =
Builder.CreateMinNum(Op0, Op1,
nullptr,
"elt.min");
4621 case Builtin::BI__builtin_elementwise_maxnum: {
4625 Op1,
nullptr,
"elt.maxnum");
4629 case Builtin::BI__builtin_elementwise_minnum: {
4633 Op1,
nullptr,
"elt.minnum");
4637 case Builtin::BI__builtin_elementwise_maximum: {
4641 nullptr,
"elt.maximum");
4645 case Builtin::BI__builtin_elementwise_minimum: {
4649 nullptr,
"elt.minimum");
4653 case Builtin::BI__builtin_elementwise_maximumnum: {
4657 Intrinsic::maximumnum, Op0, Op1,
nullptr,
"elt.maximumnum");
4661 case Builtin::BI__builtin_elementwise_minimumnum: {
4665 Intrinsic::minimumnum, Op0, Op1,
nullptr,
"elt.minimumnum");
4669 case Builtin::BI__builtin_reduce_max: {
4670 auto GetIntrinsicID = [
this](
QualType QT) {
4672 QT = VecTy->getElementType();
4673 else if (QT->isSizelessVectorType())
4674 QT = QT->getSizelessVectorEltType(
CGM.getContext());
4676 if (QT->isSignedIntegerType())
4677 return Intrinsic::vector_reduce_smax;
4678 if (QT->isUnsignedIntegerType())
4679 return Intrinsic::vector_reduce_umax;
4680 assert(QT->isFloatingType() &&
"must have a float here");
4681 return Intrinsic::vector_reduce_fmax;
4684 *
this, E, GetIntrinsicID(E->
getArg(0)->
getType()),
"rdx.min"));
4687 case Builtin::BI__builtin_reduce_min: {
4688 auto GetIntrinsicID = [
this](
QualType QT) {
4690 QT = VecTy->getElementType();
4691 else if (QT->isSizelessVectorType())
4692 QT = QT->getSizelessVectorEltType(
CGM.getContext());
4694 if (QT->isSignedIntegerType())
4695 return Intrinsic::vector_reduce_smin;
4696 if (QT->isUnsignedIntegerType())
4697 return Intrinsic::vector_reduce_umin;
4698 assert(QT->isFloatingType() &&
"must have a float here");
4699 return Intrinsic::vector_reduce_fmin;
4703 *
this, E, GetIntrinsicID(E->
getArg(0)->
getType()),
"rdx.min"));
4706 case Builtin::BI__builtin_reduce_add:
4708 *
this, E, Intrinsic::vector_reduce_add,
"rdx.add"));
4709 case Builtin::BI__builtin_reduce_mul:
4711 *
this, E, Intrinsic::vector_reduce_mul,
"rdx.mul"));
4712 case Builtin::BI__builtin_reduce_xor:
4714 *
this, E, Intrinsic::vector_reduce_xor,
"rdx.xor"));
4715 case Builtin::BI__builtin_reduce_or:
4717 *
this, E, Intrinsic::vector_reduce_or,
"rdx.or"));
4718 case Builtin::BI__builtin_reduce_and:
4720 *
this, E, Intrinsic::vector_reduce_and,
"rdx.and"));
4721 case Builtin::BI__builtin_reduce_maximum:
4723 *
this, E, Intrinsic::vector_reduce_fmaximum,
"rdx.maximum"));
4724 case Builtin::BI__builtin_reduce_minimum:
4726 *
this, E, Intrinsic::vector_reduce_fminimum,
"rdx.minimum"));
4727 case Builtin::BI__builtin_reduce_assoc_fadd:
4728 case Builtin::BI__builtin_reduce_in_order_fadd: {
4730 llvm::Type *ScalarTy =
Vector->getType()->getScalarType();
4731 llvm::Value *StartValue =
nullptr;
4734 llvm::Value *Args[] = {StartValue
4736 : llvm::ConstantFP::get(ScalarTy, -0.0F),
4739 CGM.getIntrinsic(Intrinsic::vector_reduce_fadd,
Vector->getType());
4740 llvm::CallBase *Reduce =
Builder.CreateCall(F, Args,
"rdx.addf");
4741 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_reduce_assoc_fadd) {
4744 llvm::FastMathFlags FMF;
4745 FMF.setAllowReassoc();
4751 case Builtin::BI__builtin_matrix_transpose: {
4755 Value *
Result = MB.CreateMatrixTranspose(MatValue, MatrixTy->getNumRows(),
4756 MatrixTy->getNumColumns());
4760 case Builtin::BI__builtin_matrix_column_major_load: {
4766 assert(PtrTy &&
"arg0 must be of pointer type");
4767 bool IsVolatile = PtrTy->getPointeeType().isVolatileQualified();
4776 ResultTy->getNumRows(), ResultTy->getNumColumns(),
"matrix");
4780 case Builtin::BI__builtin_matrix_column_major_store: {
4788 assert(PtrTy &&
"arg1 must be of pointer type");
4789 bool IsVolatile = PtrTy->getPointeeType().isVolatileQualified();
4797 MatrixTy->getNumRows(), MatrixTy->getNumColumns());
4802 case Builtin::BI__builtin_masked_load:
4803 case Builtin::BI__builtin_masked_expand_load: {
4807 llvm::Type *RetTy =
CGM.getTypes().ConvertType(E->
getType());
4808 llvm::Value *PassThru = llvm::PoisonValue::get(RetTy);
4816 if (BuiltinID == Builtin::BI__builtin_masked_load)
4818 PassThru,
"masked_load");
4820 Result =
Builder.CreateMaskedExpandLoad(RetTy, Ptr, MaybeAlign(), Mask,
4821 PassThru,
"masked_expand_load");
4825 case Builtin::BI__builtin_masked_gather: {
4830 llvm::Type *RetTy =
CGM.getTypes().ConvertType(E->
getType());
4834 llvm::Value *PassThru = llvm::PoisonValue::get(RetTy);
4838 llvm::Type *ElemTy =
CGM.getTypes().ConvertType(
4840 llvm::Value *PtrVec =
Builder.CreateGEP(ElemTy, Ptr, Idx);
4843 RetTy, PtrVec, Align.
getAsAlign(), Mask, PassThru,
"masked_gather");
4846 case Builtin::BI__builtin_masked_store:
4847 case Builtin::BI__builtin_masked_compress_store: {
4856 if (BuiltinID == Builtin::BI__builtin_masked_store)
4859 Builder.CreateMaskedCompressStore(Val, Ptr, MaybeAlign(), Mask);
4863 case Builtin::BI__builtin_masked_scatter: {
4873 llvm::Type *ElemTy =
CGM.getTypes().ConvertType(
4875 llvm::Value *PtrVec =
Builder.CreateGEP(ElemTy, Ptr, Idx);
4880 case Builtin::BI__builtin_isinf_sign: {
4887 AbsArg, ConstantFP::getInfinity(Arg->
getType()),
"isinf");
4893 Value *NegativeOne = ConstantInt::getAllOnesValue(
IntTy);
4894 Value *SignResult =
Builder.CreateSelect(IsNeg, NegativeOne, One);
4899 case Builtin::BI__builtin_flt_rounds: {
4900 Function *F =
CGM.getIntrinsic(Intrinsic::get_rounding);
4904 if (
Result->getType() != ResultType)
4910 case Builtin::BI__builtin_set_flt_rounds: {
4911 Function *F =
CGM.getIntrinsic(Intrinsic::set_rounding);
4918 case Builtin::BI__builtin_fpclassify: {
4925 BasicBlock *Begin =
Builder.GetInsertBlock();
4930 "fpclassify_result");
4933 Builder.SetInsertPoint(Begin);
4934 Value *IsZero =
Builder.CreateFCmpOEQ(
V, Constant::getNullValue(Ty),
4938 Builder.CreateCondBr(IsZero, End, NotZero);
4939 Result->addIncoming(ZeroLiteral, Begin);
4942 Builder.SetInsertPoint(NotZero);
4946 Builder.CreateCondBr(IsNan, End, NotNan);
4947 Result->addIncoming(NanLiteral, NotZero);
4950 Builder.SetInsertPoint(NotNan);
4953 Builder.CreateFCmpOEQ(VAbs, ConstantFP::getInfinity(
V->getType()),
4957 Builder.CreateCondBr(IsInf, End, NotInf);
4958 Result->addIncoming(InfLiteral, NotNan);
4961 Builder.SetInsertPoint(NotInf);
4962 APFloat Smallest = APFloat::getSmallestNormalized(
4965 Builder.CreateFCmpUGE(VAbs, ConstantFP::get(
V->getContext(), Smallest),
4967 Value *NormalResult =
4971 Result->addIncoming(NormalResult, NotInf);
4984 case Builtin::BIalloca:
4985 case Builtin::BI_alloca:
4986 case Builtin::BI__builtin_alloca_uninitialized:
4987 case Builtin::BI__builtin_alloca: {
4991 const Align SuitableAlignmentInBytes =
4995 AllocaInst *AI =
Builder.CreateAlloca(
Builder.getInt8Ty(), Size);
4996 AI->setAlignment(SuitableAlignmentInBytes);
4997 if (BuiltinID != Builtin::BI__builtin_alloca_uninitialized)
4999 if (AI->getAddressSpace() !=
5000 CGM.getContext().getTargetAddressSpace(
5002 llvm::Type *Ty =
CGM.getTypes().ConvertType(E->
getType());
5008 case Builtin::BI__builtin_alloca_with_align_uninitialized:
5009 case Builtin::BI__builtin_alloca_with_align: {
5013 unsigned AlignmentInBits = AlignmentInBitsCI->getZExtValue();
5014 const Align AlignmentInBytes =
5015 CGM.getContext().toCharUnitsFromBits(AlignmentInBits).getAsAlign();
5016 AllocaInst *AI =
Builder.CreateAlloca(
Builder.getInt8Ty(), Size);
5017 AI->setAlignment(AlignmentInBytes);
5018 if (BuiltinID != Builtin::BI__builtin_alloca_with_align_uninitialized)
5020 if (AI->getAddressSpace() !=
5021 CGM.getContext().getTargetAddressSpace(
5023 llvm::Type *Ty =
CGM.getTypes().ConvertType(E->
getType());
5029 case Builtin::BI__builtin_infer_alloc_token: {
5033 CGM.getIntrinsic(llvm::Intrinsic::alloc_token_id, {
IntPtrTy});
5034 llvm::CallBase *TokenID =
Builder.CreateCall(F, MDV);
5038 case Builtin::BIbzero:
5039 case Builtin::BI__builtin_bzero: {
5044 auto *I =
Builder.CreateMemSet(Dest,
Builder.getInt8(0), SizeVal,
false);
5049 case Builtin::BIbcopy:
5050 case Builtin::BI__builtin_bcopy: {
5060 auto *I =
Builder.CreateMemMove(Dest, Src, SizeVal,
false);
5065 case Builtin::BImemcpy:
5066 case Builtin::BI__builtin_memcpy:
5067 case Builtin::BImempcpy:
5068 case Builtin::BI__builtin_mempcpy: {
5074 auto *I =
Builder.CreateMemCpy(Dest, Src, SizeVal,
false);
5076 if (BuiltinID == Builtin::BImempcpy ||
5077 BuiltinID == Builtin::BI__builtin_mempcpy)
5084 case Builtin::BI__builtin_memcpy_inline: {
5091 auto *I =
Builder.CreateMemCpyInline(Dest, Src, Size);
5096 case Builtin::BI__builtin_char_memchr:
5097 BuiltinID = Builtin::BI__builtin_memchr;
5100 case Builtin::BI__builtin___memcpy_chk: {
5106 llvm::APSInt Size = SizeResult.
Val.
getInt();
5107 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
5108 if (Size.ugt(DstSize))
5112 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
5113 auto *I =
Builder.CreateMemCpy(Dest, Src, SizeVal,
false);
5118 case Builtin::BI__builtin_objc_memmove_collectable: {
5122 CGM.getObjCRuntime().EmitGCMemmoveCollectable(*
this,
5123 DestAddr, SrcAddr, SizeVal);
5127 case Builtin::BI__builtin___memmove_chk: {
5133 llvm::APSInt Size = SizeResult.
Val.
getInt();
5134 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
5135 if (Size.ugt(DstSize))
5139 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
5140 auto *I =
Builder.CreateMemMove(Dest, Src, SizeVal,
false);
5145 case Builtin::BI__builtin_trivially_relocate:
5146 case Builtin::BImemmove:
5147 case Builtin::BI__builtin_memmove: {
5151 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_trivially_relocate)
5161 auto *I =
Builder.CreateMemMove(Dest, Src, SizeVal,
false);
5165 case Builtin::BImemset:
5166 case Builtin::BI__builtin_memset: {
5173 auto *I =
Builder.CreateMemSet(Dest, ByteVal, SizeVal,
false);
5177 case Builtin::BI__builtin_memset_inline: {
5186 auto *I =
Builder.CreateMemSetInline(Dest, ByteVal, Size);
5190 case Builtin::BI__builtin___memset_chk: {
5196 llvm::APSInt Size = SizeResult.
Val.
getInt();
5197 llvm::APSInt DstSize = DstSizeResult.
Val.
getInt();
5198 if (Size.ugt(DstSize))
5203 Value *SizeVal = llvm::ConstantInt::get(
Builder.getContext(), Size);
5204 auto *I =
Builder.CreateMemSet(Dest, ByteVal, SizeVal,
false);
5208 case Builtin::BI__builtin_wmemchr: {
5219 BasicBlock *Entry =
Builder.GetInsertBlock();
5224 Builder.CreateCondBr(SizeEq0, Exit, CmpEq);
5228 StrPhi->addIncoming(Str, Entry);
5230 SizePhi->addIncoming(Size, Entry);
5233 Value *StrCh =
Builder.CreateAlignedLoad(WCharTy, StrPhi, WCharAlign);
5234 Value *FoundChr =
Builder.CreateConstInBoundsGEP1_32(WCharTy, StrPhi, 0);
5239 Value *NextStr =
Builder.CreateConstInBoundsGEP1_32(WCharTy, StrPhi, 1);
5241 Value *NextSizeEq0 =
5242 Builder.CreateICmpEQ(NextSize, ConstantInt::get(
SizeTy, 0));
5243 Builder.CreateCondBr(NextSizeEq0, Exit, CmpEq);
5244 StrPhi->addIncoming(NextStr,
Next);
5245 SizePhi->addIncoming(NextSize,
Next);
5249 Ret->addIncoming(llvm::Constant::getNullValue(Str->
getType()), Entry);
5250 Ret->addIncoming(llvm::Constant::getNullValue(Str->
getType()),
Next);
5251 Ret->addIncoming(FoundChr, CmpEq);
5254 case Builtin::BI__builtin_wmemcmp: {
5266 BasicBlock *Entry =
Builder.GetInsertBlock();
5272 Builder.CreateCondBr(SizeEq0, Exit, CmpGT);
5276 DstPhi->addIncoming(Dst, Entry);
5278 SrcPhi->addIncoming(Src, Entry);
5280 SizePhi->addIncoming(Size, Entry);
5283 Value *DstCh =
Builder.CreateAlignedLoad(WCharTy, DstPhi, WCharAlign);
5284 Value *SrcCh =
Builder.CreateAlignedLoad(WCharTy, SrcPhi, WCharAlign);
5286 Builder.CreateCondBr(DstGtSrc, Exit, CmpLT);
5293 Value *NextDst =
Builder.CreateConstInBoundsGEP1_32(WCharTy, DstPhi, 1);
5294 Value *NextSrc =
Builder.CreateConstInBoundsGEP1_32(WCharTy, SrcPhi, 1);
5296 Value *NextSizeEq0 =
5297 Builder.CreateICmpEQ(NextSize, ConstantInt::get(
SizeTy, 0));
5298 Builder.CreateCondBr(NextSizeEq0, Exit, CmpGT);
5299 DstPhi->addIncoming(NextDst,
Next);
5300 SrcPhi->addIncoming(NextSrc,
Next);
5301 SizePhi->addIncoming(NextSize,
Next);
5305 Ret->addIncoming(ConstantInt::get(
IntTy, 0), Entry);
5306 Ret->addIncoming(ConstantInt::get(
IntTy, 1), CmpGT);
5307 Ret->addIncoming(ConstantInt::getAllOnesValue(
IntTy), CmpLT);
5308 Ret->addIncoming(ConstantInt::get(
IntTy, 0),
Next);
5311 case Builtin::BI__builtin_dwarf_cfa: {
5322 Function *F =
CGM.getIntrinsic(Intrinsic::eh_dwarf_cfa);
5324 llvm::ConstantInt::get(
Int32Ty, Offset)));
5326 case Builtin::BI__builtin_return_address: {
5330 CGM.getIntrinsic(Intrinsic::returnaddress, {
CGM.ProgramPtrTy});
5333 case Builtin::BI_ReturnAddress: {
5335 CGM.getIntrinsic(Intrinsic::returnaddress, {
CGM.ProgramPtrTy});
5338 case Builtin::BI__builtin_frame_address: {
5344 case Builtin::BI__builtin_stack_address: {
5348 case Builtin::BI__builtin_extract_return_addr: {
5353 case Builtin::BI__builtin_frob_return_addr: {
5358 case Builtin::BI__builtin_dwarf_sp_column: {
5359 llvm::IntegerType *Ty
5363 CGM.ErrorUnsupported(E,
"__builtin_dwarf_sp_column");
5368 case Builtin::BI__builtin_init_dwarf_reg_size_table: {
5371 CGM.ErrorUnsupported(E,
"__builtin_init_dwarf_reg_size_table");
5374 case Builtin::BI__builtin_eh_return: {
5379 assert((
IntTy->getBitWidth() == 32 ||
IntTy->getBitWidth() == 64) &&
5380 "LLVM's __builtin_eh_return only supports 32- and 64-bit variants");
5382 CGM.getIntrinsic(
IntTy->getBitWidth() == 32 ? Intrinsic::eh_return_i32
5383 : Intrinsic::eh_return_i64);
5384 Builder.CreateCall(F, {Int, Ptr});
5392 case Builtin::BI__builtin_unwind_init: {
5393 Function *F =
CGM.getIntrinsic(Intrinsic::eh_unwind_init);
5397 case Builtin::BI__builtin_extend_pointer: {
5422 case Builtin::BI__builtin_setjmp: {
5430 Function *F =
CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
5437 ConstantInt::get(
Int32Ty, 0));
5438 Builder.CreateStore(FrameAddr, Buf);
5445 Builder.CreateStore(StackAddr, StackSaveSlot);
5448 Function *F =
CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
5451 case Builtin::BI__builtin_longjmp: {
5455 Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::eh_sjlj_longjmp), Buf);
5465 case Builtin::BI__builtin_launder: {
5470 Ptr =
Builder.CreateLaunderInvariantGroup(Ptr);
5474 case Builtin::BI__builtin_clear_padding: {
5477 PaddingClearer clearer{*
this};
5478 clearer.run(Src, PointeeTy);
5481 case Builtin::BI__sync_fetch_and_add:
5482 case Builtin::BI__sync_fetch_and_sub:
5483 case Builtin::BI__sync_fetch_and_or:
5484 case Builtin::BI__sync_fetch_and_and:
5485 case Builtin::BI__sync_fetch_and_xor:
5486 case Builtin::BI__sync_fetch_and_nand:
5487 case Builtin::BI__sync_add_and_fetch:
5488 case Builtin::BI__sync_sub_and_fetch:
5489 case Builtin::BI__sync_and_and_fetch:
5490 case Builtin::BI__sync_or_and_fetch:
5491 case Builtin::BI__sync_xor_and_fetch:
5492 case Builtin::BI__sync_nand_and_fetch:
5493 case Builtin::BI__sync_val_compare_and_swap:
5494 case Builtin::BI__sync_bool_compare_and_swap:
5495 case Builtin::BI__sync_lock_test_and_set:
5496 case Builtin::BI__sync_lock_release:
5497 case Builtin::BI__sync_swap:
5498 llvm_unreachable(
"Shouldn't make it through sema");
5499 case Builtin::BI__sync_fetch_and_add_1:
5500 case Builtin::BI__sync_fetch_and_add_2:
5501 case Builtin::BI__sync_fetch_and_add_4:
5502 case Builtin::BI__sync_fetch_and_add_8:
5503 case Builtin::BI__sync_fetch_and_add_16:
5505 case Builtin::BI__sync_fetch_and_sub_1:
5506 case Builtin::BI__sync_fetch_and_sub_2:
5507 case Builtin::BI__sync_fetch_and_sub_4:
5508 case Builtin::BI__sync_fetch_and_sub_8:
5509 case Builtin::BI__sync_fetch_and_sub_16:
5511 case Builtin::BI__sync_fetch_and_or_1:
5512 case Builtin::BI__sync_fetch_and_or_2:
5513 case Builtin::BI__sync_fetch_and_or_4:
5514 case Builtin::BI__sync_fetch_and_or_8:
5515 case Builtin::BI__sync_fetch_and_or_16:
5517 case Builtin::BI__sync_fetch_and_and_1:
5518 case Builtin::BI__sync_fetch_and_and_2:
5519 case Builtin::BI__sync_fetch_and_and_4:
5520 case Builtin::BI__sync_fetch_and_and_8:
5521 case Builtin::BI__sync_fetch_and_and_16:
5523 case Builtin::BI__sync_fetch_and_xor_1:
5524 case Builtin::BI__sync_fetch_and_xor_2:
5525 case Builtin::BI__sync_fetch_and_xor_4:
5526 case Builtin::BI__sync_fetch_and_xor_8:
5527 case Builtin::BI__sync_fetch_and_xor_16:
5529 case Builtin::BI__sync_fetch_and_nand_1:
5530 case Builtin::BI__sync_fetch_and_nand_2:
5531 case Builtin::BI__sync_fetch_and_nand_4:
5532 case Builtin::BI__sync_fetch_and_nand_8:
5533 case Builtin::BI__sync_fetch_and_nand_16:
5537 case Builtin::BI__sync_fetch_and_min:
5539 case Builtin::BI__sync_fetch_and_max:
5541 case Builtin::BI__sync_fetch_and_umin:
5543 case Builtin::BI__sync_fetch_and_umax:
5546 case Builtin::BI__sync_add_and_fetch_1:
5547 case Builtin::BI__sync_add_and_fetch_2:
5548 case Builtin::BI__sync_add_and_fetch_4:
5549 case Builtin::BI__sync_add_and_fetch_8:
5550 case Builtin::BI__sync_add_and_fetch_16:
5552 llvm::Instruction::Add);
5553 case Builtin::BI__sync_sub_and_fetch_1:
5554 case Builtin::BI__sync_sub_and_fetch_2:
5555 case Builtin::BI__sync_sub_and_fetch_4:
5556 case Builtin::BI__sync_sub_and_fetch_8:
5557 case Builtin::BI__sync_sub_and_fetch_16:
5559 llvm::Instruction::Sub);
5560 case Builtin::BI__sync_and_and_fetch_1:
5561 case Builtin::BI__sync_and_and_fetch_2:
5562 case Builtin::BI__sync_and_and_fetch_4:
5563 case Builtin::BI__sync_and_and_fetch_8:
5564 case Builtin::BI__sync_and_and_fetch_16:
5566 llvm::Instruction::And);
5567 case Builtin::BI__sync_or_and_fetch_1:
5568 case Builtin::BI__sync_or_and_fetch_2:
5569 case Builtin::BI__sync_or_and_fetch_4:
5570 case Builtin::BI__sync_or_and_fetch_8:
5571 case Builtin::BI__sync_or_and_fetch_16:
5573 llvm::Instruction::Or);
5574 case Builtin::BI__sync_xor_and_fetch_1:
5575 case Builtin::BI__sync_xor_and_fetch_2:
5576 case Builtin::BI__sync_xor_and_fetch_4:
5577 case Builtin::BI__sync_xor_and_fetch_8:
5578 case Builtin::BI__sync_xor_and_fetch_16:
5580 llvm::Instruction::Xor);
5581 case Builtin::BI__sync_nand_and_fetch_1:
5582 case Builtin::BI__sync_nand_and_fetch_2:
5583 case Builtin::BI__sync_nand_and_fetch_4:
5584 case Builtin::BI__sync_nand_and_fetch_8:
5585 case Builtin::BI__sync_nand_and_fetch_16:
5587 llvm::Instruction::And,
true);
5589 case Builtin::BI__sync_val_compare_and_swap_1:
5590 case Builtin::BI__sync_val_compare_and_swap_2:
5591 case Builtin::BI__sync_val_compare_and_swap_4:
5592 case Builtin::BI__sync_val_compare_and_swap_8:
5593 case Builtin::BI__sync_val_compare_and_swap_16:
5595 *
this, E,
false, AtomicOrdering::SequentiallyConsistent,
5596 AtomicOrdering::SequentiallyConsistent));
5598 case Builtin::BI__sync_bool_compare_and_swap_1:
5599 case Builtin::BI__sync_bool_compare_and_swap_2:
5600 case Builtin::BI__sync_bool_compare_and_swap_4:
5601 case Builtin::BI__sync_bool_compare_and_swap_8:
5602 case Builtin::BI__sync_bool_compare_and_swap_16:
5604 *
this, E,
true, AtomicOrdering::SequentiallyConsistent,
5605 AtomicOrdering::SequentiallyConsistent));
5607 case Builtin::BI__sync_swap_1:
5608 case Builtin::BI__sync_swap_2:
5609 case Builtin::BI__sync_swap_4:
5610 case Builtin::BI__sync_swap_8:
5611 case Builtin::BI__sync_swap_16:
5614 case Builtin::BI__sync_lock_test_and_set_1:
5615 case Builtin::BI__sync_lock_test_and_set_2:
5616 case Builtin::BI__sync_lock_test_and_set_4:
5617 case Builtin::BI__sync_lock_test_and_set_8:
5618 case Builtin::BI__sync_lock_test_and_set_16:
5621 case Builtin::BI__sync_lock_release_1:
5622 case Builtin::BI__sync_lock_release_2:
5623 case Builtin::BI__sync_lock_release_4:
5624 case Builtin::BI__sync_lock_release_8:
5625 case Builtin::BI__sync_lock_release_16: {
5631 llvm::StoreInst *Store =
5632 Builder.CreateStore(llvm::Constant::getNullValue(ITy), Ptr);
5633 Store->setAtomic(llvm::AtomicOrdering::Release);
5637 case Builtin::BI__sync_synchronize: {
5645 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent);
5649 case Builtin::BI__builtin_nontemporal_load:
5651 case Builtin::BI__builtin_nontemporal_store:
5653 case Builtin::BI__c11_atomic_is_lock_free:
5654 case Builtin::BI__atomic_is_lock_free: {
5658 const char *LibCallName =
"__atomic_is_lock_free";
5662 if (BuiltinID == Builtin::BI__atomic_is_lock_free)
5669 CGM.getTypes().arrangeBuiltinFunctionCall(E->
getType(), Args);
5670 llvm::FunctionType *FTy =
CGM.getTypes().GetFunctionType(FuncInfo);
5671 llvm::FunctionCallee
Func =
CGM.CreateRuntimeFunction(FTy, LibCallName);
5676 case Builtin::BI__atomic_thread_fence:
5677 case Builtin::BI__atomic_signal_fence:
5678 case Builtin::BI__c11_atomic_thread_fence:
5679 case Builtin::BI__c11_atomic_signal_fence: {
5680 llvm::SyncScope::ID SSID;
5681 if (BuiltinID == Builtin::BI__atomic_signal_fence ||
5682 BuiltinID == Builtin::BI__c11_atomic_signal_fence)
5683 SSID = llvm::SyncScope::SingleThread;
5685 SSID = llvm::SyncScope::System;
5695 Builder.CreateFence(llvm::AtomicOrdering::Acquire, SSID);
5698 Builder.CreateFence(llvm::AtomicOrdering::Release, SSID);
5701 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, SSID);
5704 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, SSID);
5710 llvm::BasicBlock *AcquireBB, *ReleaseBB, *AcqRelBB, *SeqCstBB;
5717 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5718 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, ContBB);
5720 Builder.SetInsertPoint(AcquireBB);
5721 Builder.CreateFence(llvm::AtomicOrdering::Acquire, SSID);
5723 SI->addCase(
Builder.getInt32(1), AcquireBB);
5724 SI->addCase(
Builder.getInt32(2), AcquireBB);
5726 Builder.SetInsertPoint(ReleaseBB);
5727 Builder.CreateFence(llvm::AtomicOrdering::Release, SSID);
5729 SI->addCase(
Builder.getInt32(3), ReleaseBB);
5731 Builder.SetInsertPoint(AcqRelBB);
5732 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, SSID);
5734 SI->addCase(
Builder.getInt32(4), AcqRelBB);
5736 Builder.SetInsertPoint(SeqCstBB);
5737 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, SSID);
5739 SI->addCase(
Builder.getInt32(5), SeqCstBB);
5741 Builder.SetInsertPoint(ContBB);
5744 case Builtin::BI__scoped_atomic_thread_fence: {
5749 auto Ord = dyn_cast<llvm::ConstantInt>(Order);
5750 auto Scp = dyn_cast<llvm::ConstantInt>(
Scope);
5752 SyncScope SS = ScopeModel->isValid(Scp->getZExtValue())
5753 ? ScopeModel->map(Scp->getZExtValue())
5754 : ScopeModel->map(ScopeModel->getFallBackValue());
5755 switch (Ord->getZExtValue()) {
5762 llvm::AtomicOrdering::Acquire,
5764 llvm::AtomicOrdering::Acquire,
5769 llvm::AtomicOrdering::Release,
5771 llvm::AtomicOrdering::Release,
5775 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease,
5778 llvm::AtomicOrdering::AcquireRelease,
5782 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
5785 llvm::AtomicOrdering::SequentiallyConsistent,
5797 switch (Ord->getZExtValue()) {
5800 ContBB->eraseFromParent();
5804 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5805 llvm::AtomicOrdering::Acquire);
5808 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5809 llvm::AtomicOrdering::Release);
5812 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5813 llvm::AtomicOrdering::AcquireRelease);
5816 OrderBBs.emplace_back(
Builder.GetInsertBlock(),
5817 llvm::AtomicOrdering::SequentiallyConsistent);
5826 Order =
Builder.CreateIntCast(Order,
Builder.getInt32Ty(),
false);
5827 llvm::SwitchInst *SI =
Builder.CreateSwitch(Order, ContBB);
5828 SI->addCase(
Builder.getInt32(1), AcquireBB);
5829 SI->addCase(
Builder.getInt32(2), AcquireBB);
5830 SI->addCase(
Builder.getInt32(3), ReleaseBB);
5831 SI->addCase(
Builder.getInt32(4), AcqRelBB);
5832 SI->addCase(
Builder.getInt32(5), SeqCstBB);
5834 OrderBBs.emplace_back(AcquireBB, llvm::AtomicOrdering::Acquire);
5835 OrderBBs.emplace_back(ReleaseBB, llvm::AtomicOrdering::Release);
5836 OrderBBs.emplace_back(AcqRelBB, llvm::AtomicOrdering::AcquireRelease);
5837 OrderBBs.emplace_back(SeqCstBB,
5838 llvm::AtomicOrdering::SequentiallyConsistent);
5841 for (
auto &[OrderBB, Ordering] : OrderBBs) {
5842 Builder.SetInsertPoint(OrderBB);
5844 SyncScope SS = ScopeModel->isValid(Scp->getZExtValue())
5845 ? ScopeModel->map(Scp->getZExtValue())
5846 : ScopeModel->map(ScopeModel->getFallBackValue());
5852 llvm::DenseMap<unsigned, llvm::BasicBlock *> BBs;
5853 for (
unsigned Scp : ScopeModel->getRuntimeValues())
5857 llvm::SwitchInst *SI =
Builder.CreateSwitch(SC, ContBB);
5858 for (
unsigned Scp : ScopeModel->getRuntimeValues()) {
5860 SI->addCase(
Builder.getInt32(Scp), B);
5871 Builder.SetInsertPoint(ContBB);
5875 case Builtin::BI__builtin_signbit:
5876 case Builtin::BI__builtin_signbitf:
5877 case Builtin::BI__builtin_signbitl: {
5882 case Builtin::BI__warn_memset_zero_len:
5884 case Builtin::BI__annotation: {
5889 assert(Str->getCharByteWidth() == 2 || Str->getCharByteWidth() == 4);
5890 StringRef WideBytes = Str->getBytes();
5891 std::string StrUtf8;
5893 (Str->getCharByteWidth() == 2)
5894 ? convertUTF16ToUTF8String(
5895 ArrayRef(WideBytes.data(), WideBytes.size()), StrUtf8)
5896 : convertUTF32ToUTF8String(
5897 ArrayRef(WideBytes.data(), WideBytes.size()), StrUtf8);
5899 CGM.ErrorUnsupported(E,
"non-Unicode __annotation argument");
5902 Strings.push_back(llvm::MDString::get(
getLLVMContext(), StrUtf8));
5906 llvm::Function *F =
CGM.getIntrinsic(Intrinsic::codeview_annotation, {});
5911 case Builtin::BI__builtin_annotation: {
5913 llvm::Function *F =
CGM.getIntrinsic(
5914 Intrinsic::annotation, {AnnVal->getType(),
CGM.ConstGlobalsPtrTy});
5923 case Builtin::BI__builtin_addcb:
5924 case Builtin::BI__builtin_addcs:
5925 case Builtin::BI__builtin_addc:
5926 case Builtin::BI__builtin_addcl:
5927 case Builtin::BI__builtin_addcll:
5928 case Builtin::BI__builtin_subcb:
5929 case Builtin::BI__builtin_subcs:
5930 case Builtin::BI__builtin_subc:
5931 case Builtin::BI__builtin_subcl:
5932 case Builtin::BI__builtin_subcll: {
5958 Intrinsic::ID IntrinsicId;
5959 switch (BuiltinID) {
5960 default: llvm_unreachable(
"Unknown multiprecision builtin id.");
5961 case Builtin::BI__builtin_addcb:
5962 case Builtin::BI__builtin_addcs:
5963 case Builtin::BI__builtin_addc:
5964 case Builtin::BI__builtin_addcl:
5965 case Builtin::BI__builtin_addcll:
5966 IntrinsicId = Intrinsic::uadd_with_overflow;
5968 case Builtin::BI__builtin_subcb:
5969 case Builtin::BI__builtin_subcs:
5970 case Builtin::BI__builtin_subc:
5971 case Builtin::BI__builtin_subcl:
5972 case Builtin::BI__builtin_subcll:
5973 IntrinsicId = Intrinsic::usub_with_overflow;
5978 llvm::Value *Carry1;
5981 llvm::Value *Carry2;
5983 Sum1, Carryin, Carry2);
5984 llvm::Value *CarryOut =
Builder.CreateZExt(
Builder.CreateOr(Carry1, Carry2),
5986 Builder.CreateStore(CarryOut, CarryOutPtr);
5990 case Builtin::BI__builtin_add_overflow:
5991 case Builtin::BI__builtin_sub_overflow:
5992 case Builtin::BI__builtin_mul_overflow: {
6000 WidthAndSignedness LeftInfo =
6002 WidthAndSignedness RightInfo =
6004 WidthAndSignedness ResultInfo =
6011 RightInfo, ResultArg, ResultQTy,
6017 *
this, LeftArg, LeftInfo, RightArg, RightInfo, ResultArg, ResultQTy,
6020 WidthAndSignedness EncompassingInfo =
6023 llvm::Type *EncompassingLLVMTy =
6024 llvm::IntegerType::get(
CGM.getLLVMContext(), EncompassingInfo.Width);
6026 llvm::Type *ResultLLVMTy =
CGM.getTypes().ConvertType(ResultQTy);
6028 Intrinsic::ID IntrinsicId;
6029 switch (BuiltinID) {
6031 llvm_unreachable(
"Unknown overflow builtin id.");
6032 case Builtin::BI__builtin_add_overflow:
6033 IntrinsicId = EncompassingInfo.Signed ? Intrinsic::sadd_with_overflow
6034 : Intrinsic::uadd_with_overflow;
6036 case Builtin::BI__builtin_sub_overflow:
6037 IntrinsicId = EncompassingInfo.Signed ? Intrinsic::ssub_with_overflow
6038 : Intrinsic::usub_with_overflow;
6040 case Builtin::BI__builtin_mul_overflow:
6041 IntrinsicId = EncompassingInfo.Signed ? Intrinsic::smul_with_overflow
6042 : Intrinsic::umul_with_overflow;
6051 Left =
Builder.CreateIntCast(Left, EncompassingLLVMTy, LeftInfo.Signed);
6052 Right =
Builder.CreateIntCast(Right, EncompassingLLVMTy, RightInfo.Signed);
6055 llvm::Value *Overflow, *
Result;
6058 if (EncompassingInfo.Width > ResultInfo.Width) {
6061 llvm::Value *ResultTrunc =
Builder.CreateTrunc(
Result, ResultLLVMTy);
6065 llvm::Value *ResultTruncExt =
Builder.CreateIntCast(
6066 ResultTrunc, EncompassingLLVMTy, ResultInfo.Signed);
6067 llvm::Value *TruncationOverflow =
6070 Overflow =
Builder.CreateOr(Overflow, TruncationOverflow);
6082 case Builtin::BI__builtin_uadd_overflow:
6083 case Builtin::BI__builtin_uaddl_overflow:
6084 case Builtin::BI__builtin_uaddll_overflow:
6085 case Builtin::BI__builtin_usub_overflow:
6086 case Builtin::BI__builtin_usubl_overflow:
6087 case Builtin::BI__builtin_usubll_overflow:
6088 case Builtin::BI__builtin_umul_overflow:
6089 case Builtin::BI__builtin_umull_overflow:
6090 case Builtin::BI__builtin_umulll_overflow:
6091 case Builtin::BI__builtin_sadd_overflow:
6092 case Builtin::BI__builtin_saddl_overflow:
6093 case Builtin::BI__builtin_saddll_overflow:
6094 case Builtin::BI__builtin_ssub_overflow:
6095 case Builtin::BI__builtin_ssubl_overflow:
6096 case Builtin::BI__builtin_ssubll_overflow:
6097 case Builtin::BI__builtin_smul_overflow:
6098 case Builtin::BI__builtin_smull_overflow:
6099 case Builtin::BI__builtin_smulll_overflow: {
6109 Intrinsic::ID IntrinsicId;
6110 switch (BuiltinID) {
6111 default: llvm_unreachable(
"Unknown overflow builtin id.");
6112 case Builtin::BI__builtin_uadd_overflow:
6113 case Builtin::BI__builtin_uaddl_overflow:
6114 case Builtin::BI__builtin_uaddll_overflow:
6115 IntrinsicId = Intrinsic::uadd_with_overflow;
6117 case Builtin::BI__builtin_usub_overflow:
6118 case Builtin::BI__builtin_usubl_overflow:
6119 case Builtin::BI__builtin_usubll_overflow:
6120 IntrinsicId = Intrinsic::usub_with_overflow;
6122 case Builtin::BI__builtin_umul_overflow:
6123 case Builtin::BI__builtin_umull_overflow:
6124 case Builtin::BI__builtin_umulll_overflow:
6125 IntrinsicId = Intrinsic::umul_with_overflow;
6127 case Builtin::BI__builtin_sadd_overflow:
6128 case Builtin::BI__builtin_saddl_overflow:
6129 case Builtin::BI__builtin_saddll_overflow:
6130 IntrinsicId = Intrinsic::sadd_with_overflow;
6132 case Builtin::BI__builtin_ssub_overflow:
6133 case Builtin::BI__builtin_ssubl_overflow:
6134 case Builtin::BI__builtin_ssubll_overflow:
6135 IntrinsicId = Intrinsic::ssub_with_overflow;
6137 case Builtin::BI__builtin_smul_overflow:
6138 case Builtin::BI__builtin_smull_overflow:
6139 case Builtin::BI__builtin_smulll_overflow:
6140 IntrinsicId = Intrinsic::smul_with_overflow;
6147 Builder.CreateStore(Sum, SumOutPtr);
6151 case Builtin::BIaddressof:
6152 case Builtin::BI__addressof:
6153 case Builtin::BI__builtin_addressof:
6155 case Builtin::BI__builtin_function_start:
6158 case Builtin::BI__builtin_operator_new:
6161 case Builtin::BI__builtin_operator_delete:
6166 case Builtin::BI__builtin_is_aligned:
6168 case Builtin::BI__builtin_align_up:
6170 case Builtin::BI__builtin_align_down:
6173 case Builtin::BI__noop:
6176 case Builtin::BI__builtin_call_with_static_chain: {
6183 case Builtin::BI_InterlockedExchange8:
6184 case Builtin::BI_InterlockedExchange16:
6185 case Builtin::BI_InterlockedExchange:
6186 case Builtin::BI_InterlockedExchangePointer:
6189 case Builtin::BI_InterlockedCompareExchangePointer:
6192 case Builtin::BI_InterlockedCompareExchangePointer_nf:
6195 case Builtin::BI_InterlockedCompareExchange8:
6196 case Builtin::BI_InterlockedCompareExchange16:
6197 case Builtin::BI_InterlockedCompareExchange:
6198 case Builtin::BI_InterlockedCompareExchange64:
6200 case Builtin::BI_InterlockedIncrement16:
6201 case Builtin::BI_InterlockedIncrement:
6204 case Builtin::BI_InterlockedDecrement16:
6205 case Builtin::BI_InterlockedDecrement:
6208 case Builtin::BI_InterlockedAnd8:
6209 case Builtin::BI_InterlockedAnd16:
6210 case Builtin::BI_InterlockedAnd:
6212 case Builtin::BI_InterlockedExchangeAdd8:
6213 case Builtin::BI_InterlockedExchangeAdd16:
6214 case Builtin::BI_InterlockedExchangeAdd:
6217 case Builtin::BI_InterlockedExchangeSub8:
6218 case Builtin::BI_InterlockedExchangeSub16:
6219 case Builtin::BI_InterlockedExchangeSub:
6222 case Builtin::BI_InterlockedOr8:
6223 case Builtin::BI_InterlockedOr16:
6224 case Builtin::BI_InterlockedOr:
6226 case Builtin::BI_InterlockedXor8:
6227 case Builtin::BI_InterlockedXor16:
6228 case Builtin::BI_InterlockedXor:
6231 case Builtin::BI_bittest64:
6232 case Builtin::BI_bittest:
6233 case Builtin::BI_bittestandcomplement64:
6234 case Builtin::BI_bittestandcomplement:
6235 case Builtin::BI_bittestandreset64:
6236 case Builtin::BI_bittestandreset:
6237 case Builtin::BI_bittestandset64:
6238 case Builtin::BI_bittestandset:
6239 case Builtin::BI_interlockedbittestandreset:
6240 case Builtin::BI_interlockedbittestandreset64:
6241 case Builtin::BI_interlockedbittestandreset64_acq:
6242 case Builtin::BI_interlockedbittestandreset64_rel:
6243 case Builtin::BI_interlockedbittestandreset64_nf:
6244 case Builtin::BI_interlockedbittestandset64:
6245 case Builtin::BI_interlockedbittestandset64_acq:
6246 case Builtin::BI_interlockedbittestandset64_rel:
6247 case Builtin::BI_interlockedbittestandset64_nf:
6248 case Builtin::BI_interlockedbittestandset:
6249 case Builtin::BI_interlockedbittestandset_acq:
6250 case Builtin::BI_interlockedbittestandset_rel:
6251 case Builtin::BI_interlockedbittestandset_nf:
6252 case Builtin::BI_interlockedbittestandreset_acq:
6253 case Builtin::BI_interlockedbittestandreset_rel:
6254 case Builtin::BI_interlockedbittestandreset_nf:
6259 case Builtin::BI__iso_volatile_load8:
6260 case Builtin::BI__iso_volatile_load16:
6261 case Builtin::BI__iso_volatile_load32:
6262 case Builtin::BI__iso_volatile_load64:
6264 case Builtin::BI__iso_volatile_store8:
6265 case Builtin::BI__iso_volatile_store16:
6266 case Builtin::BI__iso_volatile_store32:
6267 case Builtin::BI__iso_volatile_store64:
6270 case Builtin::BI__builtin_ptrauth_sign_constant:
6273 case Builtin::BI__builtin_ptrauth_auth:
6274 case Builtin::BI__builtin_ptrauth_auth_and_resign:
6275 case Builtin::BI__builtin_ptrauth_auth_with_pc_and_resign:
6276 case Builtin::BI__builtin_ptrauth_auth_load_relative_and_sign:
6277 case Builtin::BI__builtin_ptrauth_blend_discriminator:
6278 case Builtin::BI__builtin_ptrauth_sign_generic_data:
6279 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
6280 case Builtin::BI__builtin_ptrauth_strip: {
6287 llvm::Type *OrigValueType = Args[0]->getType();
6288 if (OrigValueType->isPointerTy())
6291 switch (BuiltinID) {
6292 case Builtin::BI__builtin_ptrauth_auth_with_pc_and_resign:
6295 if (Args[2]->
getType()->isPointerTy())
6297 if (Args[3]->
getType()->isPointerTy())
6299 if (Args[5]->
getType()->isPointerTy())
6303 case Builtin::BI__builtin_ptrauth_auth_and_resign:
6304 case Builtin::BI__builtin_ptrauth_auth_load_relative_and_sign:
6305 if (Args[4]->
getType()->isPointerTy())
6309 case Builtin::BI__builtin_ptrauth_auth:
6310 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
6311 if (Args[2]->
getType()->isPointerTy())
6315 case Builtin::BI__builtin_ptrauth_sign_generic_data:
6316 if (Args[1]->
getType()->isPointerTy())
6320 case Builtin::BI__builtin_ptrauth_blend_discriminator:
6321 case Builtin::BI__builtin_ptrauth_strip:
6326 auto IntrinsicID = [&]() ->
unsigned {
6327 switch (BuiltinID) {
6328 case Builtin::BI__builtin_ptrauth_auth:
6329 return Intrinsic::ptrauth_auth;
6330 case Builtin::BI__builtin_ptrauth_auth_and_resign:
6331 return Intrinsic::ptrauth_resign;
6332 case Builtin::BI__builtin_ptrauth_auth_with_pc_and_resign:
6333 return Intrinsic::ptrauth_auth_with_pc_and_resign;
6334 case Builtin::BI__builtin_ptrauth_auth_load_relative_and_sign:
6335 return Intrinsic::ptrauth_resign_load_relative;
6336 case Builtin::BI__builtin_ptrauth_blend_discriminator:
6337 return Intrinsic::ptrauth_blend;
6338 case Builtin::BI__builtin_ptrauth_sign_generic_data:
6339 return Intrinsic::ptrauth_sign_generic;
6340 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:
6341 return Intrinsic::ptrauth_sign;
6342 case Builtin::BI__builtin_ptrauth_strip:
6343 return Intrinsic::ptrauth_strip;
6345 llvm_unreachable(
"bad ptrauth intrinsic");
6347 auto Intrinsic =
CGM.getIntrinsic(IntrinsicID);
6350 if (BuiltinID != Builtin::BI__builtin_ptrauth_sign_generic_data &&
6351 BuiltinID != Builtin::BI__builtin_ptrauth_blend_discriminator &&
6352 OrigValueType->isPointerTy()) {
6358 case Builtin::BI__builtin_get_vtable_pointer: {
6364 assert(ThisAddress.isValid());
6365 llvm::Value *VTablePointer =
6370 case Builtin::BI__exception_code:
6371 case Builtin::BI_exception_code:
6373 case Builtin::BI__exception_info:
6374 case Builtin::BI_exception_info:
6376 case Builtin::BI__abnormal_termination:
6377 case Builtin::BI_abnormal_termination:
6379 case Builtin::BI_setjmpex:
6384 case Builtin::BI_setjmp:
6396 case Builtin::BImove:
6397 case Builtin::BImove_if_noexcept:
6398 case Builtin::BIforward:
6399 case Builtin::BIforward_like:
6400 case Builtin::BIas_const:
6402 case Builtin::BI__GetExceptionInfo: {
6403 if (llvm::GlobalVariable *GV =
6409 case Builtin::BI__fastfail:
6412 case Builtin::BI__builtin_coro_id:
6414 case Builtin::BI__builtin_coro_promise:
6416 case Builtin::BI__builtin_coro_resume:
6419 case Builtin::BI__builtin_coro_frame:
6421 case Builtin::BI__builtin_coro_noop:
6423 case Builtin::BI__builtin_coro_free:
6425 case Builtin::BI__builtin_coro_destroy:
6428 case Builtin::BI__builtin_coro_done:
6430 case Builtin::BI__builtin_coro_alloc:
6432 case Builtin::BI__builtin_coro_begin:
6434 case Builtin::BI__builtin_coro_end:
6436 case Builtin::BI__builtin_coro_suspend:
6438 case Builtin::BI__builtin_coro_size:
6440 case Builtin::BI__builtin_coro_align:
6444 case Builtin::BIread_pipe:
6445 case Builtin::BIwrite_pipe: {
6453 unsigned GenericAS =
6455 llvm::Type *I8PTy = llvm::PointerType::get(
getLLVMContext(), GenericAS);
6459 const char *Name = (BuiltinID == Builtin::BIread_pipe) ?
"__read_pipe_2"
6464 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6465 Value *ACast =
Builder.CreateAddrSpaceCast(Arg1, I8PTy);
6468 {Arg0, ACast, PacketSize, PacketAlign}));
6471 "Illegal number of parameters to pipe function");
6472 const char *Name = (BuiltinID == Builtin::BIread_pipe) ?
"__read_pipe_4"
6475 llvm::Type *ArgTys[] = {Arg0->
getType(), Arg1->getType(),
Int32Ty, I8PTy,
6479 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6480 Value *ACast =
Builder.CreateAddrSpaceCast(Arg3, I8PTy);
6487 {Arg0, Arg1, Arg2, ACast, PacketSize, PacketAlign}));
6492 case Builtin::BIreserve_read_pipe:
6493 case Builtin::BIreserve_write_pipe:
6494 case Builtin::BIwork_group_reserve_read_pipe:
6495 case Builtin::BIwork_group_reserve_write_pipe:
6496 case Builtin::BIsub_group_reserve_read_pipe:
6497 case Builtin::BIsub_group_reserve_write_pipe: {
6500 if (BuiltinID == Builtin::BIreserve_read_pipe)
6501 Name =
"__reserve_read_pipe";
6502 else if (BuiltinID == Builtin::BIreserve_write_pipe)
6503 Name =
"__reserve_write_pipe";
6504 else if (BuiltinID == Builtin::BIwork_group_reserve_read_pipe)
6505 Name =
"__work_group_reserve_read_pipe";
6506 else if (BuiltinID == Builtin::BIwork_group_reserve_write_pipe)
6507 Name =
"__work_group_reserve_write_pipe";
6508 else if (BuiltinID == Builtin::BIsub_group_reserve_read_pipe)
6509 Name =
"__sub_group_reserve_read_pipe";
6511 Name =
"__sub_group_reserve_write_pipe";
6522 llvm::FunctionType *FTy =
6523 llvm::FunctionType::get(ReservedIDTy, ArgTys,
false);
6526 if (Arg1->getType() !=
Int32Ty)
6529 {Arg0, Arg1, PacketSize, PacketAlign}));
6533 case Builtin::BIcommit_read_pipe:
6534 case Builtin::BIcommit_write_pipe:
6535 case Builtin::BIwork_group_commit_read_pipe:
6536 case Builtin::BIwork_group_commit_write_pipe:
6537 case Builtin::BIsub_group_commit_read_pipe:
6538 case Builtin::BIsub_group_commit_write_pipe: {
6540 if (BuiltinID == Builtin::BIcommit_read_pipe)
6541 Name =
"__commit_read_pipe";
6542 else if (BuiltinID == Builtin::BIcommit_write_pipe)
6543 Name =
"__commit_write_pipe";
6544 else if (BuiltinID == Builtin::BIwork_group_commit_read_pipe)
6545 Name =
"__work_group_commit_read_pipe";
6546 else if (BuiltinID == Builtin::BIwork_group_commit_write_pipe)
6547 Name =
"__work_group_commit_write_pipe";
6548 else if (BuiltinID == Builtin::BIsub_group_commit_read_pipe)
6549 Name =
"__sub_group_commit_read_pipe";
6551 Name =
"__sub_group_commit_write_pipe";
6561 llvm::FunctionType *FTy = llvm::FunctionType::get(
6565 {Arg0, Arg1, PacketSize, PacketAlign}));
6568 case Builtin::BIget_pipe_num_packets:
6569 case Builtin::BIget_pipe_max_packets: {
6570 const char *BaseName;
6572 if (BuiltinID == Builtin::BIget_pipe_num_packets)
6573 BaseName =
"__get_pipe_num_packets";
6575 BaseName =
"__get_pipe_max_packets";
6576 std::string Name = std::string(BaseName) +
6577 std::string(PipeTy->isReadOnly() ?
"_ro" :
"_wo");
6585 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6588 {Arg0, PacketSize, PacketAlign}));
6592 case Builtin::BIto_global:
6593 case Builtin::BIto_local:
6594 case Builtin::BIto_private: {
6596 auto NewArgT = llvm::PointerType::get(
6599 auto NewRetT = llvm::PointerType::get(
6601 CGM.getContext().getTargetAddressSpace(
6603 auto FTy = llvm::FunctionType::get(NewRetT, {NewArgT},
false);
6604 llvm::Value *NewArg;
6605 if (Arg0->getType()->getPointerAddressSpace() !=
6606 NewArgT->getPointerAddressSpace())
6607 NewArg =
Builder.CreateAddrSpaceCast(Arg0, NewArgT);
6609 NewArg =
Builder.CreateBitOrPointerCast(Arg0, NewArgT);
6625 case Builtin::BIenqueue_kernel: {
6630 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6647 Range = Range->stripPointerCasts();
6649 llvm::Type *RangePtrTy = Range->getType();
6654 Name =
"__enqueue_kernel_basic";
6655 llvm::Type *ArgTys[] = {QueueTy,
Int32Ty, RangePtrTy, GenericVoidPtrTy,
6657 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6660 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(3));
6662 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6663 llvm::Value *
Block =
6664 Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6667 {Queue, Flags, Range, Kernel, Block});
6670 assert(NumArgs >= 5 &&
"Invalid enqueue_kernel signature");
6674 auto CreateArrayForSizeVar =
6675 [=](
unsigned First) -> std::pair<llvm::Value *, llvm::Value *> {
6676 llvm::APInt ArraySize(32, NumArgs -
First);
6678 getContext().getSizeType(), ArraySize,
nullptr,
6682 llvm::Value *Alloca = Tmp.getPointer();
6683 llvm::Value *ElemPtr;
6687 auto *
Zero = llvm::ConstantInt::get(
IntTy, 0);
6688 for (
unsigned I =
First; I < NumArgs; ++I) {
6689 auto *Index = llvm::ConstantInt::get(
IntTy, I -
First);
6691 Builder.CreateGEP(Tmp.getElementType(), Alloca, {Zero, Index});
6697 V, GEP,
CGM.getDataLayout().getPrefTypeAlign(
SizeTy));
6699 return {ElemPtr, Alloca};
6705 Name =
"__enqueue_kernel_varargs";
6707 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(3));
6709 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6710 auto *
Block =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6711 auto [ElemPtr, TmpPtr] = CreateArrayForSizeVar(4);
6715 llvm::Value *
const Args[] = {Queue, Flags,
6719 llvm::Type *
const ArgTys[] = {
6720 QueueTy,
IntTy, RangePtrTy, GenericVoidPtrTy,
6721 GenericVoidPtrTy,
IntTy, ElemPtr->getType()};
6723 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6731 llvm::PointerType *PtrTy = llvm::PointerType::get(
6732 CGM.getLLVMContext(),
6735 llvm::Value *NumEvents =
6741 llvm::Value *EventWaitList =
nullptr;
6744 EventWaitList = llvm::ConstantPointerNull::get(PtrTy);
6751 EventWaitList =
Builder.CreatePointerCast(EventWaitList, PtrTy);
6753 llvm::Value *EventRet =
nullptr;
6756 EventRet = llvm::ConstantPointerNull::get(PtrTy);
6763 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(6));
6765 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6766 llvm::Value *
Block =
6767 Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6769 std::vector<llvm::Type *> ArgTys = {
6771 PtrTy, PtrTy, GenericVoidPtrTy, GenericVoidPtrTy};
6773 std::vector<llvm::Value *> Args = {Queue, Flags, Range,
6774 NumEvents, EventWaitList, EventRet,
6779 Name =
"__enqueue_kernel_basic_events";
6780 llvm::FunctionType *FTy =
6781 llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6787 Args.push_back(ConstantInt::get(
Int32Ty, NumArgs - 7));
6789 Name =
"__enqueue_kernel_events_varargs";
6791 auto [ElemPtr, TmpPtr] = CreateArrayForSizeVar(7);
6792 Args.push_back(ElemPtr);
6793 ArgTys.push_back(ElemPtr->getType());
6795 llvm::FunctionType *FTy = llvm::FunctionType::get(
Int32Ty, ArgTys,
false);
6801 llvm_unreachable(
"Unexpected enqueue_kernel signature");
6805 case Builtin::BIget_kernel_work_group_size: {
6806 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6809 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(0));
6811 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6812 Value *Arg =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6814 CGM.CreateRuntimeFunction(
6815 llvm::FunctionType::get(
IntTy, {GenericVoidPtrTy, GenericVoidPtrTy},
6817 "__get_kernel_work_group_size_impl"),
6820 case Builtin::BIget_kernel_preferred_work_group_size_multiple: {
6821 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6824 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(0));
6826 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6827 Value *Arg =
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
6829 CGM.CreateRuntimeFunction(
6830 llvm::FunctionType::get(
IntTy, {GenericVoidPtrTy, GenericVoidPtrTy},
6832 "__get_kernel_preferred_work_group_size_multiple_impl"),
6835 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange:
6836 case Builtin::BIget_kernel_sub_group_count_for_ndrange: {
6837 llvm::Type *GenericVoidPtrTy =
Builder.getPtrTy(
6842 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*
this, E->
getArg(1));
6844 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy);
6847 BuiltinID == Builtin::BIget_kernel_max_sub_group_size_for_ndrange
6848 ?
"__get_kernel_max_sub_group_size_for_ndrange_impl"
6849 :
"__get_kernel_sub_group_count_for_ndrange_impl";
6851 CGM.CreateRuntimeFunction(
6852 llvm::FunctionType::get(
6853 IntTy, {NDRange->getType(), GenericVoidPtrTy, GenericVoidPtrTy},
6856 {NDRange, Kernel, Block}));
6858 case Builtin::BI__builtin_store_half:
6859 case Builtin::BI__builtin_store_halff: {
6867 case Builtin::BI__builtin_load_half: {
6872 case Builtin::BI__builtin_load_halff: {
6877 case Builtin::BI__builtin_printf:
6878 case Builtin::BIprintf:
6892 case Builtin::BI__builtin_canonicalize:
6893 case Builtin::BI__builtin_canonicalizef:
6894 case Builtin::BI__builtin_canonicalizef16:
6895 case Builtin::BI__builtin_canonicalizel:
6899 case Builtin::BI__builtin_thread_pointer: {
6900 if (!
getContext().getTargetInfo().isTLSSupported())
6901 CGM.ErrorUnsupported(E,
"__builtin_thread_pointer");
6904 {GlobalsInt8PtrTy}, {}));
6906 case Builtin::BI__builtin_os_log_format:
6909 case Builtin::BI__xray_customevent: {
6913 if (!
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
6917 if (
const auto *XRayAttr =
CurFuncDecl->getAttr<XRayInstrumentAttr>())
6921 Function *F =
CGM.getIntrinsic(Intrinsic::xray_customevent);
6922 auto FTy = F->getFunctionType();
6923 auto Arg0 = E->
getArg(0);
6925 auto Arg0Ty = Arg0->getType();
6926 auto PTy0 = FTy->getParamType(0);
6927 if (PTy0 != Arg0Val->getType()) {
6928 if (Arg0Ty->isArrayType())
6931 Arg0Val =
Builder.CreatePointerCast(Arg0Val, PTy0);
6934 auto PTy1 = FTy->getParamType(1);
6935 if (PTy1 != Arg1->getType())
6936 Arg1 =
Builder.CreateTruncOrBitCast(Arg1, PTy1);
6940 case Builtin::BI__xray_typedevent: {
6947 if (!
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
6951 if (
const auto *XRayAttr =
CurFuncDecl->getAttr<XRayInstrumentAttr>())
6955 Function *F =
CGM.getIntrinsic(Intrinsic::xray_typedevent);
6956 auto FTy = F->getFunctionType();
6958 auto PTy0 = FTy->getParamType(0);
6959 if (PTy0 != Arg0->getType())
6960 Arg0 =
Builder.CreateTruncOrBitCast(Arg0, PTy0);
6961 auto Arg1 = E->
getArg(1);
6963 auto Arg1Ty = Arg1->getType();
6964 auto PTy1 = FTy->getParamType(1);
6965 if (PTy1 != Arg1Val->getType()) {
6966 if (Arg1Ty->isArrayType())
6969 Arg1Val =
Builder.CreatePointerCast(Arg1Val, PTy1);
6972 auto PTy2 = FTy->getParamType(2);
6973 if (PTy2 != Arg2->getType())
6974 Arg2 =
Builder.CreateTruncOrBitCast(Arg2, PTy2);
6978 case Builtin::BI__builtin_ms_va_start:
6979 case Builtin::BI__builtin_ms_va_end:
6982 BuiltinID == Builtin::BI__builtin_ms_va_start));
6984 case Builtin::BI__builtin_ms_va_copy: {
7001 case Builtin::BI__builtin_zos_va_start:
7002 case Builtin::BI__builtin_zos_va_end: {
7015 BuiltinID == Builtin::BI__builtin_zos_va_start));
7017 case Builtin::BI__builtin_zos_va_copy: {
7022 uint64_t SizeBytes =
7023 CGM.getDataLayout().getTypeAllocSize(VAListTy).getFixedValue();
7024 Value *SizeVal = llvm::ConstantInt::get(
Int64Ty, SizeBytes);
7025 Builder.CreateMemCpy(Dest, Src, SizeVal,
false);
7029 case Builtin::BI__builtin_get_device_side_mangled_name: {
7030 auto Name =
CGM.getCUDARuntime().getDeviceSideName(
7032 auto Str =
CGM.GetAddrOfConstantCString(Name,
"");
7042 BI.isLibFunction(BuiltinID))
7044 CGM.getBuiltinLibFunction(FD, BuiltinID));
7048 if (BI.isPredefinedLibFunction(BuiltinID))
7058 if (
unsigned VectorWidth =
getContext().BuiltinInfo.getRequiredVectorWidth(BuiltinID))
7059 LargestVectorWidth = std::max(LargestVectorWidth, VectorWidth);
7063 Intrinsic::ID IntrinsicID = Intrinsic::not_intrinsic;
7066 if (!Prefix.empty()) {
7067 IntrinsicID = Intrinsic::getIntrinsicForClangBuiltin(Prefix.data(), Name);
7068 if (IntrinsicID == Intrinsic::not_intrinsic && Prefix ==
"spv" &&
7070 IntrinsicID = Intrinsic::getIntrinsicForClangBuiltin(
"amdgcn", Name);
7074 if (IntrinsicID == Intrinsic::not_intrinsic)
7075 IntrinsicID = Intrinsic::getIntrinsicForMSBuiltin(Prefix.data(), Name);
7078 if (IntrinsicID != Intrinsic::not_intrinsic) {
7083 unsigned ICEArguments = 0;
7089 llvm::FunctionType *FTy = F->getFunctionType();
7091 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
7095 llvm::Type *PTy = FTy->getParamType(i);
7096 if (PTy != ArgValue->
getType()) {
7098 if (
auto *PtrTy = dyn_cast<llvm::PointerType>(PTy)) {
7099 if (PtrTy->getAddressSpace() !=
7100 ArgValue->
getType()->getPointerAddressSpace()) {
7101 ArgValue =
Builder.CreateAddrSpaceCast(
7103 PtrTy->getAddressSpace()));
7109 if (PTy->isX86_AMXTy())
7110 ArgValue =
Builder.CreateIntrinsic(Intrinsic::x86_cast_vector_to_tile,
7111 {ArgValue->
getType()}, {ArgValue});
7113 ArgValue =
Builder.CreateBitCast(ArgValue, PTy);
7116 Args.push_back(ArgValue);
7122 llvm::Type *RetTy =
VoidTy;
7126 if (RetTy !=
V->getType()) {
7128 if (
auto *PtrTy = dyn_cast<llvm::PointerType>(RetTy)) {
7129 if (PtrTy->getAddressSpace() !=
V->getType()->getPointerAddressSpace()) {
7132 PtrTy->getAddressSpace()));
7138 if (
V->getType()->isX86_AMXTy())
7139 V =
Builder.CreateIntrinsic(Intrinsic::x86_cast_tile_to_vector, {RetTy},
7145 if (RetTy->isVoidTy())
7165 if (
V->getType()->isVoidTy())
7172 llvm_unreachable(
"No current target builtin returns complex");
7174 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");
7181 if (
V->getType()->isVoidTy())
7188 llvm_unreachable(
"No current hlsl builtin returns complex");
7190 llvm_unreachable(
"Bad evaluation kind in EmitBuiltinExpr");