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" } } */
