]> git.ipfire.org Git - thirdparty/gcc.git/commit
fortran: Evaluate once BACK argument of MINLOC/MAXLOC with DIM [PR90608]
authorMikael Morin <mikael@gcc.gnu.org>
Wed, 20 Nov 2024 12:59:51 +0000 (13:59 +0100)
committerMikael Morin <mikael@gcc.gnu.org>
Wed, 20 Nov 2024 12:59:51 +0000 (13:59 +0100)
commit237380cdec2757bd42a0ec4d426b181f77d31d18
tree3e1d5065a2c5a03210da69d1c7790256614fed9e
parent086ee8d08669fe597e6c63a4e5489d2df7698ec8
fortran: Evaluate once BACK argument of MINLOC/MAXLOC with DIM [PR90608]

Evaluate the BACK argument of MINLOC/MAXLOC once before the
scalarization loops in the case where the DIM argument is present.

This is a follow-up to r15-1994-ga55d24b3cf7f4d07492bb8e6fcee557175b47ea3
which added knowledge of BACK to the scalarizer, to
r15-2701-ga10436a8404ad2f0cc5aa4d6a0cc850abe5ef49e which removed it to
handle it out of scalarization instead, and to more immediate previous
patches that added inlining support for MINLOC/MAXLOC with DIM.  The
inlining support for MINLOC/MAXLOC with DIM introduced nested loops, which
made the evaluation of BACK (removed from the scalarizer knowledge by the
forementionned commit) wrapped in a loop, so possibly executed more than
once.  This change adds BACK to the scalarization chain if MINLOC/MAXLOC
will use nested loops, so that it is evaluated by the scalarizer only once
before the outermost loop in that case.

PR fortran/90608

gcc/fortran/ChangeLog:

* trans-intrinsic.cc
(walk_inline_intrinsic_minmaxloc): Add a scalar element for BACK as
first item of the chain if BACK is present and there will be nested
loops.
(gfc_conv_intrinsic_minmaxloc): Evaluate BACK using an inherited
scalarization chain if there is a nested loop.

gcc/testsuite/ChangeLog:

* gfortran.dg/maxloc_8.f90: New test.
* gfortran.dg/minloc_9.f90: New test.
gcc/fortran/trans-intrinsic.cc
gcc/testsuite/gfortran.dg/maxloc_8.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/minloc_9.f90 [new file with mode: 0644]