From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1534) id 70C0B385740F; Tue, 15 Jun 2021 14:41:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 70C0B385740F Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Tobias Burnus To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/omp/gcc-11] Fortran/OpenMP: Extend defaultmap clause for OpenMP 5 [PR92568] X-Act-Checkin: gcc X-Git-Author: Tobias Burnus X-Git-Refname: refs/heads/devel/omp/gcc-11 X-Git-Oldrev: adda89fd07129b47191295f861a5c135094e3809 X-Git-Newrev: 35b3fbf5d52e9f68795b93051e4ca91eb0faa38c Message-Id: <20210615144129.70C0B385740F@sourceware.org> Date: Tue, 15 Jun 2021 14:41:29 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Jun 2021 14:41:29 -0000 https://gcc.gnu.org/g:35b3fbf5d52e9f68795b93051e4ca91eb0faa38c commit 35b3fbf5d52e9f68795b93051e4ca91eb0faa38c Author: Tobias Burnus Date: Tue Jun 15 16:34:37 2021 +0200 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. (cherry picked from commit 1de31913d20a467b78904c0e96efd5fbd6facd2c) Diff: --- gcc/ChangeLog.omp | 19 ++ gcc/fortran/ChangeLog.omp | 22 ++ gcc/fortran/dump-parse-tree.c | 38 ++- gcc/fortran/f95-lang.c | 4 + gcc/fortran/gfortran.h | 26 +- gcc/fortran/openmp.c | 84 ++++++- gcc/fortran/trans-decl.c | 5 + gcc/fortran/trans-openmp.c | 97 ++++++- gcc/fortran/trans.h | 9 +- gcc/gimplify.c | 35 ++- gcc/langhooks-def.h | 6 +- gcc/langhooks.c | 7 +- gcc/langhooks.h | 13 +- gcc/testsuite/ChangeLog.omp | 21 ++ gcc/testsuite/gfortran.dg/gomp/defaultmap-1.f90 | 19 ++ gcc/testsuite/gfortran.dg/gomp/defaultmap-2.f90 | 108 ++++++++ gcc/testsuite/gfortran.dg/gomp/defaultmap-3.f90 | 60 +++++ gcc/testsuite/gfortran.dg/gomp/defaultmap-4.f90 | 141 +++++++++++ gcc/testsuite/gfortran.dg/gomp/defaultmap-5.f90 | 145 +++++++++++ gcc/testsuite/gfortran.dg/gomp/defaultmap-6.f90 | 104 ++++++++ gcc/testsuite/gfortran.dg/gomp/defaultmap-7.f90 | 24 ++ gcc/testsuite/gfortran.dg/gomp/pr99928-1.f90 | 22 +- gcc/testsuite/gfortran.dg/gomp/pr99928-2.f90 | 18 +- gcc/testsuite/gfortran.dg/gomp/pr99928-3.f90 | 6 +- gcc/testsuite/gfortran.dg/gomp/pr99928-4.f90 | 6 +- gcc/testsuite/gfortran.dg/gomp/pr99928-5.f90 | 8 +- gcc/testsuite/gfortran.dg/gomp/pr99928-6.f90 | 8 +- gcc/testsuite/gfortran.dg/gomp/pr99928-8.f90 | 22 +- libgomp/ChangeLog.omp | 8 + libgomp/testsuite/libgomp.fortran/defaultmap-8.f90 | 279 +++++++++++++++++++++ 30 files changed, 1287 insertions(+), 77 deletions(-) diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp index 28758c6fb49..29da5644218 100644 --- a/gcc/ChangeLog.omp +++ b/gcc/ChangeLog.omp @@ -1,3 +1,22 @@ +2021-06-15 Tobias Burnus + + Backported from master: + 2021-06-15 Tobias Burnus + + PR fortran/92568 + * 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. + 2021-06-15 Tobias Burnus Backported from master: diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp index 95509a2e671..8d400174c00 100644 --- a/gcc/fortran/ChangeLog.omp +++ b/gcc/fortran/ChangeLog.omp @@ -1,3 +1,25 @@ +2021-06-15 Tobias Burnus + + Backported from master: + 2021-06-15 Tobias Burnus + + PR fortran/92568 + * 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. + 2021-06-09 Tobias Burnus Backported from master: diff --git a/gcc/fortran/dump-parse-tree.c b/gcc/fortran/dump-parse-tree.c index 141101e699d..07e98b7e30d 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 b6eb29e1266..bf8f38e3031 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 fb8e6432599..5fe40e2330d 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -1244,6 +1244,29 @@ enum gfc_omp_map_op OMP_MAP_DECLARE_DEALLOCATE }; +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, @@ -1426,9 +1449,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 6696e89abae..0d73adf6426 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -1541,10 +1541,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) @@ -2468,6 +2545,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 3d7d3a7d319..cb51c66a36d 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 1e6e7f75fe9..5ab83b00688 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -397,6 +397,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. */ @@ -1679,10 +1701,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) @@ -1691,7 +1714,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; @@ -1707,6 +1734,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 @@ -4061,13 +4099,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); @@ -5711,8 +5791,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 6b864a6395d..9859e9aedcb 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -818,7 +818,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); @@ -1026,6 +1028,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; }; @@ -1040,12 +1043,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 1742a2cb564..fcef85af108 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -216,6 +216,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 @@ -252,7 +253,7 @@ struct gimplify_omp_ctx bool order_concurrent; bool has_depend; bool in_for_exprs; - int defaultmap[4]; + int defaultmap[5]; hash_map *decl_data_clause; }; @@ -483,6 +484,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; @@ -7550,13 +7552,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); @@ -9516,6 +9522,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) @@ -9597,7 +9605,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 " @@ -10752,7 +10760,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; @@ -10793,12 +10802,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 ae3991c770a..8b744d96fb2 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 2354386f7b4..e211efc63f0 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 842e605c439..1b417a01a4e 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/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp index ef9ecf6e433..1faaad4d201 100644 --- a/gcc/testsuite/ChangeLog.omp +++ b/gcc/testsuite/ChangeLog.omp @@ -1,3 +1,24 @@ +2021-06-15 Tobias Burnus + + Backported from master: + 2021-06-15 Tobias Burnus + + PR fortran/92568 + * 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. + 2021-06-15 Tobias Burnus Revert: 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 00000000000..299d971f23c --- /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 00000000000..1658424cf59 --- /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 00000000000..cfe40e8eea8 --- /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 00000000000..89bbe87e570 --- /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 00000000000..d6b32dc90bc --- /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 00000000000..fabf771f9c7 --- /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 00000000000..e1b4fc2364f --- /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 9a590650520..b61b2fc32b7 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 4a5b54915e8..7a9824865c2 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 82bb89338ca..3c02c88c483 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 ead8f030e63..1563c4fbbd0 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 49cbf1e8cc2..259f6cc0136 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 0e60199476b..a9ad2264e39 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 c5d1eb7a8de..a0414a57a51 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/ChangeLog.omp b/libgomp/ChangeLog.omp index 0193517f6b9..d4d93c865f2 100644 --- a/libgomp/ChangeLog.omp +++ b/libgomp/ChangeLog.omp @@ -1,3 +1,11 @@ +2021-06-15 Tobias Burnus + + Backported from master: + 2021-06-15 Tobias Burnus + + PR fortran/92568 + * testsuite/libgomp.fortran/defaultmap-8.f90: New test. + 2021-05-28 Tobias Burnus Backported from master: diff --git a/libgomp/testsuite/libgomp.fortran/defaultmap-8.f90 b/libgomp/testsuite/libgomp.fortran/defaultmap-8.f90 new file mode 100644 index 00000000000..ddf5057618e --- /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" } }