aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-01-03 15:23:29 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-01-03 15:23:29 +0000
commitba1ee2281d44f1443bae38966276221abedd39d7 (patch)
tree5f0ecd392be5832e39047b93c683ffeb2d711b3b /gcc
parent5004040e8df391914c26eb02c3514578dded2c66 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr42589.c17
-rw-r--r--gcc/tree-ssa-math-opts.c5
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;