]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR middle-end/52547 (ICE with openmp with nested function which requires...
authorJakub Jelinek <jakub@redhat.com>
Wed, 3 Apr 2013 17:52:33 +0000 (19:52 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 3 Apr 2013 17:52:33 +0000 (19:52 +0200)
Backported from mainline
2012-03-22  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/52547
* tree-nested.c (convert_tramp_reference_stmt): Call declare_vars
on any new_local_var_chain vars declared during recursing on
GIMPLE_OMP_PARALLEL or GIMPLE_OMP_TASK body.

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

From-SVN: r197441

gcc/ChangeLog
gcc/tree-nested.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/pr52547.c [new file with mode: 0644]

index 986e8e4d3ee397659285c66b7871759b384bc32d..31f944eefd58e03909dcd3b1a223873e04700dca 100644 (file)
@@ -1,6 +1,13 @@
 2013-04-03  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2012-03-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/52547
+       * tree-nested.c (convert_tramp_reference_stmt): Call declare_vars
+       on any new_local_var_chain vars declared during recursing on
+       GIMPLE_OMP_PARALLEL or GIMPLE_OMP_TASK body.
+
        2012-03-01  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/52445
index cebaf07f7847c86c8d2fe51bb0e11765fb19f95f..f33a0ca4e771f6776ada679512bab43addd800f3 100644 (file)
@@ -1950,6 +1950,7 @@ static tree
 convert_tramp_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
                              struct walk_stmt_info *wi)
 {
+  struct nesting_info *info = (struct nesting_info *) wi->info;
   gimple stmt = gsi_stmt (*gsi);
 
   switch (gimple_code (stmt))
@@ -1962,16 +1963,33 @@ convert_tramp_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
        for (i = 0; i < nargs; i++)
          walk_tree (gimple_call_arg_ptr (stmt, i), convert_tramp_reference_op,
                     wi, NULL);
+       break;
+      }
 
-       *handled_ops_p = true;
-       return NULL_TREE;
+    case GIMPLE_OMP_PARALLEL:
+    case GIMPLE_OMP_TASK:
+      {
+       tree save_local_var_chain;
+        walk_gimple_op (stmt, convert_tramp_reference_op, wi);
+       save_local_var_chain = info->new_local_var_chain;
+       info->new_local_var_chain = NULL;
+        walk_body (convert_tramp_reference_stmt, convert_tramp_reference_op,
+                  info, gimple_omp_body (stmt));
+       if (info->new_local_var_chain)
+         declare_vars (info->new_local_var_chain,
+                       gimple_seq_first_stmt (gimple_omp_body (stmt)),
+                       false);
+       info->new_local_var_chain = save_local_var_chain;
       }
+      break;
 
     default:
+      *handled_ops_p = false;
+      return NULL_TREE;
       break;
     }
 
-  *handled_ops_p = false;
+  *handled_ops_p = true;
   return NULL_TREE;
 }
 
index 38c08ceffbb1c844dfadb6bd6522730ee780d6df..1480d9b103ae31e82fabc7b4f8856182bcee9b89 100644 (file)
@@ -1,3 +1,11 @@
+2013-04-03  Jakub Jelinek  <jakub@redhat.com>
+
+       Backported from mainline
+       2012-03-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/52547
+       * testsuite/libgomp.c/pr52547.c: New test.
+
 2012-03-01  Release Manager
 
        * GCC 4.6.3 released.
diff --git a/libgomp/testsuite/libgomp.c/pr52547.c b/libgomp/testsuite/libgomp.c/pr52547.c
new file mode 100644 (file)
index 0000000..f746e2e
--- /dev/null
@@ -0,0 +1,36 @@
+/* PR middle-end/52547 */
+/* { dg-do run } */
+
+extern void abort (void);
+
+__attribute__((noinline, noclone)) int
+baz (int *x, int (*fn) (int *))
+{
+  return fn (x);
+}
+
+__attribute__((noinline, noclone)) int
+foo (int x, int *y)
+{
+  int i, e = 0;
+#pragma omp parallel for reduction(|:e)
+  for (i = 0; i < x; ++i)
+    {
+      __label__ lab;
+      int bar (int *z) { return z - y; }
+      if (baz (&y[i], bar) != i)
+       e |= 1;
+    }
+  return e;
+}
+
+int
+main ()
+{
+  int a[100], i;
+  for (i = 0; i < 100; i++)
+    a[i] = i;
+  if (foo (100, a))
+    abort ();
+  return 0;
+}