On Tue, Apr 8, 2014 at 10:31 AM, Jakub Jelinek <ja...@redhat.com> wrote:
> On Mon, Apr 07, 2014 at 06:22:14PM +0200, Andreas Krebbel wrote:
>> On Mon, Apr 07, 2014 at 04:19:06PM +0200, Richard Biener wrote:
>> > The adjusted testcases now fail on x86_64/i?86 at least.  See PR60776.
>>
>> They seem to require at least -O2 on x86 with that change. Ok to apply?
>
> The reason why the modified test now requires -O2 seems to be that during
> ce1 a conditional move is detected, but there is no DCE to clean stuff
> up before combine at -O1 and thus the bswapsi result pseudo has multiple
> uses.
>
> I guess your patch is ok for now, for 5.0 I'd say we should do it at the
> GIMPLE level, probably not in the optimize_bswap pass (because there it is
> guarded with bswap* insn patterns, while we can certainly optimize this
> for libcalls too), but say fold_builtins pass, when seeing
> __builtin_bswap* builtin that couldn't be folded, just check if the lhs has
> a single use that is a comparison with constant and if so, remove the
> swapping and adjust comparison.

Or just

(match_and_simplify
   (eq (bswap @1) (bswap @2))
   (eq @1 @2))

and similar patterns which should then catch it everywhere.

Richard.

>> diff --git a/gcc/testsuite/gcc.dg/builtin-bswap-6.c 
>> b/gcc/testsuite/gcc.dg/builtin-bswap-6.c
>> index 6f0c782..f346c2f 100644
>> --- a/gcc/testsuite/gcc.dg/builtin-bswap-6.c
>> +++ b/gcc/testsuite/gcc.dg/builtin-bswap-6.c
>> @@ -1,7 +1,7 @@
>>  /* { dg-do compile { target arm*-*-* alpha*-*-* i?86-*-* powerpc*-*-* 
>> rs6000-*-* x86_64-*-* s390*-*-* } } */
>>  /* { dg-require-effective-target stdint_types } */
>> -/* { dg-options "-O -fdump-rtl-combine" } */
>> -/* { dg-options "-O -fdump-rtl-combine -march=z900" { target s390-*-* } } */
>> +/* { dg-options "-O2 -fdump-rtl-combine" } */
>> +/* { dg-options "-O2 -fdump-rtl-combine -march=z900" { target s390-*-* } } 
>> */
>>
>>  /* The test intentionally returns 1/2 instead of the obvious 0/1 to
>>     prevent GCC from calculating the return value with arithmetic
>> diff --git a/gcc/testsuite/gcc.dg/builtin-bswap-7.c 
>> b/gcc/testsuite/gcc.dg/builtin-bswap-7.c
>> index 0eecdd8..98529f2 100644
>> --- a/gcc/testsuite/gcc.dg/builtin-bswap-7.c
>> +++ b/gcc/testsuite/gcc.dg/builtin-bswap-7.c
>> @@ -1,7 +1,7 @@
>>  /* { dg-do compile { target arm*-*-* alpha*-*-* ia64*-*-* x86_64-*-* 
>> s390x-*-* powerpc*-*-* rs6000-*-* } } */
>>  /* { dg-require-effective-target stdint_types } */
>>  /* { dg-require-effective-target lp64 } */
>> -/* { dg-options "-O -fdump-rtl-combine" } */
>> +/* { dg-options "-O2 -fdump-rtl-combine" } */
>>
>>  /* The test intentionally returns 1/2 instead of the obvious 0/1 to
>>     prevent GCC from calculating the return value with arithmetic
>
>         Jakub

Reply via email to