public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
From: Mikael Morin <mikael@gcc.gnu.org>
To: gcc-patches@gcc.gnu.org, fortran@gcc.gnu.org
Subject: [PATCH 03/10] fortran: Move clobbers after evaluation of all arguments [PR106817]
Date: Fri, 16 Sep 2022 22:24:32 +0200	[thread overview]
Message-ID: <20220916202439.549820-4-mikael@gcc.gnu.org> (raw)
In-Reply-To: <20220916202439.549820-1-mikael@gcc.gnu.org>

For actual arguments whose dummy is INTENT(OUT), we used to generate
clobbers on them at the same time we generated the argument reference
for the function call.  This was wrong if for an argument coming
later, the value expression was depending on the value of the just-
clobbered argument, and we passed an undefined value in that case.

With this change, clobbers are collected separatedly and appended
to the procedure call preliminary code after all the arguments have been
evaluated.

	PR fortran/106817

gcc/fortran/ChangeLog:

	* trans-expr.cc (gfc_conv_procedure_call): Collect all clobbers
	to their own separate block.  Append the block of clobbers to
	the procedure preliminary block after the argument evaluation
	codes for all the arguments.

gcc/testsuite/ChangeLog:

	* gfortran.dg/intent_optimize_9.f90: New test.
---
 gcc/fortran/trans-expr.cc                     |  6 ++-
 .../gfortran.dg/intent_optimize_9.f90         | 43 +++++++++++++++++++
 2 files changed, 47 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/intent_optimize_9.f90

diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 76c587e3d9f..a62a3bb642d 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -6018,7 +6018,6 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
   gfc_charlen cl;
   gfc_expr *e;
   gfc_symbol *fsym;
-  stmtblock_t post;
   enum {MISSING = 0, ELEMENTAL, SCALAR, SCALAR_POINTER, ARRAY};
   gfc_component *comp = NULL;
   int arglen;
@@ -6062,7 +6061,9 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
   else
     info = NULL;
 
+  stmtblock_t post, clobbers;
   gfc_init_block (&post);
+  gfc_init_block (&clobbers);
   gfc_init_interface_mapping (&mapping);
   if (!comp)
     {
@@ -6531,7 +6532,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
 			  var = build_fold_indirect_ref_loc (input_location,
 							     parmse.expr);
 			  tree clobber = build_clobber (TREE_TYPE (var));
-			  gfc_add_modify (&se->pre, var, clobber);
+			  gfc_add_modify (&clobbers, var, clobber);
 			}
 		    }
 		  /* Catch base objects that are not variables.  */
@@ -7400,6 +7401,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
 
       vec_safe_push (arglist, parmse.expr);
     }
+  gfc_add_block_to_block (&se->pre, &clobbers);
   gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
 
   if (comp)
diff --git a/gcc/testsuite/gfortran.dg/intent_optimize_9.f90 b/gcc/testsuite/gfortran.dg/intent_optimize_9.f90
new file mode 100644
index 00000000000..effbaa12a2d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/intent_optimize_9.f90
@@ -0,0 +1,43 @@
+! { dg-do run }
+! { dg-additional-options "-fdump-tree-original" }
+! { dg-final { scan-tree-dump-times "CLOBBER" 2 "original" } }
+!
+! PR fortran/106817
+! Check that for an actual argument whose dummy is INTENT(OUT),
+! the clobber that is emitted in the caller before a procedure call
+! happens after any expression depending on the argument value has been
+! evaluated.
+! 
+
+module m
+  implicit none
+contains
+  subroutine copy1(out, in)
+    integer, intent(in) :: in
+    integer, intent(out) :: out
+    out = in
+  end subroutine copy1
+  subroutine copy2(in, out)
+    integer, intent(in) :: in
+    integer, intent(out) :: out
+    out = in
+  end subroutine copy2
+end module m
+
+program p
+  use m
+  implicit none
+  integer :: a, b
+
+  ! Clobbering of a should happen after a+1 has been evaluated.
+  a = 3
+  call copy1(a, a+1)
+  if (a /= 4) stop 1
+
+  ! Clobbering order does not depend on the order of arguments.
+  ! It should also come last with reversed arguments.
+  b = 12
+  call copy2(b+1, b)
+  if (b /= 13) stop 2
+
+end program p
-- 
2.35.1


  parent reply	other threads:[~2022-09-16 20:24 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-16 20:24 [PATCH 00/10] fortran: clobber fixes [PR41453] Mikael Morin
2022-09-16 20:24 ` [PATCH 01/10] fortran: Move the clobber generation code Mikael Morin
2022-09-16 20:24 ` [PATCH 02/10] fortran: Fix invalid function decl clobber ICE [PR105012] Mikael Morin
2022-09-16 20:24 ` Mikael Morin [this message]
2022-09-16 20:24 ` [PATCH 04/10] fortran: Support clobbering with implicit interfaces [PR105012] Mikael Morin
2022-09-16 20:24 ` [PATCH 05/10] fortran: Support clobbering of reference variables [PR41453] Mikael Morin
2022-09-16 20:24 ` [PATCH 06/10] fortran: Support clobbering of SAVE variables [PR87395] Mikael Morin
2022-09-16 20:24 ` [PATCH 07/10] fortran: Support clobbering of ASSOCIATE variables [PR87397] Mikael Morin
2022-09-16 20:24 ` [PATCH 08/10] fortran: Support clobbering of allocatables and pointers [PR41453] Mikael Morin
2022-09-16 20:24 ` [PATCH 09/10] fortran: Support clobbering of variable subreferences [PR88364] Mikael Morin
2022-09-17 17:03   ` Thomas Koenig
2022-09-17 19:33     ` Mikael Morin
2022-09-17 19:49       ` Bernhard Reutner-Fischer
2022-09-17 19:50       ` Mikael Morin
2022-09-17 21:24         ` Bernhard Reutner-Fischer
2022-09-18  6:12       ` Richard Biener
2022-09-18  9:10         ` Mikael Morin
2022-09-18 10:23           ` Thomas Koenig
2022-09-18 18:32             ` Harald Anlauf
2022-09-18 20:55               ` Mikael Morin
2022-09-19  7:11                 ` Mikael Morin
2022-09-19 19:46                 ` Harald Anlauf
2022-09-19 20:50                   ` Mikael Morin
2022-09-20  6:54                     ` Thomas Koenig
2022-09-20  8:46                       ` Mikael Morin
2022-09-20 21:08                     ` Harald Anlauf
2022-09-20 21:08                       ` Harald Anlauf
2022-09-21  9:57                       ` Thomas Koenig
2022-09-21 18:56                         ` Mikael Morin
2022-09-21 19:12                           ` Harald Anlauf
2022-09-21 19:12                             ` Harald Anlauf
2022-09-18 20:43             ` Mikael Morin
2022-09-18 10:48           ` Richard Biener
2022-09-19  7:31             ` Mikael Morin
2022-09-19  7:58               ` Richard Biener
2022-09-16 20:24 ` [PATCH 10/10] fortran: Support clobbering of derived types [PR41453] Mikael Morin

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=20220916202439.549820-4-mikael@gcc.gnu.org \
    --to=mikael@gcc.gnu.org \
    --cc=fortran@gcc.gnu.org \
    --cc=gcc-patches@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).