Hi!

The following testcases show incorrect handling of implicit linear or
lastprivate clauses on the #pragma omp simd iterators, if the vars aren't
private in the outer context and they aren't in combined constructs, they
should be noticed in the outer context.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk,
queued up for 6 branch after 6.1 is released.

2016-04-19  Jakub Jelinek  <ja...@redhat.com>

        PR middle-end/70680
        * gimplify.c (gimplify_omp_for): Call omp_notice_variable for
        implicitly linear or lastprivate iterator on the outer context.

        * testsuite/libgomp.c/pr70680-1.c: New test.
        * testsuite/libgomp.c/pr70680-2.c: New test.

--- gcc/gimplify.c.jj   2016-04-15 18:04:42.000000000 +0200
+++ gcc/gimplify.c      2016-04-19 20:03:19.347936293 +0200
@@ -8785,7 +8785,10 @@ gimplify_omp_for (tree *expr_p, gimple_s
                                                  decl, false))
                    ;
                  else if (outer->region_type != ORT_COMBINED_PARALLEL)
-                   outer = NULL;
+                   {
+                     omp_notice_variable (outer, decl, true);
+                     outer = NULL;
+                   }
                  if (outer)
                    {
                      n = splay_tree_lookup (outer->variables,
@@ -8868,7 +8871,10 @@ gimplify_omp_for (tree *expr_p, gimple_s
                                                  decl, false))
                    ;
                  else if (outer->region_type != ORT_COMBINED_PARALLEL)
-                   outer = NULL;
+                   {
+                     omp_notice_variable (outer, decl, true);
+                     outer = NULL;
+                   }
                  if (outer)
                    {
                      n = splay_tree_lookup (outer->variables,
--- libgomp/testsuite/libgomp.c/pr70680-1.c.jj  2016-04-19 20:13:54.998588014 
+0200
+++ libgomp/testsuite/libgomp.c/pr70680-1.c     2016-04-19 20:01:54.000000000 
+0200
@@ -0,0 +1,75 @@
+/* PR middle-end/70680 */
+
+int v;
+
+void
+f1 (void)
+{
+  int i = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd
+    for (i = 0; i < 100; i++)
+      ;
+    v = i;
+  }
+  if (i != 100)
+    __builtin_abort ();
+}
+
+void
+f2 (void)
+{
+  int i = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd
+    for (i = 0; i < 100; i++)
+      ;
+  }
+  if (i != 100)
+    __builtin_abort ();
+}
+
+void
+f3 (void)
+{
+  int i = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd linear(i: 1)
+    for (i = 0; i < 100; i++)
+      ;
+    v = i;
+  }
+  if (i != 100)
+    __builtin_abort ();
+}
+
+void
+f4 (void)
+{
+  int i = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd linear(i: 1)
+    for (i = 0; i < 100; i++)
+      ;
+  }
+  if (i != 100)
+    __builtin_abort ();
+}
+
+int
+main ()
+{
+  f1 ();
+  if (v++ != 100)
+    __builtin_abort ();
+  f2 ();
+  f3 ();
+  if (v++ != 100)
+    __builtin_abort ();
+  f4 ();
+  return 0;
+}
--- libgomp/testsuite/libgomp.c/pr70680-2.c.jj  2016-04-19 20:13:59.570527869 
+0200
+++ libgomp/testsuite/libgomp.c/pr70680-2.c     2016-04-19 20:09:02.000000000 
+0200
@@ -0,0 +1,79 @@
+/* PR middle-end/70680 */
+
+int v;
+
+void
+f1 (void)
+{
+  int i = 0, j = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd collapse(2)
+    for (i = 0; i < 10; i++)
+      for (j = 0; j < 10; j++)
+       ;
+    v = i + j;
+  }
+  if (i != 10 || j != 10)
+    __builtin_abort ();
+}
+
+void
+f2 (void)
+{
+  int i = 0, j = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd collapse(2)
+    for (i = 0; i < 10; i++)
+      for (j = 0; j < 10; j++)
+       ;
+  }
+  if (i != 10 || j != 10)
+    __builtin_abort ();
+}
+
+void
+f3 (void)
+{
+  int i = 0, j = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd collapse(2) lastprivate (i, j)
+    for (i = 0; i < 10; i++)
+      for (j = 0; j < 10; j++)
+       ;
+    v = i + j;
+  }
+  if (i != 10 || j != 10)
+    __builtin_abort ();
+}
+
+void
+f4 (void)
+{
+  int i = 0, j = 0;
+#pragma omp task default(shared) if(0)
+  {
+#pragma omp simd collapse(2) lastprivate (i, j)
+    for (i = 0; i < 10; i++)
+      for (j = 0; j < 10; j++)
+       ;
+  }
+  if (i != 10 || j != 10)
+    __builtin_abort ();
+}
+
+int
+main ()
+{
+  f1 ();
+  if (v++ != 20)
+    __builtin_abort ();
+  f2 ();
+  f3 ();
+  if (v++ != 20)
+    __builtin_abort ();
+  f4 ();
+  return 0;
+}

        Jakub

Reply via email to