https://gcc.gnu.org/g:4696d2d4523e40e27d394d8274182f3f38e5844d
commit 4696d2d4523e40e27d394d8274182f3f38e5844d Author: Mikael Morin <mik...@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 23e3a64d04c8..7218df21885e 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -5838,11 +5838,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)); @@ -11202,7 +11198,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 e448f37820e1..c89047acdcc8 100644 --- a/gcc/fortran/trans-decl.cc +++ b/gcc/fortran/trans-decl.cc @@ -7276,8 +7276,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), @@ -7507,7 +7507,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, @@ -7545,7 +7545,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) @@ -7749,7 +7749,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 34a71cfda5d4..ea4817d1cc16 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -316,8 +316,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; @@ -331,6 +331,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 5343e3c532c4..f6bb5dd8bfba 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(). */ @@ -6215,7 +6215,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)); } @@ -6230,7 +6230,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 bc2e40e96620..c8c49984944c 100644 --- a/gcc/fortran/trans-intrinsic.cc +++ b/gcc/fortran/trans-intrinsic.cc @@ -8167,7 +8167,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 726f3da65235..886f9d7d97db 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)); }