Jakub Jelinek <ja...@redhat.com> writes:
> Hi!
>
> The gcc.dg/vect/pr113281-1.c test and many others ICE on riscv since
> presumably the r15-9238 change which allowed more cases of vector modes
> in simplify_const_relational_operation.
> In the testcase it is EQ of
> (popcount:SI (unspec:RVVMF32BI [
>             (and:RVVMF32BI (const_vector:RVVMF32BI repeat [
>                         (const_int 1 [0x1])
>                     ])
>                 (reg:RVVMF32BI 147 [ mask__6.8_35 ]))
>             (reg:SI 143 [ _41 ])
>             (const_int 0 [0])
>             (reg:SI 66 vl)
>             (reg:SI 67 vtype)
>         ] UNSPEC_VPREDICATE))
> and
> (const_int 0 [0])
> which it tries to fold as EQ comparison of
> (unspec:RVVMF32BI [
>         (and:RVVMF32BI (const_vector:RVVMF32BI repeat [
>                     (const_int 1 [0x1])
>                 ])
>             (reg:RVVMF32BI 147 [ mask__6.8_35 ]))
>         (reg:SI 143 [ _41 ])
>         (const_int 0 [0])
>         (reg:SI 66 vl)
>         (reg:SI 67 vtype)
>     ] UNSPEC_VPREDICATE)
> with
> (const_int 0 [0])
> which ICEs because const0_rtx isn't a vector.
> Fixed by using CONST0_RTX, so that we pass
> (const_vector:RVVMF32BI repeat [
>         (const_int 0 [0])
>     ])
> instead.
>
> I'll bootstrap/regtest this on aarch64-linux but have no way
> to test it for RISCV, will some CI take care of it or can somebody
> please test it?
>
> 2025-04-08  Jakub Jelinek  <ja...@redhat.com>
>
>       PR rtl-optimization/119672
>       * simplify-rtx.cc (simplify_context::simplify_relational_operation_1):
>       For POPCOUNT == 0 or != 0 optimizations use
>       CONST0_RTX (GET_MODE (XEXP (op0, 0))) rather than const0_rtx.

OK.  Thanks for taking the PR.

Richard

> --- gcc/simplify-rtx.cc.jj    2025-04-07 11:54:49.216910340 +0200
> +++ gcc/simplify-rtx.cc       2025-04-08 11:14:53.826293652 +0200
> @@ -6465,14 +6465,16 @@ simplify_context::simplify_relational_op
>        case LEU:
>       /* (eq (popcount x) (const_int 0)) -> (eq x (const_int 0)).  */
>       return simplify_gen_relational (EQ, mode, GET_MODE (XEXP (op0, 0)),
> -                                     XEXP (op0, 0), const0_rtx);
> +                                     XEXP (op0, 0),
> +                                     CONST0_RTX (GET_MODE (XEXP (op0, 0))));
>  
>        case NE:
>        case GT:
>        case GTU:
>       /* (ne (popcount x) (const_int 0)) -> (ne x (const_int 0)).  */
>       return simplify_gen_relational (NE, mode, GET_MODE (XEXP (op0, 0)),
> -                                     XEXP (op0, 0), const0_rtx);
> +                                     XEXP (op0, 0),
> +                                     CONST0_RTX (GET_MODE (XEXP (op0, 0))));
>  
>        default:
>       break;
>
>       Jakub

Reply via email to