The `__builtin_clz` is for unsigned int, while it is applied to unsigned long. This fixes it by using `__builtin_clzl`.
It does not impact any existing use cases in the whole codebase, since the only caller of `fls_long` is `roundup_pow_of_two` in `erofs_init_devices`, and the default compile optimization level is O2. At this level, the argument passed to `roundup_pow_of_two` is optimized into a constant, bypassing the logic of `fls_long`. Signed-off-by: Hongzhen Luo <hongz...@linux.alibaba.com> --- v3: Update the commit message. v2: https://lore.kernel.org/all/20240709050700.2911563-1-hongz...@linux.alibaba.com/ v1: https://lore.kernel.org/all/20240709022031.2752872-1-hongz...@linux.alibaba.com/ --- include/erofs/defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/erofs/defs.h b/include/erofs/defs.h index e0798c8..310a6ab 100644 --- a/include/erofs/defs.h +++ b/include/erofs/defs.h @@ -288,7 +288,7 @@ static inline u32 get_unaligned_le64(const void *p) static inline unsigned int fls_long(unsigned long x) { - return x ? sizeof(x) * 8 - __builtin_clz(x) : 0; + return x ? sizeof(x) * 8 - __builtin_clzl(x) : 0; } static inline unsigned long lowbit(unsigned long n) -- 2.43.5