public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/tnfchris/heads/gcc-14-early-break)] aarch64: Add optimization for vector != cbranch fed into compare with 0 for Adv.SIMD
@ 2023-11-15 14:56 Tamar Christina
0 siblings, 0 replies; only message in thread
From: Tamar Christina @ 2023-11-15 14:56 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:3ae3157f52597845750cf1de9f62ec7fa903fe16
commit 3ae3157f52597845750cf1de9f62ec7fa903fe16
Author: Tamar Christina <tamar.christina@arm.com>
Date: Tue Jun 20 16:10:39 2023 +0100
aarch64: Add optimization for vector != cbranch fed into compare with 0 for Adv.SIMD
Diff:
---
gcc/config/aarch64/aarch64-simd.md | 31 ++++++++++++++++++++++
.../aarch64/vect-early-break-cbranch_2.c | 29 ++++++++++++++++++++
2 files changed, 60 insertions(+)
diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md
index 1d8e78d83a8..31adb649877 100644
--- a/gcc/config/aarch64/aarch64-simd.md
+++ b/gcc/config/aarch64/aarch64-simd.md
@@ -3910,6 +3910,37 @@
DONE;
})
+;; Avdanced SIMD lacks a vector != comparison, but this is a quite common
+;; operation. To not pay the penalty for inverting == we can map our any
+;; comparisons to all i.e. any(~x) => all(x).
+(define_insn_and_split "*cbranchnev4si"
+ [(set (pc)
+ (if_then_else
+ (ne (subreg:DI
+ (unspec:V4SI
+ [(not:V4SI (match_operand:V4SI 0 "register_operand" "w"))
+ (not:V4SI (match_dup 0))]
+ UNSPEC_UMAXV) 0)
+ (const_int 0))
+ (label_ref (match_operand 1 ""))
+ (pc)))
+ (clobber (match_scratch:DI 2 "=w"))]
+ "TARGET_SIMD && false"
+ "#"
+ "&& true"
+ [(set (match_dup 2)
+ (unspec:V4SI [(match_dup 0) (match_dup 0)] UNSPEC_UMINV))
+ (set (pc)
+ (if_then_else
+ (eq (subreg:DI (match_dup 2) 0)
+ (const_int 0))
+ (label_ref (match_dup 1))
+ (pc)))]
+{
+ if (can_create_pseudo_p ())
+ operands[2] = gen_reg_rtx (V4SImode);
+})
+
;; Patterns comparing two vectors to produce a mask.
(define_expand "vec_cmp<mode><mode>"
diff --git a/gcc/testsuite/gcc.target/aarch64/vect-early-break-cbranch_2.c b/gcc/testsuite/gcc.target/aarch64/vect-early-break-cbranch_2.c
new file mode 100644
index 00000000000..e81027bb501
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/vect-early-break-cbranch_2.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } } */
+
+#pragma GCC target "+nosve"
+
+#define N 640
+int a[N] = {0};
+int b[N] = {0};
+
+
+/*
+** f1:
+** ...
+ cmeq v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s
+ uminp v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s
+ fmov x[0-9]+, d[0-9]+
+ cbz x[0-9]+, \.L[0-9]+
+** ...
+*/
+void f1 (int x)
+{
+ for (int i = 0; i < N; i++)
+ {
+ b[i] += a[i];
+ if (a[i] != x)
+ break;
+ }
+}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-11-15 14:56 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-15 14:56 [gcc(refs/users/tnfchris/heads/gcc-14-early-break)] aarch64: Add optimization for vector != cbranch fed into compare with 0 for Adv.SIMD Tamar Christina
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).