[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