[Mesa-dev] [PATCH v4] swr: Refactor checks for compiler feature flags
Rowley, Timothy O
timothy.o.rowley at intel.com
Wed Jun 29 17:03:36 UTC 2016
Tested on gcc-5.3.1, clang-3.8, icc-16.0.3
Reviewed-by: Tim Rowley <timothy.o.rowley at intel.com>
Tested-by: Tim Rowley <timothy.o.rowley at Intel.com>
> On Jun 28, 2016, at 2:50 PM, 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.
>
> v2: Pass preprocessor-check argument as true-state instead of
> false-state for clarity.
> v3: Reduce AVX2 define test to just __AVX2__. Additional defines suchas
> __FMA__, __BMI2__, and __F16C__ appear to be inconsistently defined
> w.r.t thier availability.
> v4: Fix C++11 flags being added globally and add more logic to
> swr_require_cxx_feature_flags
>
> Cc: Tim Rowley <timothy.o.rowley at intel.com>
> Signed-off-by: Chuck Atkins <chuck.atkins at kitware.com>
> ---
> configure.ac | 73 +++++++++++++++++++++++++------------
> src/gallium/drivers/swr/Makefile.am | 4 +-
> 2 files changed, 52 insertions(+), 25 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index cc9bc47..8321e8e 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -2330,6 +2330,45 @@ swr_llvm_check() {
> fi
> }
>
> +swr_require_cxx_feature_flags() {
> + feature_name="$1"
> + preprocessor_test="$2"
> + option_list="$3"
> + output_var="$4"
> +
> + AC_MSG_CHECKING([whether $CXX supports $feature_name])
> + 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
> + AC_MSG_RESULT([$opts])
> + eval "$output_var=\$opts"
> + return 0
> + fi
> + AC_MSG_RESULT([no])
> + AC_MSG_ERROR([swr requires $feature_name support])
> + 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 +2438,19 @@ 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++])
> + swr_require_cxx_feature_flags "C++11" "__cplusplus >= 201103L" \
> + ",-std=c++11" \
> + SWR_CXX11_CXXFLAGS
> + AC_SUBST([SWR_CXX11_CXXFLAGS])
>
> + swr_require_cxx_feature_flags "AVX" "defined(__AVX__)" \
> + ",-mavx,-march=core-avx" \
> + SWR_AVX_CXXFLAGS
> AC_SUBST([SWR_AVX_CXXFLAGS])
> +
> + swr_require_cxx_feature_flags "AVX2" "defined(__AVX2__)" \
> + ",-mavx2 -mfma -mbmi2 -mf16c,-march=core-avx2" \
> + SWR_AVX2_CXXFLAGS
> AC_SUBST([SWR_AVX2_CXXFLAGS])
>
> HAVE_GALLIUM_SWR=yes
> diff --git a/src/gallium/drivers/swr/Makefile.am b/src/gallium/drivers/swr/Makefile.am
> index d896154..210b203 100644
> --- a/src/gallium/drivers/swr/Makefile.am
> +++ b/src/gallium/drivers/swr/Makefile.am
> @@ -22,7 +22,7 @@
> include Makefile.sources
> include $(top_srcdir)/src/gallium/Automake.inc
>
> -AM_CXXFLAGS = $(GALLIUM_DRIVER_CFLAGS) -std=c++11
> +AM_CXXFLAGS = $(GALLIUM_DRIVER_CFLAGS) $(SWR_CXX11_CXXFLAGS)
>
> noinst_LTLIBRARIES = libmesaswr.la
>
> @@ -31,7 +31,7 @@ libmesaswr_la_SOURCES = $(LOADER_SOURCES)
> COMMON_CXXFLAGS = \
> $(GALLIUM_DRIVER_CFLAGS) \
> $(LLVM_CXXFLAGS) \
> - -std=c++11 \
> + $(SWR_CXX11_CXXFLAGS) \
> -I$(builddir)/rasterizer/scripts \
> -I$(builddir)/rasterizer/jitter \
> -I$(srcdir)/rasterizer \
> --
> 2.5.5
>
More information about the mesa-dev
mailing list