Hi!

This patch fixes the handling of lastprivate propagation to outer 
combined/composite
leaf constructs from implicit linear or lastprivate clauses on simd IVs and 
adds missing
testsuite coverage for explicit and implicit lastprivate on simd IVs.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.

2021-05-21  Jakub Jelinek  <ja...@redhat.com>

        PR middle-end/99928
        * gimplify.c (omp_lastprivate_for_combined_outer_constructs): New
        function.
        (gimplify_scan_omp_clauses) <case OMP_CLAUSE_LASTPRIVATE>: Use it.
        (gimplify_omp_for): Likewise.

        * c-c++-common/gomp/pr99928-6.c: Remove all xfails.
        * c-c++-common/gomp/pr99928-13.c: New test.
        * c-c++-common/gomp/pr99928-14.c: New test.

--- gcc/gimplify.c.jj   2021-05-21 10:33:36.348926909 +0200
+++ gcc/gimplify.c      2021-05-21 11:41:02.647089257 +0200
@@ -8533,6 +8533,73 @@ omp_target_reorder_clauses (tree *list_p
       }
 }
 
+/* DECL is supposed to have lastprivate semantics in the outer contexts
+   of combined/composite constructs, starting with OCTX.
+   Add needed lastprivate, shared or map clause if no data sharing or
+   mapping clause are present.  IMPLICIT_P is true if it is an implicit
+   clause (IV on simd), in which case the lastprivate will not be
+   copied to some constructs.  */
+
+static void
+omp_lastprivate_for_combined_outer_constructs (struct gimplify_omp_ctx *octx,
+                                              tree decl, bool implicit_p)
+{
+  struct gimplify_omp_ctx *orig_octx = octx;
+  for (; octx; octx = octx->outer_context)
+    {
+      if ((octx->region_type == ORT_COMBINED_PARALLEL
+          || (octx->region_type & ORT_COMBINED_TEAMS) == ORT_COMBINED_TEAMS)
+         && splay_tree_lookup (octx->variables,
+                               (splay_tree_key) decl) == NULL)
+       {
+         omp_add_variable (octx, decl, GOVD_SHARED | GOVD_SEEN);
+         continue;
+       }
+      if ((octx->region_type & ORT_TASK) != 0
+         && octx->combined_loop
+         && splay_tree_lookup (octx->variables,
+                               (splay_tree_key) decl) == NULL)
+       {
+         omp_add_variable (octx, decl, GOVD_LASTPRIVATE | GOVD_SEEN);
+         continue;
+       }
+      if (implicit_p
+         && octx->region_type == ORT_WORKSHARE
+         && octx->combined_loop
+         && splay_tree_lookup (octx->variables,
+                               (splay_tree_key) decl) == NULL
+         && octx->outer_context
+         && octx->outer_context->region_type == ORT_COMBINED_PARALLEL
+         && splay_tree_lookup (octx->outer_context->variables,
+                               (splay_tree_key) decl) == NULL)
+       {
+         octx = octx->outer_context;
+         omp_add_variable (octx, decl, GOVD_LASTPRIVATE | GOVD_SEEN);
+         continue;
+       }
+      if ((octx->region_type == ORT_WORKSHARE || octx->region_type == ORT_ACC)
+         && octx->combined_loop
+         && splay_tree_lookup (octx->variables,
+                               (splay_tree_key) decl) == NULL
+         && !omp_check_private (octx, decl, false))
+       {
+         omp_add_variable (octx, decl, GOVD_LASTPRIVATE | GOVD_SEEN);
+         continue;
+       }
+      if (octx->region_type == ORT_COMBINED_TARGET
+         && splay_tree_lookup (octx->variables,
+                               (splay_tree_key) decl) == NULL)
+       {
+         omp_add_variable (octx, decl, GOVD_MAP | GOVD_SEEN);
+         octx = octx->outer_context;
+         break;
+       }
+      break;
+    }
+  if (octx && (implicit_p || octx != orig_octx))
+    omp_notice_variable (octx, decl, true);
+}
+
 /* Scan the OMP clauses in *LIST_P, installing mappings into a new
    and previous omp contexts.  */
 
