https://gcc.gnu.org/g:1bdc9e13987fc7451a4f11cfdf8b6dfb827cf9f5

commit r17-672-g1bdc9e13987fc7451a4f11cfdf8b6dfb827cf9f5
Author: Jakub Jelinek <[email protected]>
Date:   Fri May 22 11:19:18 2026 +0200

    match.pd: Handle BUILT_IN_BITREVERSE8 like other BUILT_IN_BITREVERSE* 
[PR125399]
    
    I've mistakenly omitted BUILT_IN_BITREVERSE8 in the BITREVERSE
    operator list.
    
    The following patch fixes that, plus extends the __builtin_bitreverse32
    test with one further check and duplicates the test for the other
    builtins, i.e. __builtin_bitreverse{8,16,64,128}.
    
    2026-05-22  Jakub Jelinek  <[email protected]>
    
            PR tree-optimization/125399
            * match.pd (BITREVERSE): Add BUILT_IN_BITREVERSE8.
    
            * gcc.dg/builtin-bitreverse-4.c (foo9): New function.
            * gcc.dg/builtin-bitreverse-5.c: New test.
            * gcc.dg/builtin-bitreverse-6.c: New test.
            * gcc.dg/builtin-bitreverse-7.c: New test.
            * gcc.dg/builtin-bitreverse-8.c: New test.
    
    Reviewed-by: Richard Biener <[email protected]>

Diff:
---
 gcc/match.pd                                |  4 +-
 gcc/testsuite/gcc.dg/builtin-bitreverse-4.c |  6 +++
 gcc/testsuite/gcc.dg/builtin-bitreverse-5.c | 60 +++++++++++++++++++++++++++++
 gcc/testsuite/gcc.dg/builtin-bitreverse-6.c | 60 +++++++++++++++++++++++++++++
 gcc/testsuite/gcc.dg/builtin-bitreverse-7.c | 60 +++++++++++++++++++++++++++++
 gcc/testsuite/gcc.dg/builtin-bitreverse-8.c | 60 +++++++++++++++++++++++++++++
 6 files changed, 248 insertions(+), 2 deletions(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index c6272c1e24ea..b3ddd5158287 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -55,8 +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)
+(define_operator_list BITREVERSE BUILT_IN_BITREVERSE8 BUILT_IN_BITREVERSE16
+           BUILT_IN_BITREVERSE32 BUILT_IN_BITREVERSE64 BUILT_IN_BITREVERSE128)
 
 #include "cfn-operators.pd"
 
diff --git a/gcc/testsuite/gcc.dg/builtin-bitreverse-4.c 
b/gcc/testsuite/gcc.dg/builtin-bitreverse-4.c
index 2344de17acdb..a2e7330594f7 100644
--- a/gcc/testsuite/gcc.dg/builtin-bitreverse-4.c
+++ b/gcc/testsuite/gcc.dg/builtin-bitreverse-4.c
@@ -51,4 +51,10 @@ foo8 (unsigned a)
   return BS (BS (BS (BS (a))));
 }
 
