re PR middle-end/66633 (ICE on valid "verify_gimple failed" with OpenMP)
authorJakub Jelinek <jakub@redhat.com>
Thu, 9 Jul 2015 21:14:11 +0000 (23:14 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 9 Jul 2015 21:14:11 +0000 (23:14 +0200)
PR middle-end/66633
* tree-nested.c (get_static_chain): Or in a flag into
info->static_chain_added.
(get_frame_field, get_nonlocal_debug_decl): Likewise.
(convert_nonlocal_omp_clauses, convert_local_omp_clauses): Revert
2015-07-01 changes.
(convert_tramp_reference_stmt): If a frame_decl or chain_decl
is needed newly inside of GIMPLE_OMP_{PARALLEL,TASK,TARGET} body,
add it to clauses.

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

From-SVN: r225638

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gomp/pr66633-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr66633-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr66633-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr66633-4.c [new file with mode: 0644]
gcc/tree-nested.c

index eaf7f7df902162aceffdb16ebfb2d4475ff263e5..5bc2f6ac78e4e1056789cfd79eb56b3ce17159a8 100644 (file)
@@ -1,5 +1,15 @@
 2015-07-09  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/66633
+       * tree-nested.c (get_static_chain): Or in a flag into
+       info->static_chain_added.
+       (get_frame_field, get_nonlocal_debug_decl): Likewise.
+       (convert_nonlocal_omp_clauses, convert_local_omp_clauses): Revert
+       2015-07-01 changes.
+       (convert_tramp_reference_stmt): If a frame_decl or chain_decl
+       is needed newly inside of GIMPLE_OMP_{PARALLEL,TASK,TARGET} body,
+       add it to clauses.
+
        PR tree-optimization/66718
        * tree-vect-stmts.c (struct simd_call_arg_info): Add simd_lane_linear
        field.
index 3e3fc03e8407d33cfd10f889596d47f800308c2f..df74648deff2a7c13ebd51b92389741f25159f27 100644 (file)
@@ -1,3 +1,11 @@
+2015-07-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/66633
+       * gcc.dg/gomp/pr66633-1.c: New test.
+       * gcc.dg/gomp/pr66633-2.c: New test.
+       * gcc.dg/gomp/pr66633-3.c: New test.
+       * gcc.dg/gomp/pr66633-4.c: New test.
+
 2015-07-09  John Marino  <gnugcc@marino.st>
 
        * lib/target-supports.exp (check_effective_target_pie):
diff --git a/gcc/testsuite/gcc.dg/gomp/pr66633-1.c b/gcc/testsuite/gcc.dg/gomp/pr66633-1.c
new file mode 100644 (file)
index 0000000..3260ac7
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR middle-end/66633 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -O1" } */
+
+void baz (int (*) ());
+
+void
+foo (void)
+{
+  int i;
+  auto int bar (void) { return i; }
+  #pragma omp parallel
+    baz (bar);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr66633-2.c b/gcc/testsuite/gcc.dg/gomp/pr66633-2.c
new file mode 100644 (file)
index 0000000..bc6c7c5
--- /dev/null
@@ -0,0 +1,5 @@
+/* PR middle-end/66633 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -O0" } */
+
+#include "pr66633-1.c"
diff --git a/gcc/testsuite/gcc.dg/gomp/pr66633-3.c b/gcc/testsuite/gcc.dg/gomp/pr66633-3.c
new file mode 100644 (file)
index 0000000..eaa3b0d
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR middle-end/66633 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -O1" } */
+
+void baz (int (*) ());
+
+void
+foo (void)
+{
+  int i;
+  auto int bar (void) { return i; }
+  auto void bar2 (void)
+  {
+    #pragma omp parallel
+      baz (bar);
+  }
+  bar2 ();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr66633-4.c b/gcc/testsuite/gcc.dg/gomp/pr66633-4.c
new file mode 100644 (file)
index 0000000..93cdcc2
--- /dev/null
@@ -0,0 +1,5 @@
+/* PR middle-end/66633 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -O0" } */
+
+#include "pr66633-3.c"
index 6b750208dfdb9ceef5183a80471535ee43226033..27986f6440118e8b3c43fab79b0693e6ff34abc3 100644 (file)
@@ -767,10 +767,12 @@ get_static_chain (struct nesting_info *info, tree target_context,
   if (info->context == target_context)
     {
       x = build_addr (info->frame_decl, target_context);
+      info->static_chain_added |= 1;
     }
   else
     {
       x = get_chain_decl (info);
+      info->static_chain_added |= 2;
 
       for (i = info->outer; i->context != target_context; i = i->outer)
        {
@@ -802,10 +804,12 @@ get_frame_field (struct nesting_info *info, tree target_context,
       /* Make sure frame_decl gets created.  */
       (void) get_frame_type (info);
       x = info->frame_decl;
+      info->static_chain_added |= 1;
     }
   else
     {
       x = get_chain_decl (info);
+      info->static_chain_added |= 2;
 
       for (i = info->outer; i->context != target_context; i = i->outer)
        {
@@ -851,10 +855,12 @@ get_nonlocal_debug_decl (struct nesting_info *info, tree decl)
       (void) get_frame_type (info);
       x = info->frame_decl;
       i = info;
+      info->static_chain_added |= 1;
     }
   else
     {
       x = get_chain_decl (info);
+      info->static_chain_added |= 2;
       for (i = info->outer; i->context != target_context; i = i->outer)
        {
          field = get_chain_field (i);
@@ -1061,9 +1067,7 @@ static bool
 convert_nonlocal_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
 {
   struct nesting_info *const info = (struct nesting_info *) wi->info;
-  /* If not optimizing, we will force the creation of the CHAIN object in
-     convert_all_function_calls, so we need to take it into account here.  */
-  bool need_chain = info->outer && !optimize, need_stmts = false;
+  bool need_chain = false, need_stmts = false;
   tree clause, decl;
   int dummy;
   bitmap new_suppress;
@@ -1691,9 +1695,7 @@ static bool
 convert_local_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
 {
   struct nesting_info *const info = (struct nesting_info *) wi->info;
-  /* If not optimizing, we will force the creation of the FRAME object in
-     convert_all_function_calls, so we need to take it into account here.  */
-  bool need_frame = info->inner && !optimize, need_stmts = false;
+  bool need_frame = false, need_stmts = false;
   tree clause, decl;
   int dummy;
   bitmap new_suppress;
@@ -2292,17 +2294,55 @@ convert_tramp_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
     case GIMPLE_OMP_PARALLEL:
     case GIMPLE_OMP_TASK:
       {
-       tree save_local_var_chain;
+       tree save_local_var_chain = info->new_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;
+       char save_static_chain_added = info->static_chain_added;
+       info->static_chain_added = 0;
         walk_body (convert_tramp_reference_stmt, convert_tramp_reference_op,
                   info, gimple_omp_body_ptr (stmt));
        if (info->new_local_var_chain)
          declare_vars (info->new_local_var_chain,
                        gimple_seq_first_stmt (gimple_omp_body (stmt)),
                        false);
+       for (int i = 0; i < 2; i++)
+         {
+           tree c, decl;
+           if ((info->static_chain_added & (1 << i)) == 0)
+             continue;
+           decl = i ? get_chain_decl (info) : info->frame_decl;
+           /* Don't add CHAIN.* or FRAME.* twice.  */
+           for (c = gimple_omp_taskreg_clauses (stmt);
+                c;
+                c = OMP_CLAUSE_CHAIN (c))
+             if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
+                  || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED)
+                 && OMP_CLAUSE_DECL (c) == decl)
+               break;
+             if (c == NULL && gimple_code (stmt) != GIMPLE_OMP_TARGET)
+               {
+                 c = build_omp_clause (gimple_location (stmt),
+                                       i ? OMP_CLAUSE_FIRSTPRIVATE
+                                         : OMP_CLAUSE_SHARED);
+                 OMP_CLAUSE_DECL (c) = decl;
+                 OMP_CLAUSE_CHAIN (c) = gimple_omp_taskreg_clauses (stmt);
+                 gimple_omp_taskreg_set_clauses (stmt, c);
+               }
+             else if (c == NULL)
+               {
+                 c = build_omp_clause (gimple_location (stmt),
+                                       OMP_CLAUSE_MAP);
+                 OMP_CLAUSE_DECL (c) = decl;
+                 OMP_CLAUSE_SET_MAP_KIND (c,
+                                          i ? GOMP_MAP_TO : GOMP_MAP_TOFROM);
+                 OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (decl);
+                 OMP_CLAUSE_CHAIN (c) = gimple_omp_target_clauses (stmt);
+                 gimple_omp_target_set_clauses (as_a <gomp_target *> (stmt),
+                                                c);
+               }
+         }
        info->new_local_var_chain = save_local_var_chain;
+       info->static_chain_added |= save_static_chain_added;
       }
       break;