https://gcc.gnu.org/g:fd1664f096e16e3fde4bba8b7d9ef20f8070f7c9
commit fd1664f096e16e3fde4bba8b7d9ef20f8070f7c9 Author: Mikael Morin <[email protected]> Date: Fri Jun 26 13:57:55 2026 +0200 Sauvegarde openacc.f90 compil' OK Diff: --- gcc/fortran/trans-array.cc | 22 ++++++++++++---------- gcc/fortran/trans-const.cc | 5 +++++ gcc/fortran/trans-const.h | 5 +++-- gcc/fortran/trans-decl.cc | 14 +++++++------- gcc/fortran/trans-descriptor.cc | 2 +- gcc/fortran/trans-expr.cc | 15 ++++++++------- gcc/fortran/trans-openmp.cc | 11 ++++++----- gcc/fortran/trans-types.cc | 8 ++++---- gcc/fortran/trans-types.h | 11 +++++------ 9 files changed, 51 insertions(+), 42 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index eef65622420b..c88b4a663541 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -8579,15 +8579,15 @@ gfc_tree_array_size (stmtblock_t *block, tree desc, gfc_expr *expr, tree dim) gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc))); enum gfc_array_kind akind = GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc)); if (expr == NULL || expr->rank < 0) - rank = fold_convert (signed_char_type_node, + rank = fold_convert (gfc_dim_index_type_node, gfc_conv_descriptor_rank_get (desc)); else - rank = build_int_cst (signed_char_type_node, expr->rank); + rank = build_int_cst (gfc_dim_index_type_node, expr->rank); if (dim || (expr && expr->rank == 1)) { if (!dim) - dim = gfc_index_zero_node; + dim = gfc_rank_cst[1]; tree ubound = gfc_conv_descriptor_ubound_get (desc, dim); tree lbound = gfc_conv_descriptor_lbound_get (desc, dim); @@ -8604,10 +8604,11 @@ gfc_tree_array_size (stmtblock_t *block, tree desc, gfc_expr *expr, tree dim) if (akind == GFC_ARRAY_ASSUMED_RANK_CONT || akind == GFC_ARRAY_ASSUMED_RANK) { - tmp = fold_build2_loc (input_location, MINUS_EXPR, signed_char_type_node, - rank, build_int_cst (signed_char_type_node, 1)); + tmp = fold_build2_loc (input_location, MINUS_EXPR, + gfc_dim_index_type_node, rank, + build_int_cst (gfc_dim_index_type_node, 1)); cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, - fold_convert (signed_char_type_node, dim), + fold_convert (gfc_dim_index_type_node, dim), tmp); tmp = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, gfc_conv_descriptor_ubound_get (desc, dim), @@ -8631,7 +8632,7 @@ gfc_tree_array_size (stmtblock_t *block, tree desc, gfc_expr *expr, tree dim) gfc_init_block (&loop_body); /* Loop: for (i = 0; i < rank; ++i). */ - tree idx = gfc_create_var (gfc_dim_iter_type_node, "idx"); + tree idx = gfc_create_var (gfc_dim_index_type_node, "idx"); /* Loop body. */ /* #if (assumed-rank + !allocatable && !pointer) if (idx == rank - 1 && dim[idx].ubound == -1) @@ -8645,8 +8646,9 @@ gfc_tree_array_size (stmtblock_t *block, tree desc, gfc_expr *expr, tree dim) cond = NULL_TREE; if (akind == GFC_ARRAY_ASSUMED_RANK_CONT || akind == GFC_ARRAY_ASSUMED_RANK) { - tmp = fold_build2_loc (input_location, MINUS_EXPR, signed_char_type_node, - rank, build_int_cst (signed_char_type_node, 1)); + tmp = fold_build2_loc (input_location, MINUS_EXPR, + gfc_dim_index_type_node, rank, + build_int_cst (gfc_dim_index_type_node, 1)); cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, idx, tmp); tmp = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, @@ -9179,7 +9181,7 @@ gfc_conv_array_parameter (gfc_se *se, gfc_expr *expr, bool g77, if (expr->rank == -1) { - tree idx = gfc_create_var (signed_char_type_node, "idx"); + tree idx = gfc_create_var (gfc_dim_index_type_node, "idx"); tree stride = gfc_create_var (gfc_array_index_type, "stride"); stmtblock_t loop_body; diff --git a/gcc/fortran/trans-const.cc b/gcc/fortran/trans-const.cc index 34fd39a903f1..3b30b1023dd8 100644 --- a/gcc/fortran/trans-const.cc +++ b/gcc/fortran/trans-const.cc @@ -35,6 +35,8 @@ along with GCC; see the file COPYING3. If not see #include "target-memory.h" tree gfc_rank_cst[GFC_MAX_DIMENSIONS + 1]; +tree gfc_index_zero_node; +tree gfc_index_one_node; /* Build a constant with given type from an int_cst. */ @@ -195,6 +197,9 @@ gfc_init_constants (void) for (n = 0; n <= GFC_MAX_DIMENSIONS; n++) gfc_rank_cst[n] = build_int_cst (gfc_rank_type_node, n); + + gfc_index_zero_node = build_zero_cst (gfc_array_index_type); + gfc_index_one_node = build_one_cst (gfc_array_index_type); } /* Converts a GMP integer into a backend tree node. */ diff --git a/gcc/fortran/trans-const.h b/gcc/fortran/trans-const.h index eb268cced40a..abd7d7694518 100644 --- a/gcc/fortran/trans-const.h +++ b/gcc/fortran/trans-const.h @@ -65,5 +65,6 @@ tree gfc_build_const (tree, tree); /* Integer constants 0..GFC_MAX_DIMENSIONS. */ extern GTY(()) tree gfc_rank_cst[GFC_MAX_DIMENSIONS + 1]; -#define gfc_index_zero_node gfc_rank_cst[0] -#define gfc_index_one_node gfc_rank_cst[1] +/* Integer constants 0 and 1, of array index type. */ +extern GTY(()) tree gfc_index_zero_node; +extern GTY(()) tree gfc_index_one_node; diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc index ee7453354964..b2fc68ad38f5 100644 --- a/gcc/fortran/trans-decl.cc +++ b/gcc/fortran/trans-decl.cc @@ -7357,7 +7357,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally, tmp3 = tmp2 = tmp = gfc_get_cfi_desc_rank (cfi); if (sym->as->rank != -1) tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, - tmp, build_int_cst (signed_char_type_node, + tmp, build_int_cst (gfc_rank_type_node, sym->as->rank)); else { @@ -7601,7 +7601,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally, /* In that case, the CFI rank and the declared rank can differ. */ rank = gfc_get_cfi_desc_rank (cfi); else - rank = build_int_cst (signed_char_type_node, sym->as->rank); + rank = build_int_cst (gfc_rank_type_node, sym->as->rank); /* With bind(C), the standard requires that both Fortran callers and callees handle noncontiguous arrays passed to an dummy with 'contiguous' attribute @@ -7648,7 +7648,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally, /* for (i = 1; i < rank; ++i) cond &&= dim[i].sm != (dv->dim[i - 1].sm * dv->dim[i - 1].extent) */ - idx = gfc_create_var (gfc_dim_iter_type_node, "idx"); + idx = gfc_create_var (gfc_dim_index_type_node, "idx"); stmtblock_t loop_body; gfc_init_block (&loop_body); tmp = fold_build2_loc (input_location, MINUS_EXPR, TREE_TYPE (idx), @@ -7713,7 +7713,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally, gfc_add_modify (&loop_body, tmpidx, idx); stmtblock_t inner_loop; gfc_init_block (&inner_loop); - tree dim = gfc_create_var (gfc_dim_iter_type_node, "dim"); + tree dim = gfc_create_var (gfc_dim_index_type_node, "dim"); /* shift += (tmpidx % extent[d]) * sm[d] */ tmp = fold_build2_loc (input_location, TRUNC_MOD_EXPR, size_type_node, tmpidx, @@ -7816,7 +7816,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally, } /* Loop: for (i = 0; i < rank; ++i). */ - idx = gfc_create_var (gfc_dim_iter_type_node, "idx"); + idx = gfc_create_var (gfc_dim_index_type_node, "idx"); /* Loop body. */ stmtblock_t loop_body; @@ -7952,7 +7952,7 @@ done: gfc_add_modify (&loop_body, tmpidx, idx); stmtblock_t inner_loop; gfc_init_block (&inner_loop); - tree dim = gfc_create_var (gfc_dim_iter_type_node, "dim"); + tree dim = gfc_create_var (gfc_dim_index_type_node, "dim"); /* shift += (tmpidx % extent[d]) * sm[d] */ tmp = fold_convert (size_type_node, gfc_get_cfi_dim_extent (cfi, dim)); @@ -8041,7 +8041,7 @@ done: gfc_init_block (&block2); /* Loop: for (i = 0; i < rank; ++i). */ - idx = gfc_create_var (gfc_dim_iter_type_node, "idx"); + idx = gfc_create_var (gfc_dim_index_type_node, "idx"); /* Loop body. */ gfc_init_block (&loop_body); diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index cbb59c6a16fa..b981eb1bfd56 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -208,7 +208,7 @@ conv_descriptor_rank (tree desc) dtype = conv_descriptor_dtype (desc); tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), GFC_DTYPE_RANK); gcc_assert (tmp != NULL_TREE - && TREE_TYPE (tmp) == signed_char_type_node); + && TREE_TYPE (tmp) == gfc_rank_type_node); return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (tmp), dtype, tmp, NULL_TREE); } diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index 676321baea88..ca0f2e5ba545 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -3403,10 +3403,11 @@ gfc_conv_variable (gfc_se * se, gfc_expr * expr) tree dim, lower, upper, cond; char *msg; - dim = fold_convert (signed_char_type_node, + dim = fold_convert (gfc_dim_index_type_node, gfc_conv_descriptor_rank_get (se->expr)); - dim = fold_build2_loc (input_location, MINUS_EXPR, signed_char_type_node, - dim, build_int_cst (signed_char_type_node, 1)); + dim = fold_build2_loc (input_location, MINUS_EXPR, + gfc_dim_index_type_node, dim, + build_int_cst (gfc_dim_index_type_node, 1)); lower = gfc_conv_descriptor_lbound_get (se->expr, dim); upper = gfc_conv_descriptor_ubound_get (se->expr, dim); @@ -6252,10 +6253,10 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym) gfc_add_modify (&block, tmp, build_int_cst (TREE_TYPE (tmp), CFI_VERSION)); if (e->rank < 0) - rank = fold_convert (signed_char_type_node, + rank = fold_convert (gfc_dim_index_type_node, gfc_conv_descriptor_rank_get (gfc)); else - rank = build_int_cst (gfc_rank_type_node, e->rank); + rank = build_int_cst (gfc_dim_index_type_node, e->rank); tmp = gfc_get_cfi_desc_rank (cfi); gfc_add_modify (&block, tmp, rank); int itype = CFI_type_other; @@ -6467,7 +6468,7 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym) if (e->rank != 0) { /* Loop: for (i = 0; i < rank; ++i). */ - tree idx = gfc_create_var (gfc_dim_iter_type_node, "idx"); + tree idx = gfc_create_var (gfc_dim_index_type_node, "idx"); /* Loop body. */ stmtblock_t loop_body; gfc_init_block (&loop_body); @@ -6576,7 +6577,7 @@ done: /* Calculate offset + set lbound, ubound and stride. */ gfc_conv_descriptor_offset_set (&block2, gfc, gfc_index_zero_node); /* Loop: for (i = 0; i < rank; ++i). */ - tree idx = gfc_create_var (gfc_dim_iter_type_node, "idx"); + tree idx = gfc_create_var (gfc_dim_index_type_node, "idx"); /* Loop body. */ stmtblock_t loop_body; gfc_init_block (&loop_body); diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc index f209a7b8d2b9..eccdf47bd3fd 100644 --- a/gcc/fortran/trans-openmp.cc +++ b/gcc/fortran/trans-openmp.cc @@ -2123,17 +2123,18 @@ gfc_omp_get_array_size (location_t loc, tree desc, gimple_seq *seq) tree extent = build_decl (loc, VAR_DECL, create_tmp_var_name ("extent"), gfc_array_index_type); tree idx = build_decl (loc, VAR_DECL, create_tmp_var_name ("idx"), - signed_char_type_node); + gfc_dim_index_type_node); - tree begin = build_zero_cst (signed_char_type_node); + tree begin = build_zero_cst (gfc_dim_index_type_node); tree end; if (GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc)) == GFC_ARRAY_ASSUMED_SHAPE_CONT || GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc)) == GFC_ARRAY_ASSUMED_SHAPE) - end = gfc_conv_descriptor_rank_get (desc); + end = fold_convert (gfc_dim_index_type_node, + gfc_conv_descriptor_rank_get (desc)); else - end = build_int_cst (signed_char_type_node, + end = build_int_cst (gfc_dim_index_type_node, GFC_TYPE_ARRAY_RANK (TREE_TYPE (desc))); - tree step = build_int_cst (signed_char_type_node, 1); + tree step = build_int_cst (gfc_dim_index_type_node, 1); /* size = 0 for (idx = 0; idx < rank; idx++) diff --git a/gcc/fortran/trans-types.cc b/gcc/fortran/trans-types.cc index c690997256c1..399e1daf9677 100644 --- a/gcc/fortran/trans-types.cc +++ b/gcc/fortran/trans-types.cc @@ -69,7 +69,7 @@ tree logical_true_node; tree logical_false_node; tree gfc_charlen_type_node; tree gfc_rank_type_node; -tree gfc_dim_iter_type_node; +tree gfc_dim_index_type_node; tree gfc_float128_type_node = NULL_TREE; tree gfc_complex_float128_type_node = NULL_TREE; @@ -1233,11 +1233,11 @@ gfc_init_types (void) build_int_cst (signed_char_type_node, GFC_MAX_DIMENSIONS)); - gfc_dim_iter_type_node + gfc_dim_index_type_node = build_range_type (signed_char_type_node, build_minus_one_cst (signed_char_type_node), build_int_cst (signed_char_type_node, - GFC_MAX_DIMENSIONS + 1)); + GFC_MAX_DIMENSIONS)); /* Fortran kind number of size_type_node (size_t). This is used for the _size member in vtables. */ @@ -4161,7 +4161,7 @@ gfc_get_cfi_type (int dimen, bool restricted) integer_type_node, &chain); suppress_warning (field); field = gfc_add_field_to_struct_1 (CFI_cdesc_t, get_identifier ("rank"), - signed_char_type_node, &chain); + gfc_rank_type_node, &chain); suppress_warning (field); field = gfc_add_field_to_struct_1 (CFI_cdesc_t, get_identifier ("attribute"), signed_char_type_node, &chain); diff --git a/gcc/fortran/trans-types.h b/gcc/fortran/trans-types.h index a2bbc1bcde8d..4786b4d2d268 100644 --- a/gcc/fortran/trans-types.h +++ b/gcc/fortran/trans-types.h @@ -56,12 +56,11 @@ extern GTY(()) tree gfc_charlen_type_node; array rank. */ extern GTY(()) tree gfc_rank_type_node; -/* This is the same as gfc_rank_type_node, except the range is extended by one - unit in both directions. This type is suitable for indexes to iterate over - array dimensions. GFC_RANK_TYPE_NODE can't be used for them, because a - stop condition such as I < GFC_MAX_DIMENSIONS would be eliminated as always - true if I had type GFC_RANK_TYPE_NODE. */ -extern GTY(()) tree gfc_dim_iter_type_node; +/* An integral type suitable to hold an array dimension index. This type is the + same as gfc_rank_type_node above, except its range is extended to include the + value -1. Including -1 is necessary for downward stepping loops to avoid + eliminating the I < 0 exit condition as always false. */ +extern GTY(()) tree gfc_dim_index_type_node; /* The following flags give us information on the correspondence of real (and complex) kinds with C floating-point types long double
