mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Be more paranoid in configure's checks for CRC and POPCNT intrinsics.
In these tests, we need to verify not only that the compiler has heard of these intrinsics, but that lower-level tools cope with them too. (For example, the assembler must also know the instructions, and on some platforms there might be library support involved.) The hazard is that the compiler might optimize away the calls altogether, allowing the configure check to succeed only to have the build fail later if lower-level support is missing. The existing code tried to prevent that by ensuring that the result of the intrinsic is used for something, but that's really insufficient because we were feeding constant input to it. So the compiler would be perfectly entitled to optimize away the calls anyway. Fix by making the inputs into global variables. (Hypothetically, LTO optimization could still remove the code --- but that's well past where we'd be likely to hit trouble.) It is not known that any current compiler would actually optimize away these calls, and even if that happened it would be unlikely that any problem would manifest. Our concern for this stems from largely-bygone days when it was common to install gcc on platforms with some other native compiler, so that a compiler-vs-library support discrepancy was more probable. Still, there's little point in defending against such cases in a way that is visibly incomplete. I'm content to fix this in master for now; we can back-patch if any indication appears that it's a live problem for someone. Discussion: https://postgr.es/m/3368102.1741993462@sss.pgh.pa.us
This commit is contained in:
26
configure
vendored
26
configure
vendored
@ -17334,16 +17334,17 @@ else
|
||||
/* end confdefs.h. */
|
||||
#include <immintrin.h>
|
||||
#include <stdint.h>
|
||||
char buf[sizeof(__m512i)];
|
||||
|
||||
#if defined(__has_attribute) && __has_attribute (target)
|
||||
__attribute__((target("avx512vpopcntdq,avx512bw")))
|
||||
#endif
|
||||
static int popcount_test(void)
|
||||
{
|
||||
const char buf[sizeof(__m512i)];
|
||||
int64_t popcnt = 0;
|
||||
__m512i accum = _mm512_setzero_si512();
|
||||
const __m512i val = _mm512_maskz_loadu_epi8((__mmask64) 0xf0f0f0f0f0f0f0f0, (const __m512i *) buf);
|
||||
const __m512i cnt = _mm512_popcnt_epi64(val);
|
||||
__m512i val = _mm512_maskz_loadu_epi8((__mmask64) 0xf0f0f0f0f0f0f0f0, (const __m512i *) buf);
|
||||
__m512i cnt = _mm512_popcnt_epi64(val);
|
||||
accum = _mm512_add_epi64(accum, cnt);
|
||||
popcnt = _mm512_reduce_add_epi64(accum);
|
||||
return (int) popcnt;
|
||||
@ -17387,12 +17388,12 @@ else
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
#include <nmmintrin.h>
|
||||
unsigned int crc;
|
||||
#if defined(__has_attribute) && __has_attribute (target)
|
||||
__attribute__((target("sse4.2")))
|
||||
#endif
|
||||
static int crc32_sse42_test(void)
|
||||
{
|
||||
unsigned int crc = 0;
|
||||
crc = _mm_crc32_u8(crc, 0);
|
||||
crc = _mm_crc32_u32(crc, 0);
|
||||
/* return computed value, to prevent the above being optimized away */
|
||||
@ -17459,11 +17460,11 @@ CFLAGS="$pgac_save_CFLAGS "
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
#include <arm_acle.h>
|
||||
unsigned int crc;
|
||||
int
|
||||
main ()
|
||||
{
|
||||
unsigned int crc = 0;
|
||||
crc = __crc32cb(crc, 0);
|
||||
crc = __crc32cb(crc, 0);
|
||||
crc = __crc32ch(crc, 0);
|
||||
crc = __crc32cw(crc, 0);
|
||||
crc = __crc32cd(crc, 0);
|
||||
@ -17500,11 +17501,11 @@ CFLAGS="$pgac_save_CFLAGS -march=armv8-a+crc+simd"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
#include <arm_acle.h>
|
||||
unsigned int crc;
|
||||
int
|
||||
main ()
|
||||
{
|
||||
unsigned int crc = 0;
|
||||
crc = __crc32cb(crc, 0);
|
||||
crc = __crc32cb(crc, 0);
|
||||
crc = __crc32ch(crc, 0);
|
||||
crc = __crc32cw(crc, 0);
|
||||
crc = __crc32cd(crc, 0);
|
||||
@ -17541,11 +17542,11 @@ CFLAGS="$pgac_save_CFLAGS -march=armv8-a+crc"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
#include <arm_acle.h>
|
||||
unsigned int crc;
|
||||
int
|
||||
main ()
|
||||
{
|
||||
unsigned int crc = 0;
|
||||
crc = __crc32cb(crc, 0);
|
||||
crc = __crc32cb(crc, 0);
|
||||
crc = __crc32ch(crc, 0);
|
||||
crc = __crc32cw(crc, 0);
|
||||
crc = __crc32cd(crc, 0);
|
||||
@ -17585,12 +17586,11 @@ if ${pgac_cv_loongarch_crc32c_intrinsics+:} false; then :
|
||||
else
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
unsigned int crc;
|
||||
int
|
||||
main ()
|
||||
{
|
||||
unsigned int crc = 0;
|
||||
crc = __builtin_loongarch_crcc_w_b_w(0, crc);
|
||||
crc = __builtin_loongarch_crcc_w_b_w(0, crc);
|
||||
crc = __builtin_loongarch_crcc_w_h_w(0, crc);
|
||||
crc = __builtin_loongarch_crcc_w_w_w(0, crc);
|
||||
crc = __builtin_loongarch_crcc_w_d_w(0, crc);
|
||||
|
Reference in New Issue
Block a user