omp-low.c (lower_rec_input_clauses): Don't force simd arrays for lastprivate non...
authorJakub Jelinek <jakub@redhat.com>
Sat, 20 Jul 2019 06:38:59 +0000 (08:38 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 20 Jul 2019 06:38:59 +0000 (08:38 +0200)
* omp-low.c (lower_rec_input_clauses): Don't force simd arrays for
lastprivate non-addressable iterator of a collapse(1) simd.

* gcc.dg/vect/vect-simd-16.c: New test.

From-SVN: r273620

gcc/ChangeLog
gcc/omp-low.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/vect-simd-16.c [new file with mode: 0644]

index 92e5b2e36a19af2502b02409beab5cdcf193ea75..40f6db590b66d4b74784272a031b2565f374ae38 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-20  Jakub Jelinek  <jakub@redhat.com>
+
+       * omp-low.c (lower_rec_input_clauses): Don't force simd arrays for
+       lastprivate non-addressable iterator of a collapse(1) simd.
+
 2019-07-17  Bill Seurer  <seurer@linux.vnet.ibm.com>
 
        * config/rs6000/rs6000-call.c (HAVE_AS_GNU_ATTRIBUTE): define value
index a18f24c7f96198f15c2aad4fe1366d5a5a786f53..03df07b63f182a4ceca3a9ce9ff768c2646689cc 100644 (file)
@@ -5097,7 +5097,10 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
                {
                  tree y = lang_hooks.decls.omp_clause_dtor (c, new_var);
                  if ((TREE_ADDRESSABLE (new_var) || nx || y
-                      || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
+                      || (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
+                          && (gimple_omp_for_collapse (ctx->stmt) != 1
+                              || (gimple_omp_for_index (ctx->stmt, 0)
+                                  != new_var)))
                       || OMP_CLAUSE_CODE (c) == OMP_CLAUSE__CONDTEMP_
                       || omp_is_reference (var))
                      && lower_rec_simd_input_clauses (new_var, ctx, &sctx,
index ce8e3c781b984d82d23900d304c203408ef51a58..a7c94269075cf84026a68119504ca46f432d1b17 100644 (file)
@@ -1,3 +1,7 @@
+2019-07-20  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.dg/vect/vect-simd-16.c: New test.
+
 2019-07-19  Jeff Law  <law@redhat.com>
 
        * gcc.dg/tree-ssa/ssa-dse-37.c: New test.
diff --git a/gcc/testsuite/gcc.dg/vect/vect-simd-16.c b/gcc/testsuite/gcc.dg/vect/vect-simd-16.c
new file mode 100644 (file)
index 0000000..ee4459a
--- /dev/null
@@ -0,0 +1,61 @@
+/* { dg-additional-options "-fopenmp-simd" } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+/* { dg-final { scan-tree-dump-times "vectorized \[1-3] loops" 3 "vect" { target i?86-*-* x86_64-*-* } } } */
+
+#include "tree-vect.h"
+
+__attribute__((noipa)) int
+foo (int *a)
+{
+  int i;
+  #pragma omp simd lastprivate (i)
+  for (i = 0; i < 64; i++)
+    a[i] = i;
+  return i;
+}
+
+__attribute__((noipa)) void
+bar (int *a)
+{
+  int i;
+  #pragma omp simd private (i)
+  for (i = 0; i < 64; i++)
+    a[i] = i + 1;
+}
+
+__attribute__((noipa)) int
+baz (int *a)
+{
+  int i;
+  #pragma omp simd linear (i)
+  for (i = 0; i < 64; i++)
+    a[i] = i + 2;
+  return i;
+}
+
+int
+main ()
+{
+  int i;
+  int a[64];
+  check_vect ();
+  if (foo (a) != 64)
+    abort ();
+  for (i = 0; i < 64; ++i)
+    if (a[i] != i)
+      abort ();
+    else
+      a[i] = -8;
+  bar (a);
+  for (i = 0; i < 64; ++i)
+    if (a[i] != i + 1)
+      abort ();
+    else
+      a[i] = -8;
+  if (baz (a) != 64)
+    abort ();
+  for (i = 0; i < 64; ++i)
+    if (a[i] != i + 2)
+      abort ();
+  return 0;
+}