]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/36802 (pop_gimplify_context ICE using openmp task construct)
authorJakub Jelinek <jakub@redhat.com>
Mon, 8 Dec 2008 10:36:01 +0000 (11:36 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 8 Dec 2008 10:36:01 +0000 (11:36 +0100)
PR middle-end/36802
* 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.

From-SVN: r142546

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 b530d25614a20c85b91f76465eefdf5dde5e03de..ed541f12220cc13fd899642a46fca916fcbc4ac5 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 8781418bd82007df4efb6cb9525c1fb2eaab047f..b7885e6cf3c12a841fda77a1003278a0214a90ad 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 46536c8838176009e5770c867032118cb629fef6..98a307314a9c0a52749ed7e1b0bfbca1a9dfc0d6 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;
+}