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