gimplify.c (gimplify_adjust_omp_clauses_1): Handle GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE.
authorJakub Jelinek <jakub@redhat.com>
Fri, 2 May 2014 17:43:40 +0000 (19:43 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 2 May 2014 17:43:40 +0000 (19:43 +0200)
* gimplify.c (gimplify_adjust_omp_clauses_1): Handle
GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE.
(gimplify_adjust_omp_clauses): Simd region is never
directly nested in combined parallel.  Instead, for linear
with copyin/copyout, if in combined for simd loop, make decl
firstprivate/lastprivate on OMP_FOR.
* omp-low.c (expand_omp_for_generic, expand_omp_for_static_nochunk,
expand_omp_for_static_chunk): When setting endvar, also set
fd->loop.v to the same value.
libgomp/
* testsuite/libgomp.c/simd-10.c: New test.
* testsuite/libgomp.c/simd-11.c: New test.
* testsuite/libgomp.c/simd-12.c: New test.
* testsuite/libgomp.c/simd-13.c: New test.

From-SVN: r210009

gcc/ChangeLog
gcc/gimplify.c
gcc/omp-low.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/simd-10.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/simd-11.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/simd-12.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/simd-13.c [new file with mode: 0644]

index 738dee31511daf1f83e380c77ae6458cd9ec828b..959780580130d1c6990a8e08fca71cbb5b1b50f1 100644 (file)
@@ -1,3 +1,15 @@
+2014-05-02  Jakub Jelinek  <jakub@redhat.com>
+
+       * gimplify.c (gimplify_adjust_omp_clauses_1): Handle
+       GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE.
+       (gimplify_adjust_omp_clauses): Simd region is never
+       directly nested in combined parallel.  Instead, for linear
+       with copyin/copyout, if in combined for simd loop, make decl
+       firstprivate/lastprivate on OMP_FOR.
+       * omp-low.c (expand_omp_for_generic, expand_omp_for_static_nochunk,
+       expand_omp_for_static_chunk): When setting endvar, also set
+       fd->loop.v to the same value.
+
 2014-05-02  Richard Sandiford  <rsandifo@linux.vnet.ibm.com>
 
        * hwint.h (zext_hwi): Fix signed overflow for prec == 63.
index 008a2528644aa87b0f5be028aaf94f64634ab9c4..37c3778624f2f1bd1cd386325450820b14c104cf 100644 (file)
@@ -6273,9 +6273,17 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
          OMP_CLAUSE_CHAIN (clause) = nc;
        }
     }
+  if (code == OMP_CLAUSE_FIRSTPRIVATE && (flags & GOVD_LASTPRIVATE) != 0)
+    {
+      tree nc = build_omp_clause (input_location, OMP_CLAUSE_LASTPRIVATE);
+      OMP_CLAUSE_DECL (nc) = decl;
+      OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (nc) = 1;
+      OMP_CLAUSE_CHAIN (nc) = *list_p;
+      OMP_CLAUSE_CHAIN (clause) = nc;
+      lang_hooks.decls.omp_finish_clause (nc);
+    }
   *list_p = clause;
   lang_hooks.decls.omp_finish_clause (clause);
-
   return 0;
 }
 
@@ -6314,18 +6322,17 @@ gimplify_adjust_omp_clauses (tree *list_p)
              if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
                  && ctx->outer_context
                  && !(OMP_CLAUSE_LINEAR_NO_COPYIN (c)
-                      && OMP_CLAUSE_LINEAR_NO_COPYOUT (c))
-                 && !is_global_var (decl))
+                      && OMP_CLAUSE_LINEAR_NO_COPYOUT (c)))
                {
-                 if (ctx->outer_context->region_type == ORT_COMBINED_PARALLEL)
+                 if (ctx->outer_context->combined_loop
+                     && !OMP_CLAUSE_LINEAR_NO_COPYIN (c))
                    {
                      n = splay_tree_lookup (ctx->outer_context->variables,
                                             (splay_tree_key) decl);
                      if (n == NULL
                          || (n->value & GOVD_DATA_SHARE_CLASS) == 0)
                        {
-                         int flags = OMP_CLAUSE_LINEAR_NO_COPYIN (c)
-                                     ? GOVD_LASTPRIVATE : GOVD_SHARED;
+                         int flags = GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE;
                          if (n == NULL)
                            omp_add_variable (ctx->outer_context, decl,
                                              flags | GOVD_SEEN);
@@ -6333,7 +6340,7 @@ gimplify_adjust_omp_clauses (tree *list_p)
                            n->value |= flags | GOVD_SEEN;
                        }
                    }
-                 else
+                 else if (!is_global_var (decl))
                    omp_notice_variable (ctx->outer_context, decl, true);
                }
            }
