https://gcc.gnu.org/g:6da46795fb5b460bf93638f4fc7fa9c2371fec18

commit 6da46795fb5b460bf93638f4fc7fa9c2371fec18
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Thu Jun 19 18:04:56 2025 +0200

    fortran: Use array descriptor offset setter when possible
    
        In some places, a write to an array descriptor offset field was
        generated simply by adding a modification of a reference to it that
        was already available.  This change uses the existing setter
        function instead in those places, to generate the same code.  It
        makes it more explicit that in those areas a write to the field is
        generated.
    
    gcc/fortran/ChangeLog:
    
            * trans-array.cc (gfc_alloc_allocatable_for_assignment): Use the
            offset setter instead of generating a write to the offset.
            (gfc_conv_array_parameter): Use the offset setter instead of
            generating a write to the value returned by the offset getter.
            * trans-expr.cc (gfc_trans_alloc_subarray_assign): Likewise.

Diff:
---
 gcc/fortran/trans-array.cc | 9 ++++-----
 gcc/fortran/trans-expr.cc  | 2 +-
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index e3b273744bb3..45980d656572 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -9578,9 +9578,8 @@ gfc_conv_array_parameter (gfc_se *se, gfc_expr *expr, 
bool g77,
              new_field = gfc_conv_descriptor_dtype (new_desc);
              gfc_add_modify (&se->pre, new_field, old_field);
 
-             old_field = gfc_conv_descriptor_offset (old_desc);
-             new_field = gfc_conv_descriptor_offset (new_desc);
-             gfc_add_modify (&se->pre, new_field, old_field);
+             old_field = gfc_conv_descriptor_offset_get (old_desc);
+             gfc_conv_descriptor_offset_set (&se->pre, new_desc, old_field);
 
              for (int i = 0; i < expr->rank; i++)
                {
@@ -11750,8 +11749,8 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo 
*loop,
                                          gfc_index_zero_node);
        }
 
-      tmp = gfc_conv_descriptor_offset (desc);
-      gfc_add_modify (&loop_pre_block, tmp, gfc_index_zero_node);
+      gfc_conv_descriptor_offset_set (&loop_pre_block, desc,
+                                     gfc_index_zero_node);
 
       tmp = fold_build2_loc (input_location, EQ_EXPR,
                             logical_type_node, array1,
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index ec240844a5e9..e6c321844352 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -9583,8 +9583,8 @@ gfc_trans_alloc_subarray_assign (tree dest, gfc_component 
* cm,
 
   /* Shift the lbound and ubound of temporaries to being unity,
      rather than zero, based. Always calculate the offset.  */
+  gfc_conv_descriptor_offset_set (&block, dest, gfc_index_zero_node);
   offset = gfc_conv_descriptor_offset_get (dest);
-  gfc_add_modify (&block, offset, gfc_index_zero_node);
   tmp2 =gfc_create_var (gfc_array_index_type, NULL);
 
   for (n = 0; n < expr->rank; n++)

Reply via email to