aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2021-06-15 16:06:38 +0200
committerTobias Burnus <tobias@codesourcery.com>2021-06-15 16:07:11 +0200
commit1de31913d20a467b78904c0e96efd5fbd6facd2c (patch)
tree56187de4669a2701ebd347a3a794d99419250b05
parent9a2c9579fdbf5d24dfe27fb961286ad7a9c3a98b (diff)
downloadgcc-1de31913d20a467b78904c0e96efd5fbd6facd2c.zip
gcc-1de31913d20a467b78904c0e96efd5fbd6facd2c.tar.gz
gcc-1de31913d20a467b78904c0e96efd5fbd6facd2c.tar.bz2
Fortran/OpenMP: Extend defaultmap clause for OpenMP 5 [PR92568]
PR fortran/92568 gcc/fortran/ChangeLog: * dump-parse-tree.c (show_omp_clauses): Update for defaultmap. * f95-lang.c (LANG_HOOKS_OMP_ALLOCATABLE_P, LANG_HOOKS_OMP_SCALAR_TARGET_P): New. * gfortran.h (enum gfc_omp_defaultmap, enum gfc_omp_defaultmap_category): New. * openmp.c (gfc_match_omp_clauses): Update defaultmap matching. * trans-decl.c (gfc_finish_decl_attrs): Set GFC_DECL_SCALAR_TARGET. * trans-openmp.c (gfc_omp_allocatable_p, gfc_omp_scalar_target_p): New. (gfc_omp_scalar_p): Take 'ptr_alloc_ok' argument. (gfc_trans_omp_clauses, gfc_split_omp_clauses): Update for defaultmap changes. * trans.h (gfc_omp_scalar_p): Update prototype. (gfc_omp_allocatable_p, gfc_omp_scalar_target_p): New. (struct lang_decl): Add scalar_target. (GFC_DECL_SCALAR_TARGET, GFC_DECL_GET_SCALAR_TARGET): New. gcc/ChangeLog: * gimplify.c (enum gimplify_defaultmap_kind): Add GDMK_SCALAR_TARGET. (struct gimplify_omp_ctx): Extend defaultmap array by one. (new_omp_context): Init defaultmap[GDMK_SCALAR_TARGET]. (omp_notice_variable): Update type classification for Fortran. (gimplify_scan_omp_clauses): Update calls for new argument; handle GDMK_SCALAR_TARGET; for Fortran, GDMK_POINTER avoid GOVD_MAP_0LEN_ARRAY. * langhooks-def.h (lhd_omp_scalar_p): Add 'ptr_ok' argument. * langhooks.c (lhd_omp_scalar_p): Likewise. (LANG_HOOKS_OMP_ALLOCATABLE_P, LANG_HOOKS_OMP_SCALAR_TARGET_P): New. (LANG_HOOKS_DECLS): Add them. * langhooks.h (struct lang_hooks_for_decls): Add new hooks, update omp_scalar_p pointer type to include the new bool argument. libgomp/ChangeLog: * testsuite/libgomp.fortran/defaultmap-8.f90: New test. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/pr99928-1.f90: Uncomment 'defaultmap(none)'. * gfortran.dg/gomp/pr99928-2.f90: Uncomment 'defaultmap(none)'. * gfortran.dg/gomp/pr99928-3.f90: Uncomment 'defaultmap(none)'. * gfortran.dg/gomp/pr99928-4.f90: Uncomment 'defaultmap(none)'. * gfortran.dg/gomp/pr99928-5.f90: Uncomment 'defaultmap(none)'. * gfortran.dg/gomp/pr99928-6.f90: Uncomment 'defaultmap(none)'. * gfortran.dg/gomp/pr99928-8.f90: Uncomment 'defaultmap(none)'. * gfortran.dg/gomp/defaultmap-1.f90: New test. * gfortran.dg/gomp/defaultmap-2.f90: New test. * gfortran.dg/gomp/defaultmap-3.f90: New test. * gfortran.dg/gomp/defaultmap-4.f90: New test. * gfortran.dg/gomp/defaultmap-5.f90: New test. * gfortran.dg/gomp/defaultmap-6.f90: New test. * gfortran.dg/gomp/defaultmap-7.f90: New test.
-rw-r--r--gcc/fortran/dump-parse-tree.c38
-rw-r--r--gcc/fortran/f95-lang.c4
-rw-r--r--gcc/fortran/gfortran.h26
-rw-r--r--gcc/fortran/openmp.c84
-rw-r--r--gcc/fortran/trans-decl.c5
-rw-r--r--gcc/fortran/trans-openmp.c97
-rw-r--r--gcc/fortran/trans.h9
-rw-r--r--gcc/gimplify.c35
-rw-r--r--gcc/langhooks-def.h6
-rw-r--r--gcc/langhooks.c7
-rw-r--r--gcc/langhooks.h13
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/defaultmap-1.f9019
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/defaultmap-2.f90108
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/defaultmap-3.f9060
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/defaultmap-4.f90141
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/defaultmap-5.f90145
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/defaultmap-6.f90104
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/defaultmap-7.f9024
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr99928-1.f9022
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr99928-2.f9018
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr99928-3.f906
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr99928-4.f906
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr99928-5.f908
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr99928-6.f908
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr99928-8.f9022
-rw-r--r--libgomp/testsuite/libgomp.fortran/defaultmap-8.f90279
26 files changed, 1217 insertions, 77 deletions
diff --git a/gcc/fortran/dump-parse-tree.c b/gcc/fortran/dump-parse-tree.c
index 141101e..07e98b7 100644
--- a/gcc/fortran/dump-parse-tree.c
+++ b/gcc/fortran/dump-parse-tree.c
@@ -1751,7 +1751,7 @@ show_omp_clauses (gfc_omp_clauses *omp_clauses)
}
if (omp_clauses->dist_sched_kind != OMP_SCHED_NONE)
{
- fprintf (dumpfile, " DIST_SCHEDULE (STATIC");
+ fputs (" DIST_SCHEDULE (STATIC", dumpfile);
if (omp_clauses->dist_chunk_size)
{
fputc (',', dumpfile);
@@ -1759,8 +1759,40 @@ show_omp_clauses (gfc_omp_clauses *omp_clauses)
}
fputc (')', dumpfile);
}
- if (omp_clauses->defaultmap)
- fputs (" DEFALTMAP (TOFROM: SCALAR)", dumpfile);
+ for (int i = 0; i < OMP_DEFAULTMAP_CAT_NUM; i++)
+ {
+ const char *dfltmap;
+ if (omp_clauses->defaultmap[i] == OMP_DEFAULTMAP_UNSET)
+ continue;
+ fputs (" DEFAULTMAP (", dumpfile);
+ switch (omp_clauses->defaultmap[i])
+ {
+ case OMP_DEFAULTMAP_ALLOC: dfltmap = "ALLOC"; break;
+ case OMP_DEFAULTMAP_TO: dfltmap = "TO"; break;
+ case OMP_DEFAULTMAP_FROM: dfltmap = "FROM"; break;
+ case OMP_DEFAULTMAP_TOFROM: dfltmap = "TOFROM"; break;
+ case OMP_DEFAULTMAP_FIRSTPRIVATE: dfltmap = "FIRSTPRIVATE"; break;
+ case OMP_DEFAULTMAP_NONE: dfltmap = "NONE"; break;
+ case OMP_DEFAULTMAP_DEFAULT: dfltmap = "DEFAULT"; break;
+ case OMP_DEFAULTMAP_PRESENT: dfltmap = "PRESENT"; break;
+ default: gcc_unreachable ();
+ }
+ fputs (dfltmap, dumpfile);
+ if (i != OMP_DEFAULTMAP_CAT_UNCATEGORIZED)
+ {
+ fputc (':', dumpfile);
+ switch ((enum gfc_omp_defaultmap) i)
+ {
+ case OMP_DEFAULTMAP_CAT_SCALAR: dfltmap = "SCALAR"; break;
+ case OMP_DEFAULTMAP_CAT_AGGREGATE: dfltmap = "AGGREGATE"; break;
+ case OMP_DEFAULTMAP_CAT_ALLOCATABLE: dfltmap = "ALLOCATABLE"; break;
+ case OMP_DEFAULTMAP_CAT_POINTER: dfltmap = "POINTER"; break;
+ default: gcc_unreachable ();
+ }
+ fputs (dfltmap, dumpfile);
+ }
+ fputc (')', dumpfile);
+ }
if (omp_clauses->nogroup)
fputs (" NOGROUP", dumpfile);
if (omp_clauses->simd)
diff --git a/gcc/fortran/f95-lang.c b/gcc/fortran/f95-lang.c
index a346457..5fc8481 100644
--- a/gcc/fortran/f95-lang.c
+++ b/gcc/fortran/f95-lang.c
@@ -126,6 +126,8 @@ static const struct attribute_spec gfc_attribute_table[] =
#undef LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR
#undef LANG_HOOKS_OMP_CLAUSE_DTOR
#undef LANG_HOOKS_OMP_FINISH_CLAUSE
+#undef LANG_HOOKS_OMP_ALLOCATABLE_P
+#undef LANG_HOOKS_OMP_SCALAR_TARGET_P
#undef LANG_HOOKS_OMP_SCALAR_P
#undef LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR
#undef LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE
@@ -162,7 +164,9 @@ static const struct attribute_spec gfc_attribute_table[] =
#define LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR gfc_omp_clause_linear_ctor
#define LANG_HOOKS_OMP_CLAUSE_DTOR gfc_omp_clause_dtor
#define LANG_HOOKS_OMP_FINISH_CLAUSE gfc_omp_finish_clause
+#define LANG_HOOKS_OMP_ALLOCATABLE_P gfc_omp_allocatable_p
#define LANG_HOOKS_OMP_SCALAR_P gfc_omp_scalar_p
+#define LANG_HOOKS_OMP_SCALAR_TARGET_P gfc_omp_scalar_target_p
#define LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR gfc_omp_disregard_value_expr
#define LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE gfc_omp_private_debug_clause
#define LANG_HOOKS_OMP_PRIVATE_OUTER_REF gfc_omp_private_outer_ref
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index cbc95d3..f4a50d7 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -1241,6 +1241,29 @@ enum gfc_omp_map_op
OMP_MAP_ALWAYS_TOFROM
};
+enum gfc_omp_defaultmap
+{
+ OMP_DEFAULTMAP_UNSET,
+ OMP_DEFAULTMAP_ALLOC,
+ OMP_DEFAULTMAP_TO,
+ OMP_DEFAULTMAP_FROM,
+ OMP_DEFAULTMAP_TOFROM,
+ OMP_DEFAULTMAP_FIRSTPRIVATE,
+ OMP_DEFAULTMAP_NONE,
+ OMP_DEFAULTMAP_DEFAULT,
+ OMP_DEFAULTMAP_PRESENT
+};
+
+enum gfc_omp_defaultmap_category
+{
+ OMP_DEFAULTMAP_CAT_UNCATEGORIZED,
+ OMP_DEFAULTMAP_CAT_SCALAR,
+ OMP_DEFAULTMAP_CAT_AGGREGATE,
+ OMP_DEFAULTMAP_CAT_ALLOCATABLE,
+ OMP_DEFAULTMAP_CAT_POINTER,
+ OMP_DEFAULTMAP_CAT_NUM
+};
+
enum gfc_omp_linear_op
{
OMP_LINEAR_DEFAULT,
@@ -1423,9 +1446,10 @@ typedef struct gfc_omp_clauses
enum gfc_omp_device_type device_type;
struct gfc_expr *chunk_size;
enum gfc_omp_default_sharing default_sharing;
+ enum gfc_omp_defaultmap defaultmap[OMP_DEFAULTMAP_CAT_NUM];
int collapse, orderedc;
bool nowait, ordered, untied, mergeable;
- bool inbranch, notinbranch, defaultmap, nogroup;
+ bool inbranch, notinbranch, nogroup;
bool sched_simd, sched_monotonic, sched_nonmonotonic;
bool simd, threads, depend_source, destroy, order_concurrent, capture;
enum gfc_omp_atomic_op atomic_op;
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 638a823..357a1e1 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -1539,10 +1539,87 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask,
continue;
}
if ((mask & OMP_CLAUSE_DEFAULTMAP)
- && !c->defaultmap
- && gfc_match ("defaultmap ( tofrom : scalar )") == MATCH_YES)
+ && gfc_match ("defaultmap ( ") == MATCH_YES)
{
- c->defaultmap = true;
+ enum gfc_omp_defaultmap behavior;
+ gfc_omp_defaultmap_category category
+ = OMP_DEFAULTMAP_CAT_UNCATEGORIZED;
+ if (gfc_match ("alloc ") == MATCH_YES)
+ behavior = OMP_DEFAULTMAP_ALLOC;
+ else if (gfc_match ("tofrom ") == MATCH_YES)
+ behavior = OMP_DEFAULTMAP_TOFROM;
+ else if (gfc_match ("to ") == MATCH_YES)
+ behavior = OMP_DEFAULTMAP_TO;
+ else if (gfc_match ("from ") == MATCH_YES)
+ behavior = OMP_DEFAULTMAP_FROM;
+ else if (gfc_match ("firstprivate ") == MATCH_YES)
+ behavior = OMP_DEFAULTMAP_FIRSTPRIVATE;
+ else if (gfc_match ("none ") == MATCH_YES)
+ behavior = OMP_DEFAULTMAP_NONE;
+ else if (gfc_match ("default ") == MATCH_YES)
+ behavior = OMP_DEFAULTMAP_DEFAULT;
+ else
+ {
+ gfc_error ("Expected ALLOC, TO, FROM, TOFROM, FIRSTPRIVATE, "
+ "NONE or DEFAULT at %C");
+ break;
+ }
+ if (')' == gfc_peek_ascii_char ())
+ ;
+ else if (gfc_match (": ") != MATCH_YES)
+ break;
+ else
+ {
+ if (gfc_match ("scalar ") == MATCH_YES)
+ category = OMP_DEFAULTMAP_CAT_SCALAR;
+ else if (gfc_match ("aggregate ") == MATCH_YES)
+ category = OMP_DEFAULTMAP_CAT_AGGREGATE;
+ else if (gfc_match ("allocatable ") == MATCH_YES)
+ category = OMP_DEFAULTMAP_CAT_ALLOCATABLE;
+ else if (gfc_match ("pointer ") == MATCH_YES)
+ category = OMP_DEFAULTMAP_CAT_POINTER;
+ else
+ {
+ gfc_error ("Expected SCALAR, AGGREGATE, ALLOCATABLE or "
+ "POINTER at %C");
+ break;
+ }
+ }
+ for (int i = 0; i < OMP_DEFAULTMAP_CAT_NUM; ++i)
+ {
+ if (i != category
+ && category != OMP_DEFAULTMAP_CAT_UNCATEGORIZED)
+ continue;
+ if (c->defaultmap[i] != OMP_DEFAULTMAP_UNSET)
+ {
+ const char *pcategory = NULL;
+ switch (i)
+ {
+ case OMP_DEFAULTMAP_CAT_UNCATEGORIZED: break;
+ case OMP_DEFAULTMAP_CAT_SCALAR: pcategory = "SCALAR"; break;
+ case OMP_DEFAULTMAP_CAT_AGGREGATE:
+ pcategory = "AGGREGATE";
+ break;
+ case OMP_DEFAULTMAP_CAT_ALLOCATABLE:
+ pcategory = "ALLOCATABLE";
+ break;
+ case OMP_DEFAULTMAP_CAT_POINTER:
+ pcategory = "POINTER";
+ break;
+ default: gcc_unreachable ();
+ }
+ if (i == OMP_DEFAULTMAP_CAT_UNCATEGORIZED)
+ gfc_error ("DEFAULTMAP at %C but prior DEFAULTMAP with "
+ "unspecified category");
+ else
+ gfc_error ("DEFAULTMAP at %C but prior DEFAULTMAP for "
+ "category %s", pcategory);
+ goto end;
+ }
+ }
+ c->defaultmap[category] = behavior;
+ if (gfc_match (")") != MATCH_YES)
+ break;
continue;
}
if ((mask & OMP_CLAUSE_DELETE)
@@ -2459,6 +2536,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask,
break;
}
+end:
if (gfc_match_omp_eos () != MATCH_YES)
{
if (!gfc_error_flag_test ())
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index c32bd05..479ba6f 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -605,6 +605,11 @@ gfc_finish_decl_attrs (tree decl, symbol_attribute *attr)
gfc_allocate_lang_decl (decl);
GFC_DECL_SCALAR_POINTER (decl) = 1;
}
+ if (attr->target)
+ {
+ gfc_allocate_lang_decl (decl);
+ GFC_DECL_SCALAR_TARGET (decl) = 1;
+ }
}
}
diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
index f466ab6..ce1991e 100644
--- a/gcc/fortran/trans-openmp.c
+++ b/gcc/fortran/trans-openmp.c
@@ -393,6 +393,28 @@ gfc_is_unlimited_polymorphic_nonptr (tree type)
return true;
}
+/* Return true if the DECL is for an allocatable array or scalar. */
+
+bool
+gfc_omp_allocatable_p (tree decl)
+{
+ if (!DECL_P (decl))
+ return false;
+
+ if (GFC_DECL_GET_SCALAR_ALLOCATABLE (decl))
+ return true;
+
+ tree type = TREE_TYPE (decl);
+ if (gfc_omp_privatize_by_reference (decl))
+ type = TREE_TYPE (type);
+
+ if (GFC_DESCRIPTOR_TYPE_P (type)
+ && GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
+ return true;
+
+ return false;
+}
+
/* Return true if DECL in private clause needs
OMP_CLAUSE_PRIVATE_OUTER_REF on the private clause. */
@@ -1663,10 +1685,11 @@ gfc_omp_finish_clause (tree c, gimple_seq *pre_p, bool openacc)
/* Return true if DECL is a scalar variable (for the purpose of
- implicit firstprivatization). */
+ implicit firstprivatization/mapping). Only if 'ptr_alloc_ok.'
+ is true, allocatables and pointers are permitted. */
bool
-gfc_omp_scalar_p (tree decl)
+gfc_omp_scalar_p (tree decl, bool ptr_alloc_ok)
{
tree type = TREE_TYPE (decl);
if (TREE_CODE (type) == REFERENCE_TYPE)
@@ -1675,7 +1698,11 @@ gfc_omp_scalar_p (tree decl)
{
if (GFC_DECL_GET_SCALAR_ALLOCATABLE (decl)
|| GFC_DECL_GET_SCALAR_POINTER (decl))
- type = TREE_TYPE (type);
+ {
+ if (!ptr_alloc_ok)
+ return false;
+ type = TREE_TYPE (type);
+ }
if (GFC_ARRAY_TYPE_P (type)
|| GFC_CLASS_TYPE_P (type))
return false;
@@ -1691,6 +1718,17 @@ gfc_omp_scalar_p (tree decl)
}
+/* Return true if DECL is a scalar with target attribute but does not have the
+ allocatable (or pointer) attribute (for the purpose of implicit mapping). */
+
+bool
+gfc_omp_scalar_target_p (tree decl)
+{
+ return (DECL_P (decl) && GFC_DECL_GET_SCALAR_TARGET (decl)
+ && gfc_omp_scalar_p (decl, false));
+}
+
+
/* Return true if DECL's DECL_VALUE_EXPR (if any) should be
disregarded in OpenMP construct, because it is going to be
remapped during OpenMP lowering. SHARED is true if DECL
@@ -4036,13 +4074,55 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_NOGROUP);
omp_clauses = gfc_trans_add_clause (c, omp_clauses);
}
- if (clauses->defaultmap)
+
+ for (int i = 0; i < OMP_DEFAULTMAP_CAT_NUM; i++)
{
+ if (clauses->defaultmap[i] == OMP_DEFAULTMAP_UNSET)
+ continue;
+ enum omp_clause_defaultmap_kind behavior, category;
+ switch ((gfc_omp_defaultmap_category) i)
+ {
+ case OMP_DEFAULTMAP_CAT_UNCATEGORIZED:
+ category = OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED;
+ break;
+ case OMP_DEFAULTMAP_CAT_SCALAR:
+ category = OMP_CLAUSE_DEFAULTMAP_CATEGORY_SCALAR;
+ break;
+ case OMP_DEFAULTMAP_CAT_AGGREGATE:
+ category = OMP_CLAUSE_DEFAULTMAP_CATEGORY_AGGREGATE;
+ break;
+ case OMP_DEFAULTMAP_CAT_ALLOCATABLE:
+ category = OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALLOCATABLE;
+ break;
+ case OMP_DEFAULTMAP_CAT_POINTER:
+ category = OMP_CLAUSE_DEFAULTMAP_CATEGORY_POINTER;
+ break;
+ default: gcc_unreachable ();
+ }
+ switch (clauses->defaultmap[i])
+ {
+ case OMP_DEFAULTMAP_ALLOC:
+ behavior = OMP_CLAUSE_DEFAULTMAP_ALLOC;
+ break;
+ case OMP_DEFAULTMAP_TO: behavior = OMP_CLAUSE_DEFAULTMAP_TO; break;
+ case OMP_DEFAULTMAP_FROM: behavior = OMP_CLAUSE_DEFAULTMAP_FROM; break;
+ case OMP_DEFAULTMAP_TOFROM:
+ behavior = OMP_CLAUSE_DEFAULTMAP_TOFROM;
+ break;
+ case OMP_DEFAULTMAP_FIRSTPRIVATE:
+ behavior = OMP_CLAUSE_DEFAULTMAP_FIRSTPRIVATE;
+ break;
+ case OMP_DEFAULTMAP_NONE: behavior = OMP_CLAUSE_DEFAULTMAP_NONE; break;
+ case OMP_DEFAULTMAP_DEFAULT:
+ behavior = OMP_CLAUSE_DEFAULTMAP_DEFAULT;
+ break;
+ default: gcc_unreachable ();
+ }
c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_DEFAULTMAP);
- OMP_CLAUSE_DEFAULTMAP_SET_KIND (c, OMP_CLAUSE_DEFAULTMAP_TOFROM,
- OMP_CLAUSE_DEFAULTMAP_CATEGORY_SCALAR);
+ OMP_CLAUSE_DEFAULTMAP_SET_KIND (c, behavior, category);
omp_clauses = gfc_trans_add_clause (c, omp_clauses);
}
+
if (clauses->depend_source)
{
c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_DEPEND);
@@ -5672,8 +5752,9 @@ gfc_split_omp_clauses (gfc_code *code,
= code->ext.omp_clauses->lists[OMP_LIST_IS_DEVICE_PTR];
clausesa[GFC_OMP_SPLIT_TARGET].device
= code->ext.omp_clauses->device;
- clausesa[GFC_OMP_SPLIT_TARGET].defaultmap
- = code->ext.omp_clauses->defaultmap;
+ for (int i = 0; i < OMP_DEFAULTMAP_CAT_NUM; i++)
+ clausesa[GFC_OMP_SPLIT_TARGET].defaultmap[i]
+ = code->ext.omp_clauses->defaultmap[i];
clausesa[GFC_OMP_SPLIT_TARGET].if_exprs[OMP_IF_TARGET]
= code->ext.omp_clauses->if_exprs[OMP_IF_TARGET];
/* And this is copied to all. */
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index d1d4a1d..78578cf 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -823,7 +823,9 @@ tree gfc_omp_clause_assign_op (tree, tree, tree);
tree gfc_omp_clause_linear_ctor (tree, tree, tree, tree);
tree gfc_omp_clause_dtor (tree, tree);
void gfc_omp_finish_clause (tree, gimple_seq *, bool);
-bool gfc_omp_scalar_p (tree);
+bool gfc_omp_allocatable_p (tree);
+bool gfc_omp_scalar_p (tree, bool);
+bool gfc_omp_scalar_target_p (tree);
bool gfc_omp_disregard_value_expr (tree, bool);
bool gfc_omp_private_debug_clause (tree, bool);
bool gfc_omp_private_outer_ref (tree);
@@ -1030,6 +1032,7 @@ struct GTY(()) lang_decl {
tree token, caf_offset;
unsigned int scalar_allocatable : 1;
unsigned int scalar_pointer : 1;
+ unsigned int scalar_target : 1;
unsigned int optional_arg : 1;
};
@@ -1044,12 +1047,16 @@ struct GTY(()) lang_decl {
(DECL_LANG_SPECIFIC (node)->scalar_allocatable)
#define GFC_DECL_SCALAR_POINTER(node) \
(DECL_LANG_SPECIFIC (node)->scalar_pointer)
+#define GFC_DECL_SCALAR_TARGET(node) \
+ (DECL_LANG_SPECIFIC (node)->scalar_target)
#define GFC_DECL_OPTIONAL_ARGUMENT(node) \
(DECL_LANG_SPECIFIC (node)->optional_arg)
#define GFC_DECL_GET_SCALAR_ALLOCATABLE(node) \
(DECL_LANG_SPECIFIC (node) ? GFC_DECL_SCALAR_ALLOCATABLE (node) : 0)
#define GFC_DECL_GET_SCALAR_POINTER(node) \
(DECL_LANG_SPECIFIC (node) ? GFC_DECL_SCALAR_POINTER (node) : 0)
+#define GFC_DECL_GET_SCALAR_TARGET(node) \
+ (DECL_LANG_SPECIFIC (node) ? GFC_DECL_SCALAR_TARGET (node) : 0)
#define GFC_DECL_PACKED_ARRAY(node) DECL_LANG_FLAG_0(node)
#define GFC_DECL_PARTIAL_PACKED_ARRAY(node) DECL_LANG_FLAG_1(node)
#define GFC_DECL_ASSIGN(node) DECL_LANG_FLAG_2(node)
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index c96d611..2606998 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -212,6 +212,7 @@ struct gimplify_ctx
enum gimplify_defaultmap_kind
{
GDMK_SCALAR,
+ GDMK_SCALAR_TARGET, /* w/ Fortran's target attr, implicit mapping, only. */
GDMK_AGGREGATE,
GDMK_ALLOCATABLE,
GDMK_POINTER
@@ -236,7 +237,7 @@ struct gimplify_omp_ctx
bool order_concurrent;
bool has_depend;
bool in_for_exprs;
- int defaultmap[4];
+ int defaultmap[5];
};
static struct gimplify_ctx *gimplify_ctxp;
@@ -461,6 +462,7 @@ new_omp_context (enum omp_region_type region_type)
else
c->default_kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
c->defaultmap[GDMK_SCALAR] = GOVD_MAP;
+ c->defaultmap[GDMK_SCALAR_TARGET] = GOVD_MAP;
c->defaultmap[GDMK_AGGREGATE] = GOVD_MAP;
c->defaultmap[GDMK_ALLOCATABLE] = GOVD_MAP;
c->defaultmap[GDMK_POINTER] = GOVD_MAP;
@@ -7503,13 +7505,17 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
{
int gdmk;
enum omp_clause_defaultmap_kind kind;
- if (TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
- || (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE
- && (TREE_CODE (TREE_TYPE (TREE_TYPE (decl)))
- == POINTER_TYPE)))
- gdmk = GDMK_POINTER;
- else if (lang_hooks.decls.omp_scalar_p (decl))
+ if (lang_hooks.decls.omp_allocatable_p (decl))
+ gdmk = GDMK_ALLOCATABLE;
+ else if (lang_hooks.decls.omp_scalar_target_p (decl))
+ gdmk = GDMK_SCALAR_TARGET;
+ else if (lang_hooks.decls.omp_scalar_p (decl, false))
gdmk = GDMK_SCALAR;
+ else if (TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
+ || (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE
+ && (TREE_CODE (TREE_TYPE (TREE_TYPE (decl)))
+ == POINTER_TYPE)))
+ gdmk = GDMK_POINTER;
else
gdmk = GDMK_AGGREGATE;
kind = lang_hooks.decls.omp_predetermined_mapping (decl);
@@ -8746,6 +8752,8 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
if (!lang_GNU_Fortran ())
ctx->defaultmap[GDMK_POINTER] = GOVD_MAP | GOVD_MAP_0LEN_ARRAY;
ctx->defaultmap[GDMK_SCALAR] = GOVD_FIRSTPRIVATE;
+ ctx->defaultmap[GDMK_SCALAR_TARGET] = (lang_GNU_Fortran ()
+ ? GOVD_MAP : GOVD_FIRSTPRIVATE);
}
if (!lang_GNU_Fortran ())
switch (code)
@@ -8827,7 +8835,7 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
if (error_operand_p (decl))
goto do_add;
if (OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (c)
- && !lang_hooks.decls.omp_scalar_p (decl))
+ && !lang_hooks.decls.omp_scalar_p (decl, true))
{
error_at (OMP_CLAUSE_LOCATION (c),
"non-scalar variable %qD in conditional "
@@ -10025,7 +10033,8 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
gdmkmax = GDMK_POINTER;
break;
case OMP_CLAUSE_DEFAULTMAP_CATEGORY_SCALAR:
- gdmkmin = gdmkmax = GDMK_SCALAR;
+ gdmkmin = GDMK_SCALAR;
+ gdmkmax = GDMK_SCALAR_TARGET;
break;
case OMP_CLAUSE_DEFAULTMAP_CATEGORY_AGGREGATE:
gdmkmin = gdmkmax = GDMK_AGGREGATE;
@@ -10066,12 +10075,18 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
case GDMK_SCALAR:
ctx->defaultmap[gdmk] = GOVD_FIRSTPRIVATE;
break;
+ case GDMK_SCALAR_TARGET:
+ ctx->defaultmap[gdmk] = (lang_GNU_Fortran ()
+ ? GOVD_MAP : GOVD_FIRSTPRIVATE);
+ break;
case GDMK_AGGREGATE:
case GDMK_ALLOCATABLE:
ctx->defaultmap[gdmk] = GOVD_MAP;
break;
case GDMK_POINTER:
- ctx->defaultmap[gdmk] = GOVD_MAP | GOVD_MAP_0LEN_ARRAY;
+ ctx->defaultmap[gdmk] = GOVD_MAP;
+ if (!lang_GNU_Fortran ())
+ ctx->defaultmap[gdmk] |= GOVD_MAP_0LEN_ARRAY;
break;
default:
gcc_unreachable ();
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index ae3991c..8b744d9 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -86,7 +86,7 @@ struct gimplify_omp_ctx;
extern void lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *,
tree);
extern bool lhd_omp_mappable_type (tree);
-extern bool lhd_omp_scalar_p (tree);
+extern bool lhd_omp_scalar_p (tree, bool);
extern tree *lhd_omp_get_decl_init (tree);
extern void lhd_omp_finish_decl_inits ();
@@ -266,7 +266,9 @@ extern tree lhd_unit_size_without_reusable_padding (tree);
#define LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR NULL
#define LANG_HOOKS_OMP_CLAUSE_DTOR hook_tree_tree_tree_null
#define LANG_HOOKS_OMP_FINISH_CLAUSE lhd_omp_finish_clause
+#define LANG_HOOKS_OMP_ALLOCATABLE_P hook_bool_tree_false
#define LANG_HOOKS_OMP_SCALAR_P lhd_omp_scalar_p
+#define LANG_HOOKS_OMP_SCALAR_TARGET_P hook_bool_tree_false
#define LANG_HOOKS_OMP_GET_DECL_INIT lhd_omp_get_decl_init
#define LANG_HOOKS_OMP_FINISH_DECL_INITS lhd_omp_finish_decl_inits
@@ -297,7 +299,9 @@ extern tree lhd_unit_size_without_reusable_padding (tree);
LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR, \
LANG_HOOKS_OMP_CLAUSE_DTOR, \
LANG_HOOKS_OMP_FINISH_CLAUSE, \
+ LANG_HOOKS_OMP_ALLOCATABLE_P, \
LANG_HOOKS_OMP_SCALAR_P, \
+ LANG_HOOKS_OMP_SCALAR_TARGET_P, \
LANG_HOOKS_OMP_GET_DECL_INIT, \
LANG_HOOKS_OMP_FINISH_DECL_INITS \
}
diff --git a/gcc/langhooks.c b/gcc/langhooks.c
index 12c9988..d753199 100644
--- a/gcc/langhooks.c
+++ b/gcc/langhooks.c
@@ -615,10 +615,11 @@ lhd_omp_finish_clause (tree, gimple_seq *, bool)
}
/* Return true if DECL is a scalar variable (for the purpose of
- implicit firstprivatization). */
+ implicit firstprivatization & mapping). Only if alloc_ptr_ok
+ are allocatables and pointers accepted. */
bool
-lhd_omp_scalar_p (tree decl)
+lhd_omp_scalar_p (tree decl, bool ptr_ok)
{
tree type = TREE_TYPE (decl);
if (TREE_CODE (type) == REFERENCE_TYPE)
@@ -627,7 +628,7 @@ lhd_omp_scalar_p (tree decl)
type = TREE_TYPE (type);
if (INTEGRAL_TYPE_P (type)
|| SCALAR_FLOAT_TYPE_P (type)
- || TREE_CODE (type) == POINTER_TYPE)
+ || (ptr_ok && TREE_CODE (type) == POINTER_TYPE))
return true;
return false;
}
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index 842e605..1b417a0 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -296,9 +296,18 @@ struct lang_hooks_for_decls
/* Do language specific checking on an implicitly determined clause. */
void (*omp_finish_clause) (tree clause, gimple_seq *pre_p, bool);
+ /* Return true if DECL is an allocatable variable (for the purpose of
+ implicit mapping). */
+ bool (*omp_allocatable_p) (tree decl);
+
/* Return true if DECL is a scalar variable (for the purpose of
- implicit firstprivatization). */
- bool (*omp_scalar_p) (tree decl);
+ implicit firstprivatization). If 'ptr_or', pointers and
+ allocatables are also permitted. */
+ bool (*omp_scalar_p) (tree decl, bool ptr_ok);
+
+ /* Return true if DECL is a scalar variable with Fortran target but not
+ allocatable or pointer attribute (for the purpose of implicit mapping). */
+ bool (*omp_scalar_target_p) (tree decl);
/* Return a pointer to the tree representing the initializer
expression for the non-local variable DECL. Return NULL if
diff --git a/gcc/testsuite/gfortran.dg/gomp/defaultmap-1.f90 b/gcc/testsuite/gfortran.dg/gomp/defaultmap-1.f90
new file mode 100644
index 0000000..299d971
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/defaultmap-1.f90
@@ -0,0 +1,19 @@
+! PR fortran/92568
+
+implicit none
+
+!$omp target defaultmap(bar) ! { dg-error "25: Expected ALLOC, TO, FROM, TOFROM, FIRSTPRIVATE, NONE or DEFAULT" }
+
+!$omp target defaultmap ( alloc: foo) ! { dg-error "34: Expected SCALAR, AGGREGATE, ALLOCATABLE or POINTER" }
+
+!$omp target defaultmap(alloc:scalar) defaultmap(none:Scalar) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP for category SCALAR" }
+
+!$omp target defaultmap(default:aggregate) defaultmap(tofrom) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP for category AGGREGATE" }
+
+!$omp target defaultmap(from:pointer) defaultmap(tofrom:pointer) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP for category POINTER" }
+
+!$omp target defaultmap(from:scalar) defaultmap(to:allocatable) defaultmap(tofrom:allocatable) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP for category ALLOCATABLE" }
+
+!$omp target defaultmap(from) defaultmap(to) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP with unspecified category" }
+
+end
diff --git a/gcc/testsuite/gfortran.dg/gomp/defaultmap-2.f90 b/gcc/testsuite/gfortran.dg/gomp/defaultmap-2.f90
new file mode 100644
index 0000000..1658424
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/defaultmap-2.f90
@@ -0,0 +1,108 @@
+! PR fortran/92568
+!
+implicit none
+ type t
+ end type t
+
+ integer :: ii
+ integer :: arr(5)
+ integer, allocatable :: aii, aarr(:)
+ integer, pointer :: pii, parr(:)
+
+ character :: str1, str1arr(5), str1a, str1aarr(:), str1p, str1parr(:)
+ character(len=5) :: str5, str5arr(5), str5a, str5aarr(:), str5p, str5parr(:)
+ character(len=:) :: strXa, strXaarr(:), strXp, strXparr(:)
+ allocatable :: str1a, str1aarr, str5a, str5aarr, strXa, strXaarr
+ pointer :: str1p, str1parr, str5p, str5parr, strXp, strXparr
+
+ type(t) :: dt, dtarr(5), dta, dtaarr(:), dtp, dtparr(:)
+ allocatable :: dta, dtaarr
+ pointer :: dtp, dtparr
+
+ allocate(aii, aarr(5), str1a, str1aarr(5), dta, dtparr(5))
+ allocate(pii, parr(5), str1p, str1parr(5), dtp, dtparr(5))
+ allocate(character(len=7) :: strXa, strXaarr(5), strXp, strXparr(5))
+
+
+ !$omp target defaultmap ( none ) ! { dg-note "enclosing 'target'" }
+ ii = 42; arr = 42; aii = 42; aarr = 42; pii = 42; parr = 42
+ ! { dg-error "'ii' not specified in enclosing 'target'" "" { target *-*-* } .-1 }
+ ! { dg-error "'arr' not specified in enclosing 'target'" "" { target *-*-* } .-2 }
+ ! { dg-error "'aii' not specified in enclosing 'target'" "" { target *-*-* } .-3 }
+ ! { dg-error "'aarr' not specified in enclosing 'target'" "" { target *-*-* } .-4 }
+ ! { dg-error "'pii' not specified in enclosing 'target'" "" { target *-*-* } .-5 }
+ ! { dg-error "'parr' not specified in enclosing 'target'" "" { target *-*-* } .-6 }
+
+ str1 = ""; str1arr = ""; str1a = ""; str1aarr = ""; str1p = ""; str1parr = ""
+ ! { dg-error "'str1' not specified in enclosing 'target'" "" { target *-*-* } .-1 }
+ ! { dg-error "'str1arr' not specified in enclosing 'target'" "" { target *-*-* } .-2 }
+ ! { dg-error "'str1a' not specified in enclosing 'target'" "" { target *-*-* } .-3 }
+ ! { dg-error "'str1aarr' not specified in enclosing 'target'" "" { target *-*-* } .-4 }
+ ! { dg-error "'str1p' not specified in enclosing 'target'" "" { target *-*-* } .-5 }
+ ! { dg-error "'str1parr' not specified in enclosing 'target'" "" { target *-*-* } .-6 }
+
+ str5 = ""; str5arr = ""; str5a = ""; str5aarr = ""; str5p = ""; str5parr = ""
+ ! { dg-error "'str5' not specified in enclosing 'target'" "" { target *-*-* } .-1 }
+ ! { dg-error "'str5arr' not specified in enclosing 'target'" "" { target *-*-* } .-2 }
+ ! { dg-error "'str5a' not specified in enclosing 'target'" "" { target *-*-* } .-3 }
+ ! { dg-error "'str5aarr' not specified in enclosing 'target'" "" { target *-*-* } .-4 }
+ ! { dg-error "'str5p' not specified in enclosing 'target'" "" { target *-*-* } .-5 }
+ ! { dg-error "'str5parr' not specified in enclosing 'target'" "" { target *-*-* } .-6 }
+
+ strXa = ""; strXaarr = ""; strXp = ""; strXparr = ""
+ ! { dg-error "'strxa' not specified in enclosing 'target'" "" { target *-*-* } .-1 }
+ ! { dg-error "'strxaarr' not specified in enclosing 'target'" "" { target *-*-* } .-2 }
+ ! { dg-error "'strxp' not specified in enclosing 'target'" "" { target *-*-* } .-3 }
+ ! { dg-error "'strxparr' not specified in enclosing 'target'" "" { target *-*-* } .-4 }
+
+ dt = t(); dtarr = t(); dta = t(); dtaarr = t(); dtp = t(); dtparr = t()
+ ! { dg-error "'dt' not specified in enclosing 'target'" "" { target *-*-* } .-1 }
+ ! { dg-error "'dtarr' not specified in enclosing 'target'" "" { target *-*-* } .-2 }
+ ! { dg-error "'dta' not specified in enclosing 'target'" "" { target *-*-* } .-3 }
+ ! { dg-error "'dtaarr' not specified in enclosing 'target'" "" { target *-*-* } .-4 }
+ ! { dg-error "'dtp' not specified in enclosing 'target'" "" { target *-*-* } .-5 }
+ ! { dg-error "'dtparr' not specified in enclosing 'target'" "" { target *-*-* } .-6 }
+ !$omp end target
+
+
+ !$omp target defaultmap(none : scalar) defaultmap(none : aggregate) &
+ !$omp& defaultmap(none : allocatable) defaultmap(none : pointer) ! { dg-note "enclosing 'target'" }
+ ii = 42; arr = 42; aii = 42; aarr = 42; pii = 42; parr = 42
+ ! { dg-error "'ii' not specified in enclosing 'target'" "" { target *-*-* } .-1 }
+ ! { dg-error "'arr' not specified in enclosing 'target'" "" { target *-*-* } .-2 }
+ ! { dg-error "'aii' not specified in enclosing 'target'" "" { target *-*-* } .-3 }
+ ! { dg-error "'aarr' not specified in enclosing 'target'" "" { target *-*-* } .-4 }
+ ! { dg-error "'pii' not specified in enclosing 'target'" "" { target *-*-* } .-5 }
+ ! { dg-error "'parr' not specified in enclosing 'target'" "" { target *-*-* } .-6 }
+
+ str1 = ""; str1arr = ""; str1a = ""; str1aarr = ""; str1p = ""; str1parr = ""
+ ! { dg-error "'str1' not specified in enclosing 'target'" "" { target *-*-* } .-1 }
+ ! { dg-error "'str1arr' not specified in enclosing 'target'" "" { target *-*-* } .-2 }
+ ! { dg-error "'str1a' not specified in enclosing 'target'" "" { target *-*-* } .-3 }
+ ! { dg-error "'str1aarr' not specified in enclosing 'target'" "" { target *-*-* } .-4 }
+ ! { dg-error "'str1p' not specified in enclosing 'target'" "" { target *-*-* } .-5 }
+ ! { dg-error "'str1parr' not specified in enclosing 'target'" "" { target *-*-* } .-6 }
+
+ str5 = ""; str5arr = ""; str5a = ""; str5aarr = ""; str5p = ""; str5parr = ""
+ ! { dg-error "'str5' not specified in enclosing 'target'" "" { target *-*-* } .-1 }
+ ! { dg-error "'str5arr' not specified in enclosing 'target'" "" { target *-*-* } .-2 }
+ ! { dg-error "'str5a' not specified in enclosing 'target'" "" { target *-*-* } .-3 }
+ ! { dg-error "'str5aarr' not specified in enclosing 'target'" "" { target *-*-* } .-4 }
+ ! { dg-error "'str5p' not specified in enclosing 'target'" "" { target *-*-* } .-5 }
+ ! { dg-error "'str5parr' not specified in enclosing 'target'" "" { target *-*-* } .-6 }
+
+ strXa = ""; strXaarr = ""; strXp = ""; strXparr = ""
+ ! { dg-error "'strxa' not specified in enclosing 'target'" "" { target *-*-* } .-1 }
+ ! { dg-error "'strxaarr' not specified in enclosing 'target'" "" { target *-*-* } .-2 }
+ ! { dg-error "'strxp' not specified in enclosing 'target'" "" { target *-*-* } .-3 }
+ ! { dg-error "'strxparr' not specified in enclosing 'target'" "" { target *-*-* } .-4 }
+
+ dt = t(); dtarr = t(); dta = t(); dtaarr = t(); dtp = t(); dtparr = t()
+ ! { dg-error "'dt' not specified in enclosing 'target'" "" { target *-*-* } .-1 }
+ ! { dg-error "'dtarr' not specified in enclosing 'target'" "" { target *-*-* } .-2 }
+ ! { dg-error "'dta' not specified in enclosing 'target'" "" { target *-*-* } .-3 }
+ ! { dg-error "'dtaarr' not specified in enclosing 'target'" "" { target *-*-* } .-4 }
+ ! { dg-error "'dtp' not specified in enclosing 'target'" "" { target *-*-* } .-5 }
+ ! { dg-error "'dtparr' not specified in enclosing 'target'" "" { target *-*-* } .-6 }
+ !$omp end target
+end
diff --git a/gcc/testsuite/gfortran.dg/gomp/defaultmap-3.f90 b/gcc/testsuite/gfortran.dg/gomp/defaultmap-3.f90
new file mode 100644
index 0000000..cfe40e8
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/defaultmap-3.f90
@@ -0,0 +1,60 @@
+! { dg-additional-options "-fdump-tree-original" }
+! { dg-additional-options "-fdump-tree-gimple" }
+!
+! PR fortran/92568
+!
+implicit none
+ type t
+ end type t
+
+ integer :: ii
+ integer :: arr(5)
+ integer, allocatable :: aii, aarr(:)
+ integer, pointer :: pii, parr(:)
+
+ character :: str1, str1arr(5), str1a, str1aarr(:), str1p, str1parr(:)
+ character(len=5) :: str5, str5arr(5), str5a, str5aarr(:), str5p, str5parr(:)
+ character(len=:) :: strXa, strXaarr(:), strXp, strXparr(:)
+ allocatable :: str1a, str1aarr, str5a, str5aarr, strXa, strXaarr
+ pointer :: str1p, str1parr, str5p, str5parr, strXp, strXparr
+
+ type(t) :: dt, dtarr(5), dta, dtaarr(:), dtp, dtparr(:)
+ allocatable :: dta, dtaarr
+ pointer :: dtp, dtparr
+
+ allocate(aii, aarr(5), str1a, str1aarr(5), dta, dtparr(5))
+ allocate(pii, parr(5), str1p, str1parr(5), dtp, dtparr(5))
+ allocate(character(len=7) :: strXa, strXaarr(5), strXp, strXparr(5))
+
+
+ !$omp target defaultmap ( none ) &
+ !$omp& map(tofrom: ii, arr, aii, aarr, pii, parr) &
+ !$omp& map(tofrom: str1, str1arr, str1a, str1aarr, str1p, str1parr) &
+ !$omp& map(tofrom: str5, str5arr, str5a, str5aarr, str5p, str5parr) &
+ !$omp& map(tofrom: strXa, strXaarr, strXp, strXparr) &
+ !$omp& map(tofrom: dt, dtarr, dta, dtaarr, dtp, dtparr)
+ ii = 42; arr = 42; aii = 42; aarr = 42; pii = 42; parr = 42
+ str1 = ""; str1arr = ""; str1a = ""; str1aarr = ""; str1p = ""; str1parr = ""
+ str5 = ""; str5arr = ""; str5a = ""; str5aarr = ""; str5p = ""; str5parr = ""
+ strXa = ""; strXaarr = ""; strXp = ""; strXparr = ""
+ dt = t(); dtarr = t(); dta = t(); dtaarr = t(); dtp = t(); dtparr = t()
+ !$omp end target
+
+
+ !$omp target defaultmap(none : scalar) defaultmap(none : aggregate) &
+ !$omp& defaultmap(none : allocatable) defaultmap(none : pointer) &
+ !$omp& map(alloc: ii, arr, aii, aarr, pii, parr) &
+ !$omp& map(alloc: str1, str1arr, str1a, str1aarr, str1p, str1parr) &
+ !$omp& map(alloc: str5, str5arr, str5a, str5aarr, str5p, str5parr) &
+ !$omp& map(alloc: strXa, strXaarr, strXp, strXparr) &
+ !$omp& map(alloc: dt, dtarr, dta, dtaarr, dtp, dtparr)
+ ii = 42; arr = 42; aii = 42; aarr = 42; pii = 42; parr = 42
+ str1 = ""; str1arr = ""; str1a = ""; str1aarr = ""; str1p = ""; str1parr = ""
+ str5 = ""; str5arr = ""; str5a = ""; str5aarr = ""; str5p = ""; str5parr = ""
+ strXa = ""; strXaarr = ""; strXp = ""; strXparr = ""
+ dt = t(); dtarr = t(); dta = t(); dtaarr = t(); dtp = t(); dtparr = t()
+ !$omp end target
+end
+
+! { dg-final { scan-tree-dump-times "#pragma omp target map\\(tofrom:.* defaultmap\\(none\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target map\\(alloc:.* defaultmap\\(none:scalar\\) defaultmap\\(none:aggregate\\) defaultmap\\(none:allocatable\\) defaultmap\\(none:pointer\\)" 1 "original" } }
diff --git a/gcc/testsuite/gfortran.dg/gomp/defaultmap-4.f90 b/gcc/testsuite/gfortran.dg/gomp/defaultmap-4.f90
new file mode 100644
index 0000000..89bbe87
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/defaultmap-4.f90
@@ -0,0 +1,141 @@
+! { dg-additional-options "-fdump-tree-original" }
+! { dg-additional-options "-fdump-tree-gimple" }
+!
+! PR fortran/92568
+!
+implicit none
+ type t
+ end type t
+
+ integer :: ii
+ integer :: arr(5)
+ integer, allocatable :: aii, aarr(:)
+ integer, pointer :: pii, parr(:)
+
+ character :: str1, str1arr(5), str1a, str1aarr(:), str1p, str1parr(:)
+ character(len=5) :: str5, str5arr(5), str5a, str5aarr(:), str5p, str5parr(:)
+ character(len=:) :: strXa, strXaarr(:), strXp, strXparr(:)
+ allocatable :: str1a, str1aarr, str5a, str5aarr, strXa, strXaarr
+ pointer :: str1p, str1parr, str5p, str5parr, strXp, strXparr
+
+ type(t) :: dt, dtarr(5), dta, dtaarr(:), dtp, dtparr(:)
+ allocatable :: dta, dtaarr
+ pointer :: dtp, dtparr
+
+ allocate(aii, aarr(5), str1a, str1aarr(5), dta, dtparr(5))
+ allocate(pii, parr(5), str1p, str1parr(5), dtp, dtparr(5))
+ allocate(character(len=7) :: strXa, strXaarr(5), strXp, strXparr(5))
+
+
+ !$omp target defaultmap ( alloc )
+ ii = 42; arr = 42; aii = 42; aarr = 42; pii = 42; parr = 42
+ str1 = ""; str1arr = ""; str1a = ""; str1aarr = ""; str1p = ""; str1parr = ""
+ str5 = ""; str5arr = ""; str5a = ""; str5aarr = ""; str5p = ""; str5parr = ""
+ strXa = ""; strXaarr = ""; strXp = ""; strXparr = ""
+ dt = t(); dtarr = t(); dta = t(); dtaarr = t(); dtp = t(); dtparr = t()
+ !$omp end target
+
+ !$omp target defaultmap(alloc : scalar) defaultmap(to : aggregate) &
+ !$omp& defaultmap(tofrom : allocatable) defaultmap(firstprivate : pointer)
+ ii = 42; arr = 42; aii = 42; aarr = 42; pii = 42; parr = 42
+ str1 = ""; str1arr = ""; str1a = ""; str1aarr = ""; str1p = ""; str1parr = ""
+ str5 = ""; str5arr = ""; str5a = ""; str5aarr = ""; str5p = ""; str5parr = ""
+ strXa = ""; strXaarr = ""; strXp = ""; strXparr = ""
+ dt = t(); dtarr = t(); dta = t(); dtaarr = t(); dtp = t(); dtparr = t()
+ !$omp end target
+end
+
+! { dg-final { scan-tree-dump-times "#pragma omp target defaultmap\\(alloc:scalar\\) defaultmap\\(to:aggregate\\) defaultmap\\(tofrom:allocatable\\) defaultmap\\(firstprivate:pointer\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target defaultmap\\(alloc\\)" 1 "original" } }
+
+! { dg-final { scan-tree-dump-times "firstprivate\\(dtp\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(pii\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(str1p\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(str5p\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(strxp\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*aii \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:aii \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*\\(c_char \\*\\) aarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*\\(c_char \\*\\) dtaarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*\\(c_char \\*\\) dtparr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*\\(c_char \\*\\) parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*\\(c_char \\*\\) str1aarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*\\(c_char \\*\\) str1parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*\\(c_char \\*\\) str5aarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*\\(c_char \\*\\) str5parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*\\(c_char \\*\\) strxaarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*\\(c_char \\*\\) strxparr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:1\\\] \\* restrict\\) str1aarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:5\\\] \\* restrict\\) str5aarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:\\.strxaarr\\\] \\* restrict\\) strxaarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*dta \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:dta \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:dtarr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:dt \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*dtp \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:dtp \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:ii \\\[len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(integer\\(kind=4\\)\\\[0:\\\] \\* restrict\\) aarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*pii \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:pii \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*str1a \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str1a \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str1arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str1 \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*str1p \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str1p \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*str5a \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str5a \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str5arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str5 \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*str5p \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str5p \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(struct t\\\[0:\\\] \\* restrict\\) dtaarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*strxa \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:strxa \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\*strxp \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:strxp \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:1\\\] \\*\\) str1parr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:5\\\] \\*\\) str5parr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:\\.strxparr\\\] \\*\\) strxparr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(integer\\(kind=4\\)\\\[0:\\\] \\*\\) parr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(struct t\\\[0:\\\] \\*\\) dtparr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:aarr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) dtparr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) str1parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) str5parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) strxparr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:dtaarr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:dtarr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:dt \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:dtparr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*aii \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) aarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) dtaarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) str1aarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) str5aarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) strxaarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*dta \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*str1a \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*str5a \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*strxa \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:parr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str1aarr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str1arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str1 \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str1parr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str5aarr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str5arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str5 \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str5parr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\.strxaarr \\\[len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:strxaarr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\.strxa \\\[len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\.strxparr \\\[len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:strxparr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\.strxp \\\[len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target num_teams\\(1\\) thread_limit\\(0\\) defaultmap\\(alloc\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target num_teams\\(1\\) thread_limit\\(0\\) defaultmap\\(alloc:scalar\\) defaultmap\\(to:aggregate\\) defaultmap\\(tofrom:allocatable\\) defaultmap\\(firstprivate:pointer\\)" 1 "gimple" } }
diff --git a/gcc/testsuite/gfortran.dg/gomp/defaultmap-5.f90 b/gcc/testsuite/gfortran.dg/gomp/defaultmap-5.f90
new file mode 100644
index 0000000..d6b32dc
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/defaultmap-5.f90
@@ -0,0 +1,145 @@
+! { dg-additional-options "-fdump-tree-original" }
+! { dg-additional-options "-fdump-tree-gimple" }
+!
+! PR fortran/92568
+!
+implicit none
+ type t
+ end type t
+
+ integer :: ii
+ integer :: arr(5)
+ integer, allocatable :: aii, aarr(:)
+ integer, pointer :: pii, parr(:)
+
+ character :: str1, str1arr(5), str1a, str1aarr(:), str1p, str1parr(:)
+ character(len=5) :: str5, str5arr(5), str5a, str5aarr(:), str5p, str5parr(:)
+ character(len=:) :: strXa, strXaarr(:), strXp, strXparr(:)
+ allocatable :: str1a, str1aarr, str5a, str5aarr, strXa, strXaarr
+ pointer :: str1p, str1parr, str5p, str5parr, strXp, strXparr
+
+ type(t) :: dt, dtarr(5), dta, dtaarr(:), dtp, dtparr(:)
+ allocatable :: dta, dtaarr
+ pointer :: dtp, dtparr
+
+ allocate(aii, aarr(5), str1a, str1aarr(5), dta, dtparr(5))
+ allocate(pii, parr(5), str1p, str1parr(5), dtp, dtparr(5))
+ allocate(character(len=7) :: strXa, strXaarr(5), strXp, strXparr(5))
+
+
+ !$omp target defaultmap ( to )
+ ii = 42; arr = 42; aii = 42; aarr = 42; pii = 42; parr = 42
+ str1 = ""; str1arr = ""; str1a = ""; str1aarr = ""; str1p = ""; str1parr = ""
+ str5 = ""; str5arr = ""; str5a = ""; str5aarr = ""; str5p = ""; str5parr = ""
+ strXa = ""; strXaarr = ""; strXp = ""; strXparr = ""
+ dt = t(); dtarr = t(); dta = t(); dtaarr = t(); dtp = t(); dtparr = t()
+ !$omp end target
+
+
+ ! FIXME: strXp disabled because of PR fortran/100965
+
+ !$omp target defaultmap(to : scalar) defaultmap(tofrom : aggregate) &
+ !$omp& defaultmap(firstprivate : allocatable) defaultmap(default : pointer)
+ ii = 42; arr = 42; aii = 42; aarr = 42; pii = 42; parr = 42
+ str1 = ""; str1arr = ""; str1a = ""; str1aarr = ""; str1p = ""; str1parr = ""
+ str5 = ""; str5arr = ""; str5a = ""; str5aarr = ""; str5p = ""; str5parr = ""
+ !strXa = "";
+ strXaarr = "";
+ ! strXp = ""
+ strXparr = ""
+ dt = t(); dtarr = t(); dta = t(); dtaarr = t(); dtp = t(); dtparr = t()
+ !$omp end target
+end
+
+! { dg-final { scan-tree-dump-times "#pragma omp target defaultmap\\(to\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target defaultmap\\(to:scalar\\) defaultmap\\(tofrom:aggregate\\) defaultmap\\(firstprivate:allocatable\\) defaultmap\\(default:pointer\\)" 1 "original" } }
+
+! { dg-final { scan-tree-dump-times "firstprivate\\(aarr\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(aii\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(dta\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(dtaarr\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(str1a\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(str1aarr\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(str5a\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(str5aarr\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(strxaarr\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:aii \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:1\\\] \\* restrict\\) str1aarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:5\\\] \\* restrict\\) str5aarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:\\.strxaarr\\\] \\* restrict\\) strxaarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:dta \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:dtp \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(integer\\(kind=4\\)\\\[0:\\\] \\* restrict\\) aarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:pii \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str1a \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str1p \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str5a \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str5p \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(struct t\\\[0:\\\] \\* restrict\\) dtaarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:strxa \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:strxp \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:1\\\] \\*\\) str1parr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:5\\\] \\*\\) str5parr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:\\.strxparr\\\] \\*\\) strxparr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(integer\\(kind=4\\)\\\[0:\\\] \\*\\) parr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(struct t\\\[0:\\\] \\*\\) dtparr\\.data \\\[pointer assign, bias: 0\\\]\\)" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:aarr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*aii \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) aarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) dtaarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) dtparr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) str1aarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) str1parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) str5aarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) str5parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) strxaarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*\\(c_char \\*\\) strxparr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:dtaarr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*dta \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:dtarr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:dt \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:dtparr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*dtp \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) dtparr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) str1parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) str5parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) strxparr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:dtarr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:dt \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*dtp \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*pii \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:str1arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:str1 \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*str1p \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:str5arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:str5 \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*str5p \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:ii \\\[len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:parr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*pii \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str1aarr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*str1a \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str1arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str1 \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str1parr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*str1p \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str5aarr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*str5a \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str5arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str5 \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str5parr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*str5p \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\.strxaarr \\\[len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:strxaarr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*strxa \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\.strxa \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\.strxparr \\\[len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:strxparr \\\[pointer set, len:" 2 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\*strxp \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\.strxp \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target num_teams\\(1\\) thread_limit\\(0\\) defaultmap\\(to\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target num_teams\\(1\\) thread_limit\\(0\\) defaultmap\\(to:scalar\\) defaultmap\\(tofrom:aggregate\\) defaultmap\\(firstprivate:allocatable\\) defaultmap\\(default:pointer\\)" 1 "gimple" } }
diff --git a/gcc/testsuite/gfortran.dg/gomp/defaultmap-6.f90 b/gcc/testsuite/gfortran.dg/gomp/defaultmap-6.f90
new file mode 100644
index 0000000..fabf771
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/defaultmap-6.f90
@@ -0,0 +1,104 @@
+! { dg-additional-options "-fdump-tree-original" }
+! { dg-additional-options "-fdump-tree-gimple" }
+!
+! PR fortran/92568
+!
+implicit none
+ type t
+ end type t
+
+ integer :: ii
+ integer :: arr(5)
+ integer, allocatable :: aii, aarr(:)
+ integer, pointer :: pii, parr(:)
+
+ character :: str1, str1arr(5), str1a, str1aarr(:), str1p, str1parr(:)
+ character(len=5) :: str5, str5arr(5), str5a, str5aarr(:), str5p, str5parr(:)
+ character(len=:) :: strXa, strXaarr(:), strXp, strXparr(:)
+ allocatable :: str1a, str1aarr, str5a, str5aarr, strXa, strXaarr
+ pointer :: str1p, str1parr, str5p, str5parr, strXp, strXparr
+
+ type(t) :: dt, dtarr(5), dta, dtaarr(:), dtp, dtparr(:)
+ allocatable :: dta, dtaarr
+ pointer :: dtp, dtparr
+
+ allocate(aii, aarr(5), str1a, str1aarr(5), dta, dtparr(5))
+ allocate(pii, parr(5), str1p, str1parr(5), dtp, dtparr(5))
+ allocate(character(len=7) :: strXa, strXaarr(5), strXp, strXparr(5))
+
+
+ !$omp target defaultmap ( default )
+ ii = 42; arr = 42; aii = 42; aarr = 42; pii = 42; parr = 42
+ str1 = ""; str1arr = ""; str1a = ""; str1aarr = ""; str1p = ""; str1parr = ""
+ str5 = ""; str5arr = ""; str5a = ""; str5aarr = ""; str5p = ""; str5parr = ""
+ strXa = ""; strXaarr = ""; strXp = ""; strXparr = ""
+ dt = t(); dtarr = t(); dta = t(); dtaarr = t(); dtp = t(); dtparr = t()
+ !$omp end target
+
+end
+
+! { dg-final { scan-tree-dump-times "#pragma omp target defaultmap\\(default\\)" 1 "original" } }
+
+! { dg-final { scan-tree-dump-times "firstprivate\\(ii\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:aii \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:1\\\] \\* restrict\\) str1aarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:5\\\] \\* restrict\\) str5aarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:\\.strxaarr\\\] \\* restrict\\) strxaarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:dta \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:dtp \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(integer\\(kind=4\\)\\\[0:\\\] \\* restrict\\) aarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:pii \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str1a \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str1p \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str5a \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:str5p \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:\\(struct t\\\[0:\\\] \\* restrict\\) dtaarr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:strxa \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(alloc:strxp \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:1\\\] \\*\\) str1parr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:5\\\] \\*\\) str5parr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(character\\(kind=1\\)\\\[0:\\\]\\\[1:\\.strxparr\\\] \\*\\) strxparr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(integer\\(kind=4\\)\\\[0:\\\] \\*\\) parr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(always_pointer:\\(struct t\\\[0:\\\] \\*\\) dtparr\\.data \\\[pointer assign, bias: 0\\\]\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:aarr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:dtaarr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:dtparr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*aii \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) aarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) dtaarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) dtparr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) str1aarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) str1parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) str5aarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) str5parr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) strxaarr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*\\(c_char \\*\\) strxparr\\.data \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*dta \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:dtarr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:dt \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*dtp \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*pii \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*str1a \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:str1arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:str1 \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*str1p \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*str5a \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:str5arr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:str5 \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*str5p \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*strxa \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*strxp \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:parr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str1aarr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str1parr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str5aarr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:str5parr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\.strxaarr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:strxaarr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\.strxa \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\.strxparr \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:strxparr \\\[pointer set, len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(to:\\.strxp \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target num_teams\\(1\\) thread_limit\\(0\\) defaultmap\\(default\\)" 1 "gimple" } }
diff --git a/gcc/testsuite/gfortran.dg/gomp/defaultmap-7.f90 b/gcc/testsuite/gfortran.dg/gomp/defaultmap-7.f90
new file mode 100644
index 0000000..e1b4fc2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/defaultmap-7.f90
@@ -0,0 +1,24 @@
+! PR fortran/92568
+!
+! { dg-additional-options "-fdump-tree-original" }
+! { dg-additional-options "-fdump-tree-gimple" }
+implicit none
+ integer :: ii, aa, pp
+ allocatable :: aa
+ pointer :: pp
+ character :: str
+ character(len=2) :: str2
+
+!$omp target
+ ii = 1
+ aa = 5
+ pp = 7
+ str = '1'
+ str2 = '12'
+!$omp end target
+end
+! { dg-final { scan-tree-dump-times "firstprivate\\(ii\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*aa" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:\\*pp" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:str2 \\\[len:" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "map\\(tofrom:str \\\[len:" 1 "gimple" } }
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr99928-1.f90 b/gcc/testsuite/gfortran.dg/gomp/pr99928-1.f90
index 9a59065..b61b2fc3 100644
--- a/gcc/testsuite/gfortran.dg/gomp/pr99928-1.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/pr99928-1.f90
@@ -108,13 +108,13 @@ subroutine bar ()
!$omp end parallel sections
! { dg-final { scan-tree-dump "omp target\[^\n\r]*firstprivate\\(f13\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*firstprivate\\(f13\\)" "gimple" } }
- !$omp target parallel firstprivate (f13) default(none) ! defaultmap(none)
+ !$omp target parallel firstprivate (f13) default(none) defaultmap(none)
f13 = f13 + 1
!$omp end target parallel
! { dg-final { scan-tree-dump "omp target\[^\n\r]*firstprivate\\(f14\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*firstprivate\\(f14\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*firstprivate\\(f14\\)" "gimple" } } ! FIXME.
- !$omp target parallel do firstprivate (f14) default(none) ! defaultmap(none)
+ !$omp target parallel do firstprivate (f14) default(none) defaultmap(none)
do i = 1, 64
f14 = f14 + 1
end do
@@ -122,7 +122,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*firstprivate\\(f15\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*firstprivate\\(f15\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump-not "omp simd\[^\n\r]*firstprivate\\(f15\\)" "gimple" } }
- !$omp target parallel do simd firstprivate (f15) default(none) ! defaultmap(none)
+ !$omp target parallel do simd firstprivate (f15) default(none) defaultmap(none)
do i = 1, 64
f15 = f15 + 1
end do
@@ -130,19 +130,19 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*firstprivate\\(f16\\)" "gimple" } }
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*firstprivate\\(f16\\)" "gimple" } }
! { dg-final { scan-tree-dump-not "omp simd\[^\n\r]*firstprivate\\(f16\\)" "gimple" } }
- !$omp target parallel loop firstprivate (f16) default(none) ! defaultmap(none)
+ !$omp target parallel loop firstprivate (f16) default(none) defaultmap(none)
do i = 1, 64
f16 = f16 + 1
end do
! { dg-final { scan-tree-dump "omp target\[^\n\r]*firstprivate\\(f17\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp teams\[^\n\r]*firstprivate\\(f17\\)" "gimple" } }
- !$omp target teams firstprivate (f17) default(none) ! defaultmap(none)
+ !$omp target teams firstprivate (f17) default(none) defaultmap(none)
f17 = f17 + 1
!$omp end target teams
! { dg-final { scan-tree-dump "omp target\[^\n\r]*firstprivate\\(f18\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp teams\[^\n\r]*firstprivate\\(f18\\)" "gimple" } } ! FIXME: This should be on distribute instead.
! { dg-final { scan-tree-dump-not "omp distribute\[^\n\r]*firstprivate\\(f18\\)" "gimple" } } ! FIXME.
- !$omp target teams distribute firstprivate (f18) default(none) ! defaultmap(none)
+ !$omp target teams distribute firstprivate (f18) default(none) defaultmap(none)
do i = 1, 64
f18 = f18 + 1
end do
@@ -151,7 +151,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump-not "omp distribute\[^\n\r]*firstprivate\\(f19\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*firstprivate\\(f19\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*firstprivate\\(f19\\)" "gimple" } } ! FIXME.
- !$omp target teams distribute parallel do firstprivate (f19) default(none) ! defaultmap(none)
+ !$omp target teams distribute parallel do firstprivate (f19) default(none) defaultmap(none)
do i = 1, 64
f19 = f19 + 1
end do
@@ -161,7 +161,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*firstprivate\\(f20\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*firstprivate\\(f20\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump-not "omp simd\[^\n\r]*firstprivate\\(f20\\)" "gimple" } }
- !$omp target teams distribute parallel do simd firstprivate (f20) default(none) ! defaultmap(none)
+ !$omp target teams distribute parallel do simd firstprivate (f20) default(none) defaultmap(none)
do i = 1, 64
f20 = f20 + 1
end do
@@ -169,7 +169,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp teams\[^\n\r]*firstprivate\\(f21\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp distribute\[^\n\r]*firstprivate\\(f21\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump-not "omp simd\[^\n\r]*firstprivate\\(f21\\)" "gimple" } }
- !$omp target teams distribute simd firstprivate (f21) default(none) ! defaultmap(none)
+ !$omp target teams distribute simd firstprivate (f21) default(none) defaultmap(none)
do i = 1, 64
f21 = f21 + 1
end do
@@ -179,13 +179,13 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(f22\\)" "gimple" } } ! NOTE: This is an implementation detail.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*firstprivate\\(f22\\)" "gimple" } }
! { dg-final { scan-tree-dump-not "omp simd\[^\n\r]*firstprivate\\(f22\\)" "gimple" } }
- !$omp target teams loop firstprivate (f22) default(none) ! defaultmap(none)
+ !$omp target teams loop firstprivate (f22) default(none) defaultmap(none)
do i = 1, 64
f22 = f22 + 1
end do
! { dg-final { scan-tree-dump "omp target\[^\n\r]*firstprivate\\(f23\\)" "gimple" } }
! { dg-final { scan-tree-dump-not "omp simd\[^\n\r]*firstprivate\\(f23\\)" "gimple" } }
- !$omp target simd firstprivate (f23) ! defaultmap(none)
+ !$omp target simd firstprivate (f23) defaultmap(none)
do i = 1, 64
f23 = f23 + 1
end do
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr99928-2.f90 b/gcc/testsuite/gfortran.dg/gomp/pr99928-2.f90
index 4a5b549..7a98248 100644
--- a/gcc/testsuite/gfortran.dg/gomp/pr99928-2.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/pr99928-2.f90
@@ -108,7 +108,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump-not "omp target\[^\n\r]*firstprivate\\(l11\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(l11\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(l11\\)" "gimple" } } ! FIXME.
- !$omp target parallel do lastprivate (l11) default(none) ! defaultmap(none)
+ !$omp target parallel do lastprivate (l11) default(none) defaultmap(none)
do i = 1, 64
l11 = i
end do
@@ -117,7 +117,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(l12\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(l12\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(l12\\)" "gimple" } }
- !$omp target parallel do simd lastprivate (l12) default(none) ! defaultmap(none)
+ !$omp target parallel do simd lastprivate (l12) default(none) defaultmap(none)
do i = 1, 64
l12 = i
end do
@@ -126,14 +126,14 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j01\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j01\\)" "gimple" } } ! NOTE: This is implementation detail.
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j01\\)" "gimple" } } ! NOTE: This is implementation detail.
- !$omp target parallel loop lastprivate (j01) default(none) ! defaultmap(none)
+ !$omp target parallel loop lastprivate (j01) default(none) defaultmap(none)
do j01 = 0, 64
end do
! { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:l13" "gimple" } }
! { dg-final { scan-tree-dump-not "omp target\[^\n\r]*firstprivate\\(l13\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(l13\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp distribute\[^\n\r]*lastprivate\\(l13\\)" "gimple" } }
- !$omp target teams distribute lastprivate (l13) default(none) ! defaultmap(none)
+ !$omp target teams distribute lastprivate (l13) default(none) defaultmap(none)
do i = 1, 64
l13 = i
end do
@@ -143,7 +143,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp distribute\[^\n\r]*lastprivate\\(l14\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(l14\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(l14\\)" "gimple" } } ! FIXME.
- !$omp target teams distribute parallel do lastprivate (l14) default(none) ! defaultmap(none)
+ !$omp target teams distribute parallel do lastprivate (l14) default(none) defaultmap(none)
do i = 1, 64
l14 = i
end do
@@ -154,7 +154,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(l15\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(l15\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(l15\\)" "gimple" } }
- !$omp target teams distribute parallel do simd lastprivate (l15) default(none) ! defaultmap(none)
+ !$omp target teams distribute parallel do simd lastprivate (l15) default(none) defaultmap(none)
do i = 1, 64
l15 = i
end do
@@ -163,7 +163,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp teams\[^\n\r]*shared\\(l16\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp distribute\[^\n\r]*lastprivate\\(l16\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(l16\\)" "gimple" } }
- !$omp target teams distribute simd lastprivate (l16) default(none) ! defaultmap(none)
+ !$omp target teams distribute simd lastprivate (l16) default(none) defaultmap(none)
do i = 1, 64
l16 = i
end do
@@ -174,13 +174,13 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(j02\\)" "gimple" } } ! NOTE: This is implementation detail.
! { dg-final { scan-tree-dump "omp for\[^\n\r]*lastprivate\\(j02\\)" "gimple" } } ! NOTE: This is implementation detail.
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(j02\\)" "gimple" } } ! NOTE: This is implementation detail.
- !$omp target teams loop lastprivate (j02) default(none) ! defaultmap(none)
+ !$omp target teams loop lastprivate (j02) default(none) defaultmap(none)
do j02 = 0, 64
end do
! { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:l17" "gimple" } }
! { dg-final { scan-tree-dump-not "omp target\[^\n\r]*firstprivate\\(l17\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(l17\\)" "gimple" } }
- !$omp target simd lastprivate (l17) ! defaultmap(none)
+ !$omp target simd lastprivate (l17) defaultmap(none)
do i = 1, 64
l17 = i
end do
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr99928-3.f90 b/gcc/testsuite/gfortran.dg/gomp/pr99928-3.f90
index 82bb893..3c02c88 100644
--- a/gcc/testsuite/gfortran.dg/gomp/pr99928-3.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/pr99928-3.f90
@@ -101,7 +101,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(l08\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*firstprivate\\(l08\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(l08\\)" "gimple" } } ! FIXME.
- !$omp target parallel do firstprivate (l08) lastprivate (l08) default(none) ! defaultmap(none)
+ !$omp target parallel do firstprivate (l08) lastprivate (l08) default(none) defaultmap(none)
do i = 1, 64
l08 = i
end do
@@ -114,7 +114,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(l09\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump-not "omp simd\[^\n\r]*firstprivate\\(l09\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(l09\\)" "gimple" } }
- !$omp target parallel do simd firstprivate (l09) lastprivate (l09) default(none) ! defaultmap(none)
+ !$omp target parallel do simd firstprivate (l09) lastprivate (l09) default(none) defaultmap(none)
do i = 1, 64
l09 = i
end do
@@ -122,7 +122,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump-not "omp target\[^\n\r]*firstprivate\\(l10\\)" "gimple" } }
! { dg-final { scan-tree-dump-not "omp simd\[^\n\r]*firstprivate\\(l10\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*lastprivate\\(l10\\)" "gimple" } }
- !$omp target simd firstprivate (l10) lastprivate (l10) ! defaultmap(none)
+ !$omp target simd firstprivate (l10) lastprivate (l10) defaultmap(none)
do i = 1, 64
l10 = i
end do
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr99928-4.f90 b/gcc/testsuite/gfortran.dg/gomp/pr99928-4.f90
index ead8f03..1563c4f 100644
--- a/gcc/testsuite/gfortran.dg/gomp/pr99928-4.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/pr99928-4.f90
@@ -57,7 +57,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump-not "omp target\[^\n\r]*firstprivate\\(l05\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(l05\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp for\[^\n\r]*linear\\(l05:1\\)" "gimple" } }
- !$omp target parallel do linear (l05) default(none) ! defaultmap(none)
+ !$omp target parallel do linear (l05) default(none) defaultmap(none)
do i = 1, 64
l05 = l05 + 1
end do
@@ -68,14 +68,14 @@ subroutine bar ()
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*firstprivate\\(l06\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(l06\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*linear\\(l06:1\\)" "gimple" } }
- !$omp target parallel do simd linear (l06) default(none) ! defaultmap(none)
+ !$omp target parallel do simd linear (l06) default(none) defaultmap(none)
do i = 1, 64
l06 = l06 + 1
end do
! { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:l07" "gimple" } }
! { dg-final { scan-tree-dump-not "omp target\[^\n\r]*firstprivate\\(l07\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*linear\\(l07:1\\)" "gimple" } }
- !$omp target simd linear (l07) ! defaultmap(none)
+ !$omp target simd linear (l07) defaultmap(none)
do i = 1, 64
l07 = l07 + 1
end do
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr99928-5.f90 b/gcc/testsuite/gfortran.dg/gomp/pr99928-5.f90
index 49cbf1e..259f6cc 100644
--- a/gcc/testsuite/gfortran.dg/gomp/pr99928-5.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/pr99928-5.f90
@@ -57,13 +57,13 @@ subroutine bar ()
! { 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" } }
- !$omp target parallel do simd linear (j06) default(none) ! defaultmap(none)
+ !$omp target parallel do simd linear (j06) default(none) defaultmap(none)
do j06 = 1, 64
end do
! { 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" } }
- !$omp target simd linear (j07) ! defaultmap(none)
+ !$omp target simd linear (j07) defaultmap(none)
do j07 = 1, 64
end do
! { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j08" "gimple" } }
@@ -73,7 +73,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j08\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j08\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*linear\\(j08:1\\)" "gimple" } }
- !$omp target teams distribute parallel do simd linear (j08) default(none) ! defaultmap(none)
+ !$omp target teams distribute parallel do simd linear (j08) default(none) defaultmap(none)
do j08 = 1, 64
end do
! { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j09" "gimple" } }
@@ -81,7 +81,7 @@ subroutine bar ()
! { 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" } }
- !$omp target teams distribute simd linear (j09) default(none) ! defaultmap(none)
+ !$omp target teams distribute simd linear (j09) default(none) defaultmap(none)
do j09 = 1, 64
end do
! { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j10\\)" "gimple" } } ! NOTE: This is implementation detail.
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr99928-6.f90 b/gcc/testsuite/gfortran.dg/gomp/pr99928-6.f90
index 0e60199..a9ad226 100644
--- a/gcc/testsuite/gfortran.dg/gomp/pr99928-6.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/pr99928-6.f90
@@ -57,13 +57,13 @@ subroutine bar ()
! { 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" } }
- !$omp target parallel do simd default(none) ! defaultmap(none)
+ !$omp target parallel do simd default(none) defaultmap(none)
do j06 = 1, 64
end do
! { 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" } }
- !$omp target simd ! defaultmap(none)
+ !$omp target simd defaultmap(none)
do j07 = 1, 64
end do
! { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j08" "gimple" } }
@@ -73,7 +73,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*lastprivate\\(j08\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*lastprivate\\(j08\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*linear\\(j08:1\\)" "gimple" } }
- !$omp target teams distribute parallel do simd default(none) ! defaultmap(none)
+ !$omp target teams distribute parallel do simd default(none) defaultmap(none)
do j08 = 1, 64
end do
! { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:j09" "gimple" } }
@@ -81,7 +81,7 @@ subroutine bar ()
! { 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" } }
- !$omp target teams distribute simd default(none) ! defaultmap(none)
+ !$omp target teams distribute simd default(none) defaultmap(none)
do j09 = 1, 64
end do
! { dg-final { scan-tree-dump "omp taskloop\[^\n\r]*shared\\(j10\\)" "gimple" } } ! NOTE: This is implementation detail.
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr99928-8.f90 b/gcc/testsuite/gfortran.dg/gomp/pr99928-8.f90
index c5d1eb7..a0414a5 100644
--- a/gcc/testsuite/gfortran.dg/gomp/pr99928-8.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/pr99928-8.f90
@@ -113,14 +113,14 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:r13" "gimple" } }
! { dg-final { scan-tree-dump-not "omp target\[^\n\r]*firstprivate\\(r13\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*reduction\\(\\+:r13\\)" "gimple" } }
- !$omp target parallel reduction(+:r13) default(none) ! defaultmap(none)
+ !$omp target parallel reduction(+:r13) default(none) defaultmap(none)
r13 = r13 + 1
!$omp end target parallel
! { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:r14" "gimple" } }
! { dg-final { scan-tree-dump-not "omp target\[^\n\r]*firstprivate\\(r14\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*reduction\\(\\+:r14\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*reduction\\(\\+:r14\\)" "gimple" } } ! FIXME.
- !$omp target parallel do reduction(+:r14) default(none) ! defaultmap(none)
+ !$omp target parallel do reduction(+:r14) default(none) defaultmap(none)
do i = 1, 64
r14 = r14 + 1
end do
@@ -129,7 +129,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*reduction\\(\\+:r15\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*reduction\\(\\+:r15\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*reduction\\(\\+:r15\\)" "gimple" } }
- !$omp target parallel do simd reduction(+:r15) default(none) ! defaultmap(none)
+ !$omp target parallel do simd reduction(+:r15) default(none) defaultmap(none)
do i = 1, 64
r15 = r15 + 1
end do
@@ -138,21 +138,21 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(r16\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp for\[^\n\r]*reduction\\(\\+:r16\\)" "gimple" } } ! NOTE: This is implementation detail.
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*reduction\\(\\+:r16\\)" "gimple" } } ! NOTE: This is implementation detail.
- !$omp target parallel loop reduction(+:r16) default(none) ! defaultmap(none)
+ !$omp target parallel loop reduction(+:r16) default(none) defaultmap(none)
do i = 1, 64
r16 = r16 + 1
end do
! { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:r17" "gimple" } }
! { dg-final { scan-tree-dump-not "omp target\[^\n\r]*firstprivate\\(r17\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp teams\[^\n\r]*reduction\\(\\+:r17\\)" "gimple" } }
- !$omp target teams reduction(+:r17) default(none) ! defaultmap(none)
+ !$omp target teams reduction(+:r17) default(none) defaultmap(none)
r17 = r17 + 1
!$omp end target teams
! { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:r18" "gimple" } }
! { dg-final { scan-tree-dump-not "omp target\[^\n\r]*firstprivate\\(r18\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp teams\[^\n\r]*reduction\\(\\+:r18\\)" "gimple" } }
! { dg-final { scan-tree-dump-not "omp distribute\[^\n\r]*reduction\\(\\+:r18\\)" "gimple" } }
- !$omp target teams distribute reduction(+:r18) default(none) ! defaultmap(none)
+ !$omp target teams distribute reduction(+:r18) default(none) defaultmap(none)
do i = 1, 64
r18 = r18 + 1
end do
@@ -162,7 +162,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump-not "omp distribute\[^\n\r]*reduction\\(\\+:r19\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*reduction\\(\\+:r19\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*reduction\\(\\+:r19\\)" "gimple" } } ! FIXME.
- !$omp target teams distribute parallel do reduction(+:r19) default(none) ! defaultmap(none)
+ !$omp target teams distribute parallel do reduction(+:r19) default(none) defaultmap(none)
do i = 1, 64
r19 = r19 + 1
end do
@@ -173,7 +173,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*reduction\\(\\+:r20\\)" "gimple" } } ! FIXME: This should be on for instead.
! { dg-final { scan-tree-dump-not "omp for\[^\n\r]*reduction\\(\\+:r20\\)" "gimple" } } ! FIXME.
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*reduction\\(\\+:r20\\)" "gimple" } }
- !$omp target teams distribute parallel do simd reduction(+:r20) default(none) ! defaultmap(none)
+ !$omp target teams distribute parallel do simd reduction(+:r20) default(none) defaultmap(none)
do i = 1, 64
r20 = r20 + 1
end do
@@ -182,7 +182,7 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp teams\[^\n\r]*reduction\\(\\+:r21\\)" "gimple" } }
! { dg-final { scan-tree-dump-not "omp distribute\[^\n\r]*reduction\\(\\+:r21\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*reduction\\(\\+:r21\\)" "gimple" } }
- !$omp target teams distribute simd reduction(+:r21) default(none) ! defaultmap(none)
+ !$omp target teams distribute simd reduction(+:r21) default(none) defaultmap(none)
do i = 1, 64
r21 = r21 + 1
end do
@@ -193,14 +193,14 @@ subroutine bar ()
! { dg-final { scan-tree-dump "omp parallel\[^\n\r]*shared\\(r22\\)" "gimple" } } ! NOTE: This is implementation detail.
! { dg-final { scan-tree-dump "omp for\[^\n\r]*reduction\\(\\+:r22\\)" "gimple" } } ! NOTE: This is implementation detail.
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*reduction\\(\\+:r22\\)" "gimple" } } ! NOTE: This is implementation detail.
- !$omp target teams loop reduction(+:r22) default(none) ! defaultmap(none)
+ !$omp target teams loop reduction(+:r22) default(none) defaultmap(none)
do i = 1, 64
r22 = r22 + 1
end do
! { dg-final { scan-tree-dump "omp target\[^\n\r]*map\\(tofrom:r23" "gimple" } }
! { dg-final { scan-tree-dump-not "omp target\[^\n\r]*firstprivate\\(r23\\)" "gimple" } }
! { dg-final { scan-tree-dump "omp simd\[^\n\r]*reduction\\(\\+:r23\\)" "gimple" } }
- !$omp target simd reduction(+:r23) ! defaultmap(none)
+ !$omp target simd reduction(+:r23) defaultmap(none)
do i = 1, 64
r23 = r23 + 1
end do
diff --git a/libgomp/testsuite/libgomp.fortran/defaultmap-8.f90 b/libgomp/testsuite/libgomp.fortran/defaultmap-8.f90
new file mode 100644
index 0000000..ddf5057
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/defaultmap-8.f90
@@ -0,0 +1,279 @@
+! { dg-do run }
+! { dg-additional-options "-fdump-tree-gimple" }
+!
+! PR fortran/92568
+!
+program main
+ implicit none
+ integer :: xa1, xa2, xp1, xp2, xat1, xat2, xt1, xt2, xi1, xi2
+ allocatable :: xa1, xa2, xat1, xat2
+ pointer :: xp1, xp2
+
+ allocate (xa1, xa2, xat1, xat2, xp1, xp2)
+
+ call foo (xa1, xa2, xp1, xp2, xat1, xat2, xt1, xt2, xi1, xi2)
+ call foo2 (xa1, xa2, xp1, xp2, xat1, xat2, xt1, xt2, xi1, xi2)
+ call foo3 (xa1, xa2, xp1, xp2, xat1, xat2, xt1, xt2, xi1, xi2)
+ call bar (xa1, xa2, xp1, xp2, xat1, xat2, xt1, xt2, xi1, xi2)
+
+ deallocate (xa1, xa2, xat1, xat2, xp1, xp2)
+contains
+! Implicit mapping
+subroutine foo (ia1, ia2, ip1, ip2, iat1, iat2, it1, it2, ii1, ii2)
+ implicit none
+ integer :: ia1, ia2, ia3, ip1, ip2, ip3, iat1, iat2, iat3, it1, it2, it3, ii1, ii2, ii3
+ allocatable :: ia1, ia2, ia3, iat1, iat2, iat3
+ pointer :: ip1, ip2, ip3
+ target :: iat1, iat2, iat3, it1, it2, it3
+ optional :: ia1, ip1, iat1, it1, ii1
+
+ allocate(ia3, iat3, ip3)
+
+ ia1 = 2; ia2 = 2; ia3 = 2; ip1 = 2; ip2 = 2; ip3 = 2;
+ iat1 = 2; iat2 = 2; iat3 = 2; it1 = 2; it2 = 2; it3 = 2
+ ii1 = 2; ii2 = 2; ii3 = 2
+
+ ! Implicitly, scalars are 'firstprivate' except
+ ! if target, allocatable, pointer they are always tofrom.
+ !$omp target
+ if (ia1 /= 2) stop 1
+ if (ia2 /= 2) stop 2
+ if (ia3 /= 2) stop 3
+ if (ip1 /= 2) stop 4
+ if (ip2 /= 2) stop 5
+ if (ip3 /= 2) stop 6
+ if (iat1 /= 2) stop 7
+ if (iat2 /= 2) stop 8
+ if (iat3 /= 2) stop 9
+ if (it1 /= 2) stop 10
+ if (it2 /= 2) stop 11
+ if (it3 /= 2) stop 12
+ if (ii1 /= 2) stop 13
+ if (ii2 /= 2) stop 14
+ if (ii3 /= 2) stop 15
+
+ ia1 = 1; ia2 = 1; ia3 = 1; ip1 = 1; ip2 = 1; ip3 = 1;
+ iat1 = 1; iat2 = 1; iat3 = 1; it1 = 1; it2 = 1; it3 = 1
+ ii1 = 1; ii2 = 1; ii3 = 1
+ !$omp end target
+
+ ! (target,allocatable,pointer) -> tofrom
+ if (ia1 /= 1) stop 16
+ if (ia2 /= 1) stop 17
+ if (ia3 /= 1) stop 18
+ if (ip1 /= 1) stop 19
+ if (ip2 /= 1) stop 20
+ if (ip3 /= 1) stop 21
+ if (iat1 /= 1) stop 22
+ if (iat2 /= 1) stop 23
+ if (iat3 /= 1) stop 24
+ if (it1 /= 1) stop 25
+ if (it2 /= 1) stop 26
+ if (it3 /= 1) stop 27
+ ! non-(target,allocatable,pointer) -> firstprivate
+ !if (ii1 /= 2) stop 28 ! FIXME: optional scalar wrongly mapped as tofrom, PR fortran/100991
+ if (ii2 /= 2) stop 29
+ if (ii3 /= 2) stop 30
+
+ deallocate(ia3, iat3, ip3)
+end
+
+! Implicit mapping likewise even though there is defaultmap
+subroutine foo2 (ia1, ia2, ip1, ip2, iat1, iat2, it1, it2, ii1, ii2)
+ implicit none
+ integer :: ia1, ia2, ia3, ip1, ip2, ip3, iat1, iat2, iat3, it1, it2, it3, ii1, ii2, ii3
+ allocatable :: ia1, ia2, ia3, iat1, iat2, iat3
+ pointer :: ip1, ip2, ip3
+ target :: iat1, iat2, iat3, it1, it2, it3
+ optional :: ia1, ip1, iat1, it1, ii1
+
+ allocate(ia3, iat3, ip3)
+
+ ia1 = 2; ia2 = 2; ia3 = 2; ip1 = 2; ip2 = 2; ip3 = 2;
+ iat1 = 2; iat2 = 2; iat3 = 2; it1 = 2; it2 = 2; it3 = 2
+ ii1 = 2; ii2 = 2; ii3 = 2
+
+ ! Implicitly, scalars are 'firstprivate' except
+ ! if target, allocatable, pointer they are always tofrom.
+ !$omp target defaultmap(default)
+ if (ia1 /= 2) stop 31
+ if (ia2 /= 2) stop 32
+ if (ia3 /= 2) stop 33
+ if (ip1 /= 2) stop 34
+ if (ip2 /= 2) stop 35
+ if (ip3 /= 2) stop 36
+ if (iat1 /= 2) stop 37
+ if (iat2 /= 2) stop 38
+ if (iat3 /= 2) stop 39
+ if (it1 /= 2) stop 40
+ if (it2 /= 2) stop 41
+ if (it3 /= 2) stop 42
+ if (ii1 /= 2) stop 43
+ if (ii2 /= 2) stop 44
+ if (ii3 /= 2) stop 45
+
+ ia1 = 1; ia2 = 1; ia3 = 1; ip1 = 1; ip2 = 1; ip3 = 1;
+ iat1 = 1; iat2 = 1; iat3 = 1; it1 = 1; it2 = 1; it3 = 1
+ ii1 = 1; ii2 = 1; ii3 = 1
+ !$omp end target
+
+ ! (target,allocatable,pointer) -> tofrom
+ if (ia1 /= 1) stop 46
+ if (ia2 /= 1) stop 47
+ if (ia3 /= 1) stop 48
+ if (ip1 /= 1) stop 49
+ if (ip2 /= 1) stop 50
+ if (ip3 /= 1) stop 51
+ if (iat1 /= 1) stop 52
+ if (iat2 /= 1) stop 53
+ if (iat3 /= 1) stop 54
+ if (it1 /= 1) stop 55
+ if (it2 /= 1) stop 56
+ if (it3 /= 1) stop 57
+ ! non-(target,allocatable,pointer) -> firstprivate
+ !if (ii1 /= 2) stop 58 ! FIXME: optional scalar wrongly mapped as tofrom, PR fortran/100991
+ if (ii2 /= 2) stop 59
+ if (ii3 /= 2) stop 60
+
+ deallocate(ia3, iat3, ip3)
+end
+
+! Implicit mapping likewise even though there is defaultmap
+subroutine foo3 (ia1, ia2, ip1, ip2, iat1, iat2, it1, it2, ii1, ii2)
+ implicit none
+ integer :: ia1, ia2, ia3, ip1, ip2, ip3, iat1, iat2, iat3, it1, it2, it3, ii1, ii2, ii3
+ allocatable :: ia1, ia2, ia3, iat1, iat2, iat3
+ pointer :: ip1, ip2, ip3
+ target :: iat1, iat2, iat3, it1, it2, it3
+ optional :: ia1, ip1, iat1, it1, ii1
+
+ allocate(ia3, iat3, ip3)
+
+ ia1 = 2; ia2 = 2; ia3 = 2; ip1 = 2; ip2 = 2; ip3 = 2;
+ iat1 = 2; iat2 = 2; iat3 = 2; it1 = 2; it2 = 2; it3 = 2
+ ii1 = 2; ii2 = 2; ii3 = 2
+
+ ! Implicitly, scalars are 'firstprivate' except
+ ! if target, allocatable, pointer they are always tofrom.
+ !$omp target defaultmap(none:aggregate)
+ if (ia1 /= 2) stop 61
+ if (ia2 /= 2) stop 62
+ if (ia3 /= 2) stop 63
+ if (ip1 /= 2) stop 64
+ if (ip2 /= 2) stop 65
+ if (ip3 /= 2) stop 66
+ if (iat1 /= 2) stop 67
+ if (iat2 /= 2) stop 68
+ if (iat3 /= 2) stop 69
+ if (it1 /= 2) stop 70
+ if (it2 /= 2) stop 71
+ if (it3 /= 2) stop 72
+ if (ii1 /= 2) stop 73
+ if (ii2 /= 2) stop 74
+ if (ii3 /= 2) stop 75
+
+ ia1 = 1; ia2 = 1; ia3 = 1; ip1 = 1; ip2 = 1; ip3 = 1;
+ iat1 = 1; iat2 = 1; iat3 = 1; it1 = 1; it2 = 1; it3 = 1
+ ii1 = 1; ii2 = 1; ii3 = 1
+ !$omp end target
+
+ ! (target,allocatable,pointer) -> tofrom
+ if (ia1 /= 1) stop 76
+ if (ia2 /= 1) stop 77
+ if (ia3 /= 1) stop 78
+ if (ip1 /= 1) stop 79
+ if (ip2 /= 1) stop 80
+ if (ip3 /= 1) stop 81
+ if (iat1 /= 1) stop 82
+ if (iat2 /= 1) stop 83
+ if (iat3 /= 1) stop 84
+ if (it1 /= 1) stop 85
+ if (it2 /= 1) stop 86
+ if (it3 /= 1) stop 87
+ ! non-(target,allocatable,pointer) -> firstprivate
+ !if (ii1 /= 2) stop 88 ! FIXME: optional scalar wrongly mapped as tofrom, PR fortran/100991
+ if (ii2 /= 2) stop 89
+ if (ii3 /= 2) stop 90
+
+ deallocate(ia3, iat3, ip3)
+end
+
+subroutine bar (ea1, ea2, ep1, ep2, eat1, eat2, et1, et2, ei1, ei2)
+ implicit none
+ integer :: ea1, ea2, ea3, ep1, ep2, ep3, eat1, eat2, eat3, et1, et2, et3, ei1, ei2, ei3
+ allocatable :: ea1, ea2, ea3, eat1, eat2, eat3
+ pointer :: ep1, ep2, ep3
+ target :: eat1, eat2, eat3, et1, et2, et3
+ optional :: ea1, ep1, eat1, et1, ei1
+
+ allocate(ea3, eat3, ep3)
+
+ ea1 = 2; ea2 = 2; ea3 = 2; ep1 = 2; ep2 = 2; ep3 = 2;
+ eat1 = 2; eat2 = 2; eat3 = 2; et1 = 2; et2 = 2; et3 = 2
+ ei1 = 2; ei2 = 2; ei3 = 2
+
+ ! While here 'scalar' implies nonallocatable/nonpointer and
+ ! the target attribute plays no role.
+ !$omp target defaultmap(tofrom:scalar) defaultmap(firstprivate:allocatable) &
+ !$omp& defaultmap(none:aggregate) defaultmap(firstprivate:pointer)
+ if (ea1 /= 2) stop 91
+ if (ea2 /= 2) stop 92
+ if (ea3 /= 2) stop 93
+ if (ep1 /= 2) stop 94
+ if (ep2 /= 2) stop 95
+ if (ep3 /= 2) stop 96
+ if (eat1 /= 2) stop 97
+ if (eat2 /= 2) stop 98
+ if (eat3 /= 2) stop 99
+ if (et1 /= 2) stop 100
+ if (et2 /= 2) stop 101
+ if (et3 /= 2) stop 102
+ if (ei1 /= 2) stop 103
+ if (ei2 /= 2) stop 104
+ if (ei3 /= 2) stop 105
+ ep1 => null(); ep2 => null(); ep3 => null()
+ ea1 = 1; ea2 = 1; ea3 = 1
+ eat1 = 1; eat2 = 1; eat3 = 1
+ et1 = 1; et2 = 1; et3 = 1
+ ei1 = 1; ei2 = 1; ei3 = 1
+ !$omp end target
+ ! (allocatable,pointer) -> firstprivate
+
+! FIXME: allocatables not properly privatized, cf. PR fortran/90742
+
+! if (ea1 /= 2) stop 106
+! if (ea2 /= 2) stop 107
+! if (ea3 /= 2) stop 108
+! if (eat1 /= 2) stop 112
+! if (eat2 /= 2) stop 113
+! if (eat3 /= 2) stop 114
+ if (ep1 /= 2) stop 109
+ if (ep2 /= 2) stop 110
+ if (ep3 /= 2) stop 111
+ ! (scalar) -> tofrom
+ !if (et1 /= 1) stop 115 ! FIXME: optional scalar wrongly mapped as 'firstprivate', PR fortran/100991
+ if (et2 /= 1) stop 116
+ if (et3 /= 1) stop 117
+ !if (ei1 /= 1) stop 118 ! FIXME: optional scalar wrongly mapped as 'firstprivate', PR fortran/100991
+ if (ei2 /= 1) stop 119
+ if (ei3 /= 1) stop 120
+
+ deallocate(ea3, eat3, ep3)
+end
+
+end
+
+! FIXME/xfail: Optional scalars wrongly classified, PR fortran/100991
+! { dg-final { scan-tree-dump-times "firstprivate\\(ii1\\)" 3 "gimple" { xfail *-*-* } } }
+! { dg-final { scan-tree-dump-not "firstprivate\\(et1\\)" "gimple" { xfail *-*-* } } }
+! { dg-final { scan-tree-dump-not "firstprivate\\(ei1\\)" "gimple" { xfail *-*-* } } }
+
+! { dg-final { scan-tree-dump-times "firstprivate\\(ea1\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(ea2\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(ea3\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(eat1\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(eat2\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(eat3\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(ep1\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(ep2\\)" 1 "gimple" } }
+! { dg-final { scan-tree-dump-times "firstprivate\\(ep3\\)" 1 "gimple" } }