Re-send the patch, modified bugzilla number and testcase name.

emit_cmp_and_jump_insns used GET_MODE (expand_normal (masked_op)) to select the
mask mode.  For vector boolean constants that expand to CONST_INT, this produces
VOIDmode and triggers the assert mode != VOID_mode in maybe_legitimize_operand.

Use TYPE_MODE (TREE_TYPE (masked_op)), so the constant can be materialized in
the right mask mode.

gcc/ChangeLog:

        PR middle-end/126203
        PR middle-end/126221
        PR middle-end/126232
        * optabs.cc (emit_cmp_and_jump_insns): Take the masked_op mode
        from TREE_TYPE (masked_op).

gcc/testsuite/ChangeLog:

        * gcc.target/i386/pr126221-1.c: New test.
        * gcc.target/i386/pr126221-2.c: Ditto.
        * gfortran.dg/pr126221.f90: Ditto.
---
 gcc/optabs.cc                              |  2 +-
 gcc/testsuite/gcc.target/i386/pr126221-1.c | 14 ++++++++++++++
 gcc/testsuite/gcc.target/i386/pr126221-2.c | 18 ++++++++++++++++++
 gcc/testsuite/gfortran.dg/pr126221.f90     |  9 +++++++++
 4 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr126221-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/pr126221-2.c
 create mode 100644 gcc/testsuite/gfortran.dg/pr126221.f90

diff --git a/gcc/optabs.cc b/gcc/optabs.cc
index 57fc9d3306e..012c0e9736e 100644
--- a/gcc/optabs.cc
+++ b/gcc/optabs.cc
@@ -5097,8 +5097,8 @@ emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code 
comparison, rtx size,
              create_input_operand (&ops[offset + 1], op1c, mode2);
              if (masked_op)
                {
+                 auto mask_mode = TYPE_MODE (TREE_TYPE (masked_op));
                  rtx mask_op = expand_normal (masked_op);
-                 auto mask_mode = GET_MODE (mask_op);
                  create_input_operand (&ops[0], mask_op, mask_mode);
                }
              else if (len_op)
diff --git a/gcc/testsuite/gcc.target/i386/pr126221-1.c 
b/gcc/testsuite/gcc.target/i386/pr126221-1.c
new file mode 100644
index 00000000000..c7b8680ece8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr126221-1.c
@@ -0,0 +1,14 @@
+/* PR middle-end/126221 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=x86-64-v4" } */
+
+int a[5];
+int
+foo (int t)
+{
+  for (int c = 0; c < 5; c++)
+    if (a[c] && c == 0)
+      return 0;
+  return t;
+}
+
diff --git a/gcc/testsuite/gcc.target/i386/pr126221-2.c 
b/gcc/testsuite/gcc.target/i386/pr126221-2.c
new file mode 100644
index 00000000000..de3c35f3fec
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr126221-2.c
@@ -0,0 +1,18 @@
+/* PR middle-end/126221 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-O3 -fvect-cost-model=unlimited 
--param=vect-partial-vector-usage=2 -mavx10.1" } */
+
+#if __BITINT_MAXWIDTH__ >= 10986
+_BitInt(10986) b;
+char c;
+
+void
+foo (void)
+{
+  int t;
+  if (__builtin_mul_overflow 
(0xffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffffuwb,
 c, &t))
+    t = 1;
+  b = t;
+}
+
+#endif
diff --git a/gcc/testsuite/gfortran.dg/pr126221.f90 
b/gcc/testsuite/gfortran.dg/pr126221.f90
new file mode 100644
index 00000000000..addf76dc3a1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr126221.f90
@@ -0,0 +1,9 @@
+! { dg-do compile }
+! { dg-options "-O3" }
+! { dg-additional-options "-mavx10.1 --param=vect-partial-vector-usage=2" { 
target { i?86-*-* x86_64-*-* } } }
+!
+! PR middle-end/126221
+
+integer A(5,5)
+if (any (A(:,5) /= [9, 9, 9, 9, 5])) STOP
+end
-- 
2.31.1

Reply via email to