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 > >