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