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)

Reply via email to