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