> Am 22.05.2026 um 10:12 schrieb Jakub Jelinek <[email protected]>:
> 
> Hi!
> 
> 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}.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok

Richard 

> 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.
> 
> --- gcc/match.pd.jj    2026-05-21 11:25:41.764789799 +0200
> +++ gcc/match.pd    2026-05-21 11:29:16.831181205 +0200
> @@ -55,8 +55,8 @@ (define_operator_list simple_comparison
> (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"
> 
> --- gcc/testsuite/gcc.dg/builtin-bitreverse-4.c.jj    2026-05-16 
> 10:51:34.084101223 +0200
> +++ gcc/testsuite/gcc.dg/builtin-bitreverse-4.c    2026-05-21 
> 11:30:28.173984146 +0200
> @@ -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" } } */
> --- gcc/testsuite/gcc.dg/builtin-bitreverse-5.c.jj    2026-05-21 
> 11:30:40.318780366 +0200
> +++ gcc/testsuite/gcc.dg/builtin-bitreverse-5.c    2026-05-21 
> 11:31:14.604205091 +0200
> @@ -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" } } */
> --- gcc/testsuite/gcc.dg/builtin-bitreverse-6.c.jj    2026-05-21 
> 11:31:26.048013075 +0200
> +++ gcc/testsuite/gcc.dg/builtin-bitreverse-6.c    2026-05-21 
> 11:31:58.405470152 +0200
> @@ -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" } } */
> --- gcc/testsuite/gcc.dg/builtin-bitreverse-7.c.jj    2026-05-21 
> 11:32:07.822312148 +0200
> +++ gcc/testsuite/gcc.dg/builtin-bitreverse-7.c    2026-05-21 
> 11:32:25.911008640 +0200
> @@ -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" } } */
> --- gcc/testsuite/gcc.dg/builtin-bitreverse-8.c.jj    2026-05-21 
> 11:35:56.379477196 +0200
> +++ gcc/testsuite/gcc.dg/builtin-bitreverse-8.c    2026-05-21 
> 11:36:42.805698209 +0200
> @@ -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" } } */
> 
>    Jakub
> 

Reply via email to