On Tue, Apr 10, 2018 at 11:22:03AM +0100, Szabolcs Nagy wrote:
> On 10/04/18 11:14, Janne Blomqvist wrote:
> > As I mentioned previously in that thread you linked to, the fortran
> > frontend never generates a direct call to libm sin(), or for that matter
> > ZGVbN2v_sin(). Instead it generates a "call" to __builtin_sin(). And
> > similarly for other libm functions that have gcc builtins. The
> > middle-end optimizers are then free to do whatever optimizations they
> > like on that __builtin_sin call, such as constant folding, and at least
> > as far as the fortran frontend is concerned, vectorizing if -mveclibabi=
> > or such is in effect.
> 
> the generated builtin call is not the issue (same happens in c),
> the knowledge about libc declarations is.
> 
> the middle-end has no idea what functions can be vectorized,
> only the libc knows it and declares this in c headers.
> 
> this is the problem i'm trying to solve.

And the easiest solution is in the Fortran FE based on some flag
(e.g. -mveclibabi=glibc) through a target hook add
__attribute__((__simd__ ("notinbranch")))
to the builtins like __builtin_sin etc. that have them in the
glibc header (x86_64 -m64 and -ffast-math only):

#  undef __DECL_SIMD_cos
#  define __DECL_SIMD_cos __DECL_SIMD_x86_64
#  undef __DECL_SIMD_cosf
#  define __DECL_SIMD_cosf __DECL_SIMD_x86_64
#  undef __DECL_SIMD_sin
#  define __DECL_SIMD_sin __DECL_SIMD_x86_64
#  undef __DECL_SIMD_sinf
#  define __DECL_SIMD_sinf __DECL_SIMD_x86_64
#  undef __DECL_SIMD_sincos
#  define __DECL_SIMD_sincos __DECL_SIMD_x86_64
#  undef __DECL_SIMD_sincosf
#  define __DECL_SIMD_sincosf __DECL_SIMD_x86_64
#  undef __DECL_SIMD_log
#  define __DECL_SIMD_log __DECL_SIMD_x86_64
#  undef __DECL_SIMD_logf
#  define __DECL_SIMD_logf __DECL_SIMD_x86_64
#  undef __DECL_SIMD_exp
#  define __DECL_SIMD_exp __DECL_SIMD_x86_64
#  undef __DECL_SIMD_expf
#  define __DECL_SIMD_expf __DECL_SIMD_x86_64
#  undef __DECL_SIMD_pow
#  define __DECL_SIMD_pow __DECL_SIMD_x86_64
#  undef __DECL_SIMD_powf
#  define __DECL_SIMD_powf __DECL_SIMD_x86_64

The sincos/sincosf stuff is questionable, because some glibc versions
implement it incorrectly and the simd ("notinbranch") attribute isn't that
useful for it anyway, we'd want to use extra clauses so that it doesn't need
to do scatter stores.

        Jakub

Reply via email to