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)

        Jakub

Reply via email to