@@ -8642,48 +8709,8 @@ gimplify_scan_omp_clauses (tree *list_p,
            }
          if (OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (c))
            flags |= GOVD_LASTPRIVATE_CONDITIONAL;
-         struct gimplify_omp_ctx *octx;
-         for (octx = outer_ctx; octx; octx = octx->outer_context)
-           {
-             if ((octx->region_type == ORT_COMBINED_PARALLEL
-                  || ((octx->region_type & ORT_COMBINED_TEAMS)
-                       == ORT_COMBINED_TEAMS))
-                 && splay_tree_lookup (octx->variables,
-                                       (splay_tree_key) decl) == NULL)
-               {
-                 omp_add_variable (octx, decl, GOVD_SHARED | GOVD_SEEN);
-                 continue;
-               }
-             if ((octx->region_type & ORT_TASK) != 0
-                 && octx->combined_loop
-                 && splay_tree_lookup (octx->variables,
-                                       (splay_tree_key) decl) == NULL)
-               {
-                 omp_add_variable (octx, decl, GOVD_LASTPRIVATE | GOVD_SEEN);
-                 continue;
-               }
-             if ((octx->region_type == ORT_WORKSHARE
-                  || octx->region_type == ORT_ACC)
-                 && octx->combined_loop
-                 && splay_tree_lookup (octx->variables,
-                                       (splay_tree_key) decl) == NULL
-                 && !omp_check_private (octx, decl, false))
-               {
-                 omp_add_variable (octx, decl, GOVD_LASTPRIVATE | GOVD_SEEN);
-                 continue;
-               }
-             if (octx->region_type == ORT_COMBINED_TARGET
-                 && splay_tree_lookup (octx->variables,
-                                       (splay_tree_key) decl) == NULL)
-               {
-                 omp_add_variable (octx, decl, GOVD_MAP | GOVD_SEEN);
-                 octx = octx->outer_context;
-                 break;
-               }
-             break;
-           }
-         if (octx && octx != outer_ctx)
-           omp_notice_variable (octx, decl, true);
+         omp_lastprivate_for_combined_outer_constructs (outer_ctx, decl,
+                                                        false);
          goto do_add;
        case OMP_CLAUSE_REDUCTION:
          if (OMP_CLAUSE_REDUCTION_TASK (c))
