OSDN Git Service

PR middle-end/39154
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 Feb 2009 21:57:52 +0000 (21:57 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 Feb 2009 21:57:52 +0000 (21:57 +0000)
* gimplify.c (omp_notice_variable): If adding GOVD_SEEN
bit to variable length decl's flags, add it also to its
pointer replacement variable.

* testsuite/libgomp.c/pr39154.c: New test.

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

gcc/ChangeLog
gcc/gimplify.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/pr39154.c [new file with mode: 0644]

index 71c859e..8f65c78 100644 (file)
@@ -1,3 +1,10 @@
+2009-02-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/39154
+       * gimplify.c (omp_notice_variable): If adding GOVD_SEEN
+       bit to variable length decl's flags, add it also to its
+       pointer replacement variable.
+
 2009-02-11  Uros Bizjak  <ubizjak@gmail.com>
            Jakub Jelinek  <jakub@redhat.com>
 
 2009-02-11  Uros Bizjak  <ubizjak@gmail.com>
            Jakub Jelinek  <jakub@redhat.com>
 
index 4af5029..ae12424 100644 (file)
@@ -5308,6 +5308,20 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
       goto do_outer;
     }
 
       goto do_outer;
     }
 
+  if ((n->value & (GOVD_SEEN | GOVD_LOCAL)) == 0
+      && (flags & (GOVD_SEEN | GOVD_LOCAL)) == GOVD_SEEN
+      && DECL_SIZE (decl)
+      && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
+    {
+      splay_tree_node n2;
+      tree t = DECL_VALUE_EXPR (decl);
+      gcc_assert (TREE_CODE (t) == INDIRECT_REF);
+      t = TREE_OPERAND (t, 0);
+      gcc_assert (DECL_P (t));
+      n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
+      n2->value |= GOVD_SEEN;
+    }
+
   shared = ((flags | n->value) & GOVD_SHARED) != 0;
   ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
 
   shared = ((flags | n->value) & GOVD_SHARED) != 0;
   ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
 
index 1261f31..3d0d3e8 100644 (file)
@@ -1,3 +1,8 @@
+2009-02-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/39154
+       * testsuite/libgomp.c/pr39154.c: New test.
+
 2009-01-30  Ian Lance Taylor  <iant@google.com>
 
        * acinclude.m4 (LIBCOMP_CHECK_LINKER_FEATURES): Set
 2009-01-30  Ian Lance Taylor  <iant@google.com>
 
        * acinclude.m4 (LIBCOMP_CHECK_LINKER_FEATURES): Set
diff --git a/libgomp/testsuite/libgomp.c/pr39154.c b/libgomp/testsuite/libgomp.c/pr39154.c
new file mode 100644 (file)
index 0000000..5a4c89e
--- /dev/null
@@ -0,0 +1,105 @@
+/* PR middle-end/39154 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -std=gnu99" } */
+
+extern void abort (void);
+
+int n = 20;
+
+int
+main (void)
+{
+  int a[n], b[n][n];
+
+#pragma omp parallel for
+    for (int i = 0; i < n; i++)
+      {
+       a[i] = i + 1;
+#pragma omp parallel for
+       for (int j = 0; j < n; j++)
+         b[i][j] = a[i];
+      }
+
+  for (int i = 0; i < n; i++)
+    {
+      for (int j = 0; j < n; j++)
+       if (b[i][j] != i + 1)
+         abort ();
+      if (a[i] != i + 1)
+       abort ();
+    }
+
+#pragma omp parallel for shared (n, a, b)
+    for (int i = 0; i < n; i++)
+      {
+       a[i] = i + 3;
+#pragma omp parallel for
+       for (int j = 0; j < n; j++)
+         b[i][j] = a[i];
+      }
+
+  for (int i = 0; i < n; i++)
+    {
+      for (int j = 0; j < n; j++)
+       if (b[i][j] != i + 3)
+         abort ();
+      if (a[i] != i + 3)
+       abort ();
+    }
+
+#pragma omp parallel for
+    for (int i = 0; i < n; i++)
+      {
+       a[i] = i + 5;
+#pragma omp parallel for shared (n, a, b)
+       for (int j = 0; j < n; j++)
+         b[i][j] = a[i];
+      }
+
+  for (int i = 0; i < n; i++)
+    {
+      for (int j = 0; j < n; j++)
+       if (b[i][j] != i + 5)
+         abort ();
+      if (a[i] != i + 5)
+       abort ();
+    }
+
+#pragma omp parallel for shared (n, a, b)
+    for (int i = 0; i < n; i++)
+      {
+       a[i] = i + 7;
+#pragma omp parallel for shared (n, a, b)
+       for (int j = 0; j < n; j++)
+         b[i][j] = a[i];
+      }
+
+  for (int i = 0; i < n; i++)
+    {
+      for (int j = 0; j < n; j++)
+       if (b[i][j] != i + 7)
+         abort ();
+      if (a[i] != i + 7)
+       abort ();
+    }
+
+#pragma omp parallel for private (a, b)
+    for (int i = 0; i < n; i++)
+      {
+       a[i] = i + 1;
+#pragma omp parallel for
+       for (int j = 0; j < n; j++)
+         b[i][j] = a[i];
+      }
+
+#pragma omp parallel for private (a, b)
+    for (int i = 0; i < n; i++)
+      {
+       a[i] = i + 1;
+#pragma omp parallel for private (b)
+       for (int j = 0; j < n; j++)
+         b[i][j] = a[i];
+      }
+
+  return 0;
+}