Hi Tom, We shouldn't use gallivm if possible and instead c++ helpers should be added into ac_llvm_helper.cpp with the ac prefix. With that done:
Reviewed-by: Marek Olšák <marek.ol...@amd.com> Thanks, Marek On Tue, Jun 26, 2018 at 11:00 PM, Tom Stellard <tstel...@redhat.com> wrote: > 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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev