https://gcc.gnu.org/g:1b488ce13c7f722cef3a667b7f46dcb2d4f2e330

commit 1b488ce13c7f722cef3a667b7f46dcb2d4f2e330
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Fri Mar 14 16:37:46 2025 +0100

    Sauvegarde suppression initialisation inutile bornes pour taire warnings

Diff:
---
 gcc/fortran/trans-array.cc | 20 ++++++++++++--------
 gcc/fortran/trans-expr.cc  | 39 +++++++++++++++++++++++++++++----------
 2 files changed, 41 insertions(+), 18 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 6f3fb5f04240..f225f013ea53 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -4767,13 +4767,12 @@ gfc_trans_scalarized_loop_boundary (gfc_loopinfo * 
loop, stmtblock_t * body)
 
 static void
 evaluate_bound (stmtblock_t *block, tree *bounds, gfc_expr ** values,
-               tree desc, int dim, bool lbound, bool deferred)
+               tree desc, int dim, bool lbound, bool deferred, bool save_value)
 {
   gfc_se se;
   gfc_expr * input_val = values[dim];
   tree *output = &bounds[dim];
 
-
   if (input_val)
     {
       /* Specified section bound.  */
@@ -4799,7 +4798,8 @@ evaluate_bound (stmtblock_t *block, tree *bounds, 
gfc_expr ** values,
       *output = lbound ? gfc_conv_array_lbound (desc, dim) :
                         gfc_conv_array_ubound (desc, dim);
     }
-  *output = gfc_evaluate_now (*output, block);
+  if (save_value)
+    *output = gfc_evaluate_now (*output, block);
 }
 
 
@@ -4832,18 +4832,18 @@ gfc_conv_section_startstride (stmtblock_t * block, 
gfc_ss * ss, int dim)
              || ar->dimen_type[dim] == DIMEN_THIS_IMAGE);
   desc = info->descriptor;
   stride = ar->stride[dim];
-
+  bool save_value = !ss->is_alloc_lhs;
 
   /* Calculate the start of the range.  For vector subscripts this will
      be the range of the vector.  */
   evaluate_bound (block, info->start, ar->start, desc, dim, true,
-                 ar->as->type == AS_DEFERRED);
+                 ar->as->type == AS_DEFERRED, save_value);
 
   /* Similarly calculate the end.  Although this is not used in the
      scalarizer, it is needed when checking bounds and where the end
      is an expression with side-effects.  */
   evaluate_bound (block, info->end, ar->end, desc, dim, false,
-                 ar->as->type == AS_DEFERRED);
+                 ar->as->type == AS_DEFERRED, save_value);
 
 
   /* Calculate the stride.  */
@@ -4854,7 +4854,11 @@ gfc_conv_section_startstride (stmtblock_t * block, 
gfc_ss * ss, int dim)
       gfc_init_se (&se, NULL);
       gfc_conv_expr_type (&se, stride, gfc_array_index_type);
       gfc_add_block_to_block (block, &se.pre);
-      info->stride[dim] = gfc_evaluate_now (se.expr, block);
+      tree value = se.expr;
+      if (save_value)
+       info->stride[dim] = gfc_evaluate_now (value, block);
+      else
+       info->stride[dim] = value;
     }
 }
 
@@ -8466,7 +8470,7 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr)
          gcc_assert (n == codim - 1);
          evaluate_bound (&loop.pre, info->start, ar->start,
                          info->descriptor, n + ndim, true,
-                         ar->as->type == AS_DEFERRED);
+                         ar->as->type == AS_DEFERRED, true);
          loop.from[n + loop.dimen] = info->start[n + ndim];
        }
       else
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index c8a207609e4b..3104badba0c4 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -13010,6 +13010,35 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * 
expr2, bool init_flag,
          ompws_flags |= OMPWS_SCALARIZER_WS | OMPWS_SCALARIZER_BODY;
        }
 
+      /* F2003: Allocate or reallocate lhs of allocatable array.  */
+      if (realloc_flag)
+       {
+         realloc_lhs_warning (expr1->ts.type, true, &expr1->where);
+         ompws_flags &= ~OMPWS_SCALARIZER_WS;
+         tmp = gfc_alloc_allocatable_for_assignment (&loop, expr1, expr2);
+         if (tmp != NULL_TREE)
+           gfc_add_expr_to_block (&loop.pre, tmp);
+       }
+
+      for (gfc_ss *s = loop.ss; s != gfc_ss_terminator; s = s->loop_chain)
+       {
+         if (!s->is_alloc_lhs)
+           continue;
+
+         gcc_assert (s->info->type == GFC_SS_SECTION);
+         gfc_array_info *info = &s->info->data.array;
+         info->offset = gfc_evaluate_now (info->offset, &loop.pre);
+         info->saved_offset = info->offset;
+         for (int i = 0; i < s->dimen; i++)
+           {
+             int dim = s->dim[i];
+             info->start[dim] = gfc_evaluate_now (info->start[dim], &loop.pre);
+             info->end[dim] = gfc_evaluate_now (info->end[dim], &loop.pre);
+             info->stride[dim] = gfc_evaluate_now (info->stride[dim], 
&loop.pre);
+             info->delta[dim] = gfc_evaluate_now (info->delta[dim], &loop.pre);
+           }
+       }
+
       /* Start the scalarized loop body.  */
       gfc_start_scalarized_body (&loop, &body);
     }
@@ -13318,16 +13347,6 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * 
expr2, bool init_flag,
          gfc_add_expr_to_block (&body, tmp);
        }
 
-      /* F2003: Allocate or reallocate lhs of allocatable array.  */
-      if (realloc_flag)
-       {
-         realloc_lhs_warning (expr1->ts.type, true, &expr1->where);
-         ompws_flags &= ~OMPWS_SCALARIZER_WS;
-         tmp = gfc_alloc_allocatable_for_assignment (&loop, expr1, expr2);
-         if (tmp != NULL_TREE)
-           gfc_add_expr_to_block (&loop.code[expr1->rank - 1], tmp);
-       }
-
       if (maybe_workshare)
        ompws_flags &= ~OMPWS_SCALARIZER_BODY;

Reply via email to