be-more-paranoid-in-CRC-configure-checks.patch
text/x-diff
Filename: be-more-paranoid-in-CRC-configure-checks.patch
Type: text/x-diff
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| config/c-compiler.m4 | 13 | 10 |
| configure | 14 | 15 |
| meson.build | 6 | 8 |
diff --git a/config/c-compiler.m4 b/config/c-compiler.m4
index 8534cc54c13..2d33d919585 100644
--- a/config/c-compiler.m4
+++ b/config/c-compiler.m4
@@ -553,19 +553,23 @@ fi])# PGAC_HAVE_GCC__ATOMIC_INT64_CAS
# the other ones are, on x86-64 platforms)
#
# If the intrinsics are supported, sets pgac_sse42_crc32_intrinsics.
+#
+# To detect the case where the compiler knows the function but library support
+# is missing, we must link not just compile, and store the results in global
+# variables so the compiler doesn't optimize away the call.
AC_DEFUN([PGAC_SSE42_CRC32_INTRINSICS],
[define([Ac_cachevar], [AS_TR_SH([pgac_cv_sse42_crc32_intrinsics])])dnl
AC_CACHE_CHECK([for _mm_crc32_u8 and _mm_crc32_u32], [Ac_cachevar],
[AC_LINK_IFELSE([AC_LANG_PROGRAM([#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 */
+ /* else this function could get optimized away altogether: */
return crc == 0;
}],
[return crc32_sse42_test();])],
@@ -593,13 +597,13 @@ AC_DEFUN([PGAC_ARMV8_CRC32C_INTRINSICS],
AC_CACHE_CHECK([for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=$1], [Ac_cachevar],
[pgac_save_CFLAGS=$CFLAGS
CFLAGS="$pgac_save_CFLAGS $1"
-AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <arm_acle.h>],
- [unsigned int crc = 0;
- crc = __crc32cb(crc, 0);
+AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <arm_acle.h>
+unsigned int crc;],
+ [crc = __crc32cb(crc, 0);
crc = __crc32ch(crc, 0);
crc = __crc32cw(crc, 0);
crc = __crc32cd(crc, 0);
- /* return computed value, to prevent the above being optimized away */
+ /* return computed value, just to be extra sure this isn't optimized away */
return crc == 0;])],
[Ac_cachevar=yes],
[Ac_cachevar=no])
@@ -628,13 +632,12 @@ AC_DEFUN([PGAC_LOONGARCH_CRC32C_INTRINSICS],
AC_CACHE_CHECK(
[for __builtin_loongarch_crcc_w_b_w, __builtin_loongarch_crcc_w_h_w, __builtin_loongarch_crcc_w_w_w and __builtin_loongarch_crcc_w_d_w],
[Ac_cachevar],
-[AC_LINK_IFELSE([AC_LANG_PROGRAM([],
- [unsigned int crc = 0;
- crc = __builtin_loongarch_crcc_w_b_w(0, crc);
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([unsigned int 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);
- /* return computed value, to prevent the above being optimized away */
+ /* return computed value, just to be extra sure this isn't optimized away */
return crc == 0;])],
[Ac_cachevar=yes],
[Ac_cachevar=no])])
diff --git a/configure b/configure
index 93fddd69981..1e685514777 100755
--- a/configure
+++ b/configure
@@ -17391,15 +17391,15 @@ 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 */
+ /* else this function could get optimized away altogether: */
return crc == 0;
}
int
@@ -17463,15 +17463,15 @@ 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);
- /* return computed value, to prevent the above being optimized away */
+ /* return computed value, just to be extra sure this isn't optimized away */
return crc == 0;
;
return 0;
@@ -17504,15 +17504,15 @@ 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);
- /* return computed value, to prevent the above being optimized away */
+ /* return computed value, just to be extra sure this isn't optimized away */
return crc == 0;
;
return 0;
@@ -17545,15 +17545,15 @@ 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);
- /* return computed value, to prevent the above being optimized away */
+ /* return computed value, just to be extra sure this isn't optimized away */
return crc == 0;
;
return 0;
@@ -17589,16 +17589,15 @@ 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);
- /* return computed value, to prevent the above being optimized away */
+ /* return computed value, just to be extra sure this isn't optimized away */
return crc == 0;
;
return 0;
diff --git a/meson.build b/meson.build
index 13c13748e5d..599942800fd 100644
--- a/meson.build
+++ b/meson.build
@@ -2323,16 +2323,15 @@ if host_cpu == 'x86' or host_cpu == 'x86_64'
prog = '''
#include <nmmintrin.h>
-
+unsigned int crc;
#if defined(__has_attribute) && __has_attribute (target)
__attribute__((target("sse4.2")))
#endif
int main(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 */
+ /* else this function could get optimized away altogether: */
return crc == 0;
}
'''
@@ -2358,16 +2357,15 @@ elif host_cpu == 'arm' or host_cpu == 'aarch64'
prog = '''
#include <arm_acle.h>
-
+unsigned int crc;
int main(void)
{
- unsigned int crc = 0;
crc = __crc32cb(crc, 0);
crc = __crc32ch(crc, 0);
crc = __crc32cw(crc, 0);
crc = __crc32cd(crc, 0);
- /* return computed value, to prevent the above being optimized away */
+ /* return computed value, just to be extra sure this isn't optimized away */
return crc == 0;
}
'''
@@ -2396,15 +2394,15 @@ int main(void)
elif host_cpu == 'loongarch64'
prog = '''
+unsigned int crc;
int main(void)
{
- unsigned int crc = 0;
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);
- /* return computed value, to prevent the above being optimized away */
+ /* return computed value, just to be extra sure this isn't optimized away */
return crc == 0;
}
'''