From 6c3d04e3421c45097c7731014984e8a3744db989 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Fri, 6 Feb 2026 10:00:21 -0600 Subject: [PATCH v11 4/4] Remove uses of popcount builtins. --- configure | 38 ---------------------------------- configure.ac | 1 - meson.build | 1 - src/include/pg_config.h.in | 3 --- src/include/port/pg_bitutils.h | 17 +-------------- src/port/pg_popcount_aarch64.c | 5 ----- 6 files changed, 1 insertion(+), 64 deletions(-) diff --git a/configure b/configure index ba293931878..623aa397fae 100755 --- a/configure +++ b/configure @@ -15920,44 +15920,6 @@ cat >>confdefs.h <<_ACEOF #define HAVE__BUILTIN_CTZ 1 _ACEOF -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_popcount" >&5 -$as_echo_n "checking for __builtin_popcount... " >&6; } -if ${pgac_cv__builtin_popcount+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -call__builtin_popcount(unsigned int x) -{ - return __builtin_popcount(x); -} -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - pgac_cv__builtin_popcount=yes -else - pgac_cv__builtin_popcount=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__builtin_popcount" >&5 -$as_echo "$pgac_cv__builtin_popcount" >&6; } -if test x"${pgac_cv__builtin_popcount}" = xyes ; then - -cat >>confdefs.h <<_ACEOF -#define HAVE__BUILTIN_POPCOUNT 1 -_ACEOF - fi # __builtin_frame_address may draw a diagnostic for non-constant argument, # so it needs a different test function. diff --git a/configure.ac b/configure.ac index 412fe358a2f..04c6a75bff7 100644 --- a/configure.ac +++ b/configure.ac @@ -1853,7 +1853,6 @@ PGAC_CHECK_BUILTIN_FUNC([__builtin_bswap64], [long int x]) # We assume that we needn't test all widths of these explicitly: PGAC_CHECK_BUILTIN_FUNC([__builtin_clz], [unsigned int x]) PGAC_CHECK_BUILTIN_FUNC([__builtin_ctz], [unsigned int x]) -PGAC_CHECK_BUILTIN_FUNC([__builtin_popcount], [unsigned int x]) # __builtin_frame_address may draw a diagnostic for non-constant argument, # so it needs a different test function. PGAC_CHECK_BUILTIN_FUNC_PTR([__builtin_frame_address], [0]) diff --git a/meson.build b/meson.build index 0722b16927e..c607d8ac69a 100644 --- a/meson.build +++ b/meson.build @@ -2004,7 +2004,6 @@ builtins = [ 'ctz', 'constant_p', 'frame_address', - 'popcount', 'unreachable', ] diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index c089f2252c3..301328b8cd3 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -530,9 +530,6 @@ /* Define to 1 if your compiler understands __builtin_$op_overflow. */ #undef HAVE__BUILTIN_OP_OVERFLOW -/* Define to 1 if your compiler understands __builtin_popcount. */ -#undef HAVE__BUILTIN_POPCOUNT - /* Define to 1 if your compiler understands __builtin_types_compatible_p. */ #undef HAVE__BUILTIN_TYPES_COMPATIBLE_P diff --git a/src/include/port/pg_bitutils.h b/src/include/port/pg_bitutils.h index 3c58f6c6864..c9b1f5f17dc 100644 --- a/src/include/port/pg_bitutils.h +++ b/src/include/port/pg_bitutils.h @@ -313,32 +313,17 @@ pg_popcount32(uint32 word) * pg_popcount64 * Return the number of 1 bits set in word * - * Plain C version adapted from + * Adapted from * https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel. */ static inline int pg_popcount64(uint64 word) { - /* - * On x86, gcc generates a function call for this built-in unless the - * popcnt instruction is available, so we use the plain C version in that - * case to ensure inlining. - */ -#if defined(HAVE__BUILTIN_POPCOUNT) && (defined(__POPCNT__) || !defined(__x86_64__)) -#if SIZEOF_LONG == 8 - return __builtin_popcountl(word); -#elif SIZEOF_LONG_LONG == 8 - return __builtin_popcountll(word); -#else -#error "cannot find integer of the same size as uint64_t" -#endif -#else word -= (word >> 1) & UINT64CONST(0x5555555555555555); word = (word & UINT64CONST(0x3333333333333333)) + ((word >> 2) & UINT64CONST(0x3333333333333333)); word = (word + (word >> 4)) & UINT64CONST(0xf0f0f0f0f0f0f0f); return (word * UINT64CONST(0x101010101010101)) >> 56; -#endif } /* diff --git a/src/port/pg_popcount_aarch64.c b/src/port/pg_popcount_aarch64.c index f474ef45510..b0f10ae07a4 100644 --- a/src/port/pg_popcount_aarch64.c +++ b/src/port/pg_popcount_aarch64.c @@ -298,11 +298,6 @@ pg_popcount_masked_optimized(const char *buf, int bytes, bits8 mask) static inline int pg_popcount64_neon(uint64 word) { - /* - * For some compilers, __builtin_popcountl() already emits Neon - * instructions. The line below should compile to the same code on those - * systems. - */ return vaddv_u8(vcnt_u8(vld1_u8((const uint8 *) &word))); } -- 2.50.1 (Apple Git-155)