On Tue, Jul 30, 2024 at 5:25 PM Andrew Pinski <quic_apin...@quicinc.com> wrote:
>
> The problem here is that in generic types of comparisons don't need
> to be boolean types (or vector boolean types). And fixes that by making
> sure the types of the conditions match before doing the optimization.
>
> Bootstrapped and tested on x86_64-linux-gnu with no regressions.

OK

>         PR middle-end/116134
>
> gcc/ChangeLog:
>
>         * match.pd (`(a ? x : y) eq/ne (b ? x : y)`): Check that
>         a and b types match.
>         (`(a ? x : y) eq/ne (b ? y : x)`): Likewise.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/torture/pr116134-1.c: New test.
>
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
>  gcc/match.pd                              | 10 ++++++----
>  gcc/testsuite/gcc.dg/torture/pr116134-1.c |  9 +++++++++
>  2 files changed, 15 insertions(+), 4 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/torture/pr116134-1.c
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 1c8601229e3..881a827860f 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -5640,12 +5640,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>   (for eqne (eq ne)
>    (simplify
>     (eqne:c (cnd @0 @1 @2) (cnd @3 @1 @2))
> -    (cnd (bit_xor @0 @3) { constant_boolean_node (eqne == NE_EXPR, type); }
> -     { constant_boolean_node (eqne != NE_EXPR, type); }))
> +    (if (types_match (TREE_TYPE (@0), TREE_TYPE (@3)))
> +     (cnd (bit_xor @0 @3) { constant_boolean_node (eqne == NE_EXPR, type); }
> +      { constant_boolean_node (eqne != NE_EXPR, type); })))
>    (simplify
>     (eqne:c (cnd @0 @1 @2) (cnd @3 @2 @1))
> -    (cnd (bit_xor @0 @3) { constant_boolean_node (eqne != NE_EXPR, type); }
> -     { constant_boolean_node (eqne == NE_EXPR, type); }))))
> +    (if (types_match (TREE_TYPE (@0), TREE_TYPE (@3)))
> +     (cnd (bit_xor @0 @3) { constant_boolean_node (eqne != NE_EXPR, type); }
> +      { constant_boolean_node (eqne == NE_EXPR, type); })))))
>
>  /* Canonicalize mask ? { 0, ... } : { -1, ...} to ~mask if the mask
>     types are compatible.  */
> diff --git a/gcc/testsuite/gcc.dg/torture/pr116134-1.c 
> b/gcc/testsuite/gcc.dg/torture/pr116134-1.c
> new file mode 100644
> index 00000000000..ab595f99680
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/torture/pr116134-1.c
> @@ -0,0 +1,9 @@
> +/* { dg-do compile } */
> +
> +/* This used to ICE as comparisons on generic can be different types. */
> +/* PR middle-end/116134  */
> +
> +int a;
> +int b;
> +int d;
> +void c() { 1UL <= (d < b) != (1UL & (0 < a | 0L)); }
> --
> 2.43.0
>

Reply via email to