[gcc(refs/users/mikael/heads/refactor_descriptor_v08)] Utilisation gfc_offset_pair dans gfc_array_ref_info
Mikael Morin
mikael@gcc.gnu.org
Sun Sep 21 16:12:23 GMT 2025
https://gcc.gnu.org/g:874e8a1e28e0ca6bf6de207f87260b85300dfdd6
commit 874e8a1e28e0ca6bf6de207f87260b85300dfdd6
Author: Mikael Morin <mikael@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 e094f7fb58b5..0c9d4a30484d 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);
@@ -10452,7 +10427,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];
More information about the Gcc-cvs
mailing list