diff mbox

[OpenACC] Fix reduction lowering segfault in omp-low

Message ID 7d98ae79-3cb7-03f2-bbd5-34a78d30dfd4@codesourcery.com
State New
Headers show

Commit Message

Chung-Lin Tang Aug. 15, 2016, 9:52 a.m. UTC
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.

Comments

Jakub Jelinek Aug. 15, 2016, 9:57 a.m. UTC | #1
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
diff mbox

Patch

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:;
 	  }