re PR middle-end/89015 (ICE in lookup_decl_in_outer_ctx, at omp-low.c:3480)
authorJakub Jelinek <jakub@redhat.com>
Thu, 24 Jan 2019 19:17:13 +0000 (20:17 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 24 Jan 2019 19:17:13 +0000 (20:17 +0100)
PR middle-end/89015
* tree-nested.c (convert_nonlocal_reference_stmt,
convert_local_reference_stmt, convert_tramp_reference_stmt,
convert_gimple_call) <case GIMPLE_OMP_TEAMS>: Treat
gimple_omp_teams_host teams stmts like GIMPLE_OMP_PARALLEL
or GIMPLE_OMP_TASK.

* gcc.dg/gomp/pr89015.c: New test.

From-SVN: r268246

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gomp/pr89015.c [new file with mode: 0644]
gcc/tree-nested.c

index efb20f77deec3f976f60274c7d661265c69170cb..7087ef1a4f5c79e77ae74be102eb68d52ac58c3e 100644 (file)
@@ -1,5 +1,12 @@
 2019-01-24  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/89015
+       * tree-nested.c (convert_nonlocal_reference_stmt,
+       convert_local_reference_stmt, convert_tramp_reference_stmt,
+       convert_gimple_call) <case GIMPLE_OMP_TEAMS>: Treat
+       gimple_omp_teams_host teams stmts like GIMPLE_OMP_PARALLEL
+       or GIMPLE_OMP_TASK.
+
        PR tree-optimization/89027
        * tree-inline.c (add_clobbers_to_eh_landing_pad): Don't add clobbers
        for "omp simd array" variables.
index 809c952e30ac984bc6d53dc8400abbed8df97cf3..f7423fe9b382d1a8ae8020df3a9eae560a291da2 100644 (file)
@@ -1,5 +1,8 @@
 2019-01-24  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/89015
+       * gcc.dg/gomp/pr89015.c: New test.
+
        PR c++/88976
        * c-c++-common/gomp/cancel-2.c: New test.
        * gcc.dg/gomp/cancel-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/gomp/pr89015.c b/gcc/testsuite/gcc.dg/gomp/pr89015.c
new file mode 100644 (file)
index 0000000..9036351
--- /dev/null
@@ -0,0 +1,25 @@
+/* PR middle-end/89015 */
+/* { dg-do compile } */
+
+int
+foo (int n, float *x, float *y)
+{
+  int i;
+  int bar (void) { return i; }
+#pragma omp teams distribute parallel for simd
+  for (i = 0; i < n; i++)
+    y[i] = x[i];
+  return bar ();
+}
+
+int
+baz (int n, float *x, float *y)
+{
+  int i;
+  int qux (void) {
+#pragma omp teams distribute parallel for simd
+    for (i = 0; i < n; i++)
+      y[i] = x[i];
+  }
+  return qux ();
+}
index 504afafbb47535084503b66ee006d7a554e45d96..3fe23cc2b22a00ff629c9da0a13456bbccf14f4e 100644 (file)
@@ -1497,6 +1497,20 @@ convert_nonlocal_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
        }
       break;
 
+    case GIMPLE_OMP_TEAMS:
+      if (!gimple_omp_teams_host (as_a <gomp_teams *> (stmt)))
+       {
+         save_suppress = info->suppress_expansion;
+         convert_nonlocal_omp_clauses (gimple_omp_teams_clauses_ptr (stmt),
+                                       wi);
+         walk_body (convert_nonlocal_reference_stmt,
+                    convert_nonlocal_reference_op, info,
+                    gimple_omp_body_ptr (stmt));
+         info->suppress_expansion = save_suppress;
+         break;
+       }
+      /* FALLTHRU */
+
     case GIMPLE_OMP_PARALLEL:
     case GIMPLE_OMP_TASK:
       save_suppress = info->suppress_expansion;
@@ -1601,14 +1615,6 @@ convert_nonlocal_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
       info->suppress_expansion = save_suppress;
       break;
 
