https://gcc.gnu.org/g:2438d1a7204809bc9e5bc4dcce37bb57816ebae3
commit 2438d1a7204809bc9e5bc4dcce37bb57816ebae3 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Thu Jul 31 20:48:05 2025 +0200 Déplacement copy_descriptor Diff: --- gcc/fortran/trans-descriptor.cc | 42 +++++++++++++++++++++++++++++++++++++ gcc/fortran/trans-descriptor.h | 1 + gcc/fortran/trans-stmt.cc | 46 ++--------------------------------------- 3 files changed, 45 insertions(+), 44 deletions(-) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 2485159a7617..4f781f4976f7 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -1225,6 +1225,48 @@ gfc_copy_descriptor (stmtblock_t *block, tree dest, tree src, bool lhs_type) } +void +gfc_copy_descriptor (stmtblock_t *block, tree dst, tree src, int rank) +{ + int n; + tree dim; + tree tmp; + tree tmp2; + tree size; + tree offset; + + offset = gfc_index_zero_node; + + /* Use memcpy to copy the descriptor. The size is the minimum of + the sizes of 'src' and 'dst'. This avoids a non-trivial conversion. */ + tmp = TYPE_SIZE_UNIT (TREE_TYPE (src)); + tmp2 = TYPE_SIZE_UNIT (TREE_TYPE (dst)); + size = fold_build2_loc (input_location, MIN_EXPR, + TREE_TYPE (tmp), tmp, tmp2); + tmp = builtin_decl_explicit (BUILT_IN_MEMCPY); + tmp = build_call_expr_loc (input_location, tmp, 3, + gfc_build_addr_expr (NULL_TREE, dst), + gfc_build_addr_expr (NULL_TREE, src), + fold_convert (size_type_node, size)); + gfc_add_expr_to_block (block, tmp); + + /* Set the offset correctly. */ + for (n = 0; n < rank; n++) + { + dim = gfc_rank_cst[n]; + tmp = gfc_conv_descriptor_lbound_get (src, dim); + tmp2 = gfc_conv_descriptor_stride_get (src, dim); + tmp = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (tmp), + tmp, tmp2); + offset = fold_build2_loc (input_location, MINUS_EXPR, + TREE_TYPE (offset), offset, tmp); + offset = gfc_evaluate_now (offset, block); + } + + gfc_conv_descriptor_offset_set (block, dst, offset); +} + + void gfc_set_descriptor (stmtblock_t *block, tree dest, tree src, gfc_expr *src_expr, int rank, int corank, gfc_ss *ss, gfc_array_info *info, diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h index 4826d7a5bd94..2c2e4e5dbf75 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -103,6 +103,7 @@ void gfc_conv_remap_descriptor (stmtblock_t *, tree, int, tree, int, void gfc_conv_shift_descriptor (stmtblock_t *, tree, tree, int, tree); void gfc_copy_descriptor (stmtblock_t *, tree, tree, gfc_expr *, bool); void gfc_copy_descriptor (stmtblock_t *, tree, tree, bool); +void gfc_copy_descriptor (stmtblock_t *, tree, tree, int); void gfc_set_descriptor (stmtblock_t *block, tree dest, tree src, gfc_expr *src_expr, int rank, int corank, gfc_ss *ss, gfc_array_info *info, diff --git a/gcc/fortran/trans-stmt.cc b/gcc/fortran/trans-stmt.cc index ba90d5cdc89a..de625b293eae 100644 --- a/gcc/fortran/trans-stmt.cc +++ b/gcc/fortran/trans-stmt.cc @@ -1825,48 +1825,6 @@ class_has_len_component (gfc_symbol *sym) } -static void -copy_descriptor (stmtblock_t *block, tree dst, tree src, int rank) -{ - int n; - tree dim; - tree tmp; - tree tmp2; - tree size; - tree offset; - - offset = gfc_index_zero_node; - - /* Use memcpy to copy the descriptor. The size is the minimum of - the sizes of 'src' and 'dst'. This avoids a non-trivial conversion. */ - tmp = TYPE_SIZE_UNIT (TREE_TYPE (src)); - tmp2 = TYPE_SIZE_UNIT (TREE_TYPE (dst)); - size = fold_build2_loc (input_location, MIN_EXPR, - TREE_TYPE (tmp), tmp, tmp2); - tmp = builtin_decl_explicit (BUILT_IN_MEMCPY); - tmp = build_call_expr_loc (input_location, tmp, 3, - gfc_build_addr_expr (NULL_TREE, dst), - gfc_build_addr_expr (NULL_TREE, src), - fold_convert (size_type_node, size)); - gfc_add_expr_to_block (block, tmp); - - /* Set the offset correctly. */ - for (n = 0; n < rank; n++) - { - dim = gfc_rank_cst[n]; - tmp = gfc_conv_descriptor_lbound_get (src, dim); - tmp2 = gfc_conv_descriptor_stride_get (src, dim); - tmp = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (tmp), - tmp, tmp2); - offset = fold_build2_loc (input_location, MINUS_EXPR, - TREE_TYPE (offset), offset, tmp); - offset = gfc_evaluate_now (offset, block); - } - - gfc_conv_descriptor_offset_set (block, dst, offset); -} - - /* Do proper initialization for ASSOCIATE names. */ static void @@ -1995,7 +1953,7 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block) attributes so the selector descriptor must be copied in and copied out. */ if (rank > 0) - copy_descriptor (&se.pre, desc, se.expr, rank); + gfc_copy_descriptor (&se.pre, desc, se.expr, rank); else { tmp = gfc_conv_descriptor_data_get (se.expr); @@ -2024,7 +1982,7 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block) || CLASS_DATA (sym)->attr.pointer))) { if (rank > 0) - copy_descriptor (&se.post, se.expr, desc, rank); + gfc_copy_descriptor (&se.post, se.expr, desc, rank); else gfc_conv_descriptor_data_set (&se.post, se.expr, desc);