On Tue, 10 Dec 2024, Martin Uecker wrote:

> 
> As requested, I split up into one part for the TYPE_MODE and 
> another one for the array size to help with git bisecting.  This
> is the first part.
> 
> 
> Bootstrapped and regression tested on x86_64.

OK.

Thanks,
Richard.


> 
> 
> Allow the TYPE_MODE of a type with an array as last member to differ from
> another compatible type.
> 
> gcc/ChangeLog:
>         * tree.cc (gimple_canonical_types_compatible_p): Add exception.
>         (verify_type): Add exception.
> 
> gcc/lto/ChangeLog:
>         * lto-common.cc (hash_canonical_type): Add exception.
> ---
>  gcc/lto/lto-common.cc |  3 ++-
>  gcc/tree.cc           | 12 +++++++++---
>  2 files changed, 11 insertions(+), 4 deletions(-)
> 
> diff --git a/gcc/lto/lto-common.cc b/gcc/lto/lto-common.cc
> index 86a309f92b4..94050209912 100644
> --- a/gcc/lto/lto-common.cc
> +++ b/gcc/lto/lto-common.cc
> @@ -254,7 +254,8 @@ hash_canonical_type (tree type)
>       checked.  */
>    code = tree_code_for_canonical_type_merging (TREE_CODE (type));
>    hstate.add_int (code);
> -  hstate.add_int (TYPE_MODE (type));
> +  if (!RECORD_OR_UNION_TYPE_P (type))
> +    hstate.add_int (TYPE_MODE (type));
>  
>    /* Incorporate common features of numerical types.  */
>    if (INTEGRAL_TYPE_P (type)
> diff --git a/gcc/tree.cc b/gcc/tree.cc
> index 83a03374a32..1391af6bd4c 100644
> --- a/gcc/tree.cc
> +++ b/gcc/tree.cc
> @@ -13914,8 +13914,11 @@ gimple_canonical_types_compatible_p (const_tree t1, 
> const_tree t2,
>        || TREE_CODE (t1) == NULLPTR_TYPE)
>      return true;
>  
> -  /* Can't be the same type if they have different mode.  */
> -  if (TYPE_MODE (t1) != TYPE_MODE (t2))
> +  /* Can't be compatible types if they have different mode.  Because of
> +     flexible array members, we allow mismatching modes for structures or
> +     unions.  */
> +  if (!RECORD_OR_UNION_TYPE_P (t1)
> +      && TYPE_MODE (t1) != TYPE_MODE (t2))
>      return false;
>  
>    /* Non-aggregate types can be handled cheaply.  */
> @@ -14218,8 +14221,11 @@ verify_type (const_tree t)
>        debug_tree (ct);
>        error_found = true;
>      }
> -
>    if (COMPLETE_TYPE_P (t) && TYPE_CANONICAL (t)
> +      /* We allow a mismatch for structure or union because of
> +      flexible array members.  */
> +      && !RECORD_OR_UNION_TYPE_P (t)
> +      && !RECORD_OR_UNION_TYPE_P (TYPE_CANONICAL (t))
>        && TYPE_MODE (t) != TYPE_MODE (TYPE_CANONICAL (t)))
>      {
>        error ("%<TYPE_MODE%> of %<TYPE_CANONICAL%> is not compatible");
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to