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 10/10] fortran: Support clobbering of derived types [PR41453]
Date: Fri, 16 Sep 2022 22:24:39 +0200	[thread overview]
Message-ID: <20220916202439.549820-11-mikael@gcc.gnu.org> (raw)
In-Reply-To: <20220916202439.549820-1-mikael@gcc.gnu.org>

This is probably the most risky patch in the series.

A previous version of this patch allowing all exactly matching derived
types showed two regressions.  One of them uncovered PR106817 for which
I added a fix in this series, and for the other I have excluded
types with allocatable components from clobbering.

I have additionnally excluded finalizable types for similar reasons, and
parameterized derived type because they may not be constant-sized.

I hope we are safe for all the rest.

-- >8 --

This adds support for clobbering of non-polymorphic derived type
variables, when they are passed as actual argument whose associated
dummy has the INTENT(OUT) attribute.

We avoid to play with non-constant type sizes or class descriptors by
requiring that the types are derived (not class) and strictly matching,
and by excluding parameterized derived types.

Types that are used in the callee are also excluded: they are types with
allocatable components (the components will be deallocated), and
finalizable types or types with finalizable components (they will be
passed to finalization routines).

	PR fortran/41453

gcc/fortran/ChangeLog:

	* trans-expr.cc (gfc_conv_procedure_call): Allow strictly
	matching derived types.

gcc/testsuite/ChangeLog:

	* gfortran.dg/intent_optimize_8.f90: New test.
---
 gcc/fortran/trans-expr.cc                     | 18 ++++-
 .../gfortran.dg/intent_optimize_8.f90         | 67 +++++++++++++++++++
 2 files changed, 84 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gfortran.dg/intent_optimize_8.f90

diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index f1026d7f309..f8fcd2d97d9 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -6523,8 +6523,24 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
 			  && e->expr_type == EXPR_VARIABLE
 			  && e->rank == 0
 			  && e->ts.type != BT_CHARACTER
-			  && e->ts.type != BT_DERIVED
 			  && e->ts.type != BT_CLASS
+			  && (e->ts.type != BT_DERIVED
+			      || (dsym->ts.type == BT_DERIVED
+				  && e->ts.u.derived == dsym->ts.u.derived
+				  /* Types with allocatable components are
+				     excluded from clobbering because we need
+				     the unclobbered pointers to free the
+				     allocatable components in the callee.
+				     Same goes for finalizable types or types
+				     with finalizable components, we need to
+				     pass the unclobbered values to the
+				     finalization routines.
+				     For parameterized types, it's less clear
+				     but they may not have a constant size
+				     so better exclude them in any case.  */
+				  && !e->ts.u.derived->attr.alloc_comp
+				  && !e->ts.u.derived->attr.pdt_type
+				  && !gfc_is_finalizable (e->ts.u.derived, NULL)))
 			  && !sym->attr.elemental)
 			{
 			  tree var;
diff --git a/gcc/testsuite/gfortran.dg/intent_optimize_8.f90 b/gcc/testsuite/gfortran.dg/intent_optimize_8.f90
new file mode 100644
index 00000000000..584592842e1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/intent_optimize_8.f90
@@ -0,0 +1,67 @@
+! { dg-do run }
+! { dg-additional-options "-fno-inline -fno-ipa-modref -fdump-tree-optimized -fdump-tree-original" }
+!
+! PR fortran/41453
+! Check that the INTENT(OUT) attribute causes in the case of non-polymorphic derived type arguments:
+!  - one clobber to be emitted in the caller before calls to FOO in the *.original dump,
+!  - no clobber to be emitted in the caller before calls to BAR in the *.original dump,
+!  - the initialization constants to be optimized away in the *.optimized dump.
+
+module x
+  implicit none
+  type :: t
+    integer :: c
+  end type t
+  type, extends(t) :: u
+    integer :: d
+  end type u
+contains
+  subroutine foo(a)
+    type(t), intent(out) :: a
+    a = t(42)
+  end subroutine foo
+  subroutine bar(b)
+    class(t), intent(out) :: b
+    b%c = 24
+  end subroutine bar
+end module x
+
+program main
+  use x
+  implicit none
+  type(t) :: tc
+  type(u) :: uc, ud
+  class(t), allocatable :: te, tf
+
+  tc = t(123456789)
+  call foo(tc)
+  if (tc%c /= 42) stop 1
+
+  uc = u(987654321, 0)
+  call foo(uc%t)
+  if (uc%c /= 42) stop 2
+  if (uc%d /= 0) stop 3
+
+  ud = u(11223344, 0)
+  call bar(ud)
+  if (ud%c /= 24) stop 4
+
+  te = t(55667788)
+  call foo(te)
+  if (te%c /= 42) stop 5
+
+  tf = t(99887766)
+  call bar(tf)
+  if (tf%c /= 24) stop 6
+
+end program main
+
+! We don't support class descriptors, so there are clobbers for tc and uc only; no clobber for ud, te, tf.
+! { dg-final { scan-tree-dump-times "CLOBBER" 2 "original" } }
+! { dg-final { scan-tree-dump "tc = {CLOBBER};" "original" } }
+! { dg-final { scan-tree-dump "uc\\.t = {CLOBBER};" "original" } }
+
+! There are clobbers for tc and uc, so we should manage to optimize away the associated initialization constants (but not other
+! initialization constants).
+! { dg-final { scan-tree-dump-not "123456789" "optimized" { target __OPTIMIZE__ } } }
+! { dg-final { scan-tree-dump-not "987654321" "optimized" { target __OPTIMIZE__ } } }
-- 
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 ` [PATCH 03/10] fortran: Move clobbers after evaluation of all arguments [PR106817] Mikael Morin
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 ` 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=20220916202439.549820-11-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).