> -----Original Message-----
> From: Richard Sandiford <richard.sandif...@arm.com>
> Sent: Tuesday, July 29, 2025 5:20 PM
> To: Alex Coplan <alex.cop...@arm.com>; Alice Carlotti 
> <alice.carlo...@arm.com>;
> pins...@gmail.com; ktkac...@nvidia.com; Richard Earnshaw
> <richard.earns...@arm.com>; Tamar Christina <tamar.christ...@arm.com>;
> Wilco Dijkstra <wilco.dijks...@arm.com>; gcc-patches@gcc.gnu.org
> Cc: Richard Sandiford <richard.sandif...@arm.com>
> Subject: [PATCH 2/2] aarch64: Use VNx16BI for svrev_b* [PR121294]
> 
> The previous patch for PR121294 handled svtrn1/2, svuzp1/2, and svzip1/2.
> This one extends it to handle svrev intrinsics, where the same kind of
> wrong code can be generated.
> 
> gcc/
>       PR target/121294
>       * config/aarch64/aarch64.md (UNSPEC_REV_PRED): New unspec.
>       * config/aarch64/aarch64-sve.md (@aarch64_sve_rev<mode>_acle)
>       (*aarch64_sve_rev<mode>_acle): New patterns.
>       * config/aarch64/aarch64-sve-builtins-base.cc
>       (svrev_impl::expand): Use the new patterns for boolean svrev.
> 
> gcc/testsuite/
>       PR target/121294
>       * gcc.target/aarch64/sve/acle/general/rev_2.c: New test.
> ---
>  .../aarch64/aarch64-sve-builtins-base.cc      |  5 +++-
>  gcc/config/aarch64/aarch64-sve.md             | 25 ++++++++++++++++++-
>  gcc/config/aarch64/aarch64.md                 |  1 +
>  .../aarch64/sve/acle/general/rev_2.c          | 24 ++++++++++++++++++
>  4 files changed, 53 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general/rev_2.c
> 
> diff --git a/gcc/config/aarch64/aarch64-sve-builtins-base.cc
> b/gcc/config/aarch64/aarch64-sve-builtins-base.cc
> index 32cce97b220..0d871a10898 100644
> --- a/gcc/config/aarch64/aarch64-sve-builtins-base.cc
> +++ b/gcc/config/aarch64/aarch64-sve-builtins-base.cc
> @@ -2858,7 +2858,10 @@ public:
>    rtx
>    expand (function_expander &e) const override
>    {
> -    return e.use_exact_insn (code_for_aarch64_sve_rev (e.vector_mode (0)));
> +    auto mode = e.vector_mode (0);
> +    return e.use_exact_insn (e.type_suffix (0).bool_p
> +                          ? code_for_aarch64_sve_rev_acle (mode)
> +                          : code_for_aarch64_sve_rev (mode));
>    }
>  };
> 
> diff --git a/gcc/config/aarch64/aarch64-sve.md b/gcc/config/aarch64/aarch64-
> sve.md
> index 23365eacbc7..13cab47243c 100644
> --- a/gcc/config/aarch64/aarch64-sve.md
> +++ b/gcc/config/aarch64/aarch64-sve.md
> @@ -9505,7 +9505,30 @@ (define_insn "@aarch64_sve_rev<mode>"
>       (unspec:PRED_ALL [(match_operand:PRED_ALL 1 "register_operand"
> "Upa")]
>                        UNSPEC_REV))]
>    "TARGET_SVE"
> -  "rev\t%0.<Vetype>, %1.<Vetype>")
> +  "rev\t%0.<Vetype>, %1.<Vetype>"
> +)
> +
> +(define_expand "@aarch64_sve_rev<mode>_acle"
> +  [(set (match_operand:VNx16BI 0 "register_operand" "=Upa")
> +     (unspec:VNx16BI
> +       [(match_operand:VNx16BI 1 "register_operand" "Upa")
> +        (match_dup:PRED_ALL 2)]
> +       UNSPEC_REV_PRED))]
> +  "TARGET_SVE"
> +  {
> +    operands[2] = CONST0_RTX (<MODE>mode);
> +  }
> +)
> +
> +(define_insn "*aarch64_sve_rev<mode>_acle"
> +  [(set (match_operand:VNx16BI 0 "register_operand" "=Upa")
> +     (unspec:VNx16BI
> +       [(match_operand:VNx16BI 1 "register_operand" "Upa")
> +        (match_operand:PRED_ALL 2 "aarch64_simd_imm_zero")]
> +       UNSPEC_REV_PRED))]
> +  "TARGET_SVE"
> +  "rev\t%0.<Vetype>, %1.<Vetype>"
> +)
> 
>  ;; -------------------------------------------------------------------------
>  ;; ---- [PRED] Special-purpose binary permutes
> diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
> index a4ae6859da0..dc2be815ede 100644
> --- a/gcc/config/aarch64/aarch64.md
> +++ b/gcc/config/aarch64/aarch64.md
> @@ -280,6 +280,7 @@ (define_c_enum "unspec" [
>      UNSPEC_PACIBSP
>      UNSPEC_PRLG_STK
>      UNSPEC_REV
> +    UNSPEC_REV_PRED
>      UNSPEC_SADALP
>      UNSPEC_SCVTF
>      UNSPEC_SET_LANE
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/rev_2.c
> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/rev_2.c
> new file mode 100644
> index 00000000000..f502f9b6dc0
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/rev_2.c
> @@ -0,0 +1,24 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +#include <arm_sve.h>
> +
> +svbool_t test1()
> +{
> +  return svrev_b16 (svptrue_b16 ());
> +}
> +
> +svbool_t test2()
> +{
> +  return svrev_b32 (svptrue_b32 ());
> +}
> +
> +svbool_t test3()
> +{
> +  return svrev_b64 (svptrue_b64 ());
> +}
> +
> +/* { dg-final { scan-assembler {\tptrue\tp[0-7]\.h} } } */
> +/* { dg-final { scan-assembler {\tptrue\tp[0-7]\.s} } } */
> +/* { dg-final { scan-assembler {\tptrue\tp[0-7]\.d} } } */
> +/* { dg-final { scan-assembler-not {\tptrue\tp[0-7]\.b} } } */

Perhaps we should also check that the 3 REVs are emitted?

Thanks,
Tamar
> --
> 2.43.0

Reply via email to