From ba1ee2281d44f1443bae38966276221abedd39d7 Mon Sep 17 00:00:00 2001
From: Richard Guenther <rguenther@suse.de>
Date: Sun, 3 Jan 2010 15:23:29 +0000
Subject: [PATCH] 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
---
 gcc/ChangeLog                           |  6 ++++++
 gcc/testsuite/ChangeLog                 |  5 +++++
 gcc/testsuite/gcc.target/i386/pr42589.c | 17 +++++++++++++++++
 gcc/tree-ssa-math-opts.c                |  5 +++--
 4 files changed, 31 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr42589.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 01769cc1c8a1..cb0ecfa8fea1 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 609589ca072d..bbf96380f706 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/gcc.target/i386/pr42589.c b/gcc/testsuite/gcc.target/i386/pr42589.c
new file mode 100644
index 000000000000..04e419a2a838
--- /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 2a984a1034ec..c46a57fa0482 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;
-- 
GitLab