Richard Biener via Gcc-patches <gcc-patches@gcc.gnu.org> writes: > 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.
Yeah, shouldn't it be folding to (minus @1 @0) instead? ~X = (-X - 1) -Y = (-Y - 1) so: ~X - ~Y = (-X - 1) - (-Y - 1) = -X - 1 + Y + 1 = Y - X Richard > 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" } } */ >> >> >> >> >> --