I haven't tried it, but maybe calling LLVMParseCommandLineOptions()
second time would work (after creating the target machine, through
call_once) to avoid all this code duplication?

GraÅžvydas

On Fri, Jun 8, 2018 at 12:38 PM, Samuel Pitoiset
<samuel.pitoi...@gmail.com> wrote:
> Workaround for bug in llvm that causes the GPU to hang in presence
> of nested loops because there is an exec mask issue. The proper
> solution is to fix LLVM but this might require a bunch of work.
>
> This fixes a bunch of GPU hangs that happen with DXVK.
>
> Vega10:
> Totals from affected shaders:
> SGPRS: 110456 -> 110456 (0.00 %)
> VGPRS: 122800 -> 122800 (0.00 %)
> Spilled SGPRs: 7478 -> 7478 (0.00 %)
> Spilled VGPRs: 36 -> 36 (0.00 %)
> Code Size: 9901104 -> 9922928 (0.22 %) bytes
> Max Waves: 7143 -> 7143 (0.00 %)
>
> Code size slightly increases because it inserts more branch
> instructions but that's expected. I don't see any real performance
> changes.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105613
> Cc: mesa-sta...@lists.freedesktop.org
> Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
> ---
>  src/amd/vulkan/radv_shader.c | 79 +++++++++++++++++++++++++++++++++++-
>  1 file changed, 78 insertions(+), 1 deletion(-)
>
> diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
> index 68f2a55e81..76790a1904 100644
> --- a/src/amd/vulkan/radv_shader.c
> +++ b/src/amd/vulkan/radv_shader.c
> @@ -36,6 +36,7 @@
>
>  #include <llvm-c/Core.h>
>  #include <llvm-c/TargetMachine.h>
> +#include <llvm-c/Support.h>
>
>  #include "sid.h"
>  #include "gfx9d.h"
> @@ -467,6 +468,82 @@ radv_fill_shader_variant(struct radv_device *device,
>         memcpy(ptr, binary->code, binary->code_size);
>  }
>
> +static void radv_init_llvm_target()
> +{
> +       LLVMInitializeAMDGPUTargetInfo();
> +       LLVMInitializeAMDGPUTarget();
> +       LLVMInitializeAMDGPUTargetMC();
> +       LLVMInitializeAMDGPUAsmPrinter();
> +
> +       /* For inline assembly. */
> +       LLVMInitializeAMDGPUAsmParser();
> +
> +       /* Workaround for bug in llvm 4.0 that causes image intrinsics
> +        * to disappear.
> +        * https://reviews.llvm.org/D26348
> +        *
> +        * Workaround for bug in llvm that causes the GPU to hang in presence
> +        * of nested loops because there is an exec mask issue. The proper
> +        * solution is to fix LLVM but this might require a bunch of work.
> +        * https://bugs.llvm.org/show_bug.cgi?id=37744
> +        *
> +        * "mesa" is the prefix for error messages.
> +        */
> +       const char *argv[3] = { "mesa", "-simplifycfg-sink-common=false",
> +                               "-amdgpu-skip-threshold=1" };
> +       LLVMParseCommandLineOptions(3, argv, NULL);
> +}
> +
> +static once_flag radv_init_llvm_target_once_flag = ONCE_FLAG_INIT;
> +
> +static LLVMTargetRef radv_get_llvm_target(const char *triple)
> +{
> +       LLVMTargetRef target = NULL;
> +       char *err_message = NULL;
> +
> +       call_once(&radv_init_llvm_target_once_flag, radv_init_llvm_target);
> +
> +       if (LLVMGetTargetFromTriple(triple, &target, &err_message)) {
> +               fprintf(stderr, "Cannot find target for triple %s ", triple);
> +               if (err_message) {
> +                       fprintf(stderr, "%s\n", err_message);
> +               }
> +               LLVMDisposeMessage(err_message);
> +               return NULL;
> +       }
> +       return target;
> +}
> +
> +static LLVMTargetMachineRef radv_create_target_machine(enum radeon_family 
> family,
> +                                                      enum 
> ac_target_machine_options tm_options,
> +                                                      const char 
> **out_triple)
> +{
> +       assert(family >= CHIP_TAHITI);
> +       char features[256];
> +       const char *triple = (tm_options & AC_TM_SUPPORTS_SPILL) ? 
> "amdgcn-mesa-mesa3d" : "amdgcn--";
> +       LLVMTargetRef target = radv_get_llvm_target(triple);
> +
> +       snprintf(features, sizeof(features),
> +                
> "+DumpCode,+vgpr-spilling,-fp32-denormals,+fp64-denormals%s%s%s%s",
> +                tm_options & AC_TM_SISCHED ? ",+si-scheduler" : "",
> +                tm_options & AC_TM_FORCE_ENABLE_XNACK ? ",+xnack" : "",
> +                tm_options & AC_TM_FORCE_DISABLE_XNACK ? ",-xnack" : "",
> +                tm_options & AC_TM_PROMOTE_ALLOCA_TO_SCRATCH ? 
> ",-promote-alloca" : "");
> +
> +       LLVMTargetMachineRef tm = LLVMCreateTargetMachine(
> +                                    target,
> +                                    triple,
> +                                    ac_get_llvm_processor_name(family),
> +                                    features,
> +                                    LLVMCodeGenLevelDefault,
> +                                    LLVMRelocDefault,
> +                                    LLVMCodeModelDefault);
> +
> +       if (out_triple)
> +               *out_triple = triple;
> +       return tm;
> +}
> +
>  static struct radv_shader_variant *
>  shader_variant_create(struct radv_device *device,
>                       struct radv_shader_module *module,
> @@ -501,7 +578,7 @@ shader_variant_create(struct radv_device *device,
>                 tm_options |= AC_TM_SUPPORTS_SPILL;
>         if (device->instance->perftest_flags & RADV_PERFTEST_SISCHED)
>                 tm_options |= AC_TM_SISCHED;
> -       tm = ac_create_target_machine(chip_family, tm_options, NULL);
> +       tm = radv_create_target_machine(chip_family, tm_options, NULL);
>
>         if (gs_copy_shader) {
>                 assert(shader_count == 1);
> --
> 2.17.1
>
> _______________________________________________
> 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

Reply via email to