Tamar Christina <tamar.christ...@arm.com> writes:
>> -----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?

Yeah, good idea.  I added:

/* { dg-final { scan-assembler {\trev\tp0\.h} } } */
/* { dg-final { scan-assembler {\trev\tp0\.s} } } */
/* { dg-final { scan-assembler {\trev\tp0\.d} } } */

Thanks,
Richard

Reply via email to