aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-10-04 12:36:52 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2024-10-04 12:36:52 +0200
commit67b750c20e1f9428ef89a6fed0103e912bea8679 (patch)
treef8a3732c62692d1dab312f37f879807fd97bb9d6
parent247643c7e21b087e6c93b8b8d49b4268bf84b03b (diff)
downloadgcc-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.md2
-rw-r--r--gcc/testsuite/g++.target/i386/avx-pr116925.C12
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;
+}