@@ -11853,80 +11880,8 @@ gimplify_omp_for (tree *expr_p, gimple_s
              OMP_FOR_CLAUSES (for_stmt) = c;
              omp_add_variable (gimplify_omp_ctxp, decl, flags);
              if (outer && !OMP_CLAUSE_LINEAR_NO_COPYOUT (c))
-               {
-                 if (outer->region_type == ORT_WORKSHARE
-                     && outer->combined_loop)
-                   {
-                     if (outer->outer_context
-                         && (outer->outer_context->region_type
-                             == ORT_COMBINED_PARALLEL))
-                       outer = outer->outer_context;
-                     else if (omp_check_private (outer, decl, false))
-                       outer = NULL;
-                   }
-                 else if (((outer->region_type & ORT_TASKLOOP)
-                           == ORT_TASKLOOP)
-                          && outer->combined_loop
-                          && !omp_check_private (gimplify_omp_ctxp,
-                                                 decl, false))
-                   ;
-                 else if (outer->region_type != ORT_COMBINED_PARALLEL)
-                   {
-                     omp_notice_variable (outer, decl, true);
-                     outer = NULL;
-                   }
-                 if (outer)
-                   {
-                     n = splay_tree_lookup (outer->variables,
-                                            (splay_tree_key)decl);
-                     if (n == NULL || (n->value & GOVD_DATA_SHARE_CLASS) == 0)
-                       {
-                         omp_add_variable (outer, decl,
-                                           GOVD_LASTPRIVATE | GOVD_SEEN);
-                         if (outer->region_type == ORT_COMBINED_PARALLEL
-                             && outer->outer_context
-                             && (outer->outer_context->region_type
-                                 == ORT_WORKSHARE)
-                             && outer->outer_context->combined_loop)
-                           {
-                             outer = outer->outer_context;
-                             n = splay_tree_lookup (outer->variables,
-                                                    (splay_tree_key)decl);
-                             if (omp_check_private (outer, decl, false))
-                               outer = NULL;
-                             else if (n == NULL
-                                      || ((n->value & GOVD_DATA_SHARE_CLASS)
-                                          == 0))
-                               omp_add_variable (outer, decl,
-                                                 GOVD_LASTPRIVATE
-                                                 | GOVD_SEEN);
-                             else
-                               outer = NULL;
-                           }
-                         if (outer && outer->outer_context
-                             && ((outer->outer_context->region_type
-                                  & ORT_COMBINED_TEAMS) == ORT_COMBINED_TEAMS
-                                 || (((outer->region_type & ORT_TASKLOOP)
-                                      == ORT_TASKLOOP)
-                                     && (outer->outer_context->region_type
-                                         == ORT_COMBINED_PARALLEL))))
-                           {
-                             outer = outer->outer_context;
-                             n = splay_tree_lookup (outer->variables,
-                                                    (splay_tree_key)decl);
-                             if (n == NULL
-                                 || (n->value & GOVD_DATA_SHARE_CLASS) == 0)
-                               omp_add_variable (outer, decl,
-                                                 GOVD_SHARED | GOVD_SEEN);
-                             else
-                               outer = NULL;
-                           }
-                         if (outer && outer->outer_context)
-                           omp_notice_variable (outer->outer_context, decl,
-                                                true);
-                       }
-                   }
-               }
+               omp_lastprivate_for_combined_outer_constructs (outer, decl,
+                                                              true);
            }
          else
            {
@@ -11945,87 +11900,8 @@ gimplify_omp_for (tree *expr_p, gimple_s
              struct gimplify_omp_ctx *outer
                = gimplify_omp_ctxp->outer_context;
              if (outer && lastprivate)
-               {
-                 if (outer->region_type == ORT_WORKSHARE
-                     && outer->combined_loop)
-                   {
-                     n = splay_tree_lookup (outer->variables,
-                                            (splay_tree_key)decl);
-                     if (n != NULL && (n->value & GOVD_LOCAL) != 0)
-                       {
-                         lastprivate = false;
-                         outer = NULL;
-                       }
-                     else if (outer->outer_context
-                              && (outer->outer_context->region_type
-                                  == ORT_COMBINED_PARALLEL))
-                       outer = outer->outer_context;
-                     else if (omp_check_private (outer, decl, false))
-                       outer = NULL;
-                   }
-                 else if (((outer->region_type & ORT_TASKLOOP)
-                           == ORT_TASKLOOP)
-                          && outer->combined_loop
-                          && !omp_check_private (gimplify_omp_ctxp,
-                                                 decl, false))
-                   ;
-                 else if (outer->region_type != ORT_COMBINED_PARALLEL)
-                   {
-                     omp_notice_variable (outer, decl, true);
-                     outer = NULL;
-                   }
-                 if (outer)
-                   {
-                     n = splay_tree_lookup (outer->variables,
-                                            (splay_tree_key)decl);
-                     if (n == NULL || (n->value & GOVD_DATA_SHARE_CLASS) == 0)
-                       {
-                         omp_add_variable (outer, decl,
-                                           GOVD_LASTPRIVATE | GOVD_SEEN);
-                         if (outer->region_type == ORT_COMBINED_PARALLEL
-                             && outer->outer_context
-                             && (outer->outer_context->region_type
-                                 == ORT_WORKSHARE)
-                             && outer->outer_context->combined_loop)
-                           {
-                             outer = outer->outer_context;
-                             n = splay_tree_lookup (outer->variables,
-                                                    (splay_tree_key)decl);
-                             if (omp_check_private (outer, decl, false))
-                               outer = NULL;
-                             else if (n == NULL
-                                      || ((n->value & GOVD_DATA_SHARE_CLASS)
-                                          == 0))
-                               omp_add_variable (outer, decl,
-                                                 GOVD_LASTPRIVATE
-                                                 | GOVD_SEEN);
-                             else
-                               outer = NULL;
-                           }
-                         if (outer && outer->outer_context
-                             && ((outer->outer_context->region_type
-                                  & ORT_COMBINED_TEAMS) == ORT_COMBINED_TEAMS
-                                 || (((outer->region_type & ORT_TASKLOOP)
-                                      == ORT_TASKLOOP)
-                                     && (outer->outer_context->region_type
-                                         == ORT_COMBINED_PARALLEL))))
-                           {
-                             outer = outer->outer_context;
-                             n = splay_tree_lookup (outer->variables,
-                                                    (splay_tree_key)decl);
-                             if (n == NULL
-                                 || (n->value & GOVD_DATA_SHARE_CLASS) == 0)
-                               omp_add_variable (outer, decl,
-                                                 GOVD_SHARED | GOVD_SEEN);
-                             else
-                               outer = NULL;
-                           }
-                         if (outer && outer->outer_context)
-                           omp_notice_variable (outer->outer_context, decl,
-                                                true);
-                       }
-                   }
-               }
+               omp_lastprivate_for_combined_outer_constructs (outer, decl,
+                                                              true);
 
              c = build_omp_clause (input_location,
                                    lastprivate ? OMP_CLAUSE_LASTPRIVATE
--- gcc/testsuite/c-c++-common/gomp/pr99928-6.c.jj      2021-05-21 
10:33:36.441925877 +0200
+++ gcc/testsuite/c-c++-common/gomp/pr99928-6.c 2021-05-21 11:25:53.127154433 
+0200
@@ -52,22 +52,22 @@ bar (void)
   #pragma omp parallel master taskloop simd
   for (j05 = 0; j05 < 64; j05++)
     ;
-  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j06" 
"gimple" { xfail *-*-* } } } */
-  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j06\\)" "gimple" { xfail *-*-* } } } */
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j06" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j06\\)" "gimple" } } */
   /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j06\\)" 
"gimple" } } *//* FIXME: This should be on for instead.  */
   /* { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j06\\)" 
"gimple" } } *//* FIXME.  */
   /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*linear\\(j06:1\\)" "gimple" 
} } */
   #pragma omp target parallel for simd
   for (j06 = 0; j06 < 64; j06++)
     ;
-  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j07" 
"gimple" { xfail *-*-* } } } */
-  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j07\\)" "gimple" { xfail *-*-* } } } */
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j07" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j07\\)" "gimple" } } */
   /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*linear\\(j07:1\\)" "gimple" 
} } */
   #pragma omp target simd
   for (j07 = 0; j07 < 64; j07++)
     ;
-  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j08" 
"gimple" { xfail *-*-* } } } */
-  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j08\\)" "gimple" { xfail *-*-* } } } */
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j08" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j08\\)" "gimple" } } */
   /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j08\\)" "gimple" 
} } */
   /* { dg-final { scan-tree-dump "omp distribute\[^\n\r]*lastprivate\\(j08\\)" 
"gimple" } } */
   /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j08\\)" 
"gimple" } } *//* FIXME: This should be on for instead.  */
@@ -76,8 +76,8 @@ bar (void)
   #pragma omp target teams distribute parallel for simd
   for (j08 = 0; j08 < 64; j08++)
     ;
