On Sun, Jun 7, 2026 at 8:46 PM Souradipto Das <[email protected]> wrote:
>
> This patch introduces a simplification rule in match.pd to reduce bitwise
> expressions against zero. Specifically, it simplifies patterns where a
> variable checked against zero is combined via bitwise AND/OR with a compounded
> bitwise OR check against zero.
>
>         PR tree-optimization/125442
>
> gcc/ChangeLog:
>
>         * match.pd: Add simplification rules for
>         (a == 0) | ((a | b) == 0) -> (a == 0) and
>         (a != 0) & ((a | b) != 0) -> (a != 0).

Ok, pushed as https://gcc.gnu.org/pipermail/gcc-cvs/2026-June/455459.html .

Thanks again for working on this and sorry it took me almost a week to
review this version of the patch.

Thanks,
Andrea

>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/int-bwise-opt-3.c: New test.
>         * gcc.dg/int-bwise-opt-4.c: New test.
>
> Suggested-by: Andrew Pinski <[email protected]>
> Signed-off-by: Souradipto Das <[email protected]>
> ---
> Changes in v3:
>  - Squashed the match.pd optimization rules and testcases into a single 
> unified patch.
> Changes in v2:
>  - Added dedicated testcases for the new bitwise optimization rules as 
> suggested by Andrew Pinski.
>  gcc/match.pd                           | 9 +++++++++
>  gcc/testsuite/gcc.dg/int-bwise-opt-3.c | 9 +++++++++
>  gcc/testsuite/gcc.dg/int-bwise-opt-4.c | 9 +++++++++
>  3 files changed, 27 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/int-bwise-opt-3.c
>  create mode 100644 gcc/testsuite/gcc.dg/int-bwise-opt-4.c
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 8a2de136e..4a2f9a784 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -6660,6 +6660,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>   (simplify
>    (bitop (neeql @0 @1) (neeqr (bit_ior @0 @1) integer_zerop))
>    { constant_boolean_node (bitop == BIT_IOR_EXPR, type); }))
> +
> +/* (a == 0) | ((a | b) == 0) -> (a == 0) -- PR125442
> +   (a != 0) & ((a | b) != 0) -> (a != 0) -- PR125442 */
> +
> +(for bitop (bit_and bit_ior)
> +     neeq  (ne      eq)
> +(simplify
> +  (bitop:c (neeq@2 @0 integer_zerop) (neeq (bit_ior:c @0 @1) integer_zerop))
> +  @2))
>  #endif
>
>  /* These was part of minmax phiopt.  */
> diff --git a/gcc/testsuite/gcc.dg/int-bwise-opt-3.c 
> b/gcc/testsuite/gcc.dg/int-bwise-opt-3.c
> new file mode 100644
> index 000000000..199e85dbe
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/int-bwise-opt-3.c
> @@ -0,0 +1,9 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +int f1(int a, int b)
> +{
> +  return (a == 0) | ((a | b) == 0);
> +}
> +
> +/* { dg-final { scan-tree-dump-times "\\\|" 0 "optimized" } } */
> diff --git a/gcc/testsuite/gcc.dg/int-bwise-opt-4.c 
> b/gcc/testsuite/gcc.dg/int-bwise-opt-4.c
> new file mode 100644
> index 000000000..6989f71b8
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/int-bwise-opt-4.c
> @@ -0,0 +1,9 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +int f2(int a, int b)
> +{
> +  return (a != 0) & ((a | b) != 0);
> +}
> +
> +/* { dg-final { scan-tree-dump-times "\&" 0 "optimized" } } */
> --
> 2.43.0
>

Reply via email to