Messages in this thread | | | From | Nick Desaulniers <> | Date | Tue, 10 May 2022 15:14:43 -0700 | Subject | Re: [PATCH 0/2] x86/asm/bitops: optimize ff{s,z} functions for constant expressions |
| |
On Tue, May 10, 2022 at 7:26 AM Vincent Mailhol <mailhol.vincent@wanadoo.fr> wrote: > > The compilers provides some builtin expression equivalent to the > ffs(), __ffs() and ffz() function of the kernel. The kernel uses > optimized assembly which produces better code than the builtin > functions. However, such assembly code can not be optimized when used > on constant expression. > > This series relies on __builtin_constant_p to select the optimal solution: > > * use kernel assembly for non constant expressions > > * use compiler's __builtin function for constant expressions. > > I also think that the fls() and fls64() can be optimized in a similar > way, using __builtin_ctz() and __builtin_ctzll() but it is a bit less > trivial so I want to focus on this series first. If it get accepted, I > will then work on those two additionnal function. > > > ** Statistics ** > > On a allyesconfig, before applying this series, I get: > > | $ objdump -d vmlinux.o | grep bsf | wc -l > | 1081 > > After applying this series: > > | $ objdump -d vmlinux.o | grep bsf | wc -l > | 792 > > So, roughly 26.7% of the call to either ffs() or __ffs() were using > constant expression and can be optimized (I did not produce the > figures for ffz()).
These stats are interesting; consider putting them on patch 1/2 commit message though (in addition to the cover letter). (Sending thoughts on 1/2 next).
> > (tests done on linux v5.18-rc5 x86_64 using GCC 11.2.1)
Here's the same measure of x86_64 allyesconfig (./scripts/config -d CONFIG_HINIC) at 9be9ed2612b5aedb52a2c240edb1630b6b743cb6 with ToT LLVM (~clang-15):
Before: $ objdump -d vmlinux.o | grep bsf | wc -l 1454
After: $ objdump -d vmlinux.o | grep bsf | wc -l 1070
-26.4% :)
> > > Vincent Mailhol (2): > x86/asm/bitops: ffs: use __builtin_ffs to evaluate constant > expressions > x86/asm/bitops: __ffs,ffz: use __builtin_ctzl to evaluate constant > expressions > > arch/x86/include/asm/bitops.h | 65 +++++++++++++++++++++-------------- > 1 file changed, 40 insertions(+), 25 deletions(-) > > -- > 2.35.1 >
-- Thanks, ~Nick Desaulniers
| |