diff options
author | Jakub Jelinek <jakub@redhat.com> | 2024-10-04 12:36:52 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2024-10-04 12:36:52 +0200 |
commit | 67b750c20e1f9428ef89a6fed0103e912bea8679 (patch) | |
tree | f8a3732c62692d1dab312f37f879807fd97bb9d6 | |
parent | 247643c7e21b087e6c93b8b8d49b4268bf84b03b (diff) | |
download | gcc-67b750c20e1f9428ef89a6fed0103e912bea8679.zip gcc-67b750c20e1f9428ef89a6fed0103e912bea8679.tar.gz gcc-67b750c20e1f9428ef89a6fed0103e912bea8679.tar.bz2 |
i386: Fix up *minmax<mode>3_2 splitter [PR116925]
While *minmax<mode>3_1 correctly uses
if (MEM_P (operands[1]))
operands[1] = force_reg (<MODE>mode, operands[1]);
to ensure operands[1] is not a MEM, *minmax<mode>3_2 does it wrongly
by calling force_reg but ignoring its return value.
The following borderingly obvious patch fixes that.
Didn't find similar other errors in the backend with force_reg calls.
2024-10-04 Jakub Jelinek <jakub@redhat.com>
PR target/116925
* config/i386/sse.md (*minmax<mode>3_2): Assign force_reg result
back to operands[2] instead of throwing it away.
* g++.target/i386/avx-pr116925.C: New test.
-rw-r--r-- | gcc/config/i386/sse.md | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.target/i386/avx-pr116925.C | 12 |
2 files changed, 13 insertions, 1 deletions
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 183c195..d6e2135 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -3269,7 +3269,7 @@ u = UNSPEC_IEEE_MAX; if (MEM_P (operands[2])) - force_reg (<MODE>mode, operands[2]); + operands[2] = force_reg (<MODE>mode, operands[2]); rtvec v = gen_rtvec (2, operands[2], operands[1]); rtx tmp = gen_rtx_UNSPEC (<MODE>mode, v, u); emit_move_insn (operands[0], tmp); diff --git a/gcc/testsuite/g++.target/i386/avx-pr116925.C b/gcc/testsuite/g++.target/i386/avx-pr116925.C new file mode 100644 index 0000000..b2d6fc1 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/avx-pr116925.C @@ -0,0 +1,12 @@ +// PR target/116925 +// { dg-do compile } +// { dg-options "-O2 -mavx -ffloat-store" } + +typedef float V __attribute__((vector_size (16))); +V a, b, c; + +void +foo () +{ + c = a > b ? a : b; +} |