Andrew Carlotti <andrew.carlo...@arm.com> writes: > The availability of ls64 intrinsics and data types were determined > solely by the globally specified architecture features, which did not > reflect any changes specified in target pragmas or attributes. > > This patch removes the initialisation-time guards for the intrinsics, > and replaces them with checks at use time. We also get better error > messages when ls64 is not available (matching the existing error > messages for SVE intrinsics). > > The data512_t type is made always available; this is consistent with the > present behaviour for Neon fp16/bf16 types. > > gcc/ChangeLog: > > PR target/112108 > * config/aarch64/aarch64-builtins.cc (handle_arm_acle_h): Remove > feature check at initialisation. > (aarch64_general_check_builtin_call): Check ls64 intrinsics. > (aarch64_expand_builtin_ls64): Add feature check. > * config/aarch64/arm_acle.h: (data512_t) Make always available. > > gcc/testsuite/ChangeLog: > > PR target/112108 > * gcc.target/aarch64/acle/ls64_guard-1.c: New test. > * gcc.target/aarch64/acle/ls64_guard-2.c: New test. > * gcc.target/aarch64/acle/ls64_guard-3.c: New test. > * gcc.target/aarch64/acle/ls64_guard-4.c: New test.
Same comment as 2/4 about checking during expansion. LGTM otherwise, but please give others 24 hours to comment. Thanks for cleaning this up. Richard > diff --git a/gcc/config/aarch64/aarch64-builtins.cc > b/gcc/config/aarch64/aarch64-builtins.cc > index > 50667e555497b483aea6a64bb5809ddc62cedf83..ba0147a2077514b4d2a6f9bccc8e7fe897d891b3 > 100644 > --- a/gcc/config/aarch64/aarch64-builtins.cc > +++ b/gcc/config/aarch64/aarch64-builtins.cc > @@ -2066,8 +2066,7 @@ aarch64_init_data_intrinsics (void) > void > handle_arm_acle_h (void) > { > - if (TARGET_LS64) > - aarch64_init_ls64_builtins (); > + aarch64_init_ls64_builtins (); > aarch64_init_tme_builtins (); > aarch64_init_memtag_builtins (); > } > @@ -2318,6 +2317,13 @@ aarch64_general_check_builtin_call (location_t > location, vec<location_t>, > return aarch64_check_required_extensions (location, decl, > AARCH64_FL_TME, false); > > + case AARCH64_LS64_BUILTIN_LD64B: > + case AARCH64_LS64_BUILTIN_ST64B: > + case AARCH64_LS64_BUILTIN_ST64BV: > + case AARCH64_LS64_BUILTIN_ST64BV0: > + return aarch64_check_required_extensions (location, decl, > + AARCH64_FL_LS64, false); > + > default: > break; > } > @@ -2798,6 +2804,11 @@ aarch64_expand_builtin_ls64 (int fcode, tree exp, rtx > target) > { > expand_operand ops[3]; > > + tree fndecl = aarch64_builtin_decls[fcode]; > + if (!aarch64_check_required_extensions (EXPR_LOCATION (exp), fndecl, > + AARCH64_FL_LS64, false)) > + return target; > + > switch (fcode) > { > case AARCH64_LS64_BUILTIN_LD64B: > diff --git a/gcc/config/aarch64/arm_acle.h b/gcc/config/aarch64/arm_acle.h > index > ab04326791309796125860ce64e63fe858a4a733..ab4e7e60e046a9e9c81237de2ca5463c3d4f96ca > 100644 > --- a/gcc/config/aarch64/arm_acle.h > +++ b/gcc/config/aarch64/arm_acle.h > @@ -265,9 +265,7 @@ __crc32d (uint32_t __a, uint64_t __b) > #define _TMFAILURE_INT 0x00800000u > #define _TMFAILURE_TRIVIAL 0x01000000u > > -#ifdef __ARM_FEATURE_LS64 > typedef __arm_data512_t data512_t; > -#endif > > #pragma GCC push_options > #pragma GCC target ("+nothing+rng") > diff --git a/gcc/testsuite/gcc.target/aarch64/acle/ls64_guard-1.c > b/gcc/testsuite/gcc.target/aarch64/acle/ls64_guard-1.c > new file mode 100644 > index > 0000000000000000000000000000000000000000..7dfc193a2934c994220280990316027c07e75ac4 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/acle/ls64_guard-1.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-additional-options "-march=armv8.6-a" } */ > + > +#include <arm_acle.h> > + > +data512_t foo (void * p) > +{ > + return __arm_ld64b (p); /* { dg-error {ACLE function '__arm_ld64b' > requires ISA extension 'ls64'} } */ > +} > diff --git a/gcc/testsuite/gcc.target/aarch64/acle/ls64_guard-2.c > b/gcc/testsuite/gcc.target/aarch64/acle/ls64_guard-2.c > new file mode 100644 > index > 0000000000000000000000000000000000000000..3ede05a81f026f8606ee2c9cd56f15ce45caa1c8 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/acle/ls64_guard-2.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-additional-options "-march=armv8.6-a" } */ > + > +#include <arm_acle.h> > + > +#pragma GCC target("arch=armv8-a+ls64") > +data512_t foo (void * p) > +{ > + return __arm_ld64b (p); > +} > diff --git a/gcc/testsuite/gcc.target/aarch64/acle/ls64_guard-3.c > b/gcc/testsuite/gcc.target/aarch64/acle/ls64_guard-3.c > new file mode 100644 > index > 0000000000000000000000000000000000000000..e0fccdad7bec4aa522fb709d010289fd02f91d05 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/acle/ls64_guard-3.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-additional-options "-march=armv8-a+ls64 -mgeneral-regs-only" } */ > + > +#include <arm_acle.h> > + > +data512_t foo (void * p) > +{ > + return __arm_ld64b (p); > +} > diff --git a/gcc/testsuite/gcc.target/aarch64/acle/ls64_guard-4.c > b/gcc/testsuite/gcc.target/aarch64/acle/ls64_guard-4.c > new file mode 100644 > index > 0000000000000000000000000000000000000000..af1d9a4241fd0047c52735a8103eeaa45525ffc0 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/acle/ls64_guard-4.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-additional-options "-march=armv8-a+ls64" } */ > + > +#include <arm_acle.h> > + > +#pragma GCC target("arch=armv8.6-a") > +data512_t foo (void * p) > +{ > + return __arm_ld64b (p); /* { dg-error {ACLE function '__arm_ld64b' > requires ISA extension 'ls64'} } */ > +}