Re: [PATCH v1 2/2] x86/asm/bitops: Use __builtin_clz*() to evaluate constant expressions

From: Vincent MAILHOL
Date: Thu Nov 10 2022 - 20:57:38 EST


On Fri. 11 Nov. 2022 at 04:01, Nick Desaulniers <ndesaulniers@xxxxxxxxxx> wrote:
> On Sun, Nov 6, 2022 at 1:51 AM Vincent Mailhol
> <mailhol.vincent@xxxxxxxxxx> wrote:
> >
> > #ifdef CONFIG_X86_64
> > -static __always_inline int fls64(__u64 x)
> > +static __always_inline int constant_fls64(u64 x)
> > +{
> > + BUILD_BUG_ON(sizeof(unsigned long long) != sizeof(x));
>
> Thanks for the patches! They LGTM; but why do we need this BUILD_BUG_ON here?

There is no absolute need for sure.

Call this a paranoiac check and you will be correct. My reasoning for still
using it is that:

1/ It is a compile time check, so no runtime penalty.
2/ Strictly speaking, the C standard doesn't guarantee 'u64' and
'unsigned long long int' to be the same (and you can argue that in clang
and gcc long long is always 64 bits on all platforms and one more time
you will be correct).
3/ It serves as a documentation to say: "hey I am using the clz long long
version on a u64 and I know what I am doing."

If you want me to remove it, OK for me. Let me know.

> > +
> > + if (!x)
> > + return 0;
> > +
> > + return BITS_PER_TYPE(x) - __builtin_clzll(x);
> > +}