Hi,

On Mon, Aug 18 2025, Richard Biener wrote:
> SRA handles outermost VIEW_CONVERT_EXPRs but it wrongly ignores
> those when building an access which leads to the wrong size
> used when the VIEW_CONVERT_EXPR does not have the same size as
> its operand which is valid GENERIC and is used by Ada upcasting.
>
> Bootstrapped on x86_64-unknown-linux-gnu with all languages enabled,
> testing in progress.
>
> OK if that went OK?

Unfortunately i don't remember what the exact issue with Ada was in
2009.  I'll be happy to get rid of the special-casing in this way if we
can.

Thanks for looking into the issue while I was away.

Martin


>
> Thanks,
> Richard.
>
>       PR tree-optimization/121527
>       * tree-sra.cc (build_access_from_expr_1): Do not strip an
>       outer VIEW_CONVERT_EXPR as it's relevant for the size of
>       the access.
>       (get_access_for_expr): Likewise.
> ---
>  gcc/tree-sra.cc | 20 ++++++--------------
>  1 file changed, 6 insertions(+), 14 deletions(-)
>
> diff --git a/gcc/tree-sra.cc b/gcc/tree-sra.cc
> index 032f2770484..24ed2b2aea0 100644
> --- a/gcc/tree-sra.cc
> +++ b/gcc/tree-sra.cc
> @@ -1291,19 +1291,16 @@ build_access_from_expr_1 (tree expr, gimple *stmt, 
> bool write)
>        return NULL;
>      }
>  
> -  /* We need to dive through V_C_Es in order to get the size of its parameter
> -     and not the result type.  Ada produces such statements.  We are also
> -     capable of handling the topmost V_C_E but not any of those buried in 
> other
> -     handled components.  */
> -  if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
> -    expr = TREE_OPERAND (expr, 0);
> -
> -  if (contains_view_convert_expr_p (expr))
> +  /* We are capable of handling the topmost V_C_E but not any of those
> +     buried in other handled components.  */
> +  if (contains_view_convert_expr_p (TREE_CODE (expr) == VIEW_CONVERT_EXPR
> +                                 ? TREE_OPERAND (expr, 0) : expr))
>      {
>        disqualify_base_of_expr (expr, "V_C_E under a different handled "
>                              "component.");
>        return NULL;
>      }
> +
>    if (TREE_THIS_VOLATILE (expr))
>      {
>        disqualify_base_of_expr (expr, "part of a volatile reference.");
> @@ -1323,6 +1320,7 @@ build_access_from_expr_1 (tree expr, gimple *stmt, bool 
> write)
>      case ARRAY_REF:
>      case ARRAY_RANGE_REF:
>      case BIT_FIELD_REF:
> +    case VIEW_CONVERT_EXPR:
>        ret = create_access (expr, stmt, write);
>        break;
>  
> @@ -4086,12 +4084,6 @@ get_access_for_expr (tree expr)
>    tree base;
>    bool reverse;
>  
> -  /* FIXME: This should not be necessary but Ada produces V_C_Es with a type 
> of
> -     a different size than the size of its argument and we need the latter
> -     one.  */
> -  if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
> -    expr = TREE_OPERAND (expr, 0);
> -
>    base = get_ref_base_and_extent (expr, &poffset, &psize, &pmax_size,
>                                 &reverse);
>    if (!known_size_p (pmax_size)
> -- 
> 2.43.0

Reply via email to