public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Mikael Morin <mikael@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r13-2836] fortran: Support clobbering with implicit interfaces [PR105012]
Date: Sun, 25 Sep 2022 12:48:10 +0000 (GMT)	[thread overview]
Message-ID: <20220925124810.B61043858024@sourceware.org> (raw)

https://gcc.gnu.org/g:20aa1eb6cb84e6a0487b47b28b00109c5f46a7e2

commit r13-2836-g20aa1eb6cb84e6a0487b47b28b00109c5f46a7e2
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Wed Aug 31 11:50:35 2022 +0200

    fortran: Support clobbering with implicit interfaces [PR105012]
    
    Before procedure calls, we clobber actual arguments whose associated
    dummy is INTENT(OUT).  This only applies to procedures with explicit
    interfaces, as the knowledge of the interface is necessary to know
    whether an argument has the INTENT(OUT) attribute.
    
    This change also enables clobber generation for procedure calls without
    explicit interface, when the procedure has been defined in the same
    file because we can use the dummy arguments' characteristics from the
    procedure definition in that case.
    
    The knowledge of the dummy characteristics is directly available through
    gfc_actual_arglist’s associated_dummy pointers which have been populated
    as a side effect of calling gfc_check_externals.
    
            PR fortran/105012
    
    gcc/fortran/ChangeLog:
    
            * trans-expr.cc (gfc_conv_procedure_call): Use dummy
            information from associated_dummy if there is no information
            from the procedure interface.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/intent_optimize_5.f90: New test.
    
    Co-Authored-By: Mikael Morin <mikael@gcc.gnu.org>

Diff:
---
 gcc/fortran/trans-expr.cc                       | 19 +++++++++++++++----
 gcc/testsuite/gfortran.dg/intent_optimize_5.f90 | 24 ++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index f93923b5bdb..214726220f7 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -6505,10 +6505,21 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
 		    {
 		      gfc_conv_expr_reference (&parmse, e);
 
-		      if (fsym
-			  && fsym->attr.intent == INTENT_OUT
-			  && !fsym->attr.allocatable
-			  && !fsym->attr.pointer
+		      gfc_symbol *dsym = fsym;
+		      gfc_dummy_arg *dummy;
+
+		      /* Use associated dummy as fallback for formal
+			 argument if there is no explicit interface.  */
+		      if (dsym == NULL
+			  && (dummy = arg->associated_dummy)
+			  && dummy->intrinsicness == GFC_NON_INTRINSIC_DUMMY_ARG
+			  && dummy->u.non_intrinsic->sym)
+			dsym = dummy->u.non_intrinsic->sym;
+
+		      if (dsym
+			  && dsym->attr.intent == INTENT_OUT
+			  && !dsym->attr.allocatable
+			  && !dsym->attr.pointer
 			  && e->expr_type == EXPR_VARIABLE
 			  && e->ref == NULL
 			  && e->symtree
diff --git a/gcc/testsuite/gfortran.dg/intent_optimize_5.f90 b/gcc/testsuite/gfortran.dg/intent_optimize_5.f90
new file mode 100644
index 00000000000..2f184bf84a8
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/intent_optimize_5.f90
@@ -0,0 +1,24 @@
+! { dg-do run }
+! { dg-additional-options "-fno-inline -fno-ipa-modref -fdump-tree-optimized -fdump-tree-original" }
+!
+! PR fortran/105012
+! Check that the INTENT(OUT) attribute causes one clobber to be emitted in
+! the caller before the call to Y in the *.original dump, and the
+! initialization constant to be optimized away in the *.optimized dump,
+! despite the non-explicit interface if the subroutine with the INTENT(OUT)
+! is declared in the same file.
+
+SUBROUTINE Y (Z)
+      integer, intent(out) :: Z
+      Z = 42
+END SUBROUTINE Y
+PROGRAM TEST
+    integer :: X
+    X = 123456789
+    CALL Y (X)
+    if (X.ne.42) STOP 1
+END PROGRAM
+
+! { dg-final { scan-tree-dump-times "CLOBBER" 1 "original" } }
+! { dg-final { scan-tree-dump "x = {CLOBBER};" "original" } }
+! { dg-final { scan-tree-dump-not "123456789" "optimized" { target __OPTIMIZE__ } } }

                 reply	other threads:[~2022-09-25 12:48 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=20220925124810.B61043858024@sourceware.org \
    --to=mikael@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /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).