On Tue, 14 Jul 2026, Hu, Lin1 wrote:
> 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.
OK.
Thanks,
Richard.
> 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
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald; (HRB 36809, AG Nuernberg)