Hi all, This patch implements the missed optimisation noted in PR117850.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117850 Changes since the last revision: - Now processing different function signatures programatically - Fixed ICE RE the type referred to by a BIT_FIELD_REF - Modified testcase regex to account for commutativity - Removed vabal_combine.c in favour of coverage in fold_to_highpart_1.c - Supported widening floating-point conversions - General response to feedback from Richard S., Christophe Lyon. Notes: - I'm on the fence about adding more conservative assertions to aarch64_duplicate_vector_cst. E.g. gcc_assert (types_compatible_p (TREE_TYPE (TREE_TYPE (vec_in)), (TREE_TYPE (out_ty)))); - I give this test in fold_to_highpart_7.c; https://godbolt.org/z/sG6GdEdGb. It's interesting that the current behavior of GCC is worse than GCC14, trunk targeting aarch64_be, and Clang. Maybe it's worth a thought? Bootstrapped and regtested on aarch64-none-linux-gnu. This work was also tested on a cross-compiler targeting aarch64_be-none-linux-gnu. OK for stage-1? Thanks, Spencer Spencer Abson (1): AArch64: Fold builtins with highpart args to highpart equivalent [PR117850] gcc/config/aarch64/aarch64-builtin-pairs.def | 81 ++ gcc/config/aarch64/aarch64-builtins.cc | 206 +++++ .../aarch64/simd/fold_to_highpart_1.c | 733 ++++++++++++++++++ .../aarch64/simd/fold_to_highpart_2.c | 86 ++ .../aarch64/simd/fold_to_highpart_3.c | 81 ++ .../aarch64/simd/fold_to_highpart_4.c | 77 ++ .../aarch64/simd/fold_to_highpart_5.c | 38 + .../aarch64/simd/fold_to_highpart_6.c | 94 +++ .../aarch64/simd/fold_to_highpart_7.c | 36 + .../gcc.target/aarch64/simd/vabal_combine.c | 72 -- 10 files changed, 1432 insertions(+), 72 deletions(-) create mode 100644 gcc/config/aarch64/aarch64-builtin-pairs.def create mode 100644 gcc/testsuite/gcc.target/aarch64/simd/fold_to_highpart_1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/simd/fold_to_highpart_2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/simd/fold_to_highpart_3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/simd/fold_to_highpart_4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/simd/fold_to_highpart_5.c create mode 100644 gcc/testsuite/gcc.target/aarch64/simd/fold_to_highpart_6.c create mode 100644 gcc/testsuite/gcc.target/aarch64/simd/fold_to_highpart_7.c delete mode 100644 gcc/testsuite/gcc.target/aarch64/simd/vabal_combine.c -- 2.34.1