]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR target/124194: Fix __builtin_ia32_cmpd256_mask(op,op,TRUE)
authorRoger Sayle <roger@nextmovesoftware.com>
Thu, 26 Feb 2026 08:07:12 +0000 (08:07 +0000)
committerRoger Sayle <roger@nextmovesoftware.com>
Thu, 26 Feb 2026 08:09:10 +0000 (08:09 +0000)
This patch fixes the wrong code regression PR target/124194 on x86_64.
The target implements a pre-reload splitter that recognizes that
integer vector comparisons can be evaluated at compile-time when the
operands being compared are the same (register).  The (admittedly rare)
case when the comparison operator is always-true, was incorrectly
handled and folded to false instead of the correct value true.

2025-02-26  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
PR target/124194
* config/i386/sse.md (*<avx512>_cmp<mode>3_dup_op): Also return
CONSTM1_RTX for the case cmp_imm == 7 (predicate TRUE).

gcc/testsuite/ChangeLog
PR target/124194
* gcc.target/i386/pr124194.c: New test case.

gcc/config/i386/sse.md
gcc/testsuite/gcc.target/i386/pr124194.c [new file with mode: 0644]

index cfe7a046f4283464252cc653bc4aac76bd4565c1..2e15842b3c7d28a8f22331207780c5628990ab61 100644 (file)
 {
   int cmp_imm = INTVAL (operands[3]);
   rtx res = CONST0_RTX (<avx512fmaskmode>mode);
-  /* EQ/LE/NLT.  */
-  if (cmp_imm == 0 || cmp_imm == 2 || cmp_imm == 5)
+  /* EQ/LE/NLT/TRUE.  */
+  if (cmp_imm == 0 || cmp_imm == 2 || cmp_imm == 5 || cmp_imm == 7)
   {
     int nelts = GET_MODE_NUNITS (<MODE>mode);
     if (nelts >= 8)
diff --git a/gcc/testsuite/gcc.target/i386/pr124194.c b/gcc/testsuite/gcc.target/i386/pr124194.c
new file mode 100644 (file)
index 0000000..c295b69
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR target/124194 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+typedef __attribute__((__vector_size__ (8 *sizeof (int)))) int V;
+
+int
+main ()
+{
+  unsigned char x = __builtin_ia32_cmpd256_mask ((V){}, (V){}, 7, 0xff);
+  if (x != 0xff)
+    __builtin_abort();
+  return 0;
+}
+/* { dg-final { scan-assembler-times "xorl" 1 } } */
+/* { dg-final { scan-assembler-not "vpcmpd" } } */