https://gcc.gnu.org/g:e80fd2b91dbfe91a4dba979da5a2956177d3a584
commit e80fd2b91dbfe91a4dba979da5a2956177d3a584 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Wed Jul 23 14:59:35 2025 +0200 Extraction gfc_shift_descriptor Diff: --- gcc/fortran/trans-descriptor.cc | 31 +++++++++++++++++++++++++++++++ gcc/fortran/trans-descriptor.h | 2 ++ gcc/fortran/trans-expr.cc | 38 ++------------------------------------ 3 files changed, 35 insertions(+), 36 deletions(-) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index bc7f951bb528..ac426dd9677b 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -2002,3 +2002,34 @@ gfc_set_temporary_descriptor (stmtblock_t *block, tree descr, tree class_src, gfc_conv_descriptor_data_set (block, descr, data_ptr); } + +void +gfc_shift_descriptor (stmtblock_t *block, tree descr, int rank, + tree lbound[GFC_MAX_DIMENSIONS], + tree ubound[GFC_MAX_DIMENSIONS]) +{ + tree size = gfc_index_one_node; + tree offset = gfc_index_zero_node; + for (int n = 0; n < rank; n++) + { + tree tmp = gfc_conv_descriptor_ubound_get (descr, gfc_rank_cst[n]); + tmp = fold_build2_loc (input_location, PLUS_EXPR, + gfc_array_index_type, tmp, + gfc_index_one_node); + gfc_conv_descriptor_ubound_set (block, descr, gfc_rank_cst[n], tmp); + gfc_conv_descriptor_lbound_set (block, descr, gfc_rank_cst[n], + gfc_index_one_node); + size = gfc_evaluate_now (size, block); + offset = fold_build2_loc (input_location, MINUS_EXPR, + gfc_array_index_type, offset, size); + offset = gfc_evaluate_now (offset, block); + tmp = fold_build2_loc (input_location, MINUS_EXPR, + gfc_array_index_type, ubound[n], lbound[n]); + tmp = fold_build2_loc (input_location, PLUS_EXPR, + gfc_array_index_type, tmp, gfc_index_one_node); + size = fold_build2_loc (input_location, MULT_EXPR, + gfc_array_index_type, size, tmp); + } + + gfc_conv_descriptor_offset_set (block, descr, offset); +} diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h index 0ec506686b93..ccb6d3c048da 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -135,5 +135,7 @@ void gfc_copy_descriptor (stmtblock_t *, tree, tree, tree, int, gfc_ss *); void gfc_set_temporary_descriptor (stmtblock_t *, tree, tree, tree, tree, tree [GFC_MAX_DIMENSIONS], tree [GFC_MAX_DIMENSIONS], int, bool, bool); +void gfc_shift_descriptor (stmtblock_t *, tree, int, tree [GFC_MAX_DIMENSIONS], + tree [GFC_MAX_DIMENSIONS]); #endif /* GFC_TRANS_DESCRIPTOR_H */ diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index 0b603aef0c26..8051289ddb80 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -5627,42 +5627,8 @@ class_array_fcn: /* Determine the offset for pointer formal arguments and set the lbounds to one. */ if (formal_ptr) - { - size = gfc_index_one_node; - offset = gfc_index_zero_node; - for (n = 0; n < dimen; n++) - { - tmp = gfc_conv_descriptor_ubound_get (parmse->expr, - gfc_rank_cst[n]); - tmp = fold_build2_loc (input_location, PLUS_EXPR, - gfc_array_index_type, tmp, - gfc_index_one_node); - gfc_conv_descriptor_ubound_set (&parmse->pre, - parmse->expr, - gfc_rank_cst[n], - tmp); - gfc_conv_descriptor_lbound_set (&parmse->pre, - parmse->expr, - gfc_rank_cst[n], - gfc_index_one_node); - size = gfc_evaluate_now (size, &parmse->pre); - offset = fold_build2_loc (input_location, MINUS_EXPR, - gfc_array_index_type, - offset, size); - offset = gfc_evaluate_now (offset, &parmse->pre); - tmp = fold_build2_loc (input_location, MINUS_EXPR, - gfc_array_index_type, - rse.loop->to[n], rse.loop->from[n]); - tmp = fold_build2_loc (input_location, PLUS_EXPR, - gfc_array_index_type, - tmp, gfc_index_one_node); - size = fold_build2_loc (input_location, MULT_EXPR, - gfc_array_index_type, size, tmp); - } - - gfc_conv_descriptor_offset_set (&parmse->pre, parmse->expr, - offset); - } + gfc_shift_descriptor (&parmse->pre, parmse->expr, dimen, + rse.loop->from, rse.loop->to); /* We want either the address for the data or the address of the descriptor, depending on the mode of passing array arguments. */