https://gcc.gnu.org/g:1240240281dc11c42018ac2d5463cab9a98f1b98
commit 1240240281dc11c42018ac2d5463cab9a98f1b98 Author: Mikael Morin <[email protected]> Date: Thu Oct 30 13:00:19 2025 +0100 fortran: array descriptor: Move bound shift utility function Regression tested on powerpc64le-unknown-linux-gnu. OK for master? -- >8 -- Move gfc_conv_shift_descriptor_lbound to trans-descriptor.cc gcc/fortran/ChangeLog: * trans-array.cc (gfc_conv_shift_descriptor_lbound): Move function ... * trans-descriptor.cc (gfc_conv_shift_descriptor_lbound): ... to this file. * trans-array.h (gfc_conv_shift_descriptor_lbound): Move declaration ... * trans-descriptor.h (gfc_conv_shift_descriptor_lbound): ... to this file. Diff: --- gcc/fortran/trans-array.cc | 37 ------------------------------------- gcc/fortran/trans-array.h | 3 --- gcc/fortran/trans-descriptor.cc | 37 +++++++++++++++++++++++++++++++++++++ gcc/fortran/trans-descriptor.h | 3 +++ 4 files changed, 40 insertions(+), 40 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 5f0d3b009864..383a92df7d35 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -216,43 +216,6 @@ gfc_get_cfi_dim_sm (tree desc, tree idx) #undef CFI_DIM_FIELD_SM -/* Modify a descriptor such that the lbound of a given dimension is the value - specified. This also updates ubound and offset accordingly. */ - -void -gfc_conv_shift_descriptor_lbound (stmtblock_t* block, tree desc, - int dim, tree new_lbound) -{ - tree offs, ubound, lbound, stride; - tree diff, offs_diff; - - new_lbound = fold_convert (gfc_array_index_type, new_lbound); - - offs = gfc_conv_descriptor_offset_get (desc); - lbound = gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[dim]); - ubound = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[dim]); - stride = gfc_conv_descriptor_stride_get (desc, gfc_rank_cst[dim]); - - /* Get difference (new - old) by which to shift stuff. */ - diff = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, - new_lbound, lbound); - - /* Shift ubound and offset accordingly. This has to be done before - updating the lbound, as they depend on the lbound expression! */ - ubound = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, - ubound, diff); - gfc_conv_descriptor_ubound_set (block, desc, gfc_rank_cst[dim], ubound); - offs_diff = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, - diff, stride); - offs = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, - offs, offs_diff); - gfc_conv_descriptor_offset_set (block, desc, offs); - - /* Finally set lbound to value we want. */ - gfc_conv_descriptor_lbound_set (block, desc, gfc_rank_cst[dim], new_lbound); -} - - /* Mark a SS chain as used. Flags specifies in which loops the SS is used. flags & 1 = Main loop body. flags & 2 = temp copy loop. */ diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h index f456532a47d9..ce39dea25248 100644 --- a/gcc/fortran/trans-array.h +++ b/gcc/fortran/trans-array.h @@ -178,9 +178,6 @@ tree gfc_get_cfi_dim_extent (tree, tree); tree gfc_get_cfi_dim_sm (tree, tree); -/* Shift lower bound of descriptor, updating ubound and offset. */ -void gfc_conv_shift_descriptor_lbound (stmtblock_t*, tree, int, tree); - /* Add pre-loop scalarization code for intrinsic functions which require special handling. */ void gfc_add_intrinsic_ss_code (gfc_loopinfo *, gfc_ss *); diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index f872bb8c12a3..57297fcf75d7 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -462,3 +462,40 @@ gfc_conv_descriptor_cosize (tree desc, int rank, int corank) { return gfc_conv_descriptor_size_1 (desc, rank, rank + corank - 1); } + + +/* Modify a descriptor such that the lbound of a given dimension is the value + specified. This also updates ubound and offset accordingly. */ + +void +gfc_conv_shift_descriptor_lbound (stmtblock_t* block, tree desc, + int dim, tree new_lbound) +{ + tree offs, ubound, lbound, stride; + tree diff, offs_diff; + + new_lbound = fold_convert (gfc_array_index_type, new_lbound); + + offs = gfc_conv_descriptor_offset_get (desc); + lbound = gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[dim]); + ubound = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[dim]); + stride = gfc_conv_descriptor_stride_get (desc, gfc_rank_cst[dim]); + + /* Get difference (new - old) by which to shift stuff. */ + diff = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, + new_lbound, lbound); + + /* Shift ubound and offset accordingly. This has to be done before + updating the lbound, as they depend on the lbound expression! */ + ubound = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, + ubound, diff); + gfc_conv_descriptor_ubound_set (block, desc, gfc_rank_cst[dim], ubound); + offs_diff = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, + diff, stride); + offs = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, + offs, offs_diff); + gfc_conv_descriptor_offset_set (block, desc, offs); + + /* Finally set lbound to value we want. */ + gfc_conv_descriptor_lbound_set (block, desc, gfc_rank_cst[dim], new_lbound); +} diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h index 826a6ce88297..fefa152e2d76 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -57,4 +57,7 @@ tree gfc_build_null_descriptor (tree type); tree gfc_conv_descriptor_size (tree, int); tree gfc_conv_descriptor_cosize (tree, int, int); +/* Shift lower bound of descriptor, updating ubound and offset. */ +void gfc_conv_shift_descriptor_lbound (stmtblock_t*, tree, int, tree); + #endif /* GFC_TRANS_DESCRIPTOR_H */
