https://gcc.gnu.org/g:18d08c0e6115e6c34eaed73f242ccf210a455240

commit r17-551-g18d08c0e6115e6c34eaed73f242ccf210a455240
Author: Jakub Jelinek <[email protected]>
Date:   Sat May 16 10:51:39 2026 +0200

    match.pd: Enable some __builtin_bswap* optimizations even for 
__builtin_bitreverse* [PR50481]
    
    Most of the bswap optimizations equally apply also to bitreverse builtins.
    The following patch enables those.
    
    2026-05-16  Jakub Jelinek  <[email protected]>
    
            PR target/50481
            * match.pd (BITREVERSE): New define_operator_list.  Use it next to
            BSWAP for a subset of bswap simplifications.
    
            * gcc.dg/builtin-bitreverse-4.c: New test.
    
    Reviewed-by: Andrew Pinski <[email protected]>

Diff:
---
 gcc/match.pd                                |  7 ++--
 gcc/testsuite/gcc.dg/builtin-bitreverse-4.c | 54 +++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index accd9a8302ea..ff13a07ea94b 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -55,6 +55,8 @@ along with GCC; see the file COPYING3.  If not see
 (define_operator_list swapped_simple_comparison gt   ge   eq ne le   lt)
 (define_operator_list BSWAP BUILT_IN_BSWAP16 BUILT_IN_BSWAP32
            BUILT_IN_BSWAP64 BUILT_IN_BSWAP128)
+(define_operator_list BITREVERSE BUILT_IN_BITREVERSE16 BUILT_IN_BITREVERSE32
+           BUILT_IN_BITREVERSE64 BUILT_IN_BITREVERSE128)
 
 #include "cfn-operators.pd"
 
@@ -5721,7 +5723,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
   (complex (convert:itype @0) (negate (convert:itype @1)))))
 
 /* BSWAP simplifications, transforms checked by gcc.dg/builtin-bswap-8.c.  */
-(for bswap (BSWAP)
+(for bswap (BSWAP BITREVERSE)
  (simplify
   (bswap (bswap @0))
   @0)
@@ -5740,7 +5742,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
   (simplify
    (cmp (bswap @0) INTEGER_CST@1)
    (with { tree ctype = TREE_TYPE (@1); }
-    (cmp (convert:ctype @0) (bswap! @1)))))
+    (cmp (convert:ctype @0) (bswap! @1))))))
+(for bswap (BSWAP)
  /* (bswap(x) >> C1) & C2 can sometimes be simplified to (x >> C3) & C2.  */
  (simplify
   (bit_and (convert1? (rshift@0 (convert2? (bswap@4 @1)) INTEGER_CST@2))
diff --git a/gcc/testsuite/gcc.dg/builtin-bitreverse-4.c 
b/gcc/testsuite/gcc.dg/builtin-bitreverse-4.c
new file mode 100644
index 000000000000..2344de17acdb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtin-bitreverse-4.c
@@ -0,0 +1,54 @@
+/* { dg-do compile { target int32 } } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+#define BS(X) __builtin_bitreverse32 (X)
+
+unsigned
+foo1 (unsigned a)
+{
+  return BS (~ BS (a));
+}
+
+unsigned
+foo2 (unsigned a)
+{
+  return BS (BS (a) & 0xA0000);
+}
+
+unsigned
+foo3 (unsigned a)
+{
+  return BS (BS (a) | 0xA0000);
+}
+
+unsigned
+foo4 (unsigned a)
+{
+  return BS (BS (a) ^ 0xA0000);
+}
+
+unsigned
+foo5 (unsigned a, unsigned b)
+{
+  return BS (BS (a) & BS (b));
+}
+
+unsigned
+foo6 (unsigned a, unsigned b)
+{
+  return BS (BS (a) | BS (b));
+}
+
+unsigned
+foo7 (unsigned a, unsigned b)
+{
+  return BS (BS (a) ^ BS (b));
+}
+
+unsigned
+foo8 (unsigned a)
+{
+  return BS (BS (BS (BS (a))));
+}
+
+/* { dg-final { scan-tree-dump-not "__builtin_bitreverse" "optimized" } } */

Reply via email to