https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122103

--- Comment #7 from rguenther at suse dot de <rguenther at suse dot de> ---
On Thu, 2 Oct 2025, pinskia at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122103
> 
> --- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
> (In reply to Tamar Christina from comment #2)
> > Note that __builtin_sqrt is correctly marked as trapping. So this doesn't
> > vectorize.
> > 
> > void f (float *c, int n)
> > {
> >     for (int i = 0; i < n; i++)
> >       c[i] = __builtin_sqrt (c[i]);
> > }
> > 
> > unless at -Ofast.
> 
> This will produce the non conditional SQRT though:
> ```
> void f (float *__restrict c, float *__restrict d, int n)
> {
>     for (int i = 0; i < n; i++)
>     {
>       if (d[i] > 1000)
>         c[i] = __builtin_sqrt (c[i]);
>     }
> }
> 
> ```
> 
> at `-O2 -fno-math-errno`.
> 
> Hmm,
> 
> #define ATTR_MATHFN_FPROUNDING_ERRNO (flag_errno_math ? \
>         (flag_rounding_math ? ATTR_ERRNOPURE_NOTHROW_LEAF_LIST \
>          : ATTR_ERRNOCONST_NOTHROW_LEAF_LIST) : ATTR_MATHFN_FPROUNDING)
> 
> And fortran does:
>   opts->x_flag_errno_math = 0;
> 
> 
> 
> So the issue is a bit more complex. Maybe ATTR_MATHFN_FPROUNDING_ERRNO  is
> wrong for sqrt{,f,ll}.

Fortran doesn't use builtins.def, it has fortran/mathbuiltins.def
and it's own logic to handle attributes.

Reply via email to