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

From: Yury Norov
Date: Thu Nov 10 2022 - 22:36:12 EST


On Fri, Nov 11, 2022 at 10:57:17AM +0900, Vincent MAILHOL wrote:
> 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.

In fact, compiler's typecheck would be more strict than your BUG().
For example, your check allows pointers, but compiler will complain.