Andrew Carlotti <[email protected]> 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'} } */
> +}