public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Mikael Morin <morin-mikael@orange.fr>
To: Thomas Koenig <tkoenig@netcologne.de>,
	"fortran@gcc.gnu.org" <fortran@gcc.gnu.org>,
	gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: [patch, RFC. Fortran] Some clobbering for INTENT(OUT) arrays
Date: Mon, 3 Oct 2022 11:05:08 +0200	[thread overview]
Message-ID: <e45d7acd-c7a5-8d2a-e1e4-f5d73f80b99c@orange.fr> (raw)
In-Reply-To: <e5bb46ca-bb5f-f177-5082-b16f38004ecb@netcologne.de>

Hello,

Le 02/10/2022 à 22:07, Thomas Koenig via Fortran a écrit :
> 
> I am a bit stuck of how to generate a reference to the first element
> of the array (really, just dereferencing the data pointer)
> in the most elegant way.  I am currently leaning towards
> building a gfc_expr, which should work, but would be less
> than elegant.
> 
> So, anything more elegant at hand?
> 
I don't understand why you are trying to do this.
According to Richi [1], array references are not allowed, so you can 
(and actually have to) pick the full variable decl directly.

[1] https://gcc.gnu.org/pipermail/fortran/2022-September/058181.html

A few comments about the rest...

> What happens if the
> 
> +                     if (!sym->attr.allocatable && !sym->attr.pointer
> +                         && !POINTER_TYPE_P (TREE_TYPE (sym->backend_decl)))
> 
> 
> part is taken out is that the whole descriptor can be clobbered in
> such a case, which is of course not what is wanted. 

The canonical way is to look for GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (...)).
Your way should work in most cases, but there are twisted cases for 
which I'm not sure (assumed shape arrays with the value attribute).

> diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
> index 4f3ae82d39c..bbb00f90a77 100644
> --- a/gcc/fortran/trans-expr.cc
> +++ b/gcc/fortran/trans-expr.cc
> @@ -6896,10 +6897,23 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
>  					     fsym->attr.pointer);
>  		}
>  	      else
> -		/* This is where we introduce a temporary to store the
> -		   result of a non-lvalue array expression.  */
> -		gfc_conv_array_parameter (&parmse, e, nodesc_arg, fsym,
> -					  sym->name, NULL);
> +		{
> +		  /* This is where we introduce a temporary to store the
> +		     result of a non-lvalue array expression.  */
> +		  gfc_conv_array_parameter (&parmse, e, nodesc_arg, fsym,
> +					    sym->name, NULL);
> +		  if (fsym && fsym->attr.intent == INTENT_OUT
> +		      && gfc_full_array_ref_p (e->ref, NULL))

The scalar case has a few more conditions this seems to miss.
e->expr_type == EXPR_VARIABLE at least, but also e->ts.type != 
CHARACTER, alloc_comp and finalizable derived types, etc.

> +			clobber_array
> +			  = gfc_build_array_ref (e->symtree->n.sym->backend_decl,
> +						 build_int_cst (size_type_node, 0),
> +						 NULL_TREE, true, NULL_TREE);

This is picking the decl from the frontend data.
This proved to be problematic in the scalar case, so maybe it would be 
better to pick the variable to be clobbered from parmse.expr.
Admittedly I'm not too sure about this, arrays are much more difficult 
to work with (and to think about).

> @@ -6952,6 +6966,13 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
>  				       tmp, build_empty_stmt (input_location));
>  		  gfc_add_expr_to_block (&se->pre, tmp);
>  		}
> +
> +	      if (clobber_array != NULL_TREE)
> +		{
> +		  tree clobber;
> +		  clobber = build_clobber (TREE_TYPE(clobber_array));
> +		  gfc_add_modify (&clobbers, clobber_array, clobber);
> +		}
>  	    }
>  	}
>        /* Special case for an assumed-rank dummy argument. */

This can be moved to the preceding hunk.


      reply	other threads:[~2022-10-03  9:05 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-02 20:07 Thomas Koenig
2022-10-03  9:05 ` Mikael Morin [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e45d7acd-c7a5-8d2a-e1e4-f5d73f80b99c@orange.fr \
    --to=morin-mikael@orange.fr \
    --cc=fortran@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=tkoenig@netcologne.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).