Re: [PATCH 7/7] fortran: array descriptor: Move array growth function

Paul Richard Thomas <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <CAGkQGiJArLTsVZBzFketzU8HBBPWN3HoZm+FV1j_tmMo69cRbQ@mail.gmail.com>
Hello Mikael,

This patch is straightforward and LGTM.

Thanks

Paul

On Thu, 30 Oct 2025 at 20:37, Mikael Morin <[email protected]> wrote:
>
> From: Mikael Morin <[email protected]>
>
> Regression tested on powerpc64le-unknown-linux-gnu.  OK for master?
>
> -- >8 --
>
> Move gfc_grow_array, a descriptor growth function used in array constructor
> descriptors initialisation, to trans-descriptor.cc.
>
> gcc/fortran/ChangeLog:
>
>         * trans-array.cc (gfc_grow_array): Move function ...
>         * trans-descriptor.cc (gfc_grow_array): ... to this file.
>         * trans-descriptor.h (gfc_grow_array): Add declaration.
> ---
>  gcc/fortran/trans-array.cc      | 37 ---------------------------------
>  gcc/fortran/trans-descriptor.cc | 37 +++++++++++++++++++++++++++++++++
>  gcc/fortran/trans-descriptor.h  |  2 ++
>  3 files changed, 39 insertions(+), 37 deletions(-)
>
> diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
> index d26f3a47ebe..3c6609b6f40 100644
> --- a/gcc/fortran/trans-array.cc
> +++ b/gcc/fortran/trans-array.cc
> @@ -1407,43 +1407,6 @@ gfc_get_iteration_count (tree start, tree end, tree step)
>  }
>
>
> -/* Extend the data in array DESC by EXTRA elements.  */
> -
> -static void
> -gfc_grow_array (stmtblock_t * pblock, tree desc, tree extra)
> -{
> -  tree arg0, arg1;
> -  tree tmp;
> -  tree size;
> -  tree ubound;
> -
> -  if (integer_zerop (extra))
> -    return;
> -
> -  ubound = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[0]);
> -
> -  /* Add EXTRA to the upper bound.  */
> -  tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
> -                        ubound, extra);
> -  gfc_conv_descriptor_ubound_set (pblock, desc, gfc_rank_cst[0], tmp);
> -
> -  /* Get the value of the current data pointer.  */
> -  arg0 = gfc_conv_descriptor_data_get (desc);
> -
> -  /* Calculate the new array size.  */
> -  size = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (desc)));
> -  tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
> -                        ubound, gfc_index_one_node);
> -  arg1 = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
> -                         fold_convert (size_type_node, tmp),
> -                         fold_convert (size_type_node, size));
> -
> -  /* Call the realloc() function.  */
> -  tmp = gfc_call_realloc (pblock, arg0, arg1);
> -  gfc_conv_descriptor_data_set (pblock, desc, tmp);
> -}
> -
> -
>  /* Return true if the bounds of iterator I can only be determined
>     at run time.  */
>
> diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
> index 299d56c728a..386f6275982 100644
> --- a/gcc/fortran/trans-descriptor.cc
> +++ b/gcc/fortran/trans-descriptor.cc
> @@ -541,3 +541,40 @@ gfc_copy_descriptor (stmtblock_t *block, tree dst, tree src, int rank)
>
>    gfc_conv_descriptor_offset_set (block, dst, offset);
>  }
> +
> +
> +/* Extend the data in array DESC by EXTRA elements.  */
> +
> +void
> +gfc_grow_array (stmtblock_t * pblock, tree desc, tree extra)
> +{
> +  tree arg0, arg1;
> +  tree tmp;
> +  tree size;
> +  tree ubound;
> +
> +  if (integer_zerop (extra))
> +    return;
> +
> +  ubound = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[0]);
> +
> +  /* Add EXTRA to the upper bound.  */
> +  tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
> +                        ubound, extra);
> +  gfc_conv_descriptor_ubound_set (pblock, desc, gfc_rank_cst[0], tmp);
> +
> +  /* Get the value of the current data pointer.  */
> +  arg0 = gfc_conv_descriptor_data_get (desc);
> +
> +  /* Calculate the new array size.  */
> +  size = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (desc)));
> +  tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
> +                        ubound, gfc_index_one_node);
> +  arg1 = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
> +                         fold_convert (size_type_node, tmp),
> +                         fold_convert (size_type_node, size));
> +
> +  /* Call the realloc() function.  */
> +  tmp = gfc_call_realloc (pblock, arg0, arg1);
> +  gfc_conv_descriptor_data_set (pblock, desc, tmp);
> +}
> diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
> index b1623a21803..816973825b6 100644
> --- a/gcc/fortran/trans-descriptor.h
> +++ b/gcc/fortran/trans-descriptor.h
> @@ -62,4 +62,6 @@ void gfc_conv_shift_descriptor_lbound (stmtblock_t*, tree, int, tree);
>
>  void gfc_copy_descriptor (stmtblock_t *, tree, tree, int);
>
> +void gfc_grow_array (stmtblock_t *, tree, tree);
> +
>  #endif /* GFC_TRANS_DESCRIPTOR_H */
> --
> 2.51.0
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.