[gcc(refs/users/mikael/heads/refactor_descriptor_v08)] Suppression gfc_conv_descriptor_elem_len compil' OK
Mikael Morin
mikael@gcc.gnu.org
Fri Sep 19 19:14:00 GMT 2025
https://gcc.gnu.org/g:db67b7370207d0335f8d3649cd9ecd7694747686
commit db67b7370207d0335f8d3649cd9ecd7694747686
Author: Mikael Morin <mikael@gcc.gnu.org>
Date: Sun Jun 29 12:40:53 2025 +0200
Suppression gfc_conv_descriptor_elem_len compil' OK
Correction ICE class_allocate_21
Suppression non_lvalue elem_len_get
Ajout location elem_len_set
Suppression retour à la ligne inutile elem_len_set
Diff:
---
gcc/fortran/trans-array.cc | 8 ++------
gcc/fortran/trans-decl.cc | 10 +++++-----
gcc/fortran/trans-descriptor.cc | 18 ++++++++++++++++--
gcc/fortran/trans-descriptor.h | 3 ++-
gcc/fortran/trans-expr.cc | 6 +++---
gcc/fortran/trans-intrinsic.cc | 2 +-
gcc/fortran/trans-openmp.cc | 6 +++---
7 files changed, 32 insertions(+), 21 deletions(-)
diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index ed2fc71c431d..6f441be2bb42 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -5927,11 +5927,7 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset,
else if (expr->ts.type == BT_CLASS && !explicit_ts
&& expr3 && expr3->ts.type != BT_CLASS
&& expr3_elem_size != NULL_TREE && expr3_desc == NULL_TREE)
- {
- tmp = gfc_conv_descriptor_elem_len (descriptor);
- gfc_add_modify (pblock, tmp,
- fold_convert (TREE_TYPE (tmp), expr3_elem_size));
- }
+ gfc_conv_descriptor_elem_len_set (pblock, descriptor, expr3_elem_size);
else
gfc_conv_descriptor_dtype_set (pblock, descriptor, gfc_get_dtype (type));
@@ -11301,7 +11297,7 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
{
/* Unfortunately, the lhs vptr is set too early in many cases.
Play it safe by using the descriptor element length. */
- tmp = gfc_conv_descriptor_elem_len (desc);
+ tmp = gfc_conv_descriptor_elem_len_get (desc);
elemsize1 = fold_convert (gfc_array_index_type, tmp);
}
else
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index 53b955ea47e0..107e5904d312 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -7314,8 +7314,8 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally,
if (sym->ts.type == BT_ASSUMED)
{
/* For type(*), take elem_len + dtype.type from the actual argument. */
- gfc_add_modify (&block, gfc_conv_descriptor_elem_len (gfc_desc),
- gfc_get_cfi_desc_elem_len (cfi));
+ gfc_conv_descriptor_elem_len_set (&block, gfc_desc,
+ gfc_get_cfi_desc_elem_len (cfi));
tree cond;
tree ctype = gfc_get_cfi_desc_type (cfi);
ctype = fold_build2_loc (input_location, BIT_AND_EXPR, TREE_TYPE (ctype),
@@ -7545,7 +7545,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally,
/* memcpy (lhs + idx*elem_len, rhs + shift, elem_len) */
tree elem_len;
if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
- elem_len = gfc_conv_descriptor_elem_len (gfc_desc);
+ elem_len = gfc_conv_descriptor_elem_len_get (gfc_desc);
else
elem_len = gfc_get_cfi_desc_elem_len (cfi);
lhs = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
@@ -7583,7 +7583,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally,
/* if do_copy_inout: gfc->dspan = gfc->dtype.elem_len
We use gfc instead of cfi on the RHS as this might be a constant. */
tmp = fold_convert (gfc_array_index_type,
- gfc_conv_descriptor_elem_len (gfc_desc));
+ gfc_conv_descriptor_elem_len_get (gfc_desc));
if (!do_copy_inout)
{
/* gfc->dspan = ((cfi->dim[0].sm % gfc->elem_len)
@@ -7787,7 +7787,7 @@ done:
/* memcpy (lhs + shift, rhs + idx*elem_len, elem_len) */
tree elem_len;
if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
- elem_len = gfc_conv_descriptor_elem_len (gfc_desc);
+ elem_len = gfc_conv_descriptor_elem_len_get (gfc_desc);
else
elem_len = gfc_get_cfi_desc_elem_len (cfi);
rhs = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 255b243d9360..8fe0e3bfaa9d 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -315,8 +315,8 @@ gfc_conv_descriptor_version (tree desc)
/* Return the element length from the descriptor dtype field. */
-tree
-gfc_conv_descriptor_elem_len (tree desc)
+static tree
+get_descriptor_elem_len (tree desc)
{
tree tmp;
tree dtype;
@@ -330,6 +330,20 @@ gfc_conv_descriptor_elem_len (tree desc)
dtype, tmp, NULL_TREE);
}
+tree
+gfc_conv_descriptor_elem_len_get (tree desc)
+{
+ return get_descriptor_elem_len (desc);
+}
+
+void
+gfc_conv_descriptor_elem_len_set (stmtblock_t *block, tree desc, tree value)
+{
+ location_t loc = input_location;
+ tree t = get_descriptor_elem_len (desc);
+ gfc_add_modify_loc (loc, block, t,
+ fold_convert_loc (loc, TREE_TYPE (t), value));
+}
tree
gfc_conv_descriptor_attribute (tree desc)
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index 108d15bec7ec..8cd65b46f5fa 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -50,7 +50,6 @@ tree gfc_get_cfi_dim_sm (tree desc, tree idx);
tree gfc_conv_descriptor_rank (tree desc);
tree gfc_conv_descriptor_version (tree desc);
-tree gfc_conv_descriptor_elem_len (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_token (tree desc);
tree gfc_conv_descriptor_data_get (tree desc);
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_span_get (tree desc);
tree gfc_conv_descriptor_stride_get (tree desc, tree dim);
@@ -70,6 +70,7 @@ void gfc_conv_descriptor_data_set (stmtblock_t *block, tree desc, tree value);
void gfc_conv_descriptor_data_set (stmtblock_t *block, tree desc, tree value);
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_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 6ffc17fae697..fa422dbb87ae 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -130,7 +130,7 @@ gfc_conv_scalar_to_descriptor (gfc_se *se, tree scalar, symbol_attribute attr)
gfc_get_dtype_rank_type (0, etype));
gfc_conv_descriptor_data_set (&se->pre, desc, scalar);
gfc_conv_descriptor_span_set (&se->pre, desc,
- gfc_conv_descriptor_elem_len (desc));
+ gfc_conv_descriptor_elem_len_get (desc));
/* Copy pointer address back - but only if it could have changed and
if the actual argument is a pointer and not, e.g., NULL(). */
@@ -6284,7 +6284,7 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym)
}
else if (e->ts.type == BT_ASSUMED)
{
- tmp = gfc_conv_descriptor_elem_len (gfc);
+ tmp = gfc_conv_descriptor_elem_len_get (gfc);
tmp2 = gfc_get_cfi_desc_elem_len (cfi);
gfc_add_modify (&block2, tmp2, fold_convert (TREE_TYPE (tmp2), tmp));
}
@@ -6299,7 +6299,7 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym)
tree type = fold_convert (TREE_TYPE (ctype),
gfc_conv_descriptor_type (gfc));
tree kind = fold_convert (TREE_TYPE (ctype),
- gfc_conv_descriptor_elem_len (gfc));
+ gfc_conv_descriptor_elem_len_get (gfc));
kind = fold_build2_loc (input_location, LSHIFT_EXPR, TREE_TYPE (type),
kind, build_int_cst (TREE_TYPE (type),
CFI_type_kind_shift));
diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index dbd29f683623..e9489f07dc07 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -8355,7 +8355,7 @@ gfc_conv_intrinsic_sizeof (gfc_se *se, gfc_expr *expr)
if (POINTER_TYPE_P (TREE_TYPE (tmp)))
tmp = build_fold_indirect_ref_loc (input_location, tmp);
- tmp = gfc_conv_descriptor_elem_len (tmp);
+ tmp = gfc_conv_descriptor_elem_len_get (tmp);
byte_size = fold_convert (gfc_array_index_type, tmp);
}
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index 2b2cef7e8ab9..5e4191809832 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -196,7 +196,7 @@ gfc_omp_array_size (tree decl, gimple_seq *pre_p)
size = fold_convert (size_type_node, size);
tree elemsz = gfc_get_element_type (TREE_TYPE (decl));
if (TREE_CODE (elemsz) == ARRAY_TYPE && TYPE_STRING_FLAG (elemsz))
- elemsz = gfc_conv_descriptor_elem_len (decl);
+ elemsz = gfc_conv_descriptor_elem_len_get (decl);
else
elemsz = TYPE_SIZE_UNIT (elemsz);
size = fold_build2 (MULT_EXPR, size_type_node, size, elemsz);
@@ -2206,7 +2206,7 @@ gfc_omp_deep_mapping_item (bool is_cnt, bool do_copy, bool do_alloc_check,
/* TODO: Optimization: Shouldn't this be an expr. const, except for
deferred-length strings. (Cf. also below). */
elem_len = (poly ? gfc_class_vtab_size_get (class_decl)
- : gfc_conv_descriptor_elem_len (decl));
+ : gfc_conv_descriptor_elem_len_get (decl));
tmp = (POINTER_TYPE_P (TREE_TYPE (decl))
? build_fold_indirect_ref (decl) : decl);
size = gfc_omp_get_array_size (loc, tmp, seq);
@@ -2251,7 +2251,7 @@ gfc_omp_deep_mapping_item (bool is_cnt, bool do_copy, bool do_alloc_check,
{
if (elem_len == NULL_TREE)
{
- elem_len = gfc_conv_descriptor_elem_len (decl);
+ elem_len = gfc_conv_descriptor_elem_len_get (decl);
size = fold_convert (size_type_node,
gfc_omp_get_array_size (loc, decl, seq));
}
More information about the Gcc-cvs
mailing list