https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125707

--- Comment #6 from Drea Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Kael Franco from comment #5)
> Comment on attachment 64700 [details]
> Proposed patch
> 
> From c3d7d4fe221e3940bd5957165f3e613f41962341 Mon Sep 17 00:00:00 2001
> From: Kael Andrew Alonzo Franco <[email protected]>
> Date: Thu, 11 Jun 2026 14:56:26 -0400
> Subject: [PATCH] match: Optimize (~a) >> a to -1 for signed a [PR125707]
> 
> Since ~a is negative, then (~a) >> a is -1 since
> it set all the lower bits to one via >>.

The real reason is (~a) >> a for signed a is the same as ~(a>>a) which is ~0
aka -1. The pattern just below where you added this pattern has the opposite
effect that is ~(a>>b) into (~a)>>b [where b is a for your case].

> 
> Bootstrapped and tested on x86_64-pc-linux-gnu
> 
>       PR tree-optimization/125707
> 
> gcc/ChangeLog:
> 
>       PR tree-optimization/125707
>       * match.pd: Add (~a) >> a to -1 for signed a.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR tree-optimization/125707
>       * gcc.dg/pr125707.c: New test.
> 
> Signed-off-by: Kael Franco <[email protected]>
> ---
>  gcc/match.pd                    |  7 +++++++
>  gcc/testsuite/gcc.dg/pr125707.c | 16 ++++++++++++++++
>  2 files changed, 23 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/pr125707.c
> 
> diff --git a/gcc/match.pd b/gcc/match.pd
> index e0d7ef80e14..ea4a447f081 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -1831,6 +1831,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>       && wi::to_wide (@1) != wi::min_value (TYPE_PRECISION (type),
>                                             SIGNED))
>      (minus (plus @1 { build_minus_one_cst (type); }) @0))))
> +
> +/* (~X) >> X -> -1 for signed X.  */
> +(simplify
> + (rshift (bit_not @0) (convert? @0))
> + (if (INTEGRAL_TYPE_P (type)
> +      && !TYPE_UNSIGNED (type))
> +  { build_minus_one_cst (type); }))
>  #endif
>  
>  /* ~(X >> Y) -> ~X >> Y if ~X can be simplified.  */
> diff --git a/gcc/testsuite/gcc.dg/pr125707.c
> b/gcc/testsuite/gcc.dg/pr125707.c
> new file mode 100644
> index 00000000000..7c1de1249c4
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr125707.c
> @@ -0,0 +1,16 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +int
> +rshift_bit_not_int_x_x (int x)
> +{
> +  return (~x) >> x;
> +}
> +
> +long
> +rshift_bit_not_long_x_x (long x)
> +{
> +  return (~x) >> x;
> +}
> +
> +/* { dg-final { scan-tree-dump-times "return -1;" 2 "optimized" } } */
> -- 
> 2.54.0

Reply via email to