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

--- Comment #20 from CVS 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:71e4d568b1264bca46d30c5fc4933f137d05ca24

commit r14-2520-g71e4d568b1264bca46d30c5fc4933f137d05ca24
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Fri Jul 14 14:15:21 2023 +0200

    fortran: Factor data references for scalar class argument wrapping
[PR92178]

    In the case of a scalar actual arg passed to a polymorphic assumed-rank
    dummy with INTENT(OUT) attribute, avoid repeatedly evaluating the actual
    argument reference by saving a pointer to it.  This is non-optimal, but
    may also be invalid, because the data reference may depend on its own
    content.  In that case the expression can't be evaluated after the data
    has been deallocated.

    There are two ways redundant expressions are generated:
     - parmse.expr, which contains the actual argument expression, is
       reused to get or set subfields in gfc_conv_class_to_class.
     - gfc_conv_class_to_class, to get the virtual table pointer associated
       with the argument, generates a new expression from scratch starting
       with the frontend expression.

    The first part is fixed by saving parmse.expr to a pointer and using
    the pointer instead of the original expression.

    The second part is fixed by adding a separate field to gfc_se that
    is set to the class container expression  when the expression to
    evaluate is polymorphic.  This needs the same field in gfc_ss_info
    so that its value can be propagated to gfc_conv_class_to_class which
    is modified to use that value.  Finally gfc_conv_procedure saves the
    expression in that field to a pointer in between to avoid the same
    problem as for the first part.

            PR fortran/92178

    gcc/fortran/ChangeLog:

            * trans.h (struct gfc_se): New field class_container.
            (struct gfc_ss_info): Ditto.
            (gfc_evaluate_data_ref_now): New prototype.
            * trans.cc (gfc_evaluate_data_ref_now):  Implement it.
            * trans-array.cc (gfc_conv_ss_descriptor): Copy class_container
            field from gfc_se struct to gfc_ss_info struct.
            (gfc_conv_expr_descriptor): Copy class_container field from
            gfc_ss_info struct to gfc_se struct.
            * trans-expr.cc (gfc_conv_class_to_class): Use class container
            set in class_container field if available.
            (gfc_conv_variable): Set class_container field on encountering
            class variables or components, clear it on encountering
            non-class components.
            (gfc_conv_procedure_call): Evaluate data ref to a pointer now,
            and replace later references by usage of the pointer.

    gcc/testsuite/ChangeLog:

            * gfortran.dg/intent_out_20.f90: New test.

Reply via email to