R600_DEBUG=gisel will tell LLVM to use GlobalISel rather than
SelectionDAG for instruction selection.
---
 src/amd/common/ac_llvm_util.c                 | 14 ++++++++++++--
 src/amd/common/ac_llvm_util.h                 |  1 +
 src/gallium/auxiliary/gallivm/lp_bld_misc.cpp |  7 +++++++
 src/gallium/auxiliary/gallivm/lp_bld_misc.h   |  3 +++
 src/gallium/drivers/radeonsi/si_pipe.c        |  3 +++
 src/gallium/drivers/radeonsi/si_pipe.h        |  1 +
 6 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/amd/common/ac_llvm_util.c b/src/amd/common/ac_llvm_util.c
index be2d92b4c0..7e211950e0 100644
--- a/src/amd/common/ac_llvm_util.c
+++ b/src/amd/common/ac_llvm_util.c
@@ -29,6 +29,7 @@
 #include <llvm-c/Core.h>
 #include <llvm-c/Support.h>
 #include "c11/threads.h"
+#include "gallivm/lp_bld_misc.h"
 #include "util/u_math.h"
 
 #include <assert.h>
@@ -50,9 +51,13 @@ static void ac_init_llvm_target()
         * https://reviews.llvm.org/D26348
         *
         * "mesa" is the prefix for error messages.
+        *
+        * -global-isel-abort=2 is a no-op unless global isel has been enabled.
+        * This option tells the backend to fall-back to SelectionDAG and print
+        * a diagnostic message if global isel fails.
         */
-       const char *argv[2] = { "mesa", "-simplifycfg-sink-common=false" };
-       LLVMParseCommandLineOptions(2, argv, NULL);
+       const char *argv[3] = { "mesa", "-simplifycfg-sink-common=false", 
"-global-isel-abort=2" };
+       LLVMParseCommandLineOptions(3, argv, NULL);
 }
 
 static once_flag ac_init_llvm_target_once_flag = ONCE_FLAG_INIT;
@@ -152,6 +157,11 @@ LLVMTargetMachineRef ac_create_target_machine(enum 
radeon_family family,
 
        if (out_triple)
                *out_triple = triple;
+
+       if (tm_options & AC_TM_ENABLE_GLOBAL_ISEL) {
+               lp_enable_global_isel(tm);
+       }
+
        return tm;
 }
 
diff --git a/src/amd/common/ac_llvm_util.h b/src/amd/common/ac_llvm_util.h
index 0aa803c5bc..31d7c4e4ff 100644
--- a/src/amd/common/ac_llvm_util.h
+++ b/src/amd/common/ac_llvm_util.h
@@ -59,6 +59,7 @@ enum ac_target_machine_options {
        AC_TM_FORCE_ENABLE_XNACK = (1 << 2),
        AC_TM_FORCE_DISABLE_XNACK = (1 << 3),
        AC_TM_PROMOTE_ALLOCA_TO_SCRATCH = (1 << 4),
+       AC_TM_ENABLE_GLOBAL_ISEL = (1 << 5)
 };
 
 enum ac_float_mode {
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp 
b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
index 79dbedbb56..ca8d4fb24c 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
+++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
@@ -813,3 +813,10 @@ lp_is_function(LLVMValueRef v)
        return llvm::isa<llvm::Function>(llvm::unwrap(v));
 #endif
 }
+
+extern "C" void lp_enable_global_isel(LLVMTargetMachineRef tm)
+{
+#if HAVE_LLVM >= 0x0700
+  reinterpret_cast<llvm::TargetMachine*>(tm)->setGlobalISel(true);
+#endif
+}
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.h 
b/src/gallium/auxiliary/gallivm/lp_bld_misc.h
index ca5ba5c44f..187dbc46c9 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_misc.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.h
@@ -76,6 +76,9 @@ lp_get_called_value(LLVMValueRef call);
 extern bool
 lp_is_function(LLVMValueRef v);
 
+extern  void
+lp_enable_global_isel(LLVMTargetMachineRef tm);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c 
b/src/gallium/drivers/radeonsi/si_pipe.c
index ded8cb5eb0..61c34b3e0c 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -63,6 +63,7 @@ static const struct debug_named_value debug_options[] = {
        /* Shader compiler options the shader cache should be aware of: */
        { "unsafemath", DBG(UNSAFE_MATH), "Enable unsafe math shader 
optimizations" },
        { "sisched", DBG(SI_SCHED), "Enable LLVM SI Machine Instruction 
Scheduler." },
+       { "gisel", DBG(GISEL), "Enable LLVM global instruction selector." },
 
        /* Shader compiler options (with no effect on the shader cache): */
        { "checkir", DBG(CHECK_IR), "Enable additional sanity checks on shader 
IR" },
@@ -115,6 +116,7 @@ static void si_init_compiler(struct si_screen *sscreen,
 {
        enum ac_target_machine_options tm_options =
                (sscreen->debug_flags & DBG(SI_SCHED) ? AC_TM_SISCHED : 0) |
+               (sscreen->debug_flags & DBG(GISEL) ? AC_TM_ENABLE_GLOBAL_ISEL : 
0) |
                (sscreen->info.chip_class >= GFX9 ? AC_TM_FORCE_ENABLE_XNACK : 
0) |
                (sscreen->info.chip_class < GFX9 ? AC_TM_FORCE_DISABLE_XNACK : 
0) |
                (!sscreen->llvm_has_working_vgpr_indexing ? 
AC_TM_PROMOTE_ALLOCA_TO_SCRATCH : 0);
@@ -805,6 +807,7 @@ static void si_disk_cache_create(struct si_screen *sscreen)
                        /* These flags affect shader compilation. */
                        #define ALL_FLAGS (DBG(FS_CORRECT_DERIVS_AFTER_KILL) | \
                                           DBG(SI_SCHED) | \
+                                          DBG(GISEL) | \
                                           DBG(UNSAFE_MATH) | \
                                           DBG(NIR))
                        uint64_t shader_debug_flags = sscreen->debug_flags &
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h 
b/src/gallium/drivers/radeonsi/si_pipe.h
index bd857f8a34..6dd66617af 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -121,6 +121,7 @@ enum {
        DBG_FS_CORRECT_DERIVS_AFTER_KILL,
        DBG_UNSAFE_MATH,
        DBG_SI_SCHED,
+       DBG_GISEL,
 
        /* Shader compiler options (with no effect on the shader cache): */
        DBG_CHECK_IR,
-- 
2.17.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to