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

commit bba1c27904398978b62e2d4b23ee3d3b497b4bc3
Author: Mikael Morin <[email protected]>
Date:   Tue Sep 16 21:45:07 2025 +0200

    Déplacement évaluation stride
    
    Annulation partielle build_array_ref

Diff:
---
 gcc/fortran/trans-array.cc | 42 ++++++++++++++++++++++++++++--------------
 gcc/fortran/trans.h        |  2 +-
 2 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index c10cb742befd..4072b3609845 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -3452,18 +3452,35 @@ array_bound_check_elemental (gfc_se * se, gfc_ss * ss, 
gfc_expr * expr)
 }
 
 
+static void
+conv_array_index_dim (gfc_array_ref_info *ref_info, tree index, tree stride)
+{
+  /* Multiply by the stride.  */
+  if (stride != NULL && !integer_onep (stride))
+    index = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
+                            index, stride);
+
+  /* Add the offset for this dimension to the stored offset for all other
+     dimensions.  */
+  ref_info->index = fold_build2_loc (input_location, PLUS_EXPR,
+                                    gfc_array_index_type,
+                                    ref_info->index, index);
+}
+
+
 /* Return the offset for an index.  Performs bound checking for elemental
    dimensions.  Single element references are processed separately.
    DIM is the array dimension, I is the loop dimension.  */
 
 static void
 conv_array_index_offset (gfc_se * se, gfc_ss * ss, int dim, int i,
-                        gfc_array_ref * ar, tree stride)
+                        gfc_array_ref * ar)
 {
   gfc_array_info *info;
   tree index;
   tree desc;
   tree data;
+  tree stride = NULL_TREE;
 
   info = &ss->info->data.array;
 
@@ -3559,16 +3576,15 @@ conv_array_index_offset (gfc_se * se, gfc_ss * ss, int 
dim, int i,
                                 gfc_array_index_type, index, info->delta[dim]);
     }
 
-  /* Multiply by the stride.  */
-  if (stride != NULL && !integer_onep (stride))
-    index = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
-                            index, stride);
+  if (stride == NULL_TREE)
+    {
+      if (i == ss->loop->dimen - 1 && ss->loop->parent == NULL)
+       stride = info->stride0;
+      else
+       stride = gfc_conv_array_stride (info->descriptor, dim);
+    }
 
-  /* Add the offset for this dimension to the stored offset for all other
-     dimensions.  */
-  info->current_elem.index = fold_build2_loc (input_location, PLUS_EXPR,
-                                            gfc_array_index_type,
-                                            info->current_elem.index, index);
+  conv_array_index_dim (&info->current_elem, index, stride);
 }
 
 
@@ -3711,7 +3727,7 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref 
* ar,
   else
     n = 0;
 
-  conv_array_index_offset (se, ss, ss->dim[n], n, ar, info->stride0);
+  conv_array_index_offset (se, ss, ss->dim[n], n, ar);
   index = info->current_elem.index;
 
   base = build_fold_indirect_ref_loc (input_location, info->current_elem.base);
@@ -4018,15 +4034,13 @@ add_array_offset (stmtblock_t *pblock, gfc_loopinfo 
*loop, gfc_ss *ss,
 {
   gfc_se se;
   gfc_array_info *info;
-  tree stride;
 
   info = &ss->info->data.array;
 
   gfc_init_se (&se, NULL);
   se.loop = loop;
   se.expr = info->descriptor;
-  stride = gfc_conv_array_stride (info->descriptor, array_dim);
-  conv_array_index_offset (&se, ss, array_dim, loop_dim, ar, stride);
+  conv_array_index_offset (&se, ss, array_dim, loop_dim, ar);
   gfc_add_block_to_block (pblock, &se.pre);
 
   info->current_elem.index = gfc_evaluate_now (info->current_elem.index, 
pblock);
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index 5bcf4cae8f2e..384c8544aa7e 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -192,7 +192,7 @@ typedef struct gfc_array_ref_info
   };
 
   access_type access;
-  tree index;
+  tree cst_index, index;
 }
 gfc_array_ref_info;

Reply via email to