OSDN Git Service

PR middle-end/36802
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Dec 2008 10:36:01 +0000 (10:36 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Dec 2008 10:36:01 +0000 (10:36 +0000)
* omp-low.c (use_pointer_for_field): Only call maybe_lookup_decl
on parallel and task contexts.

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

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

gcc/ChangeLog
gcc/omp-low.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/pr36802-1.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/pr36802-2.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/pr36802-3.c [new file with mode: 0644]

index b530d25..ed541f1 100644 (file)
@@ -1,3 +1,9 @@
+2008-12-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/36802
+       * omp-low.c (use_pointer_for_field): Only call maybe_lookup_decl
+       on parallel and task contexts.
+
 2008-12-07  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gimple.c (recalculate_side_effects) <tcc_constant>: New case.
index 8781418..b7885e6 100644 (file)
@@ -760,10 +760,10 @@ use_pointer_for_field (tree decl, omp_context *shared_ctx)
          omp_context *up;
 
          for (up = shared_ctx->outer; up; up = up->outer)
-           if (maybe_lookup_decl (decl, up))
+           if (is_taskreg_ctx (up) && maybe_lookup_decl (decl, up))
              break;
 
-         if (up && is_taskreg_ctx (up))
+         if (up)
            {
              tree c;
 
index 46536c8..98a3073 100644 (file)
@@ -1,3 +1,10 @@
+2008-12-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/36802
+       * testsuite/libgomp.c/pr36802-1.c: New test.
+       * testsuite/libgomp.c/pr36802-2.c: New test.
+       * testsuite/libgomp.c/pr36802-3.c: New test.
+
 2008-12-01  Janis Johnson  <janis187@us.ibm.com>
 
        PR libgomp/38270
diff --git a/libgomp/testsuite/libgomp.c/pr36802-1.c b/libgomp/testsuite/libgomp.c/pr36802-1.c
new file mode 100644 (file)
index 0000000..4ed5e12
--- /dev/null
@@ -0,0 +1,34 @@
+/* PR middle-end/36802 */
+
+extern void abort (void);
+
+int
+foo (int k)
+{
+  int i = 0;
+#pragma omp parallel
+  #pragma omp single
+    {
+      if (!k)
+       {
+         int j;
+         for (j = 0; j < 10; j++)
+         #pragma omp task
+           if (j == 4)  
+             i++;
+       }
+      else
+       i++;
+    }
+  return i;
+}
+
+int
+main (void)
+{
+  if (foo (0) != 1)
+    abort ();
+  if (foo (1) != 1)
+    abort ();
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c/pr36802-2.c b/libgomp/testsuite/libgomp.c/pr36802-2.c
new file mode 100644 (file)
index 0000000..06e792f
--- /dev/null
@@ -0,0 +1,46 @@
+/* PR middle-end/36802 */
+
+extern void abort (void);
+
+int q;
+
+int
+foo (int k)
+{
+  int i = 6, n = 0;
+  omp_set_dynamic (0);
+  omp_set_nested (1);
+#pragma omp parallel shared (i) num_threads (3)
+  {
+    int l;
+
+    if (omp_get_num_threads () != 3)
+    #pragma omp atomic
+      n += 1;
+    else
+    #pragma omp for
+      for (l = 0; l < 3; l++)
+       if (k)
+       #pragma omp atomic
+         q += i;
+       else
+       #pragma omp parallel shared (i) num_threads (4)
+         {
+           if (omp_get_num_threads () != 4)
+           #pragma omp atomic
+             n += 1;
+           #pragma omp critical
+             i += 1;
+         }
+  }
+  if (n == 0 && i != 6 + 3 * 4)
+    abort ();
+  return 0;
+}
+
+int
+main (void)
+{
+  foo (0);
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c/pr36802-3.c b/libgomp/testsuite/libgomp.c/pr36802-3.c
new file mode 100644 (file)
index 0000000..f11baa0
--- /dev/null
@@ -0,0 +1,46 @@
+/* PR middle-end/36802 */
+
+extern void abort (void);
+
+int q;
+
+int
+foo (int k)
+{
+  int i = 6, n = 0;
+  omp_set_dynamic (0);
+  omp_set_nested (1);
+#pragma omp parallel shared (i) num_threads (3)
+  {
+    int l;
+
+    if (omp_get_num_threads () != 3)
+    #pragma omp atomic
+      n += 1;
+    else
+    #pragma omp for
+      for (l = 0; l < 3; l++)
+       if (!k)
+       #pragma omp parallel shared (i) num_threads (4)
+         {
+           if (omp_get_num_threads () != 4)
+           #pragma omp atomic
+             n += 1;
+           #pragma omp critical
+             i += 1;
+         }
+       else
+       #pragma omp atomic
+         q += i;
+  }
+  if (n == 0 && i != 6 + 3 * 4)
+    abort ();
+  return 0;
+}
+
+int
+main (void)
+{
+  foo (0);
+  return 0;
+}