[PATCH] bitfield: wire __bf_shf to __builtin_ctzll

From: Yury Norov

Date: Mon Apr 27 2026 - 18:58:06 EST


__bf_shf() is currently based on built-in ffsll. It's more
straightforward to wire it to __builtin_ctzll, which makes it a pure
rename.

Worth to notice that __builtin_ffsll() is buggy on GCC before 14.1:

int main() {
sizeof(struct {
int t : !(__builtin_ffsll(~0ULL) + 1 < 0);
});
}

test.c: In function 'main':
test.c:3:21: error: bit-field 't' width not an integer constant
3 | int t : !(__builtin_ffsll(~0ULL) + 1 < 0);
| ^

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124699

Reported-by: Matt Coster <matt.coster@xxxxxxxxxx>
Closes: https://lore.kernel.org/oe-kbuild-all/202603222211.A2XiR1YU-lkp@xxxxxxxxx/
Signed-off-by: Yury Norov <ynorov@xxxxxxxxxx>
---
include/linux/bitfield.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/linux/bitfield.h b/include/linux/bitfield.h
index cd44013281c7..ddf6d1a70473 100644
--- a/include/linux/bitfield.h
+++ b/include/linux/bitfield.h
@@ -44,7 +44,7 @@
* FIELD_MODIFY(REG_FIELD_C, &reg, c);
*/

-#define __bf_shf(x) (__builtin_ffsll(x) - 1)
+#define __bf_shf __builtin_ctzll

#define __scalar_type_to_unsigned_cases(type) \
unsigned type: (unsigned type)0, \
--
2.51.0