Encapsulate the test for which flags are needed to get a compiler to support certain features. Along with this, give various options to try for AVX and AVX2 support. Ideally we want to use specific instruction set feature flags, like -mavx2 for instance instead of -march=haswell, but the flags required for certain compilers are different. This allows, for AVX2 for instance, GCC to use -mavx2 -mfma -mbmi2 -mf16c while the Intel compiler which doesn't support those flags can fall back to using -march=core-avx2.
This addresses a bug where the Intel compiler will silently ignore the AVX2 instruction feature flags and then potentially fail to build. v2: Pass preprocessor-check argument as true-state instead of false-state for clarity. Cc: Tim Rowley <timothy.o.row...@intel.com> Signed-off-by: Chuck Atkins <chuck.atk...@kitware.com> --- configure.ac | 86 +++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 62 insertions(+), 24 deletions(-) diff --git a/configure.ac b/configure.ac index cc9bc47..6082778 100644 --- a/configure.ac +++ b/configure.ac @@ -2330,6 +2330,39 @@ swr_llvm_check() { fi } +swr_cxx_feature_flags_check() { + preprocessor_test="$1" + option_list="$2" + unset SWR_CXX_FEATURE_FLAGS + AC_LANG_PUSH([C++]) + save_CXXFLAGS="$CXXFLAGS" + save_IFS="$IFS" + IFS="," + found=0 + for opts in $option_list + do + unset IFS + CXXFLAGS="$opts $save_CXXFLAGS" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [ #if !($preprocessor_test) + #error + #endif + ])], + [found=1; break], + []) + IFS="," + done + IFS="$save_IFS" + CXXFLAGS="$save_CXXFLAGS" + AC_LANG_POP([C++]) + if test $found -eq 1; then + SWR_CXX_FEATURE_FLAGS="$opts" + return 0 + fi + return 1 +} + dnl Duplicates in GALLIUM_DRIVERS_DIRS are removed by sorting it after this block if test -n "$with_gallium_drivers"; then gallium_drivers=`IFS=', '; echo $with_gallium_drivers` @@ -2399,31 +2432,36 @@ if test -n "$with_gallium_drivers"; then xswr) swr_llvm_check "swr" - AC_MSG_CHECKING([whether $CXX supports c++11/AVX/AVX2]) - SWR_AVX_CXXFLAGS="-mavx" - SWR_AVX2_CXXFLAGS="-mavx2 -mfma -mbmi2 -mf16c" - - AC_LANG_PUSH([C++]) - save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="-std=c++11 $CXXFLAGS" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],[], - [AC_MSG_ERROR([c++11 compiler support not detected])]) - CXXFLAGS="$save_CXXFLAGS" - - save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$SWR_AVX_CXXFLAGS $CXXFLAGS" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],[], - [AC_MSG_ERROR([AVX compiler support not detected])]) - CXXFLAGS="$save_CXXFLAGS" - - save_CFLAGS="$CXXFLAGS" - CXXFLAGS="$SWR_AVX2_CXXFLAGS $CXXFLAGS" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],[], - [AC_MSG_ERROR([AVX2 compiler support not detected])]) - CXXFLAGS="$save_CXXFLAGS" - AC_LANG_POP([C++]) - + AC_MSG_CHECKING([whether $CXX supports c++11]) + if ! swr_cxx_feature_flags_check \ + "__cplusplus >= 201103L" \ + ",-std=c++11"; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR([swr requires C++11 support]) + fi + AC_MSG_RESULT([$SWR_CXX_FEATURE_FLAGS]) + CXXFLAGS="$SWR_CXX_FEATURE_FLAGS $CXXFLAGS" + + AC_MSG_CHECKING([whether $CXX supports AVX]) + if ! swr_cxx_feature_flags_check \ + "defined(__AVX__)" \ + ",-mavx,-march=core-avx"; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR([swr requires AVX compiler support]) + fi + AC_MSG_RESULT([$SWR_CXX_FEATURE_FLAGS]) + SWR_AVX_CXXFLAGS="$SWR_CXX_FEATURE_FLAGS" AC_SUBST([SWR_AVX_CXXFLAGS]) + + AC_MSG_CHECKING([whether $CXX supports AVX2]) + if ! swr_cxx_feature_flags_check \ + "defined(__AVX2__)&&defined(__FMA__)&&defined(__BMI2__)&&defined(__F16C__)" \ + ",-mavx2 -mfma -mbmi2 -mf16c,-march=core-avx2"; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR([swr requires AVX2 compiler support]) + fi + AC_MSG_RESULT([$SWR_CXX_FEATURE_FLAGS]) + SWR_AVX2_CXXFLAGS="$SWR_CXX_FEATURE_FLAGS" AC_SUBST([SWR_AVX2_CXXFLAGS]) HAVE_GALLIUM_SWR=yes -- 2.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev