Hi Jerry,

Maybe it is a matter of taste but the comments are, to my mind, overly verbose:

+/* Return the spacing in bytes of the elements of DESC in dimension N.  The
+   stride counts spans rather than elements, so descriptors that denote the
+   same storage sequence can hold different combinations of the two: elements
+   that are subobjects of larger ones are described either by the spacing of
+   the larger objects as the span, or by that spacing folded into the stride
+   with the element length as the span.  The product is what the two have in
+   common.  */

/* If the stride is not set, use the element length.  */ ?

Likewise,

+  /* The element length is normally held by the dtype, but the descriptor
+     built for a polymorphic pointer to a character section holds the
+     spacing of the elements there instead, and carries the length
+     separately.  Require the two to agree on one or the other: if they
+     agree on neither, the storage sequences differ.  */

/* Require that the storage sequences are the same.  */ ?

The patch itself is fine. OK by me.

Cheers

Paul

On Sat, 5 Sept 2026 at 19:19, Jerry D <[email protected]> wrote:
>
> All, forgive my confusing emails.
>
> The attached patch is v3 of the original submission and Part 2 of 2.
>
> Part 1 was sent on my previous email, this is the followup.
>
> Regression tested on x86_64.
>
> OK for mainline? (after Part 1 is applied)
>
> Regards,
>
> Jerry
>
> ---
>
>      fortran: [PR126964] Reduce the cost of a span addressed dummy
>
>      Assisted-by: Claude Opus 5
>
>      r17-3342 made a TARGET assumed shape or assumed rank dummy be addressed
>      through the span of its descriptor, so that a pointer to it stays valid
>      when its elements are subobjects of larger ones.  That costs in two ways,
>      and SPEC 465.tonto pays both.
>
>      First, addressing every element as offset * span leaves the step of a 
> data
>      reference symbolic, so loop versioning cannot prove that the accesses 
> stay
>      aligned and the loop is never vectorized.  Fold the spacing into the
>      strides and the offset on entry instead, so that the elements are
>      addressed by the constant element length as usual.  The element length
>      divides the spacing whenever the element size equals the element
>      alignment, which covers integer, real and logical elements of an assumed
>      shape dummy; elsewhere the span is still used to address them.
>
>      A dummy whose spacing is folded that way is not addressed through its 
> span
>      at all, and the descriptor built for it holds the element length as its
>      span, so is_subref_array must not be true for it: passing it on needs
>      neither a copy nor a test.  The predicate is therefore split in two.  
> What
>      lets the elements be spaced by more than the element size is that the
>      actual argument of a TARGET dummy is never copied, which is now
>      gfc_dummy_requires_direct_arg; gfc_is_span_addressed_dummy is that
>      property less the dummies whose spacing is folded into their strides, and
>      moves to trans-array.cc, the element size of the type being a back end
>      property.
>
>      Second, is_subref_array became true for such a dummy, so passing one on 
> to
>      another procedure takes the copy-in/copy-out path, with the copy made
>      conditional on the actual argument being contiguous.  That is more than
>      the receiving dummy needs: a dummy that has a descriptor of its own
>      addresses its elements by the strides held in it, so it accepts an actual
>      argument of any stride; the one thing it cannot do is address elements
>      that are subobjects of larger ones, which is what a span differing from
>      the element length means.  Narrow the condition to the span alone when 
> the
>      dummy has a descriptor and is not CONTIGUOUS.  A dummy that needs the
>      argument packed still gets the full test.  The span test is a different
>      condition from contiguity, so it is a function of its own.  This applies
>      to what is left span addressed: character, complex and derived type
>      elements, and an assumed rank dummy, which has no strides to fold into.
>
>              PR fortran/126964
>
>      gcc/fortran/ChangeLog:
>
>              * gfortran.h (gfc_dummy_requires_direct_arg): New prototype.
>              * symbol.cc (gfc_is_span_addressed_dummy): Rename to...
>              (gfc_dummy_requires_direct_arg): ... this and move the addressing
>              out of the description.
>              * trans.h (struct lang_decl): Add span_normalized.
>              (GFC_DECL_SPAN_NORMALIZED): New macro.
>              (gfc_conv_subref_array_arg): Add span_only argument.
>              * trans-array.h (gfc_span_folds_into_stride): New prototype.
>              (gfc_conv_span_is_elem_len): Likewise.
>              * trans-array.cc (gfc_span_folds_into_stride): New function.
>              (gfc_is_span_addressed_dummy): New function, false for a dummy
>              whose element spacing is folded into its strides.
>              (gfc_conv_span_is_elem_len): New function.
>              (gfc_trans_dummy_array_bias): Fold the element spacing of a span
>              normalized dummy into its strides and its offset on entry.
>              * trans-decl.cc (gfc_build_dummy_array_decl): Mark such a dummy
>              span normalized rather than giving it a span variable.
>              (gfc_get_symbol_decl): Do not set GFC_DECL_PTR_ARRAY_P for it.
>              * trans-expr.cc (is_whole_span_addressed_dummy): New function.
>              (dummy_accepts_strided_arg): New function.
>              (copy_in_out_allowed): Use gfc_dummy_requires_direct_arg, the
>              actual argument of a span normalized dummy being uncopied too.
>              (gfc_conv_subref_array_arg): Take span_only and, with it, test 
> the
>              span of the descriptor instead of contiguity.
>              (gfc_conv_procedure_call): Ask for the span test when a span
>              addressed dummy is passed on to a dummy that has a descriptor.
>
>      gcc/testsuite/ChangeLog:
>
>              * gfortran.dg/target_dummy_repack_1.f90: New test.
>              * gfortran.dg/target_dummy_repack_2.f90: New test.
>              * gfortran.dg/target_dummy_span_1.f90: New test.
>              * gfortran.dg/c_loc_test_22.f90: Update for addressing by the
>              element length.
>              * gfortran.dg/gomp/target-span-1.f90: Likewise.
>              * gfortran.dg/class_to_type_9.f90: Likewise, and expect an
>              assumed shape dummy to take no copy of a strided actual argument.
>
>      libgomp/ChangeLog:
>
>              * testsuite/libgomp.oacc-fortran/host_data-5.F90: Expect no copy
>              of a span normalized dummy passed to a dummy without a 
> descriptor.
> ---

Reply via email to