https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90608

--- Comment #28 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Mikael Morin <mik...@gcc.gnu.org>:

https://gcc.gnu.org/g:dd5250384dc91b4db117c599095f47955b6dc124

commit r15-3761-gdd5250384dc91b4db117c599095f47955b6dc124
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sat Sep 21 18:32:44 2024 +0200

    fortran: Inline integral MINLOC/MAXLOC with no DIM and no MASK [PR90608]

    Enable generation of inline code for the MINLOC and MAXLOC intrinsic,
    if the ARRAY argument is of integral type and of any rank (only the rank 1
    case was previously inlined), and neither DIM nor MASK arguments are
    present.

    This needs a few adjustments in gfc_conv_intrinsic_minmaxloc,
    mainly to replace the single variables POS and OFFSET, with collections
    of variables, one variable per dimension each.

    The restriction to integral ARRAY and absent MASK limits the scope of
    the change to the cases where we generate single loop inline code.  The
    code generation for the second loop is only accessible with ARRAY of rank
    1, so it can continue using a single variable.  A later change will extend
    inlining to the double loop cases.

    There is some bounds checking code that was previously handled by the
    library, and that needed some changes in the scalarizer to avoid
regressing.
    The bounds check code generation was already supported by the scalarizer,
    but it was only applying to array reference sections, checking both
    for array bound violation and for shape conformability between all the
    involved arrays.  With this change, for MINLOC or MAXLOC, enable the
    conformability check between all the scalarized arrays, and disable the
    array bound violation check.

            PR fortran/90608

    gcc/fortran/ChangeLog:

            * trans-array.cc (gfc_conv_ss_startstride): Set the MINLOC/MAXLOC
            result upper bound using the rank of the ARRAY argument.  Ajdust
            the error message for intrinsic result arrays.  Only check array
            bounds for array references.  Move bound check decision code...
            (bounds_check_needed): ... here as a new predicate.  Allow bound
            check for MINLOC/MAXLOC intrinsic results.
            * trans-intrinsic.cc (gfc_conv_intrinsic_minmaxloc): Change the
            result array upper bound to the rank of ARRAY.  Update the NONEMPTY
            variable to depend on the non-empty extent of every dimension.  Use
            one variable per dimension instead of a single variable for the
            position and the offset.  Update their declaration, initialization,
            and update to affect the variable of each dimension.  Use the first
            variable only in areas only accessed with rank 1 ARRAY argument.
            Set every element of the result using its corresponding variable.
            (gfc_inline_intrinsic_function_p): Return true for integral ARRAY
            and absent DIM and MASK.

    gcc/testsuite/ChangeLog:

            * gfortran.dg/maxloc_bounds_4.f90: Additionally accept the error
            message emitted by the scalarizer.

Reply via email to