diff options
author | Thomas Schwinge <thomas@codesourcery.com> | 2017-05-19 15:32:48 +0200 |
---|---|---|
committer | Thomas Schwinge <tschwinge@gcc.gnu.org> | 2017-05-19 15:32:48 +0200 |
commit | 7fd549d24fda05c859fb17697c51c16886902dad (patch) | |
tree | a1ddeff9f474c8969d68b1b0b726f4ca763411f3 /gcc/gimplify.c | |
parent | 0d0afa9fafec1711b52259b9b8caebf51380216d (diff) | |
download | gcc-7fd549d24fda05c859fb17697c51c16886902dad.tar.gz |
OpenACC 2.5 default (present) clause
gcc/c/
* c-parser.c (c_parser_omp_clause_default): Handle
"OMP_CLAUSE_DEFAULT_PRESENT".
gcc/cp/
* parser.c (cp_parser_omp_clause_default): Handle
"OMP_CLAUSE_DEFAULT_PRESENT".
gcc/fortran/
* gfortran.h (enum gfc_omp_default_sharing): Add
"OMP_DEFAULT_PRESENT".
* dump-parse-tree.c (show_omp_clauses): Handle it.
* openmp.c (gfc_match_omp_clauses): Likewise.
* trans-openmp.c (gfc_trans_omp_clauses): Likewise.
gcc/
* tree-core.h (enum omp_clause_default_kind): Add
"OMP_CLAUSE_DEFAULT_PRESENT".
* tree-pretty-print.c (dump_omp_clause): Handle it.
* gimplify.c (enum gimplify_omp_var_data): Add
"GOVD_MAP_FORCE_PRESENT".
(gimplify_adjust_omp_clauses_1): Map it to
"GOMP_MAP_FORCE_PRESENT".
(oacc_default_clause): Handle "OMP_CLAUSE_DEFAULT_PRESENT".
gcc/testsuite/
* c-c++-common/goacc/default-1.c: Update.
* c-c++-common/goacc/default-2.c: Likewise.
* c-c++-common/goacc/default-4.c: Likewise.
* gfortran.dg/goacc/default-1.f95: Likewise.
* gfortran.dg/goacc/default-4.f: Likewise.
* c-c++-common/goacc/default-5.c: New file.
* gfortran.dg/goacc/default-5.f: Likewise.
libgomp/
* testsuite/libgomp.oacc-c++/template-reduction.C: Update.
* testsuite/libgomp.oacc-c-c++-common/nested-2.c: Update.
* testsuite/libgomp.oacc-fortran/data-4-2.f90: Likewise.
* testsuite/libgomp.oacc-fortran/default-1.f90: Likewise.
* testsuite/libgomp.oacc-fortran/non-scalar-data.f90: Likewise.
From-SVN: r248280
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 0c02ee4371e..810d9f4a3e1 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -99,6 +99,9 @@ enum gimplify_omp_var_data /* Flag for GOVD_MAP, if it is a forced mapping. */ GOVD_MAP_FORCE = 262144, + /* Flag for GOVD_MAP: must be present already. */ + GOVD_MAP_FORCE_PRESENT = 524288, + GOVD_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LINEAR | GOVD_LOCAL) @@ -6956,8 +6959,13 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags) rkind = "kernels"; if (AGGREGATE_TYPE_P (type)) - /* Aggregates default to 'present_or_copy'. */ - flags |= GOVD_MAP; + { + /* Aggregates default to 'present_or_copy', or 'present'. */ + if (ctx->default_kind != OMP_CLAUSE_DEFAULT_PRESENT) + flags |= GOVD_MAP; + else + flags |= GOVD_MAP | GOVD_MAP_FORCE_PRESENT; + } else /* Scalars default to 'copy'. */ flags |= GOVD_MAP | GOVD_MAP_FORCE; @@ -6970,8 +6978,13 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags) if (on_device || declared) flags |= GOVD_MAP; else if (AGGREGATE_TYPE_P (type)) - /* Aggregates default to 'present_or_copy'. */ - flags |= GOVD_MAP; + { + /* Aggregates default to 'present_or_copy', or 'present'. */ + if (ctx->default_kind != OMP_CLAUSE_DEFAULT_PRESENT) + flags |= GOVD_MAP; + else + flags |= GOVD_MAP | GOVD_MAP_FORCE_PRESENT; + } else /* Scalars default to 'firstprivate'. */ flags |= GOVD_FIRSTPRIVATE; @@ -6991,6 +7004,8 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags) DECL_NAME (lang_hooks.decls.omp_report_decl (decl)), rkind); inform (ctx->location, "enclosing OpenACC %qs construct", rkind); } + else if (ctx->default_kind == OMP_CLAUSE_DEFAULT_PRESENT) + ; /* Handled above. */ else gcc_checking_assert (ctx->default_kind == OMP_CLAUSE_DEFAULT_SHARED); @@ -8708,11 +8723,30 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data) } else if (code == OMP_CLAUSE_MAP) { - int kind = (flags & GOVD_MAP_TO_ONLY - ? GOMP_MAP_TO - : GOMP_MAP_TOFROM); - if (flags & GOVD_MAP_FORCE) - kind |= GOMP_MAP_FLAG_FORCE; + int kind; + /* Not all combinations of these GOVD_MAP flags are actually valid. */ + switch (flags & (GOVD_MAP_TO_ONLY + | GOVD_MAP_FORCE + | GOVD_MAP_FORCE_PRESENT)) + { + case 0: + kind = GOMP_MAP_TOFROM; + break; + case GOVD_MAP_FORCE: + kind = GOMP_MAP_TOFROM | GOMP_MAP_FLAG_FORCE; + break; + case GOVD_MAP_TO_ONLY: + kind = GOMP_MAP_TO; + break; + case GOVD_MAP_TO_ONLY | GOVD_MAP_FORCE: + kind = GOMP_MAP_TO | GOMP_MAP_FLAG_FORCE; + break; + case GOVD_MAP_FORCE_PRESENT: + kind = GOMP_MAP_FORCE_PRESENT; + break; + default: + gcc_unreachable (); + } OMP_CLAUSE_SET_MAP_KIND (clause, kind); if (DECL_SIZE (decl) && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST) |