https://gcc.gnu.org/g:dc9ad59374db7e17c9c61f6b71ab28d9c3f0a529
commit dc9ad59374db7e17c9c61f6b71ab28d9c3f0a529 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Wed Jul 16 21:39:51 2025 +0200 Extraction gfc_conv_shift_descriptor Diff: --- gcc/fortran/trans-descriptor.cc | 45 +++++++++++++++++++++++++++++++++++++++++ gcc/fortran/trans-descriptor.h | 1 + 2 files changed, 46 insertions(+) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index bc6c081a8e51..1ba49bb61f5a 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -963,6 +963,9 @@ gfc_nullify_descriptor (stmtblock_t *block, tree descr) int gfc_descriptor_rank (tree descriptor) { + if (TREE_TYPE (descriptor) != NULL_TREE) + return GFC_TYPE_ARRAY_RANK (TREE_TYPE (descriptor)); + tree dim = gfc_get_descriptor_dimension (descriptor); tree dim_type = TREE_TYPE (dim); gcc_assert (TREE_CODE (dim_type) == ARRAY_TYPE); @@ -1130,3 +1133,45 @@ gfc_conv_remap_descriptor (stmtblock_t *block, tree dest, tree src, gfc_conv_remap_descriptor (block, dest, src, src_rank, as); } + +void +gfc_conv_shift_descriptor (stmtblock_t *block, tree dest, tree src, + int rank, tree zero_cond) +{ + tree tmp = gfc_conv_descriptor_data_get (src); + gfc_conv_descriptor_data_set (block, dest, tmp); + + tree offset = gfc_index_zero_node; + for (int n = 0 ; n < rank; n++) + { + tree lbound; + + lbound = gfc_conv_descriptor_lbound_get (dest, gfc_rank_cst[n]); + lbound = fold_build3_loc (input_location, COND_EXPR, + gfc_array_index_type, zero_cond, + gfc_index_one_node, lbound); + lbound = gfc_evaluate_now (lbound, block); + + tmp = gfc_conv_descriptor_ubound_get (src, gfc_rank_cst[n]); + tmp = fold_build2_loc (input_location, PLUS_EXPR, + gfc_array_index_type, tmp, lbound); + gfc_conv_descriptor_lbound_set (block, dest, + gfc_rank_cst[n], lbound); + gfc_conv_descriptor_ubound_set (block, dest, + gfc_rank_cst[n], tmp); + + /* Set stride and accumulate the offset. */ + tmp = gfc_conv_descriptor_stride_get (src, gfc_rank_cst[n]); + gfc_conv_descriptor_stride_set (block, dest, + gfc_rank_cst[n], tmp); + tmp = fold_build2_loc (input_location, MULT_EXPR, + gfc_array_index_type, lbound, tmp); + offset = fold_build2_loc (input_location, MINUS_EXPR, + gfc_array_index_type, offset, tmp); + offset = gfc_evaluate_now (offset, block); + } + + gfc_conv_descriptor_offset_set (block, dest, offset); +} + + diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h index 94d85a20437a..ec0306ead91a 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -108,5 +108,6 @@ void gfc_copy_sequence_descriptor (stmtblock_t &, tree, tree, bool); int gfc_descriptor_rank (tree); void gfc_conv_remap_descriptor (stmtblock_t *, tree, tree, int, const gfc_array_ref &as); +void gfc_conv_shift_descriptor (stmtblock_t *, tree, tree, int, tree); #endif /* GFC_TRANS_DESCRIPTOR_H */