]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
aarch64: Use VNx16BI for svrev_b* [PR121294]
authorRichard Sandiford <richard.sandiford@arm.com>
Thu, 14 Aug 2025 16:56:51 +0000 (17:56 +0100)
committerRichard Sandiford <richard.sandiford@arm.com>
Thu, 14 Aug 2025 16:56:51 +0000 (17:56 +0100)
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.

gcc/config/aarch64/aarch64-sve-builtins-base.cc
gcc/config/aarch64/aarch64-sve.md
gcc/config/aarch64/aarch64.md
gcc/testsuite/gcc.target/aarch64/sve/acle/general/rev_2.c [new file with mode: 0644]

index b4396837c2468e1f43b4ffda4eceb43a34c2e7eb..6eef545dd3f6d5d8cba3e9014db6066edb37dcc0 100644 (file)
@@ -2857,7 +2857,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));
   }
 };
 
index 2161907c3273f60a643cdbe8e7ceb39674ab2a4b..d2bbdc7e1275d1e18a781009194eb3aa2dec5658 100644 (file)
        (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")
+       (unspec:VNx16BI
+         [(match_operand:VNx16BI 1 "register_operand")
+          (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
index 79bbf5fafb3139b11be5db90c02954cb69972f92..fa4791d91fcb035827023005c0876d56295976ec 100644 (file)
     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 (file)
index 0000000..3dc4eb9
--- /dev/null
@@ -0,0 +1,27 @@
+/* { 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} } } */
+/* { dg-final { scan-assembler {\trev\tp0\.h} } } */
+/* { dg-final { scan-assembler {\trev\tp0\.s} } } */
+/* { dg-final { scan-assembler {\trev\tp0\.d} } } */