On Tue, Feb 17, 2026 at 7:09 PM Alice Carlotti <[email protected]> wrote:
>
> On Tue, Feb 17, 2026 at 02:44:12PM -0800, Andrew Pinski wrote:
> > aarch64_init_ls64_builtins_types currently creates an array with type 
> > uint64_t[8]
> > and then sets the mode to V8DI. The problem here is if you used that array
> > type before, you would get a mode of BLK.
> > This causes an ICE in some cases, with the C++ front-end with -g, you would
> > get "type variant differs by TYPE_MODE" and in some cases even without -g,
> > "canonical types differ for identical types".
> >
> > The fix is to do build_distinct_type_copy of the array in 
> > aarch64_init_ls64_builtins_types
> > before assigning the mode to that copy. We keep the same ls64 structures 
> > correct and
> > user provided arrays are not influenced when "arm_neon.h" is included.
> >
> > Build and tested on aarch64-linux-gnu.
> >
> >       PR target/124126
> >
> > gcc/ChangeLog:
> >
> >       * config/aarch64/aarch64-builtins.cc 
> > (aarch64_init_ls64_builtins_types): Copy
> >       the array type before setting the mode.
> >
> > gcc/testsuite/ChangeLog:
> >
> >       * c-c++-common/aarch64/pr124126-1.c: New test.
> >
> > Signed-off-by: Andrew Pinski <[email protected]>
> > ---
> >  gcc/config/aarch64/aarch64-builtins.cc          |  1 +
> >  gcc/testsuite/c-c++-common/aarch64/pr124126-1.c | 15 +++++++++++++++
> >  2 files changed, 16 insertions(+)
> >  create mode 100644 gcc/testsuite/c-c++-common/aarch64/pr124126-1.c
> >
> > diff --git a/gcc/config/aarch64/aarch64-builtins.cc 
> > b/gcc/config/aarch64/aarch64-builtins.cc
> > index 5bb873c3923..611f6dc45e0 100644
> > --- a/gcc/config/aarch64/aarch64-builtins.cc
> > +++ b/gcc/config/aarch64/aarch64-builtins.cc
> > @@ -2321,6 +2321,7 @@ aarch64_init_ls64_builtins_types (void)
> >    const char *tuple_type_name = "__arm_data512_t";
> >    tree node_type = get_typenode_from_name (UINT64_TYPE);
> >    tree array_type = build_array_type_nelts (node_type, 8);
> > +  array_type = build_distinct_type_copy (array_type);
> >    SET_TYPE_MODE (array_type, V8DImode);
> >
> >    gcc_assert (TYPE_MODE_RAW (array_type) == TYPE_MODE (array_type));
> > diff --git a/gcc/testsuite/c-c++-common/aarch64/pr124126-1.c 
> > b/gcc/testsuite/c-c++-common/aarch64/pr124126-1.c
> > new file mode 100644
> > index 00000000000..ffe4fb6690b
> > --- /dev/null
> > +++ b/gcc/testsuite/c-c++-common/aarch64/pr124126-1.c
> > @@ -0,0 +1,15 @@
> > +/* { dg-do compile } */
> > +/* { dg-additional-options "-g" } */
>
> The bug can be reproduced on older branches by adding `+ls64` to the command
> line.
>
> This patch is ok with that change (for all open branches).

I assume for the other branches we should place the testcase at
g++.target/aarch64/pr124126-1.C .
And was the testcase change ok for the trunk or should we just have 2
copies, one in gcc.target and one in g++.target ?

Thanks,
Andrew

>
> Alice
>
> > +/* PR target/124126 */
> > +/* Make sure an array of uint64_t[8] works when
> > +   used before the inlcude of arm_acle.h.  */
> > +
> > +typedef unsigned long uint64_t;
> > +void executeSuperscalar(uint64_t (*r)[8]);
> > +
> > +#include "arm_acle.h"
> > +
> > +void initDatasetItem() {
> > +  uint64_t rl[8];
> > +  executeSuperscalar(&rl);
> > +}
> > --
> > 2.43.0
> >

Reply via email to