Message ID | 7d98ae79-3cb7-03f2-bbd5-34a78d30dfd4@codesourcery.com |
---|---|
State | New |
Headers | show |
On Mon, Aug 15, 2016 at 05:52:29PM +0800, Chung-Lin Tang wrote: > Hi Jakub, > This patch fixes an OpenACC reduction lowering segfault which > triggers when nested acc loop directives are present. > Cesar has reviewed this patch internally (since he mostly wrote > the code originally) > > Patch has been tested and committed to gomp-4_0-branch, > is this also okay for trunk? > > Thanks, > Chung-Lin > > 2016-08-15 Chung-Lin Tang <cltang@codesourcery.com> > > * omp-low.c (lower_oacc_reductions): Adjust variable lookup to use > maybe_lookup_decl, to handle nested acc loop directives. Is this covered by an existing testcase in the testsuite? If not, can you please add a testcase for it. Otherwise LGTM (not extra happy about accepting any kinds of contexts, but I hope the nesting diagnostics error out on OpenMP contexts mixed with OpenACC ones and hope that there can't be some other OpenACC context around that you wouldn't want to handle). > Index: omp-low.c > =================================================================== > --- omp-low.c (revision 239324) > +++ omp-low.c (working copy) > @@ -5687,10 +5687,19 @@ lower_oacc_reductions (location_t loc, tree clause > outgoing = var; > incoming = omp_reduction_init_op (loc, rcode, type); > } > - else if (ctx->outer) > - incoming = outgoing = lookup_decl (orig, ctx->outer); > else > - incoming = outgoing = orig; > + { > + /* Try to look at enclosing contexts for reduction var, > + use original if no mapping found. */ > + tree t = NULL_TREE; > + omp_context *c = ctx->outer; > + while (c && !t) > + { > + t = maybe_lookup_decl (orig, c); > + c = c->outer; > + } > + incoming = outgoing = (t ? t : orig); > + } > > has_outer_reduction:; > } Jakub
Index: omp-low.c =================================================================== --- omp-low.c (revision 239324) +++ omp-low.c (working copy) @@ -5687,10 +5687,19 @@ lower_oacc_reductions (location_t loc, tree clause outgoing = var; incoming = omp_reduction_init_op (loc, rcode, type); } - else if (ctx->outer) - incoming = outgoing = lookup_decl (orig, ctx->outer); else - incoming = outgoing = orig; + { + /* Try to look at enclosing contexts for reduction var, + use original if no mapping found. */ + tree t = NULL_TREE; + omp_context *c = ctx->outer; + while (c && !t) + { + t = maybe_lookup_decl (orig, c); + c = c->outer; + } + incoming = outgoing = (t ? t : orig); + } has_outer_reduction:; }