This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Adjust builtin-bswap-6/7


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.

> 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]