-  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j09" 
"gimple" { xfail *-*-* } } } */
-  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j09\\)" "gimple" { xfail *-*-* } } } */
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j09" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j09\\)" "gimple" } } */
   /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j09\\)" "gimple" 
} } */
   /* { dg-final { scan-tree-dump "omp distribute\[^\n\r]*lastprivate\\(j09\\)" 
"gimple" } } */
   /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*linear\\(j09:1\\)" "gimple" 
} } */
--- gcc/testsuite/c-c++-common/gomp/pr99928-13.c.jj     2021-05-21 
11:25:53.128154422 +0200
+++ gcc/testsuite/c-c++-common/gomp/pr99928-13.c        2021-05-21 
11:25:53.128154422 +0200
@@ -0,0 +1,171 @@
+/* PR middle-end/99928 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple" } */
+
+int j00a, j00b, j01a, j01b, j02a, j02b, j03a, j03b;
+int j06a, j06b, j07a, j07b, j08a, j08b, j09a, j09b, j10a, j10b;
+
+void
+foo (void)
+{
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j00a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j00a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j00a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j00a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j00b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j00b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j00b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j00b\\)" 
"gimple" } } */
+  #pragma omp distribute parallel for simd collapse(2) lastprivate (j00a, j00b)
+  for (j00a = 0; j00a < 64; j00a++)
+    for (j00b = 0; j00b < 4; j00b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j01a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j01a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j01b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j01b\\)" 
"gimple" } } */
+  #pragma omp distribute simd collapse(2) lastprivate (j01a, j01b)
+  for (j01a = 0; j01a < 64; j01a++)
+    for (j01b = 0; j01b < 4; j01b++)
+      ;
+}
+
+void
+bar (void)
+{
+  int j04a, j04b, j05a, j05b, j11a, j11b, j12a, j12b;
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j02a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j02a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j02b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j02b\\)" 
"gimple" } } */
+  #pragma omp for simd collapse(2) lastprivate (j02a, j02b)
+  for (j02a = 0; j02a < 64; j02a++)
+    for (j02b = 0; j02b < 4; j02b++)
+      ;
+  /* { dg-final { scan-tree-dump-not "omp 
master\[^\n\r]*lastprivate\\(j03a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j03a\\)" 
"gimple" } } *//* NOTE: This is implementation detail.  */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*lastprivate\\(j03a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j03a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
master\[^\n\r]*lastprivate\\(j03b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j03b\\)" 
"gimple" } } *//* NOTE: This is implementation detail.  */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*lastprivate\\(j03b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j03b\\)" 
"gimple" } } */
+  #pragma omp master taskloop simd collapse(2) lastprivate (j03a, j03b)
+  for (j03a = 0; j03a < 64; j03a++)
+    for (j03b = 0; j03b < 4; j03b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j04a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j04a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j04a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j04b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j04b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j04b\\)" 
"gimple" } } */
+  #pragma omp parallel for simd collapse(2) lastprivate (j04a, j04b)
+  for (j04a = 0; j04a < 64; j04a++)
+    for (j04b = 0; j04b < 4; j04b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j05a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
master\[^\n\r]*lastprivate\\(j05a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j05a\\)" 
"gimple" } } *//* NOTE: This is implementation detail.  */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*lastprivate\\(j05a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j05a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j05b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
master\[^\n\r]*lastprivate\\(j05b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j05b\\)" 
"gimple" } } *//* NOTE: This is implementation detail.  */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*lastprivate\\(j05b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j05b\\)" 
"gimple" } } */
+  #pragma omp parallel master taskloop simd collapse(2) lastprivate (j05a, 
j05b)
+  for (j05a = 0; j05a < 64; j05a++)
+    for (j05b = 0; j05b < 4; j05b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j06a" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j06a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j06a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j06a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j06a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j06b" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j06b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j06b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j06b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j06b\\)" 
"gimple" } } */
+  #pragma omp target parallel for simd collapse(2) lastprivate (j06a, j06b)
+  for (j06a = 0; j06a < 64; j06a++)
+    for (j06b = 0; j06b < 4; j06b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j07a" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j07a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j07a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j07b" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j07b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j07b\\)" 
"gimple" } } */
+  #pragma omp target simd collapse(2) lastprivate (j07a, j07b)
+  for (j07a = 0; j07a < 64; j07a++)
+    for (j07b = 0; j07b < 4; j07b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j08a" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j08a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j08a\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j08a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j08a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j08a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j08a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j08b" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j08b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j08b\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j08b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j08b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j08b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j08b\\)" 
"gimple" } } */
+  #pragma omp target teams distribute parallel for simd collapse(2) 
lastprivate (j08a, j08b)
+  for (j08a = 0; j08a < 64; j08a++)
+    for (j08b = 0; j08b < 4; j08b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j09a" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j09a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j09a\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j09a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j09a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j09b" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j09b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j09b\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j09b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j09b\\)" 
"gimple" } } */
+  #pragma omp target teams distribute simd collapse(2) lastprivate (j09a, j09b)
+  for (j09a = 0; j09a < 64; j09a++)
+    for (j09b = 0; j09b < 4; j09b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j10a\\)" 
"gimple" } } *//* NOTE: This is implementation detail.  */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*lastprivate\\(j10a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j10a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j10b\\)" 
"gimple" } } *//* NOTE: This is implementation detail.  */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*lastprivate\\(j10b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j10b\\)" 
"gimple" } } */
+  #pragma omp taskloop simd collapse(2) lastprivate (j10a, j10b)
+  for (j10a = 0; j10a < 64; j10a++)
+    for (j10b = 0; j10b < 4; j10b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j11a\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j11a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j11a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j11a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j11a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j11b\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j11b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j11b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j11b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j11b\\)" 
"gimple" } } */
+  #pragma omp teams distribute parallel for simd collapse(2) lastprivate 
(j11a, j11b)
+  for (j11a = 0; j11a < 64; j11a++)
+    for (j11b = 0; j11b < 4; j11b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j12a\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j12a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j12a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j12b\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j12b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j12b\\)" 
"gimple" } } */
+  #pragma omp teams distribute simd collapse(2) lastprivate (j12a, j12b)
+  for (j12a = 0; j12a < 64; j12a++)
+    for (j12b = 0; j12b < 4; j12b++)
+      ;
+}
--- gcc/testsuite/c-c++-common/gomp/pr99928-14.c.jj     2021-05-21 
11:25:53.128154422 +0200
+++ gcc/testsuite/c-c++-common/gomp/pr99928-14.c        2021-05-21 
11:25:53.128154422 +0200
@@ -0,0 +1,171 @@
+/* PR middle-end/99928 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple" } */
+
+int j00a, j00b, j01a, j01b, j02a, j02b, j03a, j03b, j04a, j04b;
+int j06a, j06b, j07a, j07b, j08a, j08b, j09a, j09b, j10a, j10b;
+
+void
+foo (void)
+{
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j00a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j00a\\)" 
"gimple" } } *//* FIXME: This should be on for instead.  */
+  /* { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j00a\\)" 
"gimple" } } *//* FIXME.  */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j00a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j00b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j00b\\)" 
"gimple" } } *//* FIXME: This should be on for instead.  */
+  /* { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j00b\\)" 
"gimple" } } *//* FIXME.  */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j00b\\)" 
"gimple" } } */
+  #pragma omp distribute parallel for simd collapse(2)
+  for (j00a = 0; j00a < 64; j00a++)
+    for (j00b = 0; j00b < 4; j00b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j01a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j01a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j01b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j01b\\)" 
"gimple" } } */
+  #pragma omp distribute simd collapse(2)
+  for (j01a = 0; j01a < 64; j01a++)
+    for (j01b = 0; j01b < 4; j01b++)
+      ;
+}
+
+void
+bar (void)
+{
+  int j05a, j05b, j11a, j11b, j12a, j12b;
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j02a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j02a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j02b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j02b\\)" 
"gimple" } } */
+  #pragma omp for simd collapse(2)
+  for (j02a = 0; j02a < 64; j02a++)
+    for (j02b = 0; j02b < 4; j02b++)
+      ;
+  /* { dg-final { scan-tree-dump-not "omp 
master\[^\n\r]*lastprivate\\(j03a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j03a\\)" 
"gimple" } } *//* NOTE: This is implementation detail.  */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*lastprivate\\(j03a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j03a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
master\[^\n\r]*lastprivate\\(j03b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j03b\\)" 
"gimple" } } *//* NOTE: This is implementation detail.  */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*lastprivate\\(j03b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j03b\\)" 
"gimple" } } */
+  #pragma omp master taskloop simd collapse(2)
+  for (j03a = 0; j03a < 64; j03a++)
+    for (j03b = 0; j03b < 4; j03b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j04a\\)" 
"gimple" } } *//* FIXME: This should be on for instead.  */
+  /* { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j04a\\)" 
"gimple" } } *//* FIXME.  */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j04a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j04b\\)" 
"gimple" } } *//* FIXME: This should be on for instead.  */
+  /* { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j04b\\)" 
"gimple" } } *//* FIXME.  */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j04b\\)" 
"gimple" } } */
+  #pragma omp parallel for simd collapse(2)
+  for (j04a = 0; j04a < 64; j04a++)
+    for (j04b = 0; j04b < 4; j04b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j05a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
master\[^\n\r]*lastprivate\\(j05a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j05a\\)" 
"gimple" } } *//* NOTE: This is implementation detail.  */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*lastprivate\\(j05a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j05a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j05b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
master\[^\n\r]*lastprivate\\(j05b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j05b\\)" 
"gimple" } } *//* NOTE: This is implementation detail.  */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*lastprivate\\(j05b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j05b\\)" 
"gimple" } } */
+  #pragma omp parallel master taskloop simd collapse(2)
+  for (j05a = 0; j05a < 64; j05a++)
+    for (j05b = 0; j05b < 4; j05b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j06a" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j06a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j06a\\)" 
"gimple" } } *//* FIXME: This should be on for instead.  */
+  /* { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j06a\\)" 
"gimple" } } *//* FIXME.  */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j06a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j06b" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j06b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j06b\\)" 
"gimple" } } *//* FIXME: This should be on for instead.  */
+  /* { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j06b\\)" 
"gimple" } } *//* FIXME.  */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j06b\\)" 
"gimple" } } */
+  #pragma omp target parallel for simd collapse(2)
+  for (j06a = 0; j06a < 64; j06a++)
+    for (j06b = 0; j06b < 4; j06b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j07a" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j07a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j07a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j07b" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j07b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j07b\\)" 
"gimple" } } */
+  #pragma omp target simd collapse(2)
+  for (j07a = 0; j07a < 64; j07a++)
+    for (j07b = 0; j07b < 4; j07b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j08a" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j08a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j08a\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j08a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j08a\\)" 
"gimple" } } *//* FIXME: This should be on for instead.  */
+  /* { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j08a\\)" 
"gimple" } } *//* FIXME.  */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j08a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j08b" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j08b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j08b\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j08b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j08b\\)" 
"gimple" } } *//* FIXME: This should be on for instead.  */
+  /* { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j08b\\)" 
"gimple" } } *//* FIXME.  */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j08b\\)" 
"gimple" } } */
+  #pragma omp target teams distribute parallel for simd collapse(2)
+  for (j08a = 0; j08a < 64; j08a++)
+    for (j08b = 0; j08b < 4; j08b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j09a" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j09a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j09a\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j09a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j09a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j09b" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump-not "omp 
target\[^\n\r]*firstprivate\\(j09b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j09b\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j09b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j09b\\)" 
"gimple" } } */
+  #pragma omp target teams distribute simd collapse(2)
+  for (j09a = 0; j09a < 64; j09a++)
+    for (j09b = 0; j09b < 4; j09b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j10a\\)" 
"gimple" } } *//* NOTE: This is implementation detail.  */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*lastprivate\\(j10a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j10a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j10b\\)" 
"gimple" } } *//* NOTE: This is implementation detail.  */
+  /* { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*lastprivate\\(j10b\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j10b\\)" 
"gimple" } } */
+  #pragma omp taskloop simd collapse(2)
+  for (j10a = 0; j10a < 64; j10a++)
+    for (j10b = 0; j10b < 4; j10b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j11a\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j11a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j11a\\)" 
"gimple" } } *//* FIXME: This should be on for instead.  */
+  /* { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j11a\\)" 
"gimple" } } *//* FIXME.  */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j11a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j11b\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j11b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j11b\\)" 
"gimple" } } *//* FIXME: This should be on for instead.  */
+  /* { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j11b\\)" 
"gimple" } } *//* FIXME.  */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j11b\\)" 
"gimple" } } */
+  #pragma omp teams distribute parallel for simd collapse(2)
+  for (j11a = 0; j11a < 64; j11a++)
+    for (j11b = 0; j11b < 4; j11b++)
+      ;
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j12a\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j12a\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j12a\\)" 
"gimple" } } */
+  /* { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(j12b\\)" "gimple" 
} } */
+  /* { dg-final { scan-tree-dump "omp 
distribute\[^\n\r]*lastprivate\\(j12b\\)" "gimple" } } */
+  /* { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j12b\\)" 
"gimple" } } */
+  #pragma omp teams distribute simd collapse(2)
+  for (j12a = 0; j12a < 64; j12a++)
+    for (j12b = 0; j12b < 4; j12b++)
+      ;
+}

        Jakub

Reply via email to