Re: [PATCH] Adjust builtin-bswap-6/7
On Mon, Apr 7, 2014 at 6:22 PM, Andreas Krebbel kreb...@linux.vnet.ibm.com 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? Hmm, they passed before your change. Do you mean that this was by accident (and only because of the special return value)? If so then the patch is ok. Thanks, 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
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
Re: [PATCH] Adjust builtin-bswap-6/7
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
Re: [PATCH] Adjust builtin-bswap-6/7
On Tue, Apr 08, 2014 at 10:26:30AM +0200, Richard Biener wrote: On Mon, Apr 7, 2014 at 6:22 PM, Andreas Krebbel kreb...@linux.vnet.ibm.com 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? Hmm, they passed before your change. Do you mean that this was by accident (and only because of the special return value)? If so then the patch is ok. The reason why it worked with the if ... return 1; else return 0; case is that in that case it has already been expanded as store flag insn and thus in that case ce1 pass didn't discover the conditional move there, thus no dead code waiting to be eliminated after ce1 and still present during combine pass. Another alternative for -O2 would be -O -fno-if-conversion I guess. OT, when touching the testcase, I'd say it would be better if you've converted it to single dg-options + /* { dg-additional-options -march=z900 { target s390*-*-* } } */ --- 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
Re: [PATCH] Adjust builtin-bswap-6/7
On 04/08/2014 10:41 AM, Jakub Jelinek wrote: On Tue, Apr 08, 2014 at 10:26:30AM +0200, Richard Biener wrote: On Mon, Apr 7, 2014 at 6:22 PM, Andreas Krebbel kreb...@linux.vnet.ibm.com 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? Hmm, they passed before your change. Do you mean that this was by accident (and only because of the special return value)? If so then the patch is ok. The reason why it worked with the if ... return 1; else return 0; case is that in that case it has already been expanded as store flag insn and thus in that case ce1 pass didn't discover the conditional move there, thus no dead code waiting to be eliminated after ce1 and still present during combine pass. Another alternative for -O2 would be -O -fno-if-conversion I guess. I could also revert the testcase changes and add -mbranch-cost=2 for s390?! OT, when touching the testcase, I'd say it would be better if you've converted it to single dg-options + /* { dg-additional-options -march=z900 { target s390*-*-* } } */ Ok. Bye, -Andreas- --- 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
Re: [PATCH] Adjust builtin-bswap-6/7
On Tue, Apr 08, 2014 at 10:53:19AM +0200, Andreas Krebbel wrote: On 04/08/2014 10:41 AM, Jakub Jelinek wrote: On Tue, Apr 08, 2014 at 10:26:30AM +0200, Richard Biener wrote: On Mon, Apr 7, 2014 at 6:22 PM, Andreas Krebbel kreb...@linux.vnet.ibm.com 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? Hmm, they passed before your change. Do you mean that this was by accident (and only because of the special return value)? If so then the patch is ok. The reason why it worked with the if ... return 1; else return 0; case is that in that case it has already been expanded as store flag insn and thus in that case ce1 pass didn't discover the conditional move there, thus no dead code waiting to be eliminated after ce1 and still present during combine pass. Another alternative for -O2 would be -O -fno-if-conversion I guess. I could also revert the testcase changes and add -mbranch-cost=2 for s390?! That doesn't seem to work (at least for me with cross-compiler to s390x). OT, when touching the testcase, I'd say it would be better if you've converted it to single dg-options + /* { dg-additional-options -march=z900 { target s390*-*-* } } */ Ok. Thanks. Jakub
Re: [PATCH] Adjust builtin-bswap-6/7
On 04/08/2014 11:12 AM, Jakub Jelinek wrote: On Tue, Apr 08, 2014 at 10:53:19AM +0200, Andreas Krebbel wrote: On 04/08/2014 10:41 AM, Jakub Jelinek wrote: On Tue, Apr 08, 2014 at 10:26:30AM +0200, Richard Biener wrote: On Mon, Apr 7, 2014 at 6:22 PM, Andreas Krebbel kreb...@linux.vnet.ibm.com 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? Hmm, they passed before your change. Do you mean that this was by accident (and only because of the special return value)? If so then the patch is ok. The reason why it worked with the if ... return 1; else return 0; case is that in that case it has already been expanded as store flag insn and thus in that case ce1 pass didn't discover the conditional move there, thus no dead code waiting to be eliminated after ce1 and still present during combine pass. Another alternative for -O2 would be -O -fno-if-conversion I guess. I could also revert the testcase changes and add -mbranch-cost=2 for s390?! That doesn't seem to work (at least for me with cross-compiler to s390x). Seems to be -mbranch-cost=0 this time. OT, when touching the testcase, I'd say it would be better if you've converted it to single dg-options + /* { dg-additional-options -march=z900 { target s390*-*-* } } */ Ok. Thanks. Jakub
Re: [PATCH] Adjust builtin-bswap-6/7
On Tue, Apr 08, 2014 at 11:21:56AM +0200, Andreas Krebbel wrote: On 04/08/2014 11:12 AM, Jakub Jelinek wrote: On Tue, Apr 08, 2014 at 10:53:19AM +0200, Andreas Krebbel wrote: On 04/08/2014 10:41 AM, Jakub Jelinek wrote: On Tue, Apr 08, 2014 at 10:26:30AM +0200, Richard Biener wrote: On Mon, Apr 7, 2014 at 6:22 PM, Andreas Krebbel kreb...@linux.vnet.ibm.com 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? Hmm, they passed before your change. Do you mean that this was by accident (and only because of the special return value)? If so then the patch is ok. The reason why it worked with the if ... return 1; else return 0; case is that in that case it has already been expanded as store flag insn and thus in that case ce1 pass didn't discover the conditional move there, thus no dead code waiting to be eliminated after ce1 and still present during combine pass. Another alternative for -O2 would be -O -fno-if-conversion I guess. I could also revert the testcase changes and add -mbranch-cost=2 for s390?! That doesn't seem to work (at least for me with cross-compiler to s390x). Seems to be -mbranch-cost=0 this time. Indeed, that works too. Thus, please commit any of these variants, if you go for /* { dg-additional-options -mbranch-cost=0 { target s390*-*-* } } */ plus reverting your earlier changes, you can also consider addition of two new tests that would contain the return {1,2} and have -O2. Jakub
Re: [PATCH] Adjust builtin-bswap-6/7
Hi, what about that one? Tested on x86_64, s390, and s390x. Bye, -Andreas- 2014-04-08 Andreas Krebbel andreas.kreb...@de.ibm.com * gcc.dg/builtin-bswap-6.c: Use -mbranch-cost=0 for s390. * gcc.dg/builtin-bswap-7.c: Likewise. Revert 2014-04-04 Andreas Krebbel andreas.kreb...@de.ibm.com * gcc.dg/builtin-bswap-6.c: Adjust return value to disable GCC optimization. * gcc.dg/builtin-bswap-7.c: Likewise. diff --git a/gcc/testsuite/gcc.dg/builtin-bswap-6.c b/gcc/testsuite/gcc.dg/builtin-bswap-6.c index 6f0c782..efda870 100644 --- a/gcc/testsuite/gcc.dg/builtin-bswap-6.c +++ b/gcc/testsuite/gcc.dg/builtin-bswap-6.c @@ -1,11 +1,10 @@ /* { 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-*-* } } */ -/* The test intentionally returns 1/2 instead of the obvious 0/1 to - prevent GCC from calculating the return value with arithmetic - instead of a comparison. */ +/* The branch cost setting prevents the return value from being + calculated with arithmetic instead of doing a compare. */ +/* { dg-additional-options -march=z900 -mbranch-cost=0 { target s390*-*-* } } */ #include stdint.h @@ -15,28 +14,28 @@ int foo1 (uint32_t a) { if (BS (a) == 0xA) return 1; - return 2; + return 0; } int foo2 (uint32_t a) { if (BS (a) != 0xA) return 1; - return 2; + return 0; } int foo3 (uint32_t a, uint32_t b) { if (BS (a) == BS (b)) return 1; - return 2; + return 0; } int foo4 (uint32_t a, uint32_t b) { if (BS (a) != BS (b)) return 1; - return 2; + return 0; } /* { dg-final { scan-rtl-dump-not bswapsi combine } } */ diff --git a/gcc/testsuite/gcc.dg/builtin-bswap-7.c b/gcc/testsuite/gcc.dg/builtin-bswap-7.c index 0eecdd8..035c736 100644 --- a/gcc/testsuite/gcc.dg/builtin-bswap-7.c +++ b/gcc/testsuite/gcc.dg/builtin-bswap-7.c @@ -3,9 +3,9 @@ /* { dg-require-effective-target lp64 } */ /* { dg-options -O -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 - instead of a comparison. */ +/* The branch cost setting prevents the return value from being + calculated with arithmetic instead of doing a compare. */ +/* { dg-additional-options -mbranch-cost=0 { target s390x-*-* } } */ #include stdint.h @@ -15,28 +15,28 @@ int foo1 (uint64_t a) { if (BS (a) == 0xA) return 1; - return 2; + return 0; } int foo2 (uint64_t a) { if (BS (a) != 0xA) return 1; - return 2; + return 0; } int foo3 (uint64_t a, uint64_t b) { if (BS (a) == BS (b)) return 1; - return 2; + return 0; } int foo4 (uint64_t a, uint64_t b) { if (BS (a) != BS (b)) return 1; - return 2; + return 0; } /* { dg-final { scan-rtl-dump-not bswapdi combine } } */
Re: [PATCH] Adjust builtin-bswap-6/7
On Tue, Apr 08, 2014 at 12:41:41PM +0200, Andreas Krebbel wrote: what about that one? Tested on x86_64, s390, and s390x. LGTM, thanks. 2014-04-08 Andreas Krebbel andreas.kreb...@de.ibm.com * gcc.dg/builtin-bswap-6.c: Use -mbranch-cost=0 for s390. * gcc.dg/builtin-bswap-7.c: Likewise. Revert 2014-04-04 Andreas Krebbel andreas.kreb...@de.ibm.com * gcc.dg/builtin-bswap-6.c: Adjust return value to disable GCC optimization. * gcc.dg/builtin-bswap-7.c: Likewise. Jakub
Re: [PATCH] Adjust builtin-bswap-6/7
On Tue, Apr 08, 2014 at 12:41:02PM +0200, Jakub Jelinek wrote: Thus, please commit any of these variants, if you go for /* { dg-additional-options -mbranch-cost=0 { target s390*-*-* } } */ plus reverting your earlier changes, you can also consider addition of two new tests that would contain the return {1,2} and have -O2. I've just committed the following patch: 2014-04-08 Andreas Krebbel andreas.kreb...@de.ibm.com PR rtl-optimization/60776 * gcc.dg/builtin-bswap-6.c: Use -mbranch-cost=0 for s390. * gcc.dg/builtin-bswap-7.c: Likewise. * gcc.dg/builtin-bswap-6a.c: New testcase. * gcc.dg/builtin-bswap-7a.c: New testcase. Revert 2014-04-04 Andreas Krebbel andreas.kreb...@de.ibm.com * gcc.dg/builtin-bswap-6.c: Adjust return value to disable GCC optimization. * gcc.dg/builtin-bswap-7.c: Likewise. diff --git a/gcc/testsuite/gcc.dg/builtin-bswap-6.c b/gcc/testsuite/gcc.dg/builtin-bswap-6.c index 6f0c782..efda870 100644 --- a/gcc/testsuite/gcc.dg/builtin-bswap-6.c +++ b/gcc/testsuite/gcc.dg/builtin-bswap-6.c @@ -1,11 +1,10 @@ /* { 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-*-* } } */ -/* The test intentionally returns 1/2 instead of the obvious 0/1 to - prevent GCC from calculating the return value with arithmetic - instead of a comparison. */ +/* The branch cost setting prevents the return value from being + calculated with arithmetic instead of doing a compare. */ +/* { dg-additional-options -march=z900 -mbranch-cost=0 { target s390*-*-* } } */ #include stdint.h @@ -15,28 +14,28 @@ int foo1 (uint32_t a) { if (BS (a) == 0xA) return 1; - return 2; + return 0; } int foo2 (uint32_t a) { if (BS (a) != 0xA) return 1; - return 2; + return 0; } int foo3 (uint32_t a, uint32_t b) { if (BS (a) == BS (b)) return 1; - return 2; + return 0; } int foo4 (uint32_t a, uint32_t b) { if (BS (a) != BS (b)) return 1; - return 2; + return 0; } /* { dg-final { scan-rtl-dump-not bswapsi combine } } */ diff --git a/gcc/testsuite/gcc.dg/builtin-bswap-6a.c b/gcc/testsuite/gcc.dg/builtin-bswap-6a.c new file mode 100644 index 000..f93bcde --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-bswap-6a.c @@ -0,0 +1,44 @@ +/* { dg-do compile { target arm*-*-* alpha*-*-* i?86-*-* powerpc*-*-* rs6000-*-* x86_64-*-* s390*-*-* } } */ +/* { dg-require-effective-target stdint_types } */ +/* { dg-options -O2 -fdump-rtl-combine } */ +/* { dg-additional-options -march=z900 { target s390-*-* } } */ + +/* The test is similiar to builtin-bswap-6.c but returns 1/2 instead + of 0/1 to prevent GCC from calculating the return value with + arithmetic instead of a comparison. This requires the optimization + level to be bumped up to -O2 at least for x86_64. */ + +#include stdint.h + +#define BS(X) __builtin_bswap32(X) + +int foo1 (uint32_t a) +{ + if (BS (a) == 0xA) +return 1; + return 2; +} + +int foo2 (uint32_t a) +{ + if (BS (a) != 0xA) +return 1; + return 2; +} + +int foo3 (uint32_t a, uint32_t b) +{ + if (BS (a) == BS (b)) +return 1; + return 2; +} + +int foo4 (uint32_t a, uint32_t b) +{ + if (BS (a) != BS (b)) +return 1; + return 2; +} + +/* { dg-final { scan-rtl-dump-not bswapsi combine } } */ +/* { dg-final { cleanup-rtl-dump combine } } */ diff --git a/gcc/testsuite/gcc.dg/builtin-bswap-7.c b/gcc/testsuite/gcc.dg/builtin-bswap-7.c index 0eecdd8..035c736 100644 --- a/gcc/testsuite/gcc.dg/builtin-bswap-7.c +++ b/gcc/testsuite/gcc.dg/builtin-bswap-7.c @@ -3,9 +3,9 @@ /* { dg-require-effective-target lp64 } */ /* { dg-options -O -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 - instead of a comparison. */ +/* The branch cost setting prevents the return value from being + calculated with arithmetic instead of doing a compare. */ +/* { dg-additional-options -mbranch-cost=0 { target s390x-*-* } } */ #include stdint.h @@ -15,28 +15,28 @@ int foo1 (uint64_t a) { if (BS (a) == 0xA) return 1; - return 2; + return 0; } int foo2 (uint64_t a) { if (BS (a) != 0xA) return 1; - return 2; + return 0; } int foo3 (uint64_t a, uint64_t b) { if (BS (a) == BS (b)) return 1; - return 2; + return 0; } int foo4 (uint64_t a, uint64_t b) { if (BS (a) != BS (b)) return 1; - return 2; + return 0; } /* { dg-final { scan-rtl-dump-not bswapdi combine } } */ diff --git a/gcc/testsuite/gcc.dg/builtin-bswap-7a.c b/gcc/testsuite/gcc.dg/builtin-bswap-7a.c new file mode 100644 index 000..d77bd47 --- /dev/null +++
Re: [PATCH] Adjust builtin-bswap-6/7
On Fri, Apr 4, 2014 at 7:51 PM, Jeff Law l...@redhat.com wrote: On 04/04/14 10:18, Andreas Krebbel wrote: Hi, the attached patch modifies the builtin-bswap-6/7 testcases in order to prevent GCC from using math instead of a compare. Only with a compare the folding in combine actually takes place. Whether the return value is produce with a compare or not depends again on the value of branch cost. Ideally we would be able to do the folding also with the math trick but it is probably not that easy since we have already lost the information that in the end all we need is a 0 or a 1. Ok? Bye, -Andreas- 2014-04-04 Andreas Krebbel andreas.kreb...@de.ibm.com * gcc.dg/builtin-bswap-6.c: Adjust return value to disable GCC optimization. * gcc.dg/builtin-bswap-7.c: Likewise. OK. The adjusted testcases now fail on x86_64/i?86 at least. See PR60776. Richard. Jeff
Re: [PATCH] Adjust builtin-bswap-6/7
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? 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
Re: [PATCH] Adjust builtin-bswap-6/7
On 04/04/14 10:18, Andreas Krebbel wrote: Hi, the attached patch modifies the builtin-bswap-6/7 testcases in order to prevent GCC from using math instead of a compare. Only with a compare the folding in combine actually takes place. Whether the return value is produce with a compare or not depends again on the value of branch cost. Ideally we would be able to do the folding also with the math trick but it is probably not that easy since we have already lost the information that in the end all we need is a 0 or a 1. Ok? Bye, -Andreas- 2014-04-04 Andreas Krebbel andreas.kreb...@de.ibm.com * gcc.dg/builtin-bswap-6.c: Adjust return value to disable GCC optimization. * gcc.dg/builtin-bswap-7.c: Likewise. OK. Jeff