On Tue, Feb 17, 2026 at 07:16:13PM -0800, Andrew Pinski wrote:
> 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 .

In the context of this patch, I'm fine with any (reasonable) location for the
test file. 

> 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 ?

I'll let others comment on patch 1/1 (although I've responded to that as well).

Alice

> 
> 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