On Fri, Apr 08, 2016 at 07:35:35AM -0700, Cesar Philippidis wrote: > The FEs a little inconsistent, and I didn't want to make this patch that > invasive. Can the FE changes wait to gcc7?
Sure. > 2016-04-08 Cesar Philippidis <ce...@codesourcery.com> > > PR lto/70289 > PR ipa/70348 > PR tree-optimization/70373 > PR middle-end/70533 > PR middle-end/70534 > PR middle-end/70535 > No empty line between PR lines and * gimplify.c (... line. > --- 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); There should be space before t. > + > + if (n && (n->value & GOVD_REDUCTION)) > + { > + int kind = OMP_CLAUSE_MAP_KIND (c); Use gomp_map_kind or enum gomp_map_kind instead of int? > + > + OMP_CLAUSE_MAP_IN_REDUCTION(c) = 1; Space before (. > + 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,34 @@ 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); Missing space. > + if (n->value & (GOVD_PRIVATE | GOVD_FIRSTPRIVATE)) > + { > + error_at (OMP_CLAUSE_LOCATION (c), "invalid private " > + "reduction on %qE", DECL_NAME (decl)); > + } Please avoid {}s around single statement. Better don't break the message into multiple lines in this case, so error_at (OMP_CLAUSE_LOCATION (c), "invalid private reduction on %qE", DECL_NAME (decl)); is more readable. > + else if ((n->value & GOVD_MAP) == 0) > + { > + tree next = OMP_CLAUSE_CHAIN (c); > + tree nc = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE_MAP); Too long line, please wrap. > + 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); > + for (; nc; nc = OMP_CLAUSE_CHAIN (nc)) > + { > + OMP_CLAUSE_MAP_IN_REDUCTION (nc) = 1; > + if (OMP_CLAUSE_CHAIN (nc) == NULL) > + break; > + } Then the nc; condition doesn't make sense. Perhaps then while (1) { OMP_CLAUSE_MAP_IN_REDUCTION (nc) = 1; if (OMP_CLAUSE_CHAIN (nc) == NULL) break; nc = OMP_CLAUSE_CHAIN (nc); } or for (; ; nc = OMP_CLAUSE_CHAIN (nc)) { OMP_CLAUSE_MAP_IN_REDUCTION (nc) = 1; if (OMP_CLAUSE_CHAIN (nc) == NULL) break; } ? > @@ -5624,22 +5625,38 @@ lower_oacc_reductions (location_t loc, tree clauses, > tree level, bool inner, > + else if ((OMP_CLAUSE_CODE (cls) == OMP_CLAUSE_FIRSTPRIVATE > + || OMP_CLAUSE_CODE (cls) == OMP_CLAUSE_PRIVATE) > + && orig == OMP_CLAUSE_DECL (cls)) > + { > + is_private = true; > + goto do_lookup; > + } Isn't this case rejected by the gimplifier? > @@ -15829,7 +15874,10 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, > omp_context *ctx) > if (!maybe_lookup_field (var, ctx)) > continue; > > - if (offloaded) > + /* Don't remap oacc parallel reduction variables, because the > + intermediate result must be local to each gang. */ > + if (offloaded && !(OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP > + && OMP_CLAUSE_MAP_IN_REDUCTION(c))) Missing space before after OMP_CLAUSE_MAP_IN_REDUCTION Ok for trunk with those changes if the lower_oacc_reduction is_private handling is still needed, if it is not needed, please clean that up. Jakub