index 28b2c6aea8ca3a92ba7337c9b267c8be57a2e822..453bd294fd4fb769f948917b600d9cdfac84f84d 100644 (file)
@@ -5584,6 +5584,12 @@ expand_omp_for_generic (struct omp_region *region,
     {
       stmt = gimple_build_assign (endvar, iend);
       gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
+      if (useless_type_conversion_p (TREE_TYPE (fd->loop.v), TREE_TYPE (iend)))
+       stmt = gimple_build_assign (fd->loop.v, iend);
+      else
+       stmt = gimple_build_assign_with_ops (NOP_EXPR, fd->loop.v, iend,
+                                            NULL_TREE);
+      gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
     }
   if (fd->collapse > 1)
     expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar);
@@ -6000,6 +6006,12 @@ expand_omp_for_static_nochunk (struct omp_region *region,
     {
       stmt = gimple_build_assign (endvar, e);
       gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
+      if (useless_type_conversion_p (TREE_TYPE (fd->loop.v), TREE_TYPE (e)))
+       stmt = gimple_build_assign (fd->loop.v, e);
+      else
+       stmt = gimple_build_assign_with_ops (NOP_EXPR, fd->loop.v, e,
+                                            NULL_TREE);
+      gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
     }
   if (fd->collapse > 1)
     expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar);
@@ -6385,6 +6397,12 @@ expand_omp_for_static_chunk (struct omp_region *region,
     {
       stmt = gimple_build_assign (endvar, e);
       gsi_insert_after (&si, stmt, GSI_CONTINUE_LINKING);
+      if (useless_type_conversion_p (TREE_TYPE (fd->loop.v), TREE_TYPE (e)))
+       stmt = gimple_build_assign (fd->loop.v, e);
+      else
+       stmt = gimple_build_assign_with_ops (NOP_EXPR, fd->loop.v, e,
+                                            NULL_TREE);
+      gsi_insert_after (&si, stmt, GSI_CONTINUE_LINKING);
     }
   if (fd->collapse > 1)
     expand_omp_for_init_vars (fd, &si, counts, inner_stmt, startvar);
index 0b26b9fdb4a64921752077d4e75865c6f3f6b173..c73e60ba2da1bedf6a0846b833579400fae81abe 100644 (file)
@@ -1,3 +1,10 @@
+2014-05-02  Jakub Jelinek  <jakub@redhat.com>
+
+       * testsuite/libgomp.c/simd-10.c: New test.
+       * testsuite/libgomp.c/simd-11.c: New test.
+       * testsuite/libgomp.c/simd-12.c: New test.
+       * testsuite/libgomp.c/simd-13.c: New test.
+
 2014-04-24  Jakub Jelinek  <jakub@redhat.com>
 
        * testsuite/libgomp.c++/atomic-14.C: Allow seq_cst and
diff --git a/libgomp/testsuite/libgomp.c/simd-10.c b/libgomp/testsuite/libgomp.c/simd-10.c
new file mode 100644 (file)
index 0000000..70cd9f0
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+int s = 0, i, u;
+
+void
+foo ()
+{
+  #pragma omp for simd schedule(static, 32) reduction(+:s) lastprivate(u)
+  for (i = 0; i < 128; i++)
+    {
+      s++;
+      u = i;
+    }
+  if (i != 128 || s != 128 || u != 127)
+    __builtin_abort ();
+}
+
+int
+main ()
+{
+  foo ();
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c/simd-11.c b/libgomp/testsuite/libgomp.c/simd-11.c
new file mode 100644 (file)
index 0000000..b09f0dd
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+int s = 0, i, j, u;
+
+void
+foo ()
+{
+  #pragma omp for simd schedule(static, 32) reduction(+:s) lastprivate(u) collapse(2)
+  for (i = 0; i < 16; i++)
+    for (j = 0; j < 16; j++)
+      {
+       s++;
+       u = i + j;
+      }
+  if (i != 16 || j != 16 || s != 256 || u != 30)
+    __builtin_abort ();
+}
+
+int
+main ()
+{
+  foo ();
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c/simd-12.c b/libgomp/testsuite/libgomp.c/simd-12.c
new file mode 100644 (file)
index 0000000..6685111
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+int
+main ()
+{
+  int k = 0, i, s = 0;
+  #pragma omp parallel
+  #pragma omp for simd linear(k : 3) reduction(+: s) schedule (static, 16)
+  for (i = 0; i < 128; i++)
+    {
+      k = k + 3;
+      s = s + k;
+    }
+  if (s != 128 * 129 / 2 * 3) __builtin_abort ();
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c/simd-13.c b/libgomp/testsuite/libgomp.c/simd-13.c
new file mode 100644 (file)
index 0000000..7c817b7
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+int
+main ()
+{
+  int k = 0, i, s = 0;
+  #pragma omp parallel for simd linear(k : 3) reduction(+: s) schedule (static, 16)
+  for (i = 0; i < 128; i++)
+    {
+      k = k + 3;
+      s = s + k;
+    }
+  if (s != 128 * 129 / 2 * 3) __builtin_abort ();
+  return 0;
+}