OSDN Git Service

PR middle-end/27388
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 May 2006 06:34:06 +0000 (06:34 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 May 2006 06:34:06 +0000 (06:34 +0000)
* gimplify.c (omp_is_private): If var is shared in some outer context,
return false instead of true.  Stop searching on parallel context
boundary.

* gcc.dg/gomp/pr27388-1.c: New test.
* gcc.dg/gomp/pr27388-2.c: New test.
* gcc.dg/gomp/pr27388-3.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@113514 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gomp/pr27388-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr27388-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr27388-3.c [new file with mode: 0644]

index 31310c6..59d7153 100644 (file)
@@ -1,3 +1,10 @@
+2006-05-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/27388
+       * gimplify.c (omp_is_private): If var is shared in some outer context,
+       return false instead of true.  Stop searching on parallel context
+       boundary.
+
 2006-05-03  Alexandre Oliva  <aoliva@redhat.com>
 
        PR java/8260
index 91b8881..000f610 100644 (file)
@@ -4443,17 +4443,22 @@ omp_is_private (struct gimplify_omp_ctx *ctx, tree decl)
       if (n->value & GOVD_SHARED)
        {
          if (ctx == gimplify_omp_ctxp)
-           error ("iteration variable %qs should be private",
-                  IDENTIFIER_POINTER (DECL_NAME (decl)));
-         n->value = GOVD_PRIVATE;
+           {
+             error ("iteration variable %qs should be private",
+                    IDENTIFIER_POINTER (DECL_NAME (decl)));
+             n->value = GOVD_PRIVATE;
+             return true;
+           }
+         else
+           return false;
        }
       return true;
     }
 
-  if (ctx->outer_context)
-    return omp_is_private (ctx->outer_context, decl);
-  else if (ctx->is_parallel)
+  if (ctx->is_parallel)
     return false;
+  else if (ctx->outer_context)
+    return omp_is_private (ctx->outer_context, decl);
   else
     return !is_global_var (decl);
 }
index 35e0698..218a850 100644 (file)
@@ -1,5 +1,10 @@
 2006-05-04  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/27388
+       * gcc.dg/gomp/pr27388-1.c: New test.
+       * gcc.dg/gomp/pr27388-2.c: New test.
+       * gcc.dg/gomp/pr27388-3.c: New test.
+
        PR c++/27359
        * g++.dg/gomp/pr27359.C: New test.
 
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27388-1.c b/gcc/testsuite/gcc.dg/gomp/pr27388-1.c
new file mode 100644 (file)
index 0000000..f315b8b
--- /dev/null
@@ -0,0 +1,23 @@
+/* PR middle-end/27388 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+int n, o;
+
+void
+foo (void)
+{
+#pragma omp parallel firstprivate (n)
+  {
+    int i;
+#pragma omp parallel for firstprivate (n)
+    for (i = 0; i < 10; i++)
+      ++n;
+#pragma omp atomic
+    o += n;
+  }
+}
+
+/* { dg-final { scan-tree-dump-times "shared\\\(i\\\)" 0 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "private\\\(i\\\)" 1 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27388-2.c b/gcc/testsuite/gcc.dg/gomp/pr27388-2.c
new file mode 100644 (file)
index 0000000..da8a48d
--- /dev/null
@@ -0,0 +1,35 @@
+/* PR middle-end/27388 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+extern void baz (int);
+
+void
+foo (void)
+{
+  int i;
+#pragma omp parallel for shared (i)
+  for (i = 0; i < 2; i++)
+    baz (i);
+}
+
+void
+bar (void)
+{
+  int j = 0;
+#pragma omp parallel shared (j)
+  {
+    j++;
+#pragma omp for
+    for (j = 0; j < 2; j++)
+      baz (j);
+  }
+}
+
+/* { dg-final { scan-tree-dump-times "shared\\\(i\\\)\[^\\n\]*private\\\(i\\\)" 0 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "private\\\(i\\\)\[^\\n\]*shared\\\(i\\\)" 0 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "omp for\[^\\n\]*private\\\(i\\\)" 1 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "shared\\\(j\\\)\[^\\n\]*private\\\(j\\\)" 0 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "private\\\(j\\\)\[^\\n\]*shared\\\(j\\\)" 0 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "omp for\[^\\n\]*private\\\(j\\\)" 1 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27388-3.c b/gcc/testsuite/gcc.dg/gomp/pr27388-3.c
new file mode 100644 (file)
index 0000000..a6f4647
--- /dev/null
@@ -0,0 +1,23 @@
+/* PR middle-end/27388 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+extern void bar (int);
+
+void
+foo (void)
+{
+  int i = 0, j = 0;
+#pragma omp parallel firstprivate (i) private (j)
+  {
+#pragma omp for
+    for (i = 0; i < 2; i++)
+      bar (i);
+#pragma omp for
+    for (j = 0; j < 2; j++)
+      bar (j);
+  }
+}
+
+/* { dg-final { scan-tree-dump-times "omp for\[^\\n\]*private" 0 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */