(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"
(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)
(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))
--- /dev/null
+/* { 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" } } */