aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
authorCesar Philippidis <cesar@codesourcery.com>2016-04-08 14:09:47 -0700
committerCesar Philippidis <cesar@gcc.gnu.org>2016-04-08 14:09:47 -0700
commitc42cfb5ca3b02756705485e013fa9107aaf28acd (patch)
tree354e1cd54c889228c92a0a83560a5bf53a7aab00 /gcc/gimplify.c
parent51a4b0f18711b23f2f696a4f546ccce5b1653cf5 (diff)
downloadgcc-c42cfb5ca3b02756705485e013fa9107aaf28acd.zip
gcc-c42cfb5ca3b02756705485e013fa9107aaf28acd.tar.gz
gcc-c42cfb5ca3b02756705485e013fa9107aaf28acd.tar.bz2
re PR lto/70289 ([openacc] ICE in input_varpool_node)
gcc/ PR lto/70289 PR ipa/70348 PR tree-optimization/70373 PR middle-end/70533 PR middle-end/70534 PR middle-end/70535 * gimplify.c (gimplify_adjust_omp_clauses): Add or adjust data clauses for acc parallel reductions as necessary. Error on those that are private. * omp-low.c (scan_sharing_clauses): Don't install variables which are used in acc parallel reductions. (lower_rec_input_clauses): Remove dead code. (lower_oacc_reductions): Add support for reference reductions. (lower_reduction_clauses): Remove dead code. (lower_omp_target): Don't remap variables appearing in acc parallel reductions. * tree.h (OMP_CLAUSE_MAP_IN_REDUCTION): New macro. gcc/testsuite/ * c-c++-common/goacc/reduction-5.c: New test. * c-c++-common/goacc/reduction-promotions.c: New test. * gfortran.dg/goacc/reduction-3.f95: New test. * gfortran.dg/goacc/reduction-promotions.f90: New test. libgomp/ * testsuite/libgomp.oacc-c-c++-common/loop-reduction-gang-np-1.c: New test. * testsuite/libgomp.oacc-c-c++-common/loop-reduction-gw-np-1.c: New test. * testsuite/libgomp.oacc-c-c++-common/loop-reduction-gwv-np-1.c: New test. * testsuite/libgomp.oacc-c-c++-common/loop-reduction-gwv-np-2.c: New test. * testsuite/libgomp.oacc-c-c++-common/loop-reduction-gwv-np-3.c: New test. * testsuite/libgomp.oacc-c-c++-common/loop-reduction-gwv-np-4.c: New test. * testsuite/libgomp.oacc-c-c++-common/loop-reduction-vector-p-1.c: New test. * testsuite/libgomp.oacc-c-c++-common/loop-reduction-vector-p-2.c: New test. * testsuite/libgomp.oacc-c-c++-common/loop-reduction-worker-p-1.c: New test. * testsuite/libgomp.oacc-c-c++-common/loop-reduction-wv-p-1.c: New test. * testsuite/libgomp.oacc-c-c++-common/loop-reduction-wv-p-2.c: New test. * testsuite/libgomp.oacc-c-c++-common/loop-reduction-wv-p-3.c: New test. * testsuite/libgomp.oacc-c-c++-common/par-loop-comb-reduction-1.c: New test. * testsuite/libgomp.oacc-c-c++-common/par-loop-comb-reduction-2.c: New test. * testsuite/libgomp.oacc-c-c++-common/par-loop-comb-reduction-3.c: New test. * testsuite/libgomp.oacc-c-c++-common/par-loop-comb-reduction-4.c: New test. * testsuite/libgomp.oacc-c-c++-common/par-reduction-1.c: Add test coverage. * testsuite/libgomp.oacc-c-c++-common/par-reduction-2.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/parallel-dims.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/parallel-reduction.c: New test. * testsuite/libgomp.oacc-c-c++-common/pr70289.c: New test. * testsuite/libgomp.oacc-c-c++-common/pr70373.c: New test. * testsuite/libgomp.oacc-c-c++-common/reduction-1.c: Add test coverage. * testsuite/libgomp.oacc-c-c++-common/reduction-2.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/reduction-3.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/reduction-4.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/reduction-5.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/reduction-6.c: New test. * testsuite/libgomp.oacc-c-c++-common/reduction.h: New test. * testsuite/libgomp.oacc-fortran/parallel-reduction.f90: New test. * testsuite/libgomp.oacc-fortran/pr70289.f90: New test. * testsuite/libgomp.oacc-fortran/reduction-1.f90: Add test coverage. * testsuite/libgomp.oacc-fortran/reduction-2.f90: Likewise. * testsuite/libgomp.oacc-fortran/reduction-3.f90: Likewise. * testsuite/libgomp.oacc-fortran/reduction-4.f90: Likewise. * testsuite/libgomp.oacc-fortran/reduction-5.f90: Likewise. * testsuite/libgomp.oacc-fortran/reduction-6.f90: Likewise. * testsuite/libgomp.oacc-fortran/reduction-7.f90: New test. From-SVN: r234840
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r--gcc/gimplify.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 9c0119e..e49bdaa 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -7987,6 +7987,34 @@ gimplify_adjust_omp_clauses (gimple_seq *pre_p, gimple_seq body, tree *list_p,
break;
}
decl = OMP_CLAUSE_DECL (c);
+ /* Data clasues associated with acc parallel reductions must be
+ compatible with present_or_copy. Warn and adjust the clause
+ if that is not the case. */
+ if (ctx->region_type == ORT_ACC_PARALLEL)
+ {
+ tree t = DECL_P (decl) ? decl : TREE_OPERAND (decl, 0);
+ n = NULL;
+
+ if (DECL_P (t))
+ n = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
+
+ if (n && (n->value & GOVD_REDUCTION))
+ {
+ enum gomp_map_kind kind = OMP_CLAUSE_MAP_KIND (c);
+
+ OMP_CLAUSE_MAP_IN_REDUCTION (c) = 1;
+ if ((kind & GOMP_MAP_TOFROM) != GOMP_MAP_TOFROM
+ && kind != GOMP_MAP_FORCE_PRESENT
+ && kind != GOMP_MAP_POINTER)
+ {
+ warning_at (OMP_CLAUSE_LOCATION (c), 0,
+ "incompatible data clause with reduction "
+ "on %qE; promoting to present_or_copy",
+ DECL_NAME (t));
+ OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_TOFROM);
+ }
+ }
+ }
if (!DECL_P (decl))
{
if ((ctx->region_type & ORT_TARGET) != 0
@@ -8118,6 +8146,33 @@ gimplify_adjust_omp_clauses (gimple_seq *pre_p, gimple_seq body, tree *list_p,
case OMP_CLAUSE_REDUCTION:
decl = OMP_CLAUSE_DECL (c);
+ /* OpenACC reductions need a present_or_copy data clause.
+ Add one if necessary. Error is the reduction is private. */
+ if (ctx->region_type == ORT_ACC_PARALLEL)
+ {
+ n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
+ if (n->value & (GOVD_PRIVATE | GOVD_FIRSTPRIVATE))
+ error_at (OMP_CLAUSE_LOCATION (c), "invalid private "
+ "reduction on %qE", DECL_NAME (decl));
+ else if ((n->value & GOVD_MAP) == 0)
+ {
+ tree next = OMP_CLAUSE_CHAIN (c);
+ tree nc = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE_MAP);
+ OMP_CLAUSE_SET_MAP_KIND (nc, GOMP_MAP_TOFROM);
+ OMP_CLAUSE_DECL (nc) = decl;
+ OMP_CLAUSE_CHAIN (c) = nc;
+ lang_hooks.decls.omp_finish_clause (nc, pre_p);
+ while (1)
+ {
+ OMP_CLAUSE_MAP_IN_REDUCTION (nc) = 1;
+ if (OMP_CLAUSE_CHAIN (nc) == NULL)
+ break;
+ nc = OMP_CLAUSE_CHAIN (nc);
+ }
+ OMP_CLAUSE_CHAIN (nc) = next;
+ n->value |= GOVD_MAP;
+ }
+ }
if (DECL_P (decl)
&& omp_shared_to_firstprivate_optimizable_decl_p (decl))
omp_mark_stores (gimplify_omp_ctxp->outer_context, decl);