+bool
+foo9 (unsigned a)
+{
+  return BS (a) == 0;
+}
+
 /* { dg-final { scan-tree-dump-not "__builtin_bitreverse" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/builtin-bitreverse-5.c 
b/gcc/testsuite/gcc.dg/builtin-bitreverse-5.c
new file mode 100644
index 000000000000..3f1fb320e340
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtin-bitreverse-5.c
@@ -0,0 +1,60 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+#define BS(X) __builtin_bitreverse64 (X)
+
+unsigned long long
+foo1 (unsigned long long a)
+{
+  return BS (~ BS (a));
+}
+
+unsigned long long
+foo2 (unsigned long long a)
+{
+  return BS (BS (a) & 0xA0000);
+}
+
+unsigned long long
+foo3 (unsigned long long a)
+{
+  return BS (BS (a) | 0xA0000);
+}
+
+unsigned long long
+foo4 (unsigned long long a)
+{
+  return BS (BS (a) ^ 0xA0000);
+}
+
+unsigned long long
+foo5 (unsigned long long a, unsigned long long b)
+{
+  return BS (BS (a) & BS (b));
+}
+
+unsigned long long
+foo6 (unsigned long long a, unsigned long long b)
+{
+  return BS (BS (a) | BS (b));
+}
+
+unsigned long long
+foo7 (unsigned long long a, unsigned long long b)
+{
+  return BS (BS (a) ^ BS (b));
+}
+
+unsigned long long
+foo8 (unsigned long long a)
+{
+  return BS (BS (BS (BS (a))));
+}
+
+bool
+foo9 (unsigned long long a)
+{
+  return BS (a) == 0;
+}
+
+/* { dg-final { scan-tree-dump-not "__builtin_bitreverse" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/builtin-bitreverse-6.c 
b/gcc/testsuite/gcc.dg/builtin-bitreverse-6.c
new file mode 100644
index 000000000000..730427d1dbc0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtin-bitreverse-6.c
@@ -0,0 +1,60 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+#define BS(X) __builtin_bitreverse16 (X)
+
+unsigned short
+foo1 (unsigned short a)
+{
+  return BS (~ BS (a));
+}
+
+unsigned short
+foo2 (unsigned short a)
+{
+  return BS (BS (a) & 0xA00);
+}
+
+unsigned short
+foo3 (unsigned short a)
+{
+  return BS (BS (a) | 0xA00);
+}
+
+unsigned short
+foo4 (unsigned short a)
+{
+  return BS (BS (a) ^ 0xA00);
+}
+
+unsigned short
+foo5 (unsigned short a, unsigned short b)
+{
+  return BS (BS (a) & BS (b));
+}
+
+unsigned short
+foo6 (unsigned short a, unsigned short b)
+{
+  return BS (BS (a) | BS (b));
+}
+
+unsigned short
+foo7 (unsigned short a, unsigned short b)
+{
+  return BS (BS (a) ^ BS (b));
+}
+
+unsigned short
+foo8 (unsigned short a)
+{
+  return BS (BS (BS (BS (a))));
+}
+
+bool
+foo9 (unsigned short a)
+{
+  return BS (a) == 0;
+}
+
+/* { dg-final { scan-tree-dump-not "__builtin_bitreverse" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/builtin-bitreverse-7.c 
b/gcc/testsuite/gcc.dg/builtin-bitreverse-7.c
new file mode 100644
index 000000000000..1cb7044a9fc2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtin-bitreverse-7.c
@@ -0,0 +1,60 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+#define BS(X) __builtin_bitreverse8 (X)
+
+unsigned char
+foo1 (unsigned char a)
+{
+  return BS (~ BS (a));
+}
+
+unsigned char
+foo2 (unsigned char a)
+{
+  return BS (BS (a) & 0x0A);
+}
+
+unsigned char
+foo3 (unsigned char a)
+{
+  return BS (BS (a) | 0x0A);
+}
+
+unsigned char
+foo4 (unsigned char a)
+{
+  return BS (BS (a) ^ 0x0A);
+}
+
+unsigned char
+foo5 (unsigned char a, unsigned char b)
+{
+  return BS (BS (a) & BS (b));
+}
+
+unsigned char
+foo6 (unsigned char a, unsigned char b)
+{
+  return BS (BS (a) | BS (b));
+}
+
+unsigned char
+foo7 (unsigned char a, unsigned char b)
+{
+  return BS (BS (a) ^ BS (b));
+}
+
+unsigned char
+foo8 (unsigned char a)
+{
+  return BS (BS (BS (BS (a))));
+}
+
+bool
+foo9 (unsigned char a)
+{
+  return BS (a) == 0;
+}
+
+/* { dg-final { scan-tree-dump-not "__builtin_bitreverse" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/builtin-bitreverse-8.c 
b/gcc/testsuite/gcc.dg/builtin-bitreverse-8.c
new file mode 100644
index 000000000000..383ffe696585
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtin-bitreverse-8.c
@@ -0,0 +1,60 @@
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+#define BS(X) __builtin_bitreverse128 (X)
+
+unsigned __int128
+foo1 (unsigned __int128 a)
+{
+  return BS (~ BS (a));
+}
+
+unsigned __int128
+foo2 (unsigned __int128 a)
+{
+  return BS (BS (a) & 0xA0000A0000ULL);
+}
+
+unsigned __int128
+foo3 (unsigned __int128 a)
+{
+  return BS (BS (a) | 0xA0000A0000ULL);
+}
+
+unsigned __int128
+foo4 (unsigned __int128 a)
+{
+  return BS (BS (a) ^ 0xA0000A0000ULL);
+}
+
+unsigned __int128
+foo5 (unsigned __int128 a, unsigned __int128 b)
+{
+  return BS (BS (a) & BS (b));
+}
+
+unsigned __int128
+foo6 (unsigned __int128 a, unsigned __int128 b)
+{
+  return BS (BS (a) | BS (b));
+}
+
+unsigned __int128
+foo7 (unsigned __int128 a, unsigned __int128 b)
+{
+  return BS (BS (a) ^ BS (b));
+}
+
+unsigned __int128
+foo8 (unsigned __int128 a)
+{
+  return BS (BS (BS (BS (a))));
+}
+
+bool
+foo9 (unsigned __int128 a)
+{
+  return BS (a) == 0;
+}
+
+/* { dg-final { scan-tree-dump-not "__builtin_bitreverse" "optimized" } } */

Reply via email to