On Tue, Apr 10, 2018 at 12:29 PM, Jakub Jelinek <ja...@redhat.com> wrote: > 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.
I wonder if it is possible for glibc to ship a "module" for fortran instead containing the appropriate declarations and gfortran auto-include that (if present). Hard-coding stuff like suggested above is of course possible but not very forward compatible with changes in glibc. Richard. > Jakub