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)