-    case GIMPLE_OMP_TEAMS:
-      save_suppress = info->suppress_expansion;
-      convert_nonlocal_omp_clauses (gimple_omp_teams_clauses_ptr (stmt), wi);
-      walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op,
-                info, gimple_omp_body_ptr (stmt));
-      info->suppress_expansion = save_suppress;
-      break;
-
     case GIMPLE_OMP_SECTION:
     case GIMPLE_OMP_MASTER:
     case GIMPLE_OMP_ORDERED:
@@ -2168,6 +2174,18 @@ convert_local_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
 
   switch (gimple_code (stmt))
     {
+    case GIMPLE_OMP_TEAMS:
+      if (!gimple_omp_teams_host (as_a <gomp_teams *> (stmt)))
+       {
+         save_suppress = info->suppress_expansion;
+         convert_local_omp_clauses (gimple_omp_teams_clauses_ptr (stmt), wi);
+         walk_body (convert_local_reference_stmt, convert_local_reference_op,
+                    info, gimple_omp_body_ptr (stmt));
+         info->suppress_expansion = save_suppress;
+         break;
+       }
+      /* FALLTHRU */
+
     case GIMPLE_OMP_PARALLEL:
     case GIMPLE_OMP_TASK:
       save_suppress = info->suppress_expansion;
@@ -2299,14 +2317,6 @@ convert_local_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
       info->static_chain_added |= save_static_chain_added;
       break;
 
-    case GIMPLE_OMP_TEAMS:
-      save_suppress = info->suppress_expansion;
-      convert_local_omp_clauses (gimple_omp_teams_clauses_ptr (stmt), wi);
-      walk_body (convert_local_reference_stmt, convert_local_reference_op,
-                info, gimple_omp_body_ptr (stmt));
-      info->suppress_expansion = save_suppress;
-      break;
-
     case GIMPLE_OMP_SECTION:
     case GIMPLE_OMP_MASTER:
     case GIMPLE_OMP_ORDERED:
@@ -2607,6 +2617,14 @@ convert_tramp_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
        break;
       }
 
+    case GIMPLE_OMP_TEAMS:
+      if (!gimple_omp_teams_host (as_a <gomp_teams *> (stmt)))
+       {
+         *handled_ops_p = false;
+         return NULL_TREE;
+       }
+      goto do_parallel;
+
     case GIMPLE_OMP_TARGET:
       if (!is_gimple_omp_offloaded (stmt))
        {
@@ -2616,6 +2634,7 @@ convert_tramp_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
       /* FALLTHRU */
     case GIMPLE_OMP_PARALLEL:
     case GIMPLE_OMP_TASK:
+    do_parallel:
       {
        tree save_local_var_chain = info->new_local_var_chain;
         walk_gimple_op (stmt, convert_tramp_reference_op, wi);
@@ -2723,6 +2742,15 @@ convert_gimple_call (gimple_stmt_iterator *gsi, bool *handled_ops_p,
        }
       break;
 
+    case GIMPLE_OMP_TEAMS:
+      if (!gimple_omp_teams_host (as_a <gomp_teams *> (stmt)))
+       {
+         walk_body (convert_gimple_call, NULL, info,
+                    gimple_omp_body_ptr (stmt));
+         break;
+       }
+      /* FALLTHRU */
+
     case GIMPLE_OMP_PARALLEL:
     case GIMPLE_OMP_TASK:
       save_static_chain_added = info->static_chain_added;
@@ -2798,7 +2826,6 @@ convert_gimple_call (gimple_stmt_iterator *gsi, bool *handled_ops_p,
     case GIMPLE_OMP_SECTIONS:
     case GIMPLE_OMP_SECTION:
     case GIMPLE_OMP_SINGLE:
-    case GIMPLE_OMP_TEAMS:
     case GIMPLE_OMP_MASTER:
     case GIMPLE_OMP_TASKGROUP:
     case GIMPLE_OMP_ORDERED: