diff options
author | Richard Guenther <rguenther@suse.de> | 2010-01-03 15:23:29 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-01-03 15:23:29 +0000 |
commit | ba1ee2281d44f1443bae38966276221abedd39d7 (patch) | |
tree | 5f0ecd392be5832e39047b93c683ffeb2d711b3b /gcc | |
parent | 5004040e8df391914c26eb02c3514578dded2c66 (diff) | |
download | gcc-ba1ee2281d44f1443bae38966276221abedd39d7.zip gcc-ba1ee2281d44f1443bae38966276221abedd39d7.tar.gz gcc-ba1ee2281d44f1443bae38966276221abedd39d7.tar.bz2 |
re PR rtl-optimization/42589 (bswap optimization does not work for 32bit (but for 64bit) on 64bit registers)
2010-01-03 Richard Guenther <rguenther@suse.de>
PR tree-optimization/42589
* tree-ssa-math-opts.c (execute_optimize_bswap): Allow
double-word expansion of bswap32.
* gcc.target/i386/pr42589.c: New testcase.
From-SVN: r155588
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr42589.c | 17 | ||||
-rw-r--r-- | gcc/tree-ssa-math-opts.c | 5 |
4 files changed, 31 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 01769cc..cb0ecfa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-01-03 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/42589 + * tree-ssa-math-opts.c (execute_optimize_bswap): Allow + double-word expansion of bswap32. + 2010-01-03 Steven Bosscher <steven@gcc.gnu.org> * postreload-gcse.c (insert_expr_in_table): Replace BLOCK_NUM diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 609589c..bbf9638 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2010-01-03 Richard Guenther <rguenther@suse.de> + PR tree-optimization/42589 + * gcc.target/i386/pr42589.c: New testcase. + +2010-01-03 Richard Guenther <rguenther@suse.de> + PR tree-optimization/42438 * gcc.dg/tree-ssa/ssa-pre-27.c: New testcase. diff --git a/gcc/testsuite/gcc.target/i386/pr42589.c b/gcc/testsuite/gcc.target/i386/pr42589.c new file mode 100644 index 0000000..04e419a --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr42589.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target ilp32 } */ +/* { dg-options "-O2 -march=i486" } */ + +void +foo (unsigned long long *p) +{ + unsigned long long tmp; + tmp = *p; + tmp = (tmp >> 32) | (tmp << 32); + tmp = (((tmp & 0xff00ff00ff00ff00ULL) >> 8) + | ((tmp & 71777214294589695ULL) << 8)); + *p = (((tmp & 0xffff0000ffff0000ULL) >> 16) + | ((tmp & 281470681808895ULL) << 16)); +} + +/* { dg-final { scan-assembler-times "bswap" 2 } } */ diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index 2a984a1..c46a57f 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -1111,8 +1111,9 @@ execute_optimize_bswap (void) && optab_handler (bswap_optab, SImode)->insn_code != CODE_FOR_nothing); bswap64_p = (built_in_decls[BUILT_IN_BSWAP64] - && optab_handler (bswap_optab, DImode)->insn_code != - CODE_FOR_nothing); + && (optab_handler (bswap_optab, DImode)->insn_code != + CODE_FOR_nothing + || (bswap32_p && word_mode == SImode))); if (!bswap32_p && !bswap64_p) return 0; |