Improve configure test for the sse4.2 crc instruction.
authorAndres Freund
Mon, 17 Aug 2015 09:15:46 +0000 (11:15 +0200)
committerAndres Freund
Mon, 17 Aug 2015 09:23:31 +0000 (11:23 +0200)
With optimizations enabled at least one compiler, clang 3.7, optimized
away the crc intrinsics knowing that the result went on unused and has
no side effects. That can trigger errors in code generation when the
intrinsic is used, as we chose to use the intrinsics without any
additional compiler flag. Return the computed value to prevent that.

With some more pedantic warning flags (-Wold-style-definition) the
configure test failed to recognize the existence of _mm_crc32_u*
intrinsics due to an independent warning in the test because the test
turned on -Werror, but that's not actually needed here.

Discussion: 20150814092039[email protected]
Backpatch: 9.5, where the use of crc intrinsics was integrated.

config/c-compiler.m4
configure

index 4ef0de65a8b0809970fd9c106f5e99bb29280162..ea8ea9705b47959611a9525f5a2f9d6de98cf37b 100644 (file)
@@ -488,15 +488,14 @@ AC_DEFUN([PGAC_SSE42_CRC32_INTRINSICS],
 AC_CACHE_CHECK([for _mm_crc32_u8 and _mm_crc32_u32 with CFLAGS=$1], [Ac_cachevar],
 [pgac_save_CFLAGS=$CFLAGS
 CFLAGS="$pgac_save_CFLAGS $1"
-ac_save_c_werror_flag=$ac_c_werror_flag
-ac_c_werror_flag=yes
 AC_TRY_LINK([#include ],
   [unsigned int crc = 0;
    crc = _mm_crc32_u8(crc, 0);
-   crc = _mm_crc32_u32(crc, 0);],
+   crc = _mm_crc32_u32(crc, 0);
+   /* return computed value, to prevent the above being optimized away */
+   return crc == 0;],
   [Ac_cachevar=yes],
   [Ac_cachevar=no])
-ac_c_werror_flag=$ac_save_c_werror_flag
 CFLAGS="$pgac_save_CFLAGS"])
 if test x"$Ac_cachevar" = x"yes"; then
   CFLAGS_SSE42="$1"
index ec6ae26a9e92a3e5519dbcb40593df408d7e05ff..223f687d23603fe53bb82f362fac05afb3eae905 100755 (executable)
--- a/configure
+++ b/configure
@@ -14296,8 +14296,6 @@ if ${pgac_cv_sse42_crc32_intrinsics_+:} false; then :
 else
   pgac_save_CFLAGS=$CFLAGS
 CFLAGS="$pgac_save_CFLAGS "
-ac_save_c_werror_flag=$ac_c_werror_flag
-ac_c_werror_flag=yes
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include 
@@ -14307,6 +14305,8 @@ main ()
 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 */
+   return crc == 0;
   ;
   return 0;
 }
@@ -14318,7 +14318,6 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-ac_c_werror_flag=$ac_save_c_werror_flag
 CFLAGS="$pgac_save_CFLAGS"
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_sse42_crc32_intrinsics_" >&5
@@ -14336,8 +14335,6 @@ if ${pgac_cv_sse42_crc32_intrinsics__msse4_2+:} false; then :
 else
   pgac_save_CFLAGS=$CFLAGS
 CFLAGS="$pgac_save_CFLAGS -msse4.2"
-ac_save_c_werror_flag=$ac_c_werror_flag
-ac_c_werror_flag=yes
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include 
@@ -14347,6 +14344,8 @@ main ()
 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 */
+   return crc == 0;
   ;
   return 0;
 }
@@ -14358,7 +14357,6 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-ac_c_werror_flag=$ac_save_c_werror_flag
 CFLAGS="$pgac_save_CFLAGS"
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_sse42_crc32_intrinsics__msse4_2" >&5