diff mbox

[OpenACC] Make reduction arguments addressable

Message ID 4d950359-d416-ca2e-f700-9f7cd5e41b13@codesourcery.com
State New
Headers show

Commit Message

Chung-Lin Tang June 3, 2016, 7:13 a.m. UTC
On 2016/6/2 10:00 PM, Jakub Jelinek wrote:
> Wouldn't it be better to pass either a bool openacc_async flag, or
> whole clauses, down to gfc_trans_omp_reduction_list and handle it there
> instead of walking the list after the fact?

You mean this style? (patch attached)
Tested again with no regressions.

Thanks,
Chung-Lin

        * trans-openmp.c (gfc_trans_omp_reduction_list): Add mark_addressable
        bool parameter, set reduction clause DECLs as addressable when true.
        (gfc_trans_omp_clauses): Pass clauses->async to
        gfc_trans_omp_reduction_list, add comment describing OpenACC situation.

Comments

Jakub Jelinek June 3, 2016, 7:15 a.m. UTC | #1
On Fri, Jun 03, 2016 at 03:13:40PM +0800, Chung-Lin Tang wrote:
> On 2016/6/2 10:00 PM, Jakub Jelinek wrote:
> > Wouldn't it be better to pass either a bool openacc_async flag, or
> > whole clauses, down to gfc_trans_omp_reduction_list and handle it there
> > instead of walking the list after the fact?
> 
> You mean this style? (patch attached)
> Tested again with no regressions.
> 
> Thanks,
> Chung-Lin
> 
>         * trans-openmp.c (gfc_trans_omp_reduction_list): Add mark_addressable
>         bool parameter, set reduction clause DECLs as addressable when true.
>         (gfc_trans_omp_clauses): Pass clauses->async to
>         gfc_trans_omp_reduction_list, add comment describing OpenACC situation.

Yep, thanks (and the C/C++ patch is ok too).

> Index: trans-openmp.c
> ===================================================================
> --- trans-openmp.c	(revision 236845)
> +++ trans-openmp.c	(working copy)
> @@ -1646,7 +1646,7 @@ gfc_trans_omp_array_reduction_or_udr (tree c, gfc_
>  
>  static tree
>  gfc_trans_omp_reduction_list (gfc_omp_namelist *namelist, tree list,
> -			      locus where)
> +			      locus where, bool mark_addressable)
>  {
>    for (; namelist != NULL; namelist = namelist->next)
>      if (namelist->sym->attr.referenced)
> @@ -1657,6 +1657,8 @@ gfc_trans_omp_reduction_list (gfc_omp_namelist *na
>  	    tree node = build_omp_clause (where.lb->location,
>  					  OMP_CLAUSE_REDUCTION);
>  	    OMP_CLAUSE_DECL (node) = t;
> +	    if (mark_addressable)
> +	      TREE_ADDRESSABLE (t) = 1;
>  	    switch (namelist->u.reduction_op)
>  	      {
>  	      case OMP_REDUCTION_PLUS:
> @@ -1747,7 +1749,10 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp
>        switch (list)
>  	{
>  	case OMP_LIST_REDUCTION:
> -	  omp_clauses = gfc_trans_omp_reduction_list (n, omp_clauses, where);
> +	  /* An OpenACC async clause indicates the need to set reduction
> +	     arguments addressable, to allow asynchronous copy-out.  */
> +	  omp_clauses = gfc_trans_omp_reduction_list (n, omp_clauses, where,
> +						      clauses->async);
>  	  break;
>  	case OMP_LIST_PRIVATE:
>  	  clause_code = OMP_CLAUSE_PRIVATE;


	Jakub
diff mbox

Patch

Index: trans-openmp.c
===================================================================
--- trans-openmp.c	(revision 236845)
+++ trans-openmp.c	(working copy)
@@ -1646,7 +1646,7 @@  gfc_trans_omp_array_reduction_or_udr (tree c, gfc_
 
 static tree
 gfc_trans_omp_reduction_list (gfc_omp_namelist *namelist, tree list,
-			      locus where)
+			      locus where, bool mark_addressable)
 {
   for (; namelist != NULL; namelist = namelist->next)
     if (namelist->sym->attr.referenced)
@@ -1657,6 +1657,8 @@  gfc_trans_omp_reduction_list (gfc_omp_namelist *na
 	    tree node = build_omp_clause (where.lb->location,
 					  OMP_CLAUSE_REDUCTION);
 	    OMP_CLAUSE_DECL (node) = t;
+	    if (mark_addressable)
+	      TREE_ADDRESSABLE (t) = 1;
 	    switch (namelist->u.reduction_op)
 	      {
 	      case OMP_REDUCTION_PLUS:
@@ -1747,7 +1749,10 @@  gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp
       switch (list)
 	{
 	case OMP_LIST_REDUCTION:
-	  omp_clauses = gfc_trans_omp_reduction_list (n, omp_clauses, where);
+	  /* An OpenACC async clause indicates the need to set reduction
+	     arguments addressable, to allow asynchronous copy-out.  */
+	  omp_clauses = gfc_trans_omp_reduction_list (n, omp_clauses, where,
+						      clauses->async);
 	  break;
 	case OMP_LIST_PRIVATE:
 	  clause_code = OMP_CLAUSE_PRIVATE;