[gcc(refs/users/mikael/heads/refactor_descriptor_v05)] Correction régression realloc_on_assign_1.f03

Mikael Morin mikael@gcc.gnu.org
Fri Jun 13 14:46:17 GMT 2025


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

commit bd877ae6f41b889e644d197fe1213c8c90a5f3d7
Author: Mikael Morin <mikael@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 6673b554e7f5..2b0f00df7fd8 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -12687,26 +12687,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.  */
@@ -13017,12 +13021,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);


More information about the Gcc-cvs mailing list