diff options
author | Tom de Vries <tom@codesourcery.com> | 2015-12-02 15:48:45 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2015-12-02 15:48:45 +0000 |
commit | db0f1c7a906bd8798a4016c1622f5999897e7469 (patch) | |
tree | 2109ec421b66624aa21cc5439979c233fc5ae881 /gcc/gimplify.c | |
parent | 86938de6f646b403fe6a2eaea3aac9f4e91224fd (diff) | |
download | gcc-db0f1c7a906bd8798a4016c1622f5999897e7469.zip gcc-db0f1c7a906bd8798a4016c1622f5999897e7469.tar.gz gcc-db0f1c7a906bd8798a4016c1622f5999897e7469.tar.bz2 |
Fix oacc kernels default mapping for scalars
2015-12-02 Tom de Vries <tom@codesourcery.com>
* gimplify.c (enum gimplify_omp_var_data): Add enum value
GOVD_MAP_FORCE.
(oacc_default_clause): Fix default for scalars in oacc kernels.
(gimplify_adjust_omp_clauses_1): Handle GOVD_MAP_FORCE.
* c-c++-common/goacc/kernels-default-2.c: New test.
* c-c++-common/goacc/kernels-default.c: New test.
From-SVN: r231183
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 4229e2d..7146a01 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -90,6 +90,9 @@ enum gimplify_omp_var_data /* Flag for shared vars that are or might be stored to in the region. */ GOVD_WRITTEN = 131072, + /* Flag for GOVD_MAP, if it is a forced mapping. */ + GOVD_MAP_FORCE = 262144, + GOVD_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LINEAR | GOVD_LOCAL) @@ -5980,8 +5983,12 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags) gcc_unreachable (); case ORT_ACC_KERNELS: - /* Everything under kernels are default 'present_or_copy'. */ + /* Scalars are default 'copy' under kernels, non-scalars are default + 'present_or_copy'. */ flags |= GOVD_MAP; + if (!AGGREGATE_TYPE_P (TREE_TYPE (decl))) + flags |= GOVD_MAP_FORCE; + rkind = "kernels"; break; @@ -7640,10 +7647,12 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data) } else if (code == OMP_CLAUSE_MAP) { - OMP_CLAUSE_SET_MAP_KIND (clause, - flags & GOVD_MAP_TO_ONLY - ? GOMP_MAP_TO - : GOMP_MAP_TOFROM); + int kind = (flags & GOVD_MAP_TO_ONLY + ? GOMP_MAP_TO + : GOMP_MAP_TOFROM); + if (flags & GOVD_MAP_FORCE) + kind |= GOMP_MAP_FLAG_FORCE; + OMP_CLAUSE_SET_MAP_KIND (clause, kind); if (DECL_SIZE (decl) && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST) { |