https://gcc.gnu.org/g:8fd3bbc0668da212f027c9dbe689b4a69a580f6b
commit 8fd3bbc0668da212f027c9dbe689b4a69a580f6b Author: Mikael Morin <mik...@gcc.gnu.org> Date: Sun Mar 30 18:16:46 2025 +0200 Réduction utilisations stride_get Correction régression gomp/pr36726.f90 Diff: --- gcc/fortran/trans-decl.cc | 4 +--- gcc/fortran/trans-openmp.cc | 45 +++++++++++++++++++++++++++------------------ 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc index 0c48f7a062d1..d88ad3655c19 100644 --- a/gcc/fortran/trans-decl.cc +++ b/gcc/fortran/trans-decl.cc @@ -7597,9 +7597,7 @@ done: tmp = gfc_conv_descriptor_extent_get (gfc_desc, idx); gfc_add_modify (&loop_body, gfc_get_cfi_dim_extent (cfi, idx), tmp); /* d->dim[n].sm = gfc->dim[i].stride * gfc->span); */ - tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, - gfc_conv_descriptor_stride_get (gfc_desc, idx), - gfc_conv_descriptor_span_get (gfc_desc)); + tmp = gfc_conv_descriptor_sm_get (gfc_desc, idx); gfc_add_modify (&loop_body, gfc_get_cfi_dim_sm (cfi, idx), tmp); /* Generate loop. */ diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc index f1b50ea00b6b..4ac7ea0893c1 100644 --- a/gcc/fortran/trans-openmp.cc +++ b/gcc/fortran/trans-openmp.cc @@ -779,14 +779,17 @@ gfc_omp_clause_default_ctor (tree clause, tree decl, tree outer) gfc_add_modify (&cond_block, decl, outer); tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1]; size = gfc_conv_descriptor_extent_get (decl, rank); - if (GFC_TYPE_ARRAY_RANK (type) > 1) + if (GFC_TYPE_ARRAY_RANK (type) >= 1) size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, size, - gfc_conv_descriptor_stride_get (decl, rank)); - tree esize = fold_convert (gfc_array_index_type, - TYPE_SIZE_UNIT (gfc_get_element_type (type))); - size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, - size, esize); + gfc_conv_descriptor_sm_get (decl, rank)); + else + { + tree esize = gfc_conv_descriptor_span_get (decl); + esize = fold_convert_loc (input_location, gfc_array_index_type, esize); + size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, + size, esize); + } size = unshare_expr (size); size = gfc_evaluate_now (fold_convert (size_type_node, size), &cond_block); @@ -965,14 +968,17 @@ gfc_omp_clause_copy_ctor (tree clause, tree dest, tree src) { tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1]; size = gfc_conv_descriptor_extent_get (dest, rank); - if (GFC_TYPE_ARRAY_RANK (type) > 1) + if (GFC_TYPE_ARRAY_RANK (type) >= 1) size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, size, - gfc_conv_descriptor_stride_get (dest, rank)); - tree esize = fold_convert (gfc_array_index_type, - TYPE_SIZE_UNIT (gfc_get_element_type (type))); - size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, - size, esize); + gfc_conv_descriptor_sm_get (dest, rank)); + else + { + tree esize = gfc_conv_descriptor_span_get (dest); + esize = fold_convert_loc (input_location, gfc_array_index_type, esize); + size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, + size, esize); + } size = unshare_expr (size); size = gfc_evaluate_now (fold_convert (size_type_node, size), &cond_block); @@ -1083,14 +1089,17 @@ gfc_omp_clause_assign_op (tree clause, tree dest, tree src) { tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1]; size = gfc_conv_descriptor_extent_get (src, rank); - if (GFC_TYPE_ARRAY_RANK (type) > 1) + if (GFC_TYPE_ARRAY_RANK (type) >= 1) size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, size, - gfc_conv_descriptor_stride_get (src, rank)); - tree esize = fold_convert (gfc_array_index_type, - TYPE_SIZE_UNIT (gfc_get_element_type (type))); - size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, - size, esize); + gfc_conv_descriptor_sm_get (src, rank)); + else + { + tree esize = gfc_conv_descriptor_span_get (src); + esize = fold_convert_loc (input_location, gfc_array_index_type, esize); + size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, + size, esize); + } size = unshare_expr (size); size = gfc_evaluate_now (fold_convert (size_type_node, size), &cond_block);