https://gcc.gnu.org/g:4f4d8259a58d93480f46b4911a6f0a41cc31b85b
commit 4f4d8259a58d93480f46b4911a6f0a41cc31b85b Author: Mikael Morin <mik...@gcc.gnu.org> Date: Sun Jun 29 12:40:53 2025 +0200 Suppression gfc_conv_descriptor_elem_len compil' OK Diff: --- gcc/fortran/trans-array.cc | 10 ++++------ gcc/fortran/trans-decl.cc | 10 +++++----- gcc/fortran/trans-descriptor.cc | 17 +++++++++++++++-- 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, 33 insertions(+), 21 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 6ba9e3dd05ef..861872303d18 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -5673,11 +5673,9 @@ 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, + fold_convert (TREE_TYPE (tmp), + expr3_elem_size)); else gfc_conv_descriptor_dtype_set (pblock, descriptor, gfc_get_dtype (type)); @@ -10941,7 +10939,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 cf10bbf0baef..0956343aad92 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,19 @@ gfc_conv_descriptor_elem_len (tree desc) dtype, tmp, NULL_TREE); } +tree +gfc_conv_descriptor_elem_len_get (tree desc) +{ + return non_lvalue_loc (input_location, get_descriptor_elem_len (desc)); +} + +void +gfc_conv_descriptor_elem_len_set (stmtblock_t *block, tree desc, + tree value) +{ + tree t = get_descriptor_elem_len (desc); + gfc_add_modify (block, t, fold_convert (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 75bc74afeeb2..6149dc295ed5 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -31,7 +31,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); @@ -41,6 +40,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); @@ -51,6 +51,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 dde7457a28b8..52587ecb8bad 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(). */ @@ -6214,7 +6214,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)); } @@ -6229,7 +6229,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 b19ebd6c02d4..0030344a7161 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 a4ba948e47f6..5e0732b1035d 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)); }