On 8/4/25 10:14 PM, Kees Cook wrote: > While tracking down a problem where constant expressions used by > BUILD_BUG_ON() suddenly stopped working[1], we found that an added static > initializer was convincing the compiler that it couldn't track the state > of the prior statically initialized value. Tracing this down found that > ffs() was used in the initializer macro, but since it wasn't marked with > __attribute__const__, the compiler had to assume the function might > change variable states as a side-effect (which is not true for ffs(), > which provides deterministic math results). > > Add missing __attribute_const__ annotations to PowerPC's implementations of > fls() function. These are pure mathematical functions that always return > the same result for the same input with no side effects, making them eligible > for compiler optimization. > > Build tested ARCH=powerpc defconfig with GCC powerpc-linux-gnu 14.2.0. > Also tested with gcc 8.1. Acked-by: Madhavan Srinivasan <maddy@xxxxxxxxxxxxx> > Link: https://github.com/KSPP/linux/issues/364 [1] > Signed-off-by: Kees Cook <kees@xxxxxxxxxx> > --- > arch/powerpc/include/asm/bitops.h | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/arch/powerpc/include/asm/bitops.h b/arch/powerpc/include/asm/bitops.h > index 671ecc6711e3..0d0470cd5ac3 100644 > --- a/arch/powerpc/include/asm/bitops.h > +++ b/arch/powerpc/include/asm/bitops.h > @@ -276,7 +276,7 @@ static inline void arch___clear_bit_unlock(int nr, volatile unsigned long *addr) > * fls: find last (most-significant) bit set. > * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. > */ > -static __always_inline int fls(unsigned int x) > +static __always_inline __attribute_const__ int fls(unsigned int x) > { > int lz; > > @@ -294,7 +294,7 @@ static __always_inline int fls(unsigned int x) > * 32-bit fls calls. > */ > #ifdef CONFIG_PPC64 > -static __always_inline int fls64(__u64 x) > +static __always_inline __attribute_const__ int fls64(__u64 x) > { > int lz; >