https://gcc.gnu.org/g:20ce363c557d6458ec3193ab4e7df760fbe34976

commit r15-4079-g20ce363c557d6458ec3193ab4e7df760fbe34976
Author: Saurabh Jha <saurabh....@arm.com>
Date:   Thu Oct 3 13:16:31 2024 +0000

    aarch64: Fix bug with max/min (PR116934)
    
    In ac4cdf5cb43c0b09e81760e2a1902ceebcf1a135, I introduced a bug where
    I put the new unspecs, UNSPEC_COND_SMAX and UNSPEC_COND_SMIN, into the
    wrong iterator.
    
    I should have put new unspecs in SVE_COND_FP_MAXMIN but I put it in
    SVE_COND_FP_BINARY_REG instead. That was incorrect because the
    SVE_COND_FP_MAXMIN iterator is being used for predicated floating-point
    maximum/minimum, not SVE_COND_FP_BINARY_REG.
    
    Also added a testcase to validate the new change.
    
    Regression tested on aarch64-unknown-linux-gnu and found no regressions.
    There are some test cases with "libitm" in their directory names which
    appear in compare_tests output as changed tests but it looks like they
    are in the output just because of changed build directories, like from
    build-patched/aarch64-unknown-linux-gnu/./libitm/* to
    build-pristine/aarch64-unknown-linux-gnu/./libitm/*. I didn't think it
    was a cause of concern and have pushed this for review.
    
    gcc/ChangeLog:
    
            PR target/116934
            * config/aarch64/iterators.md: Move UNSPEC_COND_SMAX and
            UNSPEC_COND_SMIN to correct iterators.
    
    gcc/testsuite/ChangeLog:
    
            PR target/116934
            * gcc.target/aarch64/sve2/pr116934.c: New test.

Diff:
---
 gcc/config/aarch64/iterators.md                  |  8 ++++----
 gcc/testsuite/gcc.target/aarch64/sve2/pr116934.c | 13 +++++++++++++
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md
index 0836dee61c9f..fcad236eee9f 100644
--- a/gcc/config/aarch64/iterators.md
+++ b/gcc/config/aarch64/iterators.md
@@ -3125,9 +3125,7 @@
 
 (define_int_iterator SVE_COND_FP_BINARY_REG
   [UNSPEC_COND_FDIV
-   UNSPEC_COND_FMULX
-   UNSPEC_COND_SMAX
-   UNSPEC_COND_SMIN])
+   UNSPEC_COND_FMULX])
 
 (define_int_iterator SVE_COND_FCADD [UNSPEC_COND_FCADD90
                                     UNSPEC_COND_FCADD270])
@@ -3135,7 +3133,9 @@
 (define_int_iterator SVE_COND_FP_MAXMIN [UNSPEC_COND_FMAX
                                         UNSPEC_COND_FMAXNM
                                         UNSPEC_COND_FMIN
-                                        UNSPEC_COND_FMINNM])
+                                        UNSPEC_COND_FMINNM
+                                        UNSPEC_COND_SMAX
+                                        UNSPEC_COND_SMIN])
 
 (define_int_iterator SVE_COND_FP_TERNARY [UNSPEC_COND_FMLA
                                          UNSPEC_COND_FMLS
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/pr116934.c 
b/gcc/testsuite/gcc.target/aarch64/sve2/pr116934.c
new file mode 100644
index 000000000000..94fb96ffa7db
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve2/pr116934.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-Ofast -mcpu=neoverse-v2" } */
+
+int a;
+float *b;
+
+void foo() {
+  for (; a; a--, b += 4) {
+    b[0] = b[1] = b[2] = b[2] > 0 ?: 0;
+    if (b[3] < 0)
+      b[3] = 0;
+  }
+}

Reply via email to