[gcc(refs/users/mikael/heads/refactor_descriptor_v03)] Correction régression pr108889.f90 realloc_on_assign*
Mikael Morin
mikael@gcc.gnu.org
Fri Mar 14 16:16:08 GMT 2025
https://gcc.gnu.org/g:1bc10b59c053a883d84ebe318b090eb258ae91b1
commit 1bc10b59c053a883d84ebe318b090eb258ae91b1
Author: Mikael Morin <mikael@gcc.gnu.org>
Date: Mon Feb 17 22:59:01 2025 +0100
Correction régression pr108889.f90 realloc_on_assign*
Diff:
---
gcc/fortran/trans-array.cc | 75 +++++++++++++++++++++++++++++++++++-----------
gcc/fortran/trans-expr.cc | 23 --------------
2 files changed, 58 insertions(+), 40 deletions(-)
diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index fd83c6ae66a7..b4fd623f5cf7 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -5742,12 +5742,15 @@ gfc_conv_ss_descriptor (stmtblock_t * block, gfc_ss * ss, int base)
&& DECL_P (TREE_OPERAND (tmp, 0)))
|| (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (se.expr))
&& TREE_CODE (se.expr) == COMPONENT_REF
- && GFC_CLASS_TYPE_P (TREE_TYPE (TREE_OPERAND (se.expr, 0))))))
+ && GFC_CLASS_TYPE_P (TREE_TYPE (TREE_OPERAND (se.expr, 0)))))
+ && !ss->is_alloc_lhs)
tmp = gfc_evaluate_now (tmp, block);
info->data = tmp;
tmp = gfc_conv_array_offset (se.expr);
- info->offset = gfc_evaluate_now (tmp, block);
+ if (!ss->is_alloc_lhs)
+ tmp = gfc_evaluate_now (tmp, block);
+ info->offset = tmp;
/* Make absolutely sure that the saved_offset is indeed saved
so that the variable is still accessible after the loops
@@ -8314,7 +8317,10 @@ gfc_set_delta (gfc_loopinfo *loop)
gfc_array_index_type,
info->start[dim], tmp);
- info->delta[dim] = gfc_evaluate_now (tmp, &outer_loop->pre);
+ if (ss->is_alloc_lhs)
+ info->delta[dim] = tmp;
+ else
+ info->delta[dim] = gfc_evaluate_now (tmp, &outer_loop->pre);
}
}
}
@@ -13598,6 +13604,52 @@ concat_str_length (gfc_expr* expr)
}
+static void
+update_reallocated_descriptor (stmtblock_t *block, gfc_loopinfo *loop)
+{
+ 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;
+ tree desc = info->descriptor;
+
+#define UPDATE_VALUE(field, value) \
+ do \
+ { \
+ if ((field) && VAR_P ((field))) \
+ { \
+ tree val = (value); \
+ gfc_add_modify (block, (field), val); \
+ } \
+ else \
+ (field) = gfc_evaluate_now ((field), block); \
+ } \
+ while (0)
+
+ UPDATE_VALUE (info->data, gfc_conv_descriptor_data_get (desc));
+ UPDATE_VALUE (info->offset, gfc_conv_descriptor_offset_get (desc));
+ info->saved_offset = info->offset;
+ for (int i = 0; i < s->dimen; i++)
+ {
+ int dim = s->dim[i];
+ tree tree_dim = gfc_rank_cst[dim];
+ UPDATE_VALUE (info->start[dim],
+ gfc_conv_descriptor_lbound_get (desc, tree_dim));
+ UPDATE_VALUE (info->end[dim],
+ gfc_conv_descriptor_ubound_get (desc, tree_dim));
+ UPDATE_VALUE (info->stride[dim],
+ gfc_conv_descriptor_stride_get (desc, tree_dim));
+ info->delta[dim] = gfc_evaluate_now (info->delta[dim], block);
+ }
+
+#undef UPDATE_VALUE
+ }
+}
+
+
/* Allocate the lhs of an assignment to an allocatable array, otherwise
reallocate it. */
@@ -13690,7 +13742,7 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
&& !expr2->value.function.isym)
expr2->ts.u.cl->backend_decl = rss->info->string_length;
- gfc_start_block (&fblock);
+ gfc_init_block (&fblock);
/* Since the lhs is allocatable, this must be a descriptor type.
Get the data and array size. */
@@ -13962,10 +14014,6 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
the array offset is saved and the info.offset is used for a
running offset. Use the saved_offset instead. */
gfc_conv_descriptor_offset_set (&fblock, desc, offset);
- if (linfo->saved_offset
- && VAR_P (linfo->saved_offset))
- gfc_add_modify (&fblock, linfo->saved_offset,
- gfc_conv_descriptor_offset_get (desc));
/* Now set the deltas for the lhs. */
for (n = 0; n < expr1->rank; n++)
@@ -13975,8 +14023,6 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
tmp = fold_build2_loc (input_location, MINUS_EXPR,
gfc_array_index_type, tmp,
loop->from[dim]);
- if (linfo->delta[dim] && VAR_P (linfo->delta[dim]))
- gfc_add_modify (&fblock, linfo->delta[dim], tmp);
}
/* Take into account _len of unlimited polymorphic entities, so that span
@@ -14197,17 +14243,12 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
tmp = build3_v (COND_EXPR, cond_null, alloc_expr, realloc_expr);
gfc_add_expr_to_block (&fblock, tmp);
- /* Make sure that the scalarizer data pointer is updated. */
- if (linfo->data && VAR_P (linfo->data))
- {
- tmp = gfc_conv_descriptor_data_get (desc);
- gfc_add_modify (&fblock, linfo->data, tmp);
- }
-
/* Add the label for same shape lhs and rhs. */
tmp = build1_v (LABEL_EXPR, jump_label2);
gfc_add_expr_to_block (&fblock, tmp);
+ update_reallocated_descriptor (&fblock, loop);
+
return gfc_finish_block (&fblock);
}
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 8e7034f59420..ccb63e120715 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -12648,30 +12648,7 @@ 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);
- gfc_add_expr_to_block (&reallocation_block, reallocation);
-
- 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, &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. */
More information about the Gcc-cvs
mailing list