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

commit c22a5a2463e428ee7fb962087d6dc5e4a95e61d9
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Mon Feb 17 21:59:00 2025 +0100

    Correction régression realloc_on_assign_1.f03

Diff:
---
 gcc/fortran/trans-expr.cc | 42 +++++++++++++++++++++++-------------------
 1 file changed, 23 insertions(+), 19 deletions(-)

diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 23c82f22c3ef..8e7034f59420 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -12648,26 +12648,30 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * 
expr2, bool init_flag,
        {
          realloc_lhs_warning (expr1->ts.type, true, &expr1->where);
          ompws_flags &= ~OMPWS_SCALARIZER_WS;
+         stmtblock_t reallocation_block;
+         gfc_init_block (&reallocation_block);
          reallocation = gfc_alloc_allocatable_for_assignment (&loop, expr1, 
expr2);
-       }
-
-      for (gfc_ss *s = loop.ss; s != gfc_ss_terminator; s = s->loop_chain)
-       {
-         if (!s->is_alloc_lhs)
-           continue;
+         gfc_add_expr_to_block (&reallocation_block, reallocation);
 
-         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++)
+         for (gfc_ss *s = loop.ss; s != gfc_ss_terminator; s = s->loop_chain)
            {
-             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);
+             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, 
&reallocation_block);
+             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], 
&reallocation_block);
+                 info->end[dim] = gfc_evaluate_now (info->end[dim], 
&reallocation_block);
+                 info->stride[dim] = gfc_evaluate_now (info->stride[dim], 
&reallocation_block);
+                 info->delta[dim] = gfc_evaluate_now (info->delta[dim], 
&reallocation_block);
+               }
            }
+         reallocation = gfc_finish_block (&reallocation_block);
        }
 
       /* Start the scalarized loop body.  */
@@ -12978,12 +12982,12 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * 
expr2, bool init_flag,
          gfc_add_expr_to_block (&body, tmp);
        }
 
-      if (maybe_workshare)
-       ompws_flags &= ~OMPWS_SCALARIZER_BODY;
-
       if (reallocation != NULL_TREE)
        gfc_add_expr_to_block (&loop.code[loop.dimen - 1], reallocation);
 
+      if (maybe_workshare)
+       ompws_flags &= ~OMPWS_SCALARIZER_BODY;
+
       /* Generate the copying loops.  */
       gfc_trans_scalarizing_loops (&loop, &body);

Reply via email to