On 1/21/19 10:19 AM, Jakub Jelinek wrote: > On Mon, Jan 21, 2019 at 10:09:01AM +0100, Martin Liška wrote: >> @@ -11351,6 +11352,7 @@ match >> gfc_match_gcc_builtin (void) >> { >> char builtin[GFC_MAX_SYMBOL_LEN + 1]; >> + char target[GFC_MAX_SYMBOL_LEN + 1]; >> >> if (gfc_match (" ( %n ) attributes simd", builtin) != MATCH_YES) >> return MATCH_ERROR; >> @@ -11361,6 +11363,26 @@ gfc_match_gcc_builtin (void) >> else if (gfc_match (" ( inbranch ) ") == MATCH_YES) >> clause = SIMD_INBRANCH; >> >> + if (gfc_match (" if ( %n ) ", target) == MATCH_YES) >> + { >> + if (strcmp (target, "lp64") == 0) >> + { >> + if (TYPE_PRECISION (long_integer_type_node) != 64 >> + || POINTER_SIZE != 64 >> + || TYPE_PRECISION (integer_type_node) != 32) >> + return MATCH_YES; >> + } >> + else if (strcmp (target, "ilp32") == 0) >> + { >> + if (TYPE_PRECISION (long_integer_type_node) != 32 >> + || POINTER_SIZE != 32 >> + || TYPE_PRECISION (integer_type_node) != 32) >> + return MATCH_YES; >> + } >> + else >> + return MATCH_ERROR; >> + } > > You should adjust the syntax above the function too. > And you need here buy-in from glibc folks. >> + >> if (gfc_vectorized_builtins == NULL) >> gfc_vectorized_builtins = new hash_map<nofree_string_hash, int> (); >> >> diff --git a/gcc/testsuite/gfortran.dg/simd-builtins-7.f90 >> b/gcc/testsuite/gfortran.dg/simd-builtins-7.f90 >> new file mode 100644 >> index 00000000000..6445733d288 >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/simd-builtins-7.f90 >> @@ -0,0 +1,21 @@ >> +! { dg-do compile { target { i?86-*-linux* x86_64-*-linux* } } } >> +! { dg-additional-options "-msse2 -mno-avx -nostdinc -Ofast >> -fpre-include=simd-builtins-7.h -fdump-tree-optimized" } >> + >> +program test_overloaded_intrinsic >> + real(4) :: x4(3200), y4(3200) >> + real(8) :: x8(3200), y8(3200) >> + >> + ! this should be using simd clone >> + y4 = sin(x4) >> + print *, y4 >> + >> + ! this should not be using simd clone > > The above 2 comments are misleading, they only match what ia32 does. > >> + y4 = sin(x8) >> + print *, y8 >> +end >> + >> +! { dg-final { scan-tree-dump "sinf.simdclone" "optimized" { target ia32 } >> } } */ >> +! { dg-final { scan-tree-dump-not "sin.simdclone" "optimized" { target ia32 >> } } } */ > > Perhaps use ilp32 instead of ia32? > > Jakub >
Thanks for review, I'm attaching updated patch. Martin
>From f8901f176f7832591dd9702da681859b9f3ddf38 Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Mon, 21 Jan 2019 08:46:06 +0100 Subject: [PATCH] Support if statement in !GCC$ builtin directive. gcc/fortran/ChangeLog: 2019-01-21 Martin Liska <mli...@suse.cz> * decl.c (gfc_match_gcc_builtin): Support filtering for 'lp64' and 'ilp32'. gcc/testsuite/ChangeLog: 2019-01-21 Martin Liska <mli...@suse.cz> * gfortran.dg/simd-builtins-7.f90: New test. * gfortran.dg/simd-builtins-7.h: New test. --- gcc/fortran/decl.c | 28 ++++++++++++++++++- gcc/testsuite/gfortran.dg/simd-builtins-7.f90 | 19 +++++++++++++ gcc/testsuite/gfortran.dg/simd-builtins-7.h | 2 ++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/simd-builtins-7.f90 create mode 100644 gcc/testsuite/gfortran.dg/simd-builtins-7.h diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 3314e176881..3e2e9adcb4a 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -28,6 +28,7 @@ along with GCC; see the file COPYING3. If not see #include "match.h" #include "parse.h" #include "constructor.h" +#include "target.h" /* Macros to access allocate memory for gfc_data_variable, gfc_data_value and gfc_data. */ @@ -11338,7 +11339,7 @@ gfc_match_gcc_unroll (void) return MATCH_ERROR; } -/* Match a !GCC$ builtin (b) attributes simd flags form: +/* Match a !GCC$ builtin (b) attributes simd if(target) flags form: The parameter b is name of a middle-end built-in. Flags are one of: @@ -11346,11 +11347,16 @@ gfc_match_gcc_unroll (void) - inbranch - notinbranch + Target must be one of: + - lp64 + - ilp32 + When we come here, we have already matched the !GCC$ builtin string. */ match gfc_match_gcc_builtin (void) { char builtin[GFC_MAX_SYMBOL_LEN + 1]; + char target[GFC_MAX_SYMBOL_LEN + 1]; if (gfc_match (" ( %n ) attributes simd", builtin) != MATCH_YES) return MATCH_ERROR; @@ -11361,6 +11367,26 @@ gfc_match_gcc_builtin (void) else if (gfc_match (" ( inbranch ) ") == MATCH_YES) clause = SIMD_INBRANCH; + if (gfc_match (" if ( %n ) ", target) == MATCH_YES) + { + if (strcmp (target, "lp64") == 0) + { + if (TYPE_PRECISION (long_integer_type_node) != 64 + || POINTER_SIZE != 64 + || TYPE_PRECISION (integer_type_node) != 32) + return MATCH_YES; + } + else if (strcmp (target, "ilp32") == 0) + { + if (TYPE_PRECISION (long_integer_type_node) != 32 + || POINTER_SIZE != 32 + || TYPE_PRECISION (integer_type_node) != 32) + return MATCH_YES; + } + else + return MATCH_ERROR; + } + if (gfc_vectorized_builtins == NULL) gfc_vectorized_builtins = new hash_map<nofree_string_hash, int> (); diff --git a/gcc/testsuite/gfortran.dg/simd-builtins-7.f90 b/gcc/testsuite/gfortran.dg/simd-builtins-7.f90 new file mode 100644 index 00000000000..c3ce5543779 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/simd-builtins-7.f90 @@ -0,0 +1,19 @@ +! { dg-do compile { target { i?86-*-linux* x86_64-*-linux* } } } +! { dg-additional-options "-msse2 -mno-avx -nostdinc -Ofast -fpre-include=simd-builtins-7.h -fdump-tree-optimized" } + +program test_overloaded_intrinsic + real(4) :: x4(3200), y4(3200) + real(8) :: x8(3200), y8(3200) + + y4 = sin(x4) + print *, y4 + + y4 = sin(x8) + print *, y8 +end + +! { dg-final { scan-tree-dump "sinf.simdclone" "optimized" { target ilp32 } } } */ +! { dg-final { scan-tree-dump-not "sin.simdclone" "optimized" { target ilp32 } } } */ + +! { dg-final { scan-tree-dump "sin.simdclone" "optimized" { target lp64} } } */ +! { dg-final { scan-tree-dump-not "sinf.simdclone" "optimized" { target lp64 } } } */ diff --git a/gcc/testsuite/gfortran.dg/simd-builtins-7.h b/gcc/testsuite/gfortran.dg/simd-builtins-7.h new file mode 100644 index 00000000000..1617e1086d0 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/simd-builtins-7.h @@ -0,0 +1,2 @@ +!GCC$ builtin (sin) attributes simd (notinbranch) if(lp64) +!GCC$ builtin (sinf) attributes simd (notinbranch) if(ilp32) -- 2.20.1