On Thu, Jun 16, 2022 at 1:10 PM Tamar Christina via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > Hi All, > > This adds a match.pd rule that drops the bitwwise nots when both arguments to > a > subtract is inverted. i.e. for: > > float g(float a, float b) > { > return ~(int)a - ~(int)b; > } > > we instead generate > > float g(float a, float b) > { > return (int)a - (int)b; > } > > We already do a limited version of this from the fold_binary fold functions > but > this makes a more general version in match.pd that applies more often. > > Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. > > Ok for master? > > Thanks, > Tamar > > gcc/ChangeLog: > > * match.pd: New bit_not rule. > > gcc/testsuite/ChangeLog: > > * gcc.dg/subnot.c: New test. > > --- inline copy of patch -- > diff --git a/gcc/match.pd b/gcc/match.pd > index > a59b6778f661cf9121dd3503f43472871e4da445..51b0a1b562409af535e53828a10c30b8a3e1ae2e > 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -1258,6 +1258,10 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (simplify > (bit_not (plus:c (bit_not @0) @1)) > (minus @0 @1)) > +/* (~X - ~Y) -> X - Y. */ > +(simplify > + (minus (bit_not @0) (bit_not @1)) > + (minus @0 @1))
It doesn't seem correct. (gdb) p/x ~-1 - ~0x80000000 $3 = 0x80000001 (gdb) p/x -1 - 0x80000000 $4 = 0x7fffffff where I was looking for a case exposing undefined integer overflow. Richard. > > /* ~(X - Y) -> ~X + Y. */ > (simplify > diff --git a/gcc/testsuite/gcc.dg/subnot.c b/gcc/testsuite/gcc.dg/subnot.c > new file mode 100644 > index > 0000000000000000000000000000000000000000..d621bacd27bd3d19a010e4c9f831aa77d28bd02d > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/subnot.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O -fdump-tree-optimized" } */ > + > +float g(float a, float b) > +{ > + return ~(int)a - ~(int)b; > +} > + > +/* { dg-final { scan-tree-dump-not "~" "optimized" } } */ > > > > > --