[Mesa-dev] [PATCH] radeonsi: Add debug option to enable LLVM GlobalISel

Marek Olšák maraeo at gmail.com
Fri Jun 29 21:32:46 UTC 2018


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.olsak at amd.com>

Thanks,
Marek

On Tue, Jun 26, 2018 at 11:00 PM, Tom Stellard <tstellar at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list