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

commit d31f0a7e37df6d3ee164c86b0dcb27e70d66425a
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sun Apr 20 22:31:01 2025 +0200

    Correction régression transfer_simplify_11

Diff:
---
 gcc/fortran/trans-array.cc | 26 ++++++++++++++++----------
 gcc/tree-ssa-loop-niter.cc |  3 ++-
 2 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 2fe00be9251f..652649953a24 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -3516,8 +3516,8 @@ build_ptr_array_ref (tree data, tree offset)
 
 
 tree
-build_array_ref_dim (gfc_ss *ss, tree index, tree spacing,
-                    tree offset = NULL_TREE, bool tmp_array = false)
+build_array_ref_dim (gfc_ss *ss, tree index, tree lbound, tree spacing,
+                    bool tmp_array = false)
 {
   gfc_array_info *info = &ss->info->data.array;
 
@@ -3529,8 +3529,8 @@ build_array_ref_dim (gfc_ss *ss, tree index, tree spacing,
                             || ss_type == GFC_SS_INTRINSIC
                             || tmp_array
                             || non_negative_strides_array_p (info->descriptor);
-  return gfc_build_array_ref (base, index, non_negative_stride, NULL_TREE,
-                             spacing, offset);
+  return gfc_build_array_ref (base, index, non_negative_stride, lbound,
+                             spacing);
 }
 
 
@@ -3551,8 +3551,8 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref 
* ar, bool tmp_array =
   tree index = conv_array_index (se, ss, ss->dim[n], n, ar);
 
   gfc_array_info *info = &ss->info->data.array;
-  se->expr = build_array_ref_dim (ss, index, info->spacing[ss->dim[n]],
-                                 info->offset, tmp_array);
+  se->expr = build_array_ref_dim (ss, index, info->lbound[ss->dim[n]],
+                                 info->spacing[ss->dim[n]], tmp_array);
 }
 
 
@@ -3761,7 +3761,7 @@ add_array_offset (stmtblock_t *pblock, gfc_loopinfo 
*loop, gfc_ss *ss,
 
   gfc_add_block_to_block (pblock, &se.pre);
 
-  tree tmp = build_array_ref_dim (ss, index, info->spacing[array_dim]);
+  tree tmp = build_array_ref_dim (ss, index, info->lbound[array_dim], 
info->spacing[array_dim]);
   tmp = gfc_build_addr_expr (NULL_TREE, tmp);
   tmp = fold_convert_loc (input_location, type, tmp);
   info->data = gfc_evaluate_now (tmp, pblock);
@@ -4155,7 +4155,7 @@ evaluate_bound (stmtblock_t *block, tree *bounds, 
gfc_expr ** values,
 
 
 static void
-conv_array_spacing (stmtblock_t * block, gfc_ss * ss, int dim)
+conv_array_lbound_spacing (stmtblock_t * block, gfc_ss * ss, int dim)
 {
   gfc_array_info *info;
 
@@ -4193,6 +4193,12 @@ conv_array_spacing (stmtblock_t * block, gfc_ss * ss, 
int dim)
     info->spacing[dim] = gfc_evaluate_now (value, block);
   else
     info->spacing[dim] = value;
+
+  value = gfc_conv_array_lbound (desc, dim);
+  if (save_value)
+    info->lbound[dim] = gfc_evaluate_now (value, block);
+  else
+    info->lbound[dim] = value;
 }
 
 
@@ -4505,13 +4511,13 @@ done:
          for (n = 0; n < ss->dimen; n++)
            {
              gfc_conv_section_startstride (&outer_loop->pre, ss, ss->dim[n]);
-             conv_array_spacing (&outer_loop->pre, ss, ss->dim[n]);
+             conv_array_lbound_spacing (&outer_loop->pre, ss, ss->dim[n]);
            }
          if (loop->parent == nullptr)
            for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
              if (info->subscript[n]
                  && info->subscript[n]->info->type == GFC_SS_SCALAR)
-               conv_array_spacing (&outer_loop->pre, ss, n);
+               conv_array_lbound_spacing (&outer_loop->pre, ss, n);
          break;
 
        case GFC_SS_INTRINSIC:
diff --git a/gcc/tree-ssa-loop-niter.cc b/gcc/tree-ssa-loop-niter.cc
index 9ce881344142..0fa9388594bc 100644
--- a/gcc/tree-ssa-loop-niter.cc
+++ b/gcc/tree-ssa-loop-niter.cc
@@ -3926,7 +3926,8 @@ do_warn_aggressive_loop_optimizations (class loop *loop,
         known constant bound.  */
       || wi::cmpu (i_bound, wi::to_widest (loop->nb_iterations)) >= 0
       /* And undefined behavior happens unconditionally.  */
-      || !dominated_by_p (CDI_DOMINATORS, loop->latch, gimple_bb (stmt)))
+      || !dominated_by_p (CDI_DOMINATORS, loop->latch, gimple_bb (stmt))
+      || loop->latch == gimple_bb (stmt))
     return;
 
   edge e = single_exit (loop);

Reply via email to