[Mesa-dev] [PATCH] swr: Refactor checks for compiler feature flags

Chuck Atkins chuck.atkins at kitware.com
Tue Jun 28 13:24:59 UTC 2016


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"
+
+            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__))" \
+                ",-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