[gcc(refs/users/mikael/heads/refactor_descriptor_v08)] Suppression gfc_conv_descriptor_rank compil' OK
Mikael Morin
mikael@gcc.gnu.org
Sat Sep 20 13:10:49 GMT 2025
https://gcc.gnu.org/g:ffd11283be69d36c33dff6724fde0d04af04e057
commit ffd11283be69d36c33dff6724fde0d04af04e057
Author: Mikael Morin <mikael@gcc.gnu.org>
Date: Sun Jun 29 14:07:23 2025 +0200
Suppression gfc_conv_descriptor_rank compil' OK
Suppression non_lvalue rank_get
Ajout location rank_set
Diff:
---
gcc/fortran/trans-array.cc | 16 ++++++----------
gcc/fortran/trans-decl.cc | 2 +-
gcc/fortran/trans-descriptor.cc | 24 ++++++++++++++++++++++--
gcc/fortran/trans-descriptor.h | 4 +++-
gcc/fortran/trans-expr.cc | 24 +++++++-----------------
gcc/fortran/trans-intrinsic.cc | 10 +++++-----
gcc/fortran/trans-openmp.cc | 2 +-
gcc/fortran/trans-stmt.cc | 2 +-
8 files changed, 46 insertions(+), 38 deletions(-)
diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 24647ab9d686..d713b5294ba6 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -1186,9 +1186,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, gfc_ss * ss,
/* These transformational functions change the rank. */
- tmp = gfc_conv_descriptor_rank (desc);
- gfc_add_modify (pre, tmp,
- build_int_cst (TREE_TYPE (tmp), ss->loop->dimen));
+ gfc_conv_descriptor_rank_set (pre, desc, ss->loop->dimen);
fcn_ss->info->class_container = NULL_TREE;
}
@@ -4875,7 +4873,7 @@ done:
&& (gfc_option.allow_std & GFC_STD_F202Y)))
gcc_assert (se.pre.head == NULL_TREE
&& se.post.head == NULL_TREE);
- rank = gfc_conv_descriptor_rank (se.expr);
+ rank = gfc_conv_descriptor_rank_get (se.expr);
tmp = fold_build2_loc (input_location, MINUS_EXPR,
gfc_array_index_type,
fold_convert (gfc_array_index_type,
@@ -8507,7 +8505,7 @@ gfc_tree_array_size (stmtblock_t *block, tree desc, gfc_expr *expr, tree dim)
enum gfc_array_kind akind = GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc));
if (expr == NULL || expr->rank < 0)
rank = fold_convert (signed_char_type_node,
- gfc_conv_descriptor_rank (desc));
+ gfc_conv_descriptor_rank_get (desc));
else
rank = build_int_cst (signed_char_type_node, expr->rank);
@@ -8912,8 +8910,7 @@ gfc_conv_array_parameter (gfc_se *se, gfc_expr *expr, bool g77,
gfc_conv_descriptor_stride_get (se->expr, gfc_index_zero_node));
tree tmp2 = gfc_conv_descriptor_dtype_get (se->expr);
gfc_conv_descriptor_dtype_set (&block, arr, tmp2);
- gfc_add_modify (&block, gfc_conv_descriptor_rank (arr),
- build_int_cst (signed_char_type_node, 1));
+ gfc_conv_descriptor_rank_set (&block, arr, 1);
gfc_conv_descriptor_span_set (&block, arr,
gfc_conv_descriptor_span_get (arr));
gfc_conv_descriptor_offset_set (&block, arr, gfc_index_zero_node);
@@ -9197,7 +9194,7 @@ gfc_full_array_size (stmtblock_t *block, tree decl, int rank)
tree nelems;
tree tmp;
if (rank < 0)
- idx = gfc_conv_descriptor_rank (decl);
+ idx = gfc_conv_descriptor_rank_get (decl);
else
idx = gfc_rank_cst[rank - 1];
nelems = gfc_conv_descriptor_ubound_get (decl, idx);
@@ -9407,8 +9404,7 @@ duplicate_allocatable_coarray (tree dest, tree dest_tok, tree src, tree type,
else
{
/* Set the rank or unitialized memory access may be reported. */
- tmp = gfc_conv_descriptor_rank (dest);
- gfc_add_modify (&globalblock, tmp, build_int_cst (TREE_TYPE (tmp), rank));
+ gfc_conv_descriptor_rank_set (&globalblock, dest, rank);
if (rank)
nelems = gfc_full_array_size (&globalblock, src, rank);
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index 107e5904d312..43d3250beb1b 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -7399,7 +7399,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally,
{
/* Set gfc->dtype.rank, if assumed-rank. */
rank = gfc_get_cfi_desc_rank (cfi);
- gfc_add_modify (&block, gfc_conv_descriptor_rank (gfc_desc), rank);
+ gfc_conv_descriptor_rank_set (&block, gfc_desc, rank);
}
else if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
/* In that case, the CFI rank and the declared rank can differ. */
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 02c1cbdfb8ea..49ad543075a5 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -283,8 +283,8 @@ gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc, tree value)
}
-tree
-gfc_conv_descriptor_rank (tree desc)
+static tree
+get_descriptor_rank (tree desc)
{
tree tmp;
tree dtype;
@@ -297,6 +297,26 @@ gfc_conv_descriptor_rank (tree desc)
dtype, tmp, NULL_TREE);
}
+tree
+gfc_conv_descriptor_rank_get (tree desc)
+{
+ return get_descriptor_rank (desc);
+}
+
+void
+gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, tree value)
+{
+ location_t loc = input_location;
+ tree t = get_descriptor_rank (desc);
+ gfc_add_modify_loc (loc, block, t,
+ fold_convert_loc (loc, TREE_TYPE (t), value));
+}
+
+void
+gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, int value)
+{
+ gfc_conv_descriptor_rank_set (block, desc, gfc_rank_cst[value]);
+}
static tree
get_descriptor_version (tree desc)
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index e5300bf0704e..cee711398447 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -48,7 +48,6 @@ tree gfc_get_cfi_dim_extent (tree desc, tree idx);
tree gfc_get_cfi_dim_sm (tree desc, tree idx);
-tree gfc_conv_descriptor_rank (tree desc);
tree gfc_conv_descriptor_attribute (tree desc);
tree gfc_conv_descriptor_type (tree desc);
tree gfc_get_descriptor_dimension (tree desc);
@@ -60,6 +59,7 @@ tree gfc_conv_descriptor_offset_get (tree desc);
tree gfc_conv_descriptor_dtype_get (tree desc);
tree gfc_conv_descriptor_elem_len_get (tree desc);
tree gfc_conv_descriptor_version_get (tree desc);
+tree gfc_conv_descriptor_rank_get (tree desc);
tree gfc_conv_descriptor_span_get (tree desc);
tree gfc_conv_descriptor_stride_get (tree desc, tree dim);
@@ -72,6 +72,8 @@ void gfc_conv_descriptor_offset_set (stmtblock_t *block, tree desc, tree value);
void gfc_conv_descriptor_dtype_set (stmtblock_t *block, tree desc, tree value);
void gfc_conv_descriptor_elem_len_set (stmtblock_t *block, tree desc, tree value);
void gfc_conv_descriptor_version_set (stmtblock_t *block, tree desc, tree value);
+void gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, tree value);
+void gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, int value);
void gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc, tree value);
void gfc_conv_descriptor_stride_set (stmtblock_t *block, tree desc, tree dim, tree value);
void gfc_conv_descriptor_lbound_set (stmtblock_t *block, tree desc, tree dim, tree value);
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index fa422dbb87ae..b7af8dc0fd89 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -3329,7 +3329,7 @@ gfc_conv_variable (gfc_se * se, gfc_expr * expr)
char *msg;
dim = fold_convert (signed_char_type_node,
- gfc_conv_descriptor_rank (se->expr));
+ gfc_conv_descriptor_rank_get (se->expr));
dim = fold_build2_loc (input_location, MINUS_EXPR, signed_char_type_node,
dim, build_int_cst (signed_char_type_node, 1));
lower = gfc_conv_descriptor_lbound_get (se->expr, dim);
@@ -6153,7 +6153,8 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym)
gfc_add_modify (&block, tmp,
build_int_cst (TREE_TYPE (tmp), CFI_VERSION));
if (e->rank < 0)
- rank = fold_convert (signed_char_type_node, gfc_conv_descriptor_rank (gfc));
+ rank = fold_convert (signed_char_type_node,
+ gfc_conv_descriptor_rank_get (gfc));
else
rank = build_int_cst (signed_char_type_node, e->rank);
tmp = gfc_get_cfi_desc_rank (cfi);
@@ -6745,12 +6746,9 @@ conv_null_actual (gfc_se * parmse, gfc_expr * e, gfc_symbol * fsym)
correct rank. */
if (fsym->as && fsym->as->type == AS_ASSUMED_RANK)
{
- tree rank;
tree tmp = parmse->expr;
tmp = gfc_conv_scalar_to_descriptor (parmse, tmp, fsym->attr);
- rank = gfc_conv_descriptor_rank (tmp);
- gfc_add_modify (&parmse->pre, rank,
- build_int_cst (TREE_TYPE (rank), e->rank));
+ gfc_conv_descriptor_rank_set (&parmse->pre, tmp, e->rank);
parmse->expr = gfc_build_addr_expr (NULL_TREE, tmp);
}
else
@@ -6800,13 +6798,10 @@ conv_null_actual (gfc_se * parmse, gfc_expr * e, gfc_symbol * fsym)
For an assumed-rank dummy we provide a descriptor that passes
the correct rank. */
{
- tree rank;
tree tmp = parmse->expr;
tmp = gfc_conv_scalar_to_descriptor (parmse, tmp, gfc_expr_attr (e));
- rank = gfc_conv_descriptor_rank (tmp);
- gfc_add_modify (&parmse->pre, rank,
- build_int_cst (TREE_TYPE (rank), e->rank));
+ gfc_conv_descriptor_rank_set (&parmse->pre, tmp, e->rank);
gfc_conv_descriptor_data_set (&parmse->pre, tmp, null_pointer_node);
parmse->expr = gfc_build_addr_expr (NULL_TREE, tmp);
}
@@ -6823,11 +6818,7 @@ conv_null_actual (gfc_se * parmse, gfc_expr * e, gfc_symbol * fsym)
tmp = gfc_conv_scalar_to_descriptor (parmse, tmp, fsym->attr);
dummy_rank = fsym->as ? fsym->as->rank : 0;
if (dummy_rank > 0)
- {
- tree rank = gfc_conv_descriptor_rank (tmp);
- gfc_add_modify (&parmse->pre, rank,
- build_int_cst (TREE_TYPE (rank), dummy_rank));
- }
+ gfc_conv_descriptor_rank_set (&parmse->pre, tmp, dummy_rank);
gfc_conv_descriptor_data_set (&parmse->pre, tmp, null_pointer_node);
parmse->expr = gfc_build_addr_expr (NULL_TREE, tmp);
}
@@ -10274,8 +10265,7 @@ gfc_trans_structure_assign (tree dest, gfc_expr * expr, bool init, bool coarray)
rank = 1;
size = build_zero_cst (size_type_node);
desc = field;
- gfc_add_modify (&block, gfc_conv_descriptor_rank (desc),
- build_int_cst (signed_char_type_node, rank));
+ gfc_conv_descriptor_rank_set (&block, desc, rank);
}
else
{
diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index e9489f07dc07..ec5df3b2e18f 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -2290,7 +2290,7 @@ gfc_conv_intrinsic_rank (gfc_se *se, gfc_expr *expr)
gfc_add_block_to_block (&se->pre, &argse.pre);
gfc_add_block_to_block (&se->post, &argse.post);
- se->expr = gfc_conv_descriptor_rank (argse.expr);
+ se->expr = gfc_conv_descriptor_rank_get (argse.expr);
se->expr = fold_convert (gfc_get_int_type (gfc_default_integer_kind),
se->expr);
}
@@ -2459,7 +2459,7 @@ gfc_conv_intrinsic_bound (gfc_se * se, gfc_expr * expr, enum gfc_isym_id op)
cond = fold_build2_loc (input_location, LT_EXPR, logical_type_node,
bound, build_int_cst (TREE_TYPE (bound), 0));
if (as && as->type == AS_ASSUMED_RANK)
- tmp = gfc_conv_descriptor_rank (desc);
+ tmp = gfc_conv_descriptor_rank_get (desc);
else
tmp = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (TREE_TYPE (desc))];
tmp = fold_build2_loc (input_location, GE_EXPR, logical_type_node,
@@ -2554,7 +2554,7 @@ gfc_conv_intrinsic_bound (gfc_se * se, gfc_expr * expr, enum gfc_isym_id op)
{
tree minus_one = build_int_cst (gfc_array_index_type, -1);
tree rank = fold_convert (gfc_array_index_type,
- gfc_conv_descriptor_rank (desc));
+ gfc_conv_descriptor_rank_get (desc));
rank = fold_build2_loc (input_location, PLUS_EXPR,
gfc_array_index_type, rank, minus_one);
@@ -8420,7 +8420,7 @@ gfc_conv_intrinsic_sizeof (gfc_se *se, gfc_expr *expr)
stmtblock_t body;
tmp = fold_convert (gfc_array_index_type,
- gfc_conv_descriptor_rank (argse.expr));
+ gfc_conv_descriptor_rank_get (argse.expr));
loop_var = gfc_create_var (gfc_array_index_type, "i");
gfc_add_modify (&argse.pre, loop_var, gfc_index_zero_node);
exit_label = gfc_build_label_decl (NULL_TREE);
@@ -9227,7 +9227,7 @@ gfc_conv_associated (gfc_se *se, gfc_expr *expr)
gfc_conv_expr_lhs (&arg1se, arg1->expr);
if (arg1->expr->rank == -1)
{
- tmp = gfc_conv_descriptor_rank (arg1se.expr);
+ tmp = gfc_conv_descriptor_rank_get (arg1se.expr);
tmp = fold_build2_loc (input_location, MINUS_EXPR,
TREE_TYPE (tmp), tmp,
build_int_cst (TREE_TYPE (tmp), 1));
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index 5e4191809832..0b5ea14629a9 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -2042,7 +2042,7 @@ gfc_omp_get_array_size (location_t loc, tree desc, gimple_seq *seq)
tree end;
if (GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc)) == GFC_ARRAY_ASSUMED_SHAPE_CONT
|| GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc)) == GFC_ARRAY_ASSUMED_SHAPE)
- end = gfc_conv_descriptor_rank (desc);
+ end = gfc_conv_descriptor_rank_get (desc);
else
end = build_int_cst (signed_char_type_node,
GFC_TYPE_ARRAY_RANK (TREE_TYPE (desc)));
diff --git a/gcc/fortran/trans-stmt.cc b/gcc/fortran/trans-stmt.cc
index 3f7c3c0955c1..1867f67b16e3 100644
--- a/gcc/fortran/trans-stmt.cc
+++ b/gcc/fortran/trans-stmt.cc
@@ -4001,7 +4001,7 @@ gfc_trans_select_rank_cases (gfc_code * code)
/* Calculate the switch expression. */
gfc_init_se (&se, NULL);
gfc_conv_expr_descriptor (&se, code->expr1);
- rank = gfc_conv_descriptor_rank (se.expr);
+ rank = gfc_conv_descriptor_rank_get (se.expr);
rank = gfc_evaluate_now (rank, &block);
symbol_attribute attr = gfc_expr_attr (code->expr1);
if (!attr.pointer && !attr.allocatable)
More information about the Gcc-cvs
mailing list