openmp: Fix up handling of implicit lastprivate on outer constructs for implicit...
authorJakub Jelinek <jakub@redhat.com>
Fri, 21 May 2021 19:13:06 +0000 (21:13 +0200)
committerJakub Jelinek <jakub@redhat.com>
Fri, 21 May 2021 19:13:06 +0000 (21:13 +0200)
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.

2021-05-21  Jakub Jelinek  <jakub@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
gcc/testsuite/c-c++-common/gomp/pr99928-13.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/pr99928-14.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/pr99928-6.c

index 719a4e1..28bf1b0 100644 (file)
@@ -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, gimple_seq *pre_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_seq *pre_p)
              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_seq *pre_p)
              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
diff --git a/gcc/testsuite/c-c++-common/gomp/pr99928-13.c b/gcc/testsuite/c-c++-common/gomp/pr99928-13.c
new file mode 100644 (file)
index 0000000..d5d8d78
--- /dev/null
@@ -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++)
+      ;
+}
diff --git a/gcc/testsuite/c-c++-common/gomp/pr99928-14.c b/gcc/testsuite/c-c++-common/gomp/pr99928-14.c
new file mode 100644 (file)
index 0000000..2d9e0be
--- /dev/null
@@ -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++)
+      ;
+}
index 9934047..918a97e 100644 (file)
@@ -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" } } */