Re: [PATCH] middle-end: If supported, use __builtin_bitreverse64 on reflect_hwi. [PR126625]

Andrea Pinski <[email protected]> Thu, 6 Aug 2026 22:46:21 -0700
Newsgroups gmane.comp.gcc.patches
Message-ID <CALvbMcArM7NCJ3brz9Qt9e1JjU4QcihZNG-1Hq_MFfMwCYZViw@mail.gmail.com>
On Thu, Aug 6, 2026 at 3:24 AM Kael Andrew Franco <[email protected]> wrote:
>
> From f3df22990341e3ff247160509c41e8b123aff0bd Mon Sep 17 00:00:00 2001
> From: Kael Andrew Alonzo Franco <[email protected]>
> Date: Wed, 5 Aug 2026 12:50:20 -0400
> Subject: [PATCH] middle-end: If supported, use __builtin_bitreverse64 on reflect_hwi. [PR126625]
>
> reflect_hwi uses a naive for loop approach to emulate __builtin_bitreverse64 ().
> This is slow compared to using __builtin_bitreverse64 () plus bitshift.
> This is useful for bootstrapping GCC since r17-523.
> Also add assert on BITWIDTH <= 64.
>
> Bootstrapped and regtested on x86_64-pc-linux-gnu.
>
> PR middle-end/126625
>
> gcc/ChangeLog:
>
> * hwint.cc (reflect_hwi): If supported, use __builtin_bitreverse64.
>
> Signed-off-by: Kael Andrew Franco <[email protected]>
> ---
>  gcc/hwint.cc | 19 ++++++++++++++++++-
>  1 file changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/hwint.cc b/gcc/hwint.cc
> index f3b3e7b8408..e87956ed3f5 100644
> --- a/gcc/hwint.cc
> +++ b/gcc/hwint.cc
> @@ -189,12 +189,27 @@ least_common_multiple (HOST_WIDE_INT a, HOST_WIDE_INT b)
>    return mul_hwi (abs_hwi (a) / gcd (a, b), abs_hwi (b));
>  }
>
> -/* Reflect (reverse) the bits of a given VALUE within a specified BITWIDTH.  */
> +#ifdef __has_builtin
> +#if __has_builtin(__builtin_bitreverse64)
> +#define HAVE_BITREVERSE64
> +#endif
> +#endif

I think it is better to do:
#define HAVE_BITREVERSE64 0
#ifdef __has_builtin
# if __has_builtin(__builtin_bitreverse64)
#  define HAVE_BITREVERSE64 1
#endif
#endif

> +
> +/* Reflect (reverse) the bits of a given VALUE within a specified BITWIDTH <= 64.  */
>
>  unsigned HOST_WIDE_INT
>  reflect_hwi (unsigned HOST_WIDE_INT value, unsigned bitwidth)
>  {
> +  if (bitwidth == 0)
> +    return 0;
> +
> +  gcc_checking_assert (bitwidth <= 64);
> +
> +#ifdef HAS_BITREVERSE64
#if HAVE_BITREVERSE64
> +  return __builtin_bitreverse64 (value) >> (64 - bitwidth);
> +#else
>    unsigned HOST_WIDE_INT reflected_value = 0;
> +
>    /* Loop through each bit in the specified BITWIDTH.  */
>    for (size_t i = 0; i < bitwidth; i++)
>      {
> @@ -204,5 +219,7 @@ reflect_hwi (unsigned HOST_WIDE_INT value, unsigned bitwidth)
>        reflected_value |= (value & 1);
>        value >>= 1;
>      }
> +
>    return reflected_value;
> +#endif
>  }
> --
> 2.55.0
>
>