https://gcc.gnu.org/g:0bcb9c6620ea726f0549e0c8292ff244ea174a12
commit 0bcb9c6620ea726f0549e0c8292ff244ea174a12 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Sun Sep 21 17:27:30 2025 +0200 Utilisation gfc_offset_pair dans gfc_array_ref_info Annulation ajout fonction build_array_ref Suppression commentaire gfc_offset_add Diff: --- gcc/fortran/trans-array.cc | 58 ++++++++++++++-------------------------------- gcc/fortran/trans-array.h | 2 ++ gcc/fortran/trans-expr.cc | 2 +- gcc/fortran/trans-io.cc | 2 +- gcc/fortran/trans.h | 10 ++++++-- 5 files changed, 29 insertions(+), 45 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 50faf7a82cb4..e6207ae2f0e5 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -635,7 +635,7 @@ gfc_trans_allocate_array_storage (stmtblock_t * pre, stmtblock_t * post, bool onstack; desc = info->descriptor; - info->current_elem.index = gfc_index_zero_node; + info->current_elem.index = {NULL_TREE, NULL_TREE}; if (size == NULL_TREE || (dynamic && integer_zerop (size))) { /* A callee allocated array. */ @@ -2231,7 +2231,6 @@ trans_constant_array_constructor (gfc_ss * ss, tree type) info->descriptor = tmp; info->data = gfc_build_addr_expr (NULL_TREE, tmp); - info->current_elem.index = gfc_index_zero_node; for (i = 0; i < ss->dimen; i++) { @@ -2814,7 +2813,8 @@ gfc_add_loop_ss_code (gfc_loopinfo * loop, gfc_ss * ss, bool subscript, tree tmp = gfc_class_data_get (se.expr); info->descriptor = tmp; info->data = gfc_conv_descriptor_data_get (tmp); - info->current_elem.index = gfc_conv_descriptor_offset_get (tmp); + gfc_offset_add (info->current_elem.index, + gfc_conv_descriptor_offset_get (tmp)); for (gfc_ss *s = ss; s; s = s->parent) for (int n = 0; n < s->dimen; n++) { @@ -3107,7 +3107,7 @@ gfc_conv_ss_descriptor (stmtblock_t * block, gfc_ss * ss, int base) tmp = gfc_conv_array_offset (se.expr); if (!ss->is_alloc_lhs) tmp = gfc_evaluate_now (tmp, block); - info->current_elem.index = tmp; + gfc_offset_add (info->current_elem.index, tmp); /* Make absolutely sure that the saved_offset is indeed saved so that the variable is still accessible after the loops @@ -3452,15 +3452,9 @@ array_bound_check_elemental (gfc_se * se, gfc_ss * ss, gfc_expr * expr) } -struct gfc_offset_pair -{ - tree cst_part, non_cst_part; -}; - - /* Add T to the offset pair *OFFSET, *CST_OFFSET. */ -static void +void gfc_offset_add (gfc_offset_pair &offset, tree t) { if (TREE_CODE (t) == INTEGER_CST) @@ -3493,6 +3487,8 @@ gfc_offset_pair_materialize (gfc_offset_pair &pair) else return pair.non_cst_part; } + else if (pair.non_cst_part == NULL_TREE) + return pair.cst_part; else return fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, pair.non_cst_part, pair.cst_part); @@ -3504,10 +3500,7 @@ gfc_offset_pair_materialize (gfc_offset_pair &pair) static gfc_offset_pair add_to_offset (gfc_array_ref_info *ref_info, tree val) { - gfc_offset_pair offset {NULL_TREE, NULL_TREE}; - memset (&offset, 0, sizeof (offset)); - offset.cst_part = ref_info->cst_index; - offset.non_cst_part = ref_info->index; + gfc_offset_pair offset = ref_info->index; gfc_offset_add (offset, val); return offset; } @@ -3937,8 +3930,7 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar, gfc_expr *expr, ref_info.base = decl; gfc_offset_pair offset = add_to_offset (&ref_info, gfc_conv_array_offset (decl)); - ref_info.cst_index = offset.cst_part; - ref_info.index = offset.non_cst_part; + ref_info.index = offset; /* Calculate the offsets from all the dimensions. Make sure to associate the final offset so that we form a chain of loop invariant summands. */ @@ -4005,28 +3997,11 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar, gfc_expr *expr, } } - gfc_offset_pair offset; - offset = conv_array_index_dim (&ref_info, indexse.expr, - gfc_conv_array_stride (decl, n)); - ref_info.cst_index = offset.cst_part; - ref_info.index = offset.non_cst_part; + ref_info.index = conv_array_index_dim (&ref_info, indexse.expr, + gfc_conv_array_stride (decl, n)); } - tree index; - if (ref_info.cst_index == NULL_TREE - || integer_zerop (ref_info.cst_index)) - { - if (ref_info.index == NULL_TREE) - index = gfc_index_zero_node; - else - index = ref_info.index; - } - else if (ref_info.index == NULL_TREE) - index = ref_info.cst_index; - else - index = fold_build2_loc (input_location, PLUS_EXPR, - gfc_array_index_type, ref_info.index, - ref_info.cst_index); + tree index = gfc_offset_pair_materialize (ref_info.index); /* A pointer array component can be detected from its field decl. Fix the descriptor, mark the resulting variable decl and pass it to @@ -4096,8 +4071,9 @@ add_array_offset (stmtblock_t *pblock, gfc_loopinfo *loop, gfc_ss *ss, gfc_offset_pair pair = conv_array_index_offset (&se, ss, array_dim, loop_dim, ar); gfc_add_block_to_block (pblock, &se.pre); - tree index = gfc_offset_pair_materialize (pair); - info->current_elem.index = gfc_evaluate_now (index, pblock); + if (pair.non_cst_part != NULL_TREE) + pair.non_cst_part = gfc_evaluate_now (pair.non_cst_part, pblock); + info->current_elem.index = pair; } @@ -4855,7 +4831,6 @@ done: info->data = gfc_conv_array_data (info->descriptor); info->data = gfc_evaluate_now (info->data, &outer_loop->pre); - info->current_elem.index = gfc_index_zero_node; gfc_expr *array = expr->value.function.actual->expr; tree rank = build_int_cst (gfc_array_index_type, array->rank); @@ -10458,7 +10433,8 @@ gfc_update_reallocated_descriptor (stmtblock_t *block, gfc_loopinfo *loop) if (save_descriptor_data (info->descriptor, info->data)) SAVE_VALUE (info->data); - SAVE_VALUE (info->current_elem.index); + if (info->current_elem.index.non_cst_part != NULL_TREE) + SAVE_VALUE (info->current_elem.index.non_cst_part); info->saved_offset = info->current_elem.index; for (int i = 0; i < s->dimen; i++) { diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h index f81d5ede35a0..5362b4bbee51 100644 --- a/gcc/fortran/trans-array.h +++ b/gcc/fortran/trans-array.h @@ -193,3 +193,5 @@ void gfc_trans_string_copy (stmtblock_t *, tree, tree, int, tree, tree, int); /* Calculate extent / size of an array. */ tree gfc_conv_array_extent_dim (tree, tree, tree*); int gfc_get_array_ref_dim_for_loop_dim (gfc_ss *, int); + +void gfc_offset_add (gfc_offset_pair &, tree); diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index ed0c0fbdf60a..d6130bae5292 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -9225,7 +9225,7 @@ gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr) lss_array->shape = gfc_get_shape (cm->as->rank); lss_array->descriptor = dest; lss_array->data = gfc_conv_array_data (dest); - lss_array->current_elem.index = gfc_conv_array_offset (dest); + gfc_offset_add (lss_array->current_elem.index, gfc_conv_array_offset (dest)); for (n = 0; n < cm->as->rank; n++) { lss_array->start[n] = gfc_conv_array_lbound (dest, n); diff --git a/gcc/fortran/trans-io.cc b/gcc/fortran/trans-io.cc index 6d0b271d273c..5a710d5f3b92 100644 --- a/gcc/fortran/trans-io.cc +++ b/gcc/fortran/trans-io.cc @@ -2188,7 +2188,7 @@ transfer_array_component (tree expr, gfc_component * cm, locus * where) ss_array->descriptor = expr; ss_array->data = gfc_conv_array_data (expr); - ss_array->current_elem.index = gfc_conv_array_offset (expr); + gfc_offset_add (ss_array->current_elem.index, gfc_conv_array_offset (expr)); for (n = 0; n < cm->as->rank; n++) { ss_array->start[n] = gfc_conv_array_lbound (expr, n); diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index 65d4db832657..1cfe8824fecc 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -182,6 +182,12 @@ enum gfc_structure_caf_mode_t { }; +struct gfc_offset_pair +{ + tree cst_part, non_cst_part; +}; + + typedef struct gfc_array_ref_info { tree base; @@ -192,7 +198,7 @@ typedef struct gfc_array_ref_info }; access_type access; - tree cst_index, index; + gfc_offset_pair index; } gfc_array_ref_info; @@ -210,7 +216,7 @@ typedef struct gfc_array_info tree descriptor; /* holds the pointer to the data array. */ tree data; - tree saved_offset; + gfc_offset_pair saved_offset; tree stride0; /* Holds the SS for a subscript. Indexed by actual dimension. */ struct gfc_ss *subscript[GFC_MAX_DIMENSIONS];