[1/2] fortran: Only pass the block for bounds check generation

Message ID 20260506204839.404713-2-morin-mikael@orange.fr
State New
Headers
Series fortran: Add bound checking code to the scalarizer block [PR125192] |

Commit Message

Mikael Morin May 6, 2026, 8:48 p.m. UTC
  From: Mikael Morin <mikael@gcc.gnu.org>

Regression-tested on powerpc64le-unknown-linux-gnu.
OK for master and 16 backport?

-- >8 --

Among the scalarized expression SE passed as argument to the array
bounds check generation function, only the PRE block field is used,
to populate it with the bounds checking code.

This change refactors the code, so that only the block is passed as
argument and not a full scalarized expression.

gcc/fortran/ChangeLog:

	* trans-array.cc (trans_array_bound_check): Replace references
	to SE->PRE with references to the new argument BLOCK.  Remove
	argument SE.
	(array_bound_check_elemental): Likewise.  Update caller.
	(conv_array_index_offset): Update caller.
	(gfc_conv_expr_descriptor): Update caller.
---
 gcc/fortran/trans-array.cc | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)
  

Comments

Paul Richard Thomas May 7, 2026, 8:44 a.m. UTC | #1
Hi Mikael,

This LGTM.

Thanks for the patch.

Paul

On Wed, 6 May 2026 at 21:49, Mikael Morin <morin-mikael@orange.fr> wrote:
>
> From: Mikael Morin <mikael@gcc.gnu.org>
>
> Regression-tested on powerpc64le-unknown-linux-gnu.
> OK for master and 16 backport?
>
> -- >8 --
>
> Among the scalarized expression SE passed as argument to the array
> bounds check generation function, only the PRE block field is used,
> to populate it with the bounds checking code.
>
> This change refactors the code, so that only the block is passed as
> argument and not a full scalarized expression.
>
> gcc/fortran/ChangeLog:
>
>         * trans-array.cc (trans_array_bound_check): Replace references
>         to SE->PRE with references to the new argument BLOCK.  Remove
>         argument SE.
>         (array_bound_check_elemental): Likewise.  Update caller.
>         (conv_array_index_offset): Update caller.
>         (gfc_conv_expr_descriptor): Update caller.
> ---
>  gcc/fortran/trans-array.cc | 22 +++++++++++-----------
>  1 file changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
> index b57c18aba00..4f86ae2889b 100644
> --- a/gcc/fortran/trans-array.cc
> +++ b/gcc/fortran/trans-array.cc
> @@ -3910,7 +3910,7 @@ abridged_ref_name (gfc_expr * expr, gfc_array_ref * ar)
>  /* Generate code to perform an array index bound check.  */
>
>  static tree
> -trans_array_bound_check (gfc_se * se, gfc_ss *ss, tree index, int n,
> +trans_array_bound_check (stmtblock_t *block, gfc_ss *ss, tree index, int n,
>                          locus * where, bool check_upper,
>                          const char *compname = NULL)
>  {
> @@ -3927,7 +3927,7 @@ trans_array_bound_check (gfc_se * se, gfc_ss *ss, tree index, int n,
>
>    descriptor = ss->info->data.array.descriptor;
>
> -  index = gfc_evaluate_now (index, &se->pre);
> +  index = gfc_evaluate_now (index, block);
>
>    /* We find a name for the error message.  */
>    name = ss->info->expr->symtree->n.sym->name;
> @@ -3961,13 +3961,13 @@ trans_array_bound_check (gfc_se * se, gfc_ss *ss, tree index, int n,
>
>        fault = fold_build2_loc (input_location, LT_EXPR, logical_type_node,
>                                index, tmp_lo);
> -      gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
> +      gfc_trans_runtime_check (true, false, fault, block, where, msg,
>                                fold_convert (long_integer_type_node, index),
>                                fold_convert (long_integer_type_node, tmp_lo),
>                                fold_convert (long_integer_type_node, tmp_up));
>        fault = fold_build2_loc (input_location, GT_EXPR, logical_type_node,
>                                index, tmp_up);
> -      gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
> +      gfc_trans_runtime_check (true, false, fault, block, where, msg,
>                                fold_convert (long_integer_type_node, index),
>                                fold_convert (long_integer_type_node, tmp_lo),
>                                fold_convert (long_integer_type_node, tmp_up));
> @@ -3986,7 +3986,7 @@ trans_array_bound_check (gfc_se * se, gfc_ss *ss, tree index, int n,
>
>        fault = fold_build2_loc (input_location, LT_EXPR, logical_type_node,
>                                index, tmp_lo);
> -      gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
> +      gfc_trans_runtime_check (true, false, fault, block, where, msg,
>                                fold_convert (long_integer_type_node, index),
>                                fold_convert (long_integer_type_node, tmp_lo));
>        free (msg);
> @@ -4023,7 +4023,7 @@ gfc_expr_contains_impure_fcn (gfc_expr *e)
>  /* Generate code for bounds checking for elemental dimensions.  */
>
>  static void
> -array_bound_check_elemental (gfc_se * se, gfc_ss * ss, gfc_expr * expr)
> +array_bound_check_elemental (stmtblock_t *block, gfc_ss * ss, gfc_expr * expr)
>  {
>    gfc_array_ref *ar;
>    gfc_ref *ref;
> @@ -4052,8 +4052,8 @@ array_bound_check_elemental (gfc_se * se, gfc_ss * ss, gfc_expr * expr)
>                       gfc_init_se (&indexse, NULL);
>                       gfc_conv_expr_type (&indexse, ar->start[dim],
>                                           gfc_array_index_type);
> -                     gfc_add_block_to_block (&se->pre, &indexse.pre);
> -                     trans_array_bound_check (se, ss, indexse.expr, dim,
> +                     gfc_add_block_to_block (block, &indexse.pre);
> +                     trans_array_bound_check (block, ss, indexse.expr, dim,
>                                                &ar->where,
>                                                ar->as->type != AS_ASSUMED_SIZE
>                                                || dim < ar->dimen - 1,
> @@ -4098,7 +4098,7 @@ conv_array_index_offset (gfc_se * se, gfc_ss * ss, int dim, int i,
>           /* We've already translated this value outside the loop.  */
>           index = info->subscript[dim]->info->data.scalar.value;
>
> -         index = trans_array_bound_check (se, ss, index, dim, &ar->where,
> +         index = trans_array_bound_check (&se->pre, ss, index, dim, &ar->where,
>                                            ar->as->type != AS_ASSUMED_SIZE
>                                            || dim < ar->dimen - 1);
>           break;
> @@ -4127,7 +4127,7 @@ conv_array_index_offset (gfc_se * se, gfc_ss * ss, int dim, int i,
>           index = fold_convert (gfc_array_index_type, index);
>
>           /* Do any bounds checking on the final info->descriptor index.  */
> -         index = trans_array_bound_check (se, ss, index, dim, &ar->where,
> +         index = trans_array_bound_check (&se->pre, ss, index, dim, &ar->where,
>                                            ar->as->type != AS_ASSUMED_SIZE
>                                            || dim < ar->dimen - 1);
>           break;
> @@ -8652,7 +8652,7 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr)
>
>    /* Add bounds-checking for elemental dimensions.  */
>    if ((gfc_option.rtcheck & GFC_RTCHECK_BOUNDS) && !expr->no_bounds_check)
> -    array_bound_check_elemental (se, ss, expr);
> +    array_bound_check_elemental (&se->pre, ss, expr);
>
>    if (need_tmp)
>      {
> --
> 2.53.0
>
  

Patch

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index b57c18aba00..4f86ae2889b 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -3910,7 +3910,7 @@  abridged_ref_name (gfc_expr * expr, gfc_array_ref * ar)
 /* Generate code to perform an array index bound check.  */
 
 static tree
-trans_array_bound_check (gfc_se * se, gfc_ss *ss, tree index, int n,
+trans_array_bound_check (stmtblock_t *block, gfc_ss *ss, tree index, int n,
 			 locus * where, bool check_upper,
 			 const char *compname = NULL)
 {
@@ -3927,7 +3927,7 @@  trans_array_bound_check (gfc_se * se, gfc_ss *ss, tree index, int n,
 
   descriptor = ss->info->data.array.descriptor;
 
-  index = gfc_evaluate_now (index, &se->pre);
+  index = gfc_evaluate_now (index, block);
 
   /* We find a name for the error message.  */
   name = ss->info->expr->symtree->n.sym->name;
@@ -3961,13 +3961,13 @@  trans_array_bound_check (gfc_se * se, gfc_ss *ss, tree index, int n,
 
       fault = fold_build2_loc (input_location, LT_EXPR, logical_type_node,
 			       index, tmp_lo);
-      gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
+      gfc_trans_runtime_check (true, false, fault, block, where, msg,
 			       fold_convert (long_integer_type_node, index),
 			       fold_convert (long_integer_type_node, tmp_lo),
 			       fold_convert (long_integer_type_node, tmp_up));
       fault = fold_build2_loc (input_location, GT_EXPR, logical_type_node,
 			       index, tmp_up);
-      gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
+      gfc_trans_runtime_check (true, false, fault, block, where, msg,
 			       fold_convert (long_integer_type_node, index),
 			       fold_convert (long_integer_type_node, tmp_lo),
 			       fold_convert (long_integer_type_node, tmp_up));
@@ -3986,7 +3986,7 @@  trans_array_bound_check (gfc_se * se, gfc_ss *ss, tree index, int n,
 
       fault = fold_build2_loc (input_location, LT_EXPR, logical_type_node,
 			       index, tmp_lo);
-      gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
+      gfc_trans_runtime_check (true, false, fault, block, where, msg,
 			       fold_convert (long_integer_type_node, index),
 			       fold_convert (long_integer_type_node, tmp_lo));
       free (msg);
@@ -4023,7 +4023,7 @@  gfc_expr_contains_impure_fcn (gfc_expr *e)
 /* Generate code for bounds checking for elemental dimensions.  */
 
 static void
-array_bound_check_elemental (gfc_se * se, gfc_ss * ss, gfc_expr * expr)
+array_bound_check_elemental (stmtblock_t *block, gfc_ss * ss, gfc_expr * expr)
 {
   gfc_array_ref *ar;
   gfc_ref *ref;
@@ -4052,8 +4052,8 @@  array_bound_check_elemental (gfc_se * se, gfc_ss * ss, gfc_expr * expr)
 		      gfc_init_se (&indexse, NULL);
 		      gfc_conv_expr_type (&indexse, ar->start[dim],
 					  gfc_array_index_type);
-		      gfc_add_block_to_block (&se->pre, &indexse.pre);
-		      trans_array_bound_check (se, ss, indexse.expr, dim,
+		      gfc_add_block_to_block (block, &indexse.pre);
+		      trans_array_bound_check (block, ss, indexse.expr, dim,
 					       &ar->where,
 					       ar->as->type != AS_ASSUMED_SIZE
 					       || dim < ar->dimen - 1,
@@ -4098,7 +4098,7 @@  conv_array_index_offset (gfc_se * se, gfc_ss * ss, int dim, int i,
 	  /* We've already translated this value outside the loop.  */
 	  index = info->subscript[dim]->info->data.scalar.value;
 
-	  index = trans_array_bound_check (se, ss, index, dim, &ar->where,
+	  index = trans_array_bound_check (&se->pre, ss, index, dim, &ar->where,
 					   ar->as->type != AS_ASSUMED_SIZE
 					   || dim < ar->dimen - 1);
 	  break;
@@ -4127,7 +4127,7 @@  conv_array_index_offset (gfc_se * se, gfc_ss * ss, int dim, int i,
 	  index = fold_convert (gfc_array_index_type, index);
 
 	  /* Do any bounds checking on the final info->descriptor index.  */
-	  index = trans_array_bound_check (se, ss, index, dim, &ar->where,
+	  index = trans_array_bound_check (&se->pre, ss, index, dim, &ar->where,
 					   ar->as->type != AS_ASSUMED_SIZE
 					   || dim < ar->dimen - 1);
 	  break;
@@ -8652,7 +8652,7 @@  gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr)
 
   /* Add bounds-checking for elemental dimensions.  */
   if ((gfc_option.rtcheck & GFC_RTCHECK_BOUNDS) && !expr->no_bounds_check)
-    array_bound_check_elemental (se, ss, expr);
+    array_bound_check_elemental (&se->pre, ss, expr);
 
   if (need_tmp)
     {