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
