diff options
author | Saurabh Jha <saurabh.jha@arm.com> | 2024-10-03 13:16:31 +0000 |
---|---|---|
committer | Saurabh Jha <saurabh.jha@arm.com> | 2024-10-04 19:04:15 +0000 |
commit | 20ce363c557d6458ec3193ab4e7df760fbe34976 (patch) | |
tree | c27c27116dfc606c54b2732d3a8ab3a4059125b2 /gcc | |
parent | 58b9024c996951f8d768f1c83a74e5f3eef8a1c7 (diff) | |
download | gcc-20ce363c557d6458ec3193ab4e7df760fbe34976.zip gcc-20ce363c557d6458ec3193ab4e7df760fbe34976.tar.gz gcc-20ce363c557d6458ec3193ab4e7df760fbe34976.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/aarch64/iterators.md | 8 | ||||
-rw-r--r-- | 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 0836dee..fcad236 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 0000000..94fb96f --- /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; + } +} |