From af3cadb59fe6cb2097d2e636c1c70b26df39ae19 Mon Sep 17 00:00:00 2001 From: Tamar Christina Date: Thu, 7 Apr 2022 16:48:05 +0100 Subject: [PATCH] AArch64: fix ls64 intrinsics expansion [PR104409] The LS64 intrinsics used a machinery that's not safe to use unless being called from a pragma instantiation. This moves the initialization code to a new pragma for arm_acle.h. gcc/ChangeLog: PR target/104409 * config/aarch64/aarch64-builtins.cc (handle_arm_acle_h): New. (aarch64_general_init_builtins): Move LS64 code. * config/aarch64/aarch64-c.cc (aarch64_pragma_aarch64): Support arm_acle.h * config/aarch64/aarch64-protos.h (handle_arm_acle_h): New. * config/aarch64/arm_acle.h: Add pragma GCC aarch64 "arm_acle.h". --- gcc/config/aarch64/aarch64-builtins.cc | 11 ++++++++--- gcc/config/aarch64/aarch64-c.cc | 2 ++ gcc/config/aarch64/aarch64-protos.h | 1 + gcc/config/aarch64/arm_acle.h | 2 ++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/gcc/config/aarch64/aarch64-builtins.cc b/gcc/config/aarch64/aarch64-builtins.cc index 6ebeee7..c21476d 100644 --- a/gcc/config/aarch64/aarch64-builtins.cc +++ b/gcc/config/aarch64/aarch64-builtins.cc @@ -1664,6 +1664,14 @@ aarch64_init_ls64_builtins (void) = aarch64_general_add_builtin (data[i].name, data[i].type, data[i].code); } +/* Implement #pragma GCC aarch64 "arm_acle.h". */ +void +handle_arm_acle_h (void) +{ + if (TARGET_LS64) + aarch64_init_ls64_builtins (); +} + /* Initialize fpsr fpcr getters and setters. */ static void @@ -1755,9 +1763,6 @@ aarch64_general_init_builtins (void) if (TARGET_MEMTAG) aarch64_init_memtag_builtins (); - - if (TARGET_LS64) - aarch64_init_ls64_builtins (); } /* Implement TARGET_BUILTIN_DECL for the AARCH64_BUILTIN_GENERAL group. */ diff --git a/gcc/config/aarch64/aarch64-c.cc b/gcc/config/aarch64/aarch64-c.cc index caf8e33..767ee0c 100644 --- a/gcc/config/aarch64/aarch64-c.cc +++ b/gcc/config/aarch64/aarch64-c.cc @@ -302,6 +302,8 @@ aarch64_pragma_aarch64 (cpp_reader *) aarch64_sve::handle_arm_sve_h (); else if (strcmp (name, "arm_neon.h") == 0) handle_arm_neon_h (); + else if (strcmp (name, "arm_acle.h") == 0) + handle_arm_acle_h (); else error ("unknown %<#pragma GCC aarch64%> option %qs", name); } diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index c6f13ee..2ac781d 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -995,6 +995,7 @@ rtx aarch64_general_expand_builtin (unsigned int, tree, rtx, int); tree aarch64_general_builtin_decl (unsigned, bool); tree aarch64_general_builtin_rsqrt (unsigned int); tree aarch64_builtin_vectorized_function (unsigned int, tree, tree); +void handle_arm_acle_h (void); void handle_arm_neon_h (void); namespace aarch64_sve { diff --git a/gcc/config/aarch64/arm_acle.h b/gcc/config/aarch64/arm_acle.h index ecd852f..9775a48 100644 --- a/gcc/config/aarch64/arm_acle.h +++ b/gcc/config/aarch64/arm_acle.h @@ -29,6 +29,8 @@ #include +#pragma GCC aarch64 "arm_acle.h" + #ifdef __cplusplus extern "C" { #endif -- 2.7.4