[Mesa-dev] [PATCH] swr: Refactor checks for compiler feature flags
Rowley, Timothy O
timothy.o.rowley at intel.com
Tue Jun 28 17:52:40 UTC 2016
> On Jun 28, 2016, at 8:24 AM, Chuck Atkins <chuck.atkins at kitware.com> wrote:
>
> 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.
>
> Cc: Tim Rowley <timothy.o.rowley at intel.com>
> Signed-off-by: Chuck Atkins <chuck.atkins at kitware.com>
> ---
> configure.ac | 86 +++++++++++++++++++++++++++++++++++++++++++-----------------
> 1 file changed, 62 insertions(+), 24 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index cc9bc47..806850e 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -2330,6 +2330,39 @@ swr_llvm_check() {
> fi
> }
>
> +swr_cxx_feature_flags_check() {
> + ifndef_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(
> + [ $ifndef_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 \
> + "#if __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”
We don’t want to globally override CXXFLAGS; AC_SUBST on a SWR_CXXFLAGS and using that in swr’s Makefile.am would be better.
> +
> + AC_MSG_CHECKING([whether $CXX supports AVX])
> + if ! swr_cxx_feature_flags_check \
> + "#ifndef __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 \
> + "#if !(defined(__AVX2__)&&defined(__FMA__)&&defined(__BMI2__)&&defined(__F16C__))” \
Is there any standard that says these are defined if the compiler supports them? With icc 16.0.3, the test falls into the #error path when it tries the fallback test of -march=core-avx2.
> + ",-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
>
More information about the mesa-dev
mailing list