[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 07/13] x86/bitops: Improve arch_ffs() in the general case
On 28.05.2024 14:30, Andrew Cooper wrote: > On 27/05/2024 2:37 pm, Jan Beulich wrote: >> On 27.05.2024 15:27, Jan Beulich wrote: >>> On 24.05.2024 22:03, Andrew Cooper wrote: >>>> --- a/xen/arch/x86/include/asm/bitops.h >>>> +++ b/xen/arch/x86/include/asm/bitops.h >>>> @@ -432,12 +432,28 @@ static inline int ffsl(unsigned long x) >>>> >>>> static always_inline unsigned int arch_ffs(unsigned int x) >>>> { >>>> - int r; >>>> + unsigned int r; >>>> + >>>> + if ( __builtin_constant_p(x > 0) && x > 0 ) >>>> + { >>>> + /* Safe, when the compiler knows that x is nonzero. */ >>>> + asm ( "bsf %[val], %[res]" >>>> + : [res] "=r" (r) >>>> + : [val] "rm" (x) ); >>>> + } >>> In patch 11 relevant things are all in a single patch, making it easier >>> to spot that this is dead code: The sole caller already has a >>> __builtin_constant_p(), hence I don't see how the one here could ever >>> return true. With that the respective part of the description is then >>> questionable, too, I'm afraid: Where did you observe any actual effect >>> from this? Or if you did - what am I missing? >> Hmm, thinking about it: I suppose that's why you have >> __builtin_constant_p(x > 0), not __builtin_constant_p(x). I have to admit >> I'm (positively) surprised that the former may return true when the latter >> doesn't. > > So was I, but this recommendation came straight from the GCC mailing > list. And it really does work, even back in obsolete versions of GCC. > > __builtin_constant_p() operates on an expression not a value, and is > documented as such. Of course. >> Nevertheless I'm inclined to think this deserves a brief comment. > > There is a comment, and it's even visible in the snippet. The comment is about the asm(); it is neither placed to clearly relate to __builtin_constant_p(), nor is it saying anything about this specific property of it. You said you were equally surprised; don't you think that when both of us are surprised, a specific (even if brief) comment is warranted? >> As an aside, to better match the comment inside the if()'s body, how about >> >> if ( __builtin_constant_p(!!x) && x ) >> >> ? That also may make a little more clear that this isn't just a style >> choice, but actually needed for the intended purpose. > > I am not changing the logic. > > Apart from anything else, your suggestion is trivially buggy. I care > about whether the RHS collapses to a constant, and the only way of doing > that correctly is asking the compiler about the *exact* expression. > Asking about some other expression which you hope - but do not know - > that the compiler will treat equivalently is bogus. It would be > strictly better to only take the else clause, than to have both halves > emitted. > > This is the form I've tested extensively. It's also the clearest form > IMO. You can experiment with alternative forms when we're not staring > down code freeze of 4.19. "Clearest form" is almost always a matter of taste. To me, comparing unsigned values with > or < against 0 is generally at least suspicious. Using != is typically better (again: imo), and simply omitting the != 0 then is shorter with no difference in effect. Except in peculiar cases like this one, where indeed it took me some time to figure why the comparison operator may not be omitted. All that said: I'm not going to insist on any change; the R-b previously offered still stands. I would highly appreciate though if the (further) comment asked for could be added. What I definitely dislike here is you - not for the first time - turning down remarks because a change of yours is late. This feels even more so bad when considering that I'm typically replying to your patches with pretty little turnaround. Whereas various of mine, pending in part for years, do not seem to deserve any review comments at all. Unlike before, where it was "only" improvements or feature additions, meanwhile even bug fixes are left sit like that. If I may be blunt: This may not work this way for much longer. At some point I will need to artificially delay reviews, making them dependent on my own work also being allowed to make progress. I question though whether that would be in everyone's interest. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |