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

Reply via email to