https://gcc.gnu.org/g:ac519f799799764075d7d50fb6e1fda9cdcf825a
commit ac519f799799764075d7d50fb6e1fda9cdcf825a Author: Mikael Morin <mik...@gcc.gnu.org> Date: Fri Aug 15 15:42:37 2025 +0200 Déroulement boucle set_gfc_from_cfi Diff: --- gcc/fortran/trans-descriptor.cc | 78 ++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index e60a5bde4f5c..fccdbbf147bb 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -2022,26 +2022,6 @@ gfc_set_gfc_from_cfi (stmtblock_t *block, stmtblock_t *block2, tree gfc_desc, tree offset = gfc_create_var (gfc_array_index_type, "offset"); gfc_add_modify (block2, offset, gfc_index_zero_node); - if (sym->as->rank > 0 && !sym->attr.pointer && !sym->attr.allocatable) - for (int i = 0; i < sym->as->rank; ++i) - { - gfc_se se; - gfc_init_se (&se, NULL ); - if (sym->as->lower[i]) - { - gfc_conv_expr (&se, sym->as->lower[i]); - tmp = se.expr; - } - else - tmp = gfc_index_one_node; - gfc_add_block_to_block (block2, &se.pre); - gfc_conv_descriptor_lbound_set (block2, gfc_desc, gfc_rank_cst[i], tmp); - gfc_add_block_to_block (block2, &se.post); - } - - /* Loop: for (i = 0; i < rank; ++i). */ - tree idx = gfc_create_var (TREE_TYPE (rank), "idx"); - /* Stride */ tree stride; if (do_copy_inout) @@ -2049,25 +2029,51 @@ gfc_set_gfc_from_cfi (stmtblock_t *block, stmtblock_t *block2, tree gfc_desc, else stride = NULL_TREE; - /* Loop body. */ - stmtblock_t loop_body; - gfc_init_block (&loop_body); - /* gfc->dim[i].lbound = ... */ - tree lbound; - if (sym->attr.pointer || sym->attr.allocatable) - lbound = gfc_get_cfi_dim_lbound (cfi, idx); - else if (sym->as->rank < 0) - lbound = gfc_index_one_node; + if (sym->as->rank > 0 && !sym->attr.pointer && !sym->attr.allocatable) + { + for (int i = 0; i < sym->as->rank; ++i) + { + gfc_se se; + gfc_init_se (&se, NULL ); + if (sym->as->lower[i]) + { + gfc_conv_expr (&se, sym->as->lower[i]); + tmp = se.expr; + } + else + tmp = gfc_index_one_node; + gfc_add_block_to_block (block2, &se.pre); + tree lbound = gfc_evaluate_now (tmp, block2); + gfc_add_block_to_block (block2, &se.post); + set_gfc_dimension_from_cfi (block2, gfc_desc, cfi, gfc_rank_cst[i], + lbound, offset, stride, do_copy_inout); + } + } else - lbound = gfc_conv_descriptor_lbound_get (gfc_desc, idx); + { + /* Loop: for (i = 0; i < rank; ++i). */ + tree idx = gfc_create_var (TREE_TYPE (rank), "idx"); + + /* Loop body. */ + stmtblock_t loop_body; + gfc_init_block (&loop_body); + /* gfc->dim[i].lbound = ... */ + tree lbound; + if (sym->attr.pointer || sym->attr.allocatable) + lbound = gfc_get_cfi_dim_lbound (cfi, idx); + else if (sym->as->rank < 0) + lbound = gfc_index_one_node; + else + gcc_unreachable (); - set_gfc_dimension_from_cfi (&loop_body, gfc_desc, cfi, idx, lbound, offset, - stride, do_copy_inout); + set_gfc_dimension_from_cfi (&loop_body, gfc_desc, cfi, idx, lbound, offset, + stride, do_copy_inout); - /* Generate loop. */ - gfc_simple_for_loop (block2, idx, build_zero_cst (TREE_TYPE (idx)), - rank, LT_EXPR, build_int_cst (TREE_TYPE (idx), 1), - gfc_finish_block (&loop_body)); + /* Generate loop. */ + gfc_simple_for_loop (block2, idx, build_zero_cst (TREE_TYPE (idx)), + rank, LT_EXPR, build_int_cst (TREE_TYPE (idx), 1), + gfc_finish_block (&loop_body)); + } gfc_conv_descriptor_offset_set (block2, gfc_desc, offset); }