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" } } */
>
>
>
>
> --

Reply via email to