This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Adjust builtin-bswap-6/7
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Andreas Krebbel <krebbel at linux dot vnet dot ibm dot com>
- Cc: Richard Biener <richard dot guenther at gmail dot com>, gcc-patches at gcc dot gnu dot org
- Date: Tue, 8 Apr 2014 10:31:20 +0200
- Subject: Re: [PATCH] Adjust builtin-bswap-6/7
- Authentication-results: sourceware.org; auth=none
- References: <20140404161818 dot GA26795 at bart> <533EF13A dot 8010001 at redhat dot com> <CAFiYyc32Squ0DrZOGKRpsdF--qoxXUM5mgEjeNf_USdgJP+LUQ at mail dot gmail dot com> <20140407162214 dot GA25019 at maggie>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
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