[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 5/9] xen/bitops: Introduce generic_hweightl() and hweightl()
On 27/08/2024 12:41 pm, Jan Beulich wrote: > On 27.08.2024 12:39, Andrew Cooper wrote: >> On 26/08/2024 12:40 pm, Jan Beulich wrote: >>> On 23.08.2024 01:06, Andrew Cooper wrote: >>> --- a/xen/include/xen/bitops.h >>> +++ b/xen/include/xen/bitops.h >>> @@ -35,6 +35,12 @@ extern void __bitop_bad_size(void); >>> unsigned int __pure generic_ffsl(unsigned long x); >>> unsigned int __pure generic_flsl(unsigned long x); >>> >>>> +/* >>>> + * Hamming Weight, also called Population Count. Returns the number of >>>> set >>>> + * bits in @x. >>>> + */ >>>> +unsigned int __pure generic_hweightl(unsigned long x); >>> Aren't this and ... >>> >>>> @@ -284,6 +290,18 @@ static always_inline __pure unsigned int >>>> fls64(uint64_t x) >>>> (_v & (_v - 1)) != 0; \ >>>> }) >>>> >>>> +static always_inline __pure unsigned int hweightl(unsigned long x) >>> ... this even __attribute_const__? >> Hmm. This is following fls(), but on further consideration, they should >> be const too. >> >> I'll do a prep patch fixing that, although I'm going to rename it to >> __attr_const for brevity. >> >> Much as I'd prefer __const, I expect that is going too far, making it >> too close to regular const. > I was actually going to suggest using that name, if we want to shorten > __attribute_const__. Yes, gcc treats __const (and __const__) as > keywords, but do we care (much)? All it requires is that we don't start > using __const as a (real) keyword. Well also we'll get into more MISRA fun for overriding keywords. But yes - the fact that GCC treats __const to mean const is precisely why we shouldn't give it an unrelated meaning. > > Of course __const is a good example of why really we shouldn't use > double-underscore prefixed names anywhere. Any of them can be assigned > a meaning by the compiler, and here that's clearly the case. Therefore, > taking your planned rename, maybe better make it attr_const then? And > eventually switch stuff like __packed, __pure, and __weak to attr_* as > well? Or even introduce something like > > #define attr(attr...) __attribute__((attr)) > > and use attr(const) here? Hmm - that's an interesting approach, and for other attributes which we can use unconditionally. It will end up shorter than multiple separate __-prefixed names. As a tangent, I've got some work from playing with -fanalyzer which sprinkles some attr malloc/alloc_{size,align}()/free around. It does improve code generation (abeit marginally), but the function declaration size suffers. It won't work for attributes which are conditionally nothing (e.g. cf_check), or ones that contain multiple aspects (e.g. __constructer conataining cf_check). In practice this means we're always going to end up with a mix, so maybe attr_const is better for consistency. > >>>> +{ >>>> + if ( __builtin_constant_p(x) ) >>>> + return __builtin_popcountl(x); >>> How certain are you that compilers (even old ones) will reliably fold >>> constant expressions here, and never emit a libgcc call instead? The >>> conditions look to be more tight than just __builtin_constant_p(); a >>> pretty absurd example: >>> >>> unsigned ltest(void) { >>> return __builtin_constant_p("") ? __builtin_popcountl((unsigned >>> long)"") : ~0; >>> } >> How do you express that in terms of a call to hweightl()? > hweightl((unsigned long)""); > > Yet as said - it's absurd. It merely serves to make the point that what > __builtin_constant_p() returns true for doesn't necessarily constant- > fold in expressions. Yes, but as shown in the godbolt link, this form changes GCC's mind about the __builtin_const-ness of the expression. > >> Again, this is following the layout started with fls() in order to avoid >> each arch opencoding different versions of constant folding. >> >> https://godbolt.org/z/r544c49oY >> >> When it's forced through the hweightl() interface, even GCC 4.1 decides >> that it's non-constant and falls back to generic_hweightl(). >> >> >> I did spend a *lot* of time with the fls() series checking that all >> compilers we supported did what we wanted in this case, so I don't >> expect it to be a problem. > Right, and I guess I was pointlessly more concerned about popcount than > I was for ffs() / fls(). The criteria upon which gcc decides whether to > constant-fold the uses is exactly the same. > >> But, if a library call is emitted, it will >> be very obvious (link failure), and we can re-evaluate. > Indeed, we certainly would notice, albeit the diagnostic may be cryptic > to people. > > Bottom line - keep it as is. Thanks. ~Andrew
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |