On Sat, 13 Mar 2021 at 21:34, Jakub Jelinek via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > Hi! > > As the patch shows, there are several bugs in > aarch64_simd_clone_compute_vecsize_and_simdlen. > One is that unlike for function declarations that aren't definitions > it completely ignores argument types. Such decls don't have DECL_ARGUMENTS, > but we can walk TYPE_ARG_TYPES instead, like the i386 backend does or like > the simd cloning code in the middle end does too. > > Another problem is that it checks types of uniform arguments. That is > unnecessary, uniform arguments are passed the way it normally is, it is > a scalar argument rather than vector, so there is no reason not to support > uniform argument of different size, or long double, structure etc. > > Fixed thusly, bootstrapped/regtested on aarch64-linux, ok for trunk? > > 2021-03-13 Jakub Jelinek <ja...@redhat.com> > > PR target/99542 > * config/aarch64/aarch64.c > (aarch64_simd_clone_compute_vecsize_and_simdlen): If not a function > definition, walk TYPE_ARG_TYPES list if non-NULL for argument types > instead of DECL_ARGUMENTS. Ignore types for uniform arguments. > > * gcc.dg/gomp/pr99542.c: New test. > * gcc.dg/gomp/pr59669-2.c (bar): Don't expect a warning on aarch64. > * gcc.dg/gomp/simd-clones-2.c (setArray): Likewise. > * g++.dg/vect/simd-clone-7.cc (bar): Likewise. > * g++.dg/gomp/declare-simd-1.C (f37): Expect a different warning > on aarch64. > * gcc.dg/declare-simd.c (fn2): Expect a new warning on aarch64. > > --- gcc/config/aarch64/aarch64.c.jj 2021-03-12 19:01:48.672296344 +0100 > +++ gcc/config/aarch64/aarch64.c 2021-03-13 09:16:42.585045538 +0100 > @@ -23412,11 +23412,17 @@ aarch64_simd_clone_compute_vecsize_and_s > return 0; > } > > - for (t = DECL_ARGUMENTS (node->decl); t; t = DECL_CHAIN (t)) > + int i; > + tree type_arg_types = TYPE_ARG_TYPES (TREE_TYPE (node->decl)); > + bool decl_arg_p = (node->definition || type_arg_types == NULL_TREE); > + > + for (t = (decl_arg_p ? DECL_ARGUMENTS (node->decl) : type_arg_types), i = > 0; > + t && t != void_list_node; t = TREE_CHAIN (t), i++) > { > - arg_type = TREE_TYPE (t); > + tree arg_type = decl_arg_p ? TREE_TYPE (t) : TREE_VALUE (t); > > - if (!currently_supported_simd_type (arg_type, base_type)) > + if (clonei->args[i].arg_type != SIMD_CLONE_ARG_TYPE_UNIFORM > + && !currently_supported_simd_type (arg_type, base_type)) > { > if (TYPE_SIZE (arg_type) != TYPE_SIZE (base_type)) > warning_at (DECL_SOURCE_LOCATION (node->decl), 0, > --- gcc/testsuite/gcc.dg/gomp/pr99542.c.jj 2021-03-13 09:16:42.586045527 > +0100 > +++ gcc/testsuite/gcc.dg/gomp/pr99542.c 2021-03-13 09:16:42.586045527 +0100 > @@ -0,0 +1,17 @@ > +/* PR middle-end/89246 */ > +/* { dg-do compile { target int128 } } */ > +/* { dg-options "-O0 -fopenmp-simd" } */ > + > +#pragma omp declare simd > +extern int foo (__int128 x); /* { dg-warning "GCC does not currently > support mixed size types for 'simd' function" "" { target aarch64*-*-* } } */ > +/* { dg-warning "unsupported argument type '__int128' for simd" "" { target > i?86-*-* x86_64-*-* } .-1 } */ > + > +#pragma omp declare simd uniform (x) > +extern int baz (__int128 x); > + > +#pragma omp declare simd > +int > +bar (int x) > +{ > + return x + foo (0) + baz (0); > +} > --- gcc/testsuite/gcc.dg/gomp/pr59669-2.c.jj 2020-01-12 11:54:37.430398065 > +0100 > +++ gcc/testsuite/gcc.dg/gomp/pr59669-2.c 2021-03-13 09:35:07.100807877 > +0100 > @@ -7,4 +7,3 @@ void > bar (int *a) > { > } > -/* { dg-warning "GCC does not currently support mixed size types for 'simd' > functions" "" { target aarch64*-*-* } .-3 } */ > --- gcc/testsuite/gcc.dg/gomp/simd-clones-2.c.jj 2020-01-12 > 11:54:37.431398050 +0100 > +++ gcc/testsuite/gcc.dg/gomp/simd-clones-2.c 2021-03-13 09:36:21.143988256 > +0100 > @@ -15,7 +15,6 @@ float setArray(float *a, float x, int k) > return a[k]; > } > > -/* { dg-warning "GCC does not currently support mixed size types for 'simd' > functions" "" { target aarch64*-*-* } .-6 } */ > /* { dg-final { scan-tree-dump "_ZGVbN4ua32vl_setArray" "optimized" { target > i?86-*-* x86_64-*-* } } } */ > /* { dg-final { scan-tree-dump "_ZGVbN4vvva32_addit" "optimized" { target > i?86-*-* x86_64-*-* } } } */ > /* { dg-final { scan-tree-dump "_ZGVbM4vl66u_addit" "optimized" { target > i?86-*-* x86_64-*-* } } } */ > --- gcc/testsuite/g++.dg/vect/simd-clone-7.cc.jj 2020-01-12 > 11:54:37.280400328 +0100 > +++ gcc/testsuite/g++.dg/vect/simd-clone-7.cc 2021-03-13 09:23:58.005214442 > +0100 > @@ -8,5 +8,3 @@ bar (float x, float *y, int) > { > return y[0] + y[1] * x; > } > -// { dg-warning "GCC does not currently support mixed size types for 'simd' > functions" "" { target { { aarch64*-*-* } && lp64 } } .-4 } > - > --- gcc/testsuite/g++.dg/gomp/declare-simd-1.C.jj 2020-01-12 > 11:54:37.177401882 +0100 > +++ gcc/testsuite/g++.dg/gomp/declare-simd-1.C 2021-03-13 09:22:58.029878348 > +0100 > @@ -287,7 +287,7 @@ struct D > int f37 (int a); > int e; > }; > -// { dg-warning "GCC does not currently support simdlen 16 for type 'int'" > "" { target aarch64*-*-* } .-3 } > +// { dg-warning "GCC does not currently support mixed size types for 'simd' > functions" "" { target aarch64*-*-* } .-3 } > > void > f38 (D &d) > --- gcc/testsuite/gcc.dg/declare-simd.c.jj 2020-01-12 11:54:37.412398337 > +0100 > +++ gcc/testsuite/gcc.dg/declare-simd.c 2021-03-13 09:34:03.314513966 +0100 > @@ -3,6 +3,7 @@ > > #pragma omp declare simd linear (p2, p3) > extern void fn2 (float p1, float *p2, float *p3); > +/* { dg-warning "GCC does not currently support mixed size types for 'simd' > functions" "" { target aarch64*-*-* } .-1 } */ > > float *a, *b; > void fn1 (float *p1) >
Unfortunately, the last new warning does not happen when running the tests with -mabi=ilp32. Is that small patch OK? diff --git a/gcc/testsuite/gcc.dg/declare-simd.c b/gcc/testsuite/gcc.dg/declare-simd.c index 52796f6..894fb64 100644 --- a/gcc/testsuite/gcc.dg/declare-simd.c +++ b/gcc/testsuite/gcc.dg/declare-simd.c @@ -3,7 +3,7 @@ #pragma omp declare simd linear (p2, p3) extern void fn2 (float p1, float *p2, float *p3); -/* { dg-warning "GCC does not currently support mixed size types for 'simd' functions" "" { target aarch64*-*-* } .-1 } */ +/* { dg-warning "GCC does not currently support mixed size types for 'simd' functions" "" { target { { aarch64*-*-* } && { ! ilp32 } } } .-1 } */ float *a, *b; void fn1 (float *p1) Thanks Christophe > Jakub >