radv: add a workaround for Monster Hunter World and LLVM 7&8
[mesa.git] / src / amd / common / ac_llvm_util.c
index 10e1ca99d41f2b13219ef589097aa0ca09c79cb2..6063411310b849adedcb761f94cb9bf76fc04013 100644 (file)
@@ -30,9 +30,7 @@
 #include <llvm-c/Support.h>
 #include <llvm-c/Transforms/IPO.h>
 #include <llvm-c/Transforms/Scalar.h>
-#if HAVE_LLVM >= 0x0700
 #include <llvm-c/Transforms/Utils.h>
-#endif
 #include "c11/threads.h"
 #include "gallivm/lp_bld_misc.h"
 #include "util/u_math.h"
@@ -132,9 +130,11 @@ const char *ac_get_llvm_processor_name(enum radeon_family family)
        case CHIP_RAVEN:
                return "gfx902";
        case CHIP_VEGA12:
-               return HAVE_LLVM >= 0x0700 ? "gfx904" : "gfx902";
+               return "gfx904";
        case CHIP_VEGA20:
-               return HAVE_LLVM >= 0x0700 ? "gfx906" : "gfx902";
+               return "gfx906";
+       case CHIP_RAVEN2:
+               return HAVE_LLVM >= 0x0800 ? "gfx909" : "gfx902";
        default:
                return "";
        }
@@ -149,16 +149,16 @@ static LLVMTargetMachineRef ac_create_target_machine(enum radeon_family family,
        char features[256];
        const char *triple = (tm_options & AC_TM_SUPPORTS_SPILL) ? "amdgcn-mesa-mesa3d" : "amdgcn--";
        LLVMTargetRef target = ac_get_llvm_target(triple);
-       bool barrier_does_waitcnt = family != CHIP_VEGA20;
 
        snprintf(features, sizeof(features),
-                "+DumpCode,+vgpr-spilling,-fp32-denormals,+fp64-denormals%s%s%s%s%s",
+                "+DumpCode,-fp32-denormals,+fp64-denormals%s%s%s%s%s%s",
+                HAVE_LLVM >= 0x0800 ? "" : ",+vgpr-spilling",
                 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" : "",
-                barrier_does_waitcnt ? ",+auto-waitcnt-before-barrier" : "");
-       
+                tm_options & AC_TM_NO_LOAD_STORE_OPT ? ",-load-store-opt" : "");
+
        LLVMTargetMachineRef tm = LLVMCreateTargetMachine(
                                     target,
                                     triple,
@@ -302,7 +302,6 @@ ac_count_scratch_private_memory(LLVMValueRef function)
 
 bool
 ac_init_llvm_compiler(struct ac_llvm_compiler *compiler,
-                     bool okay_to_leak_target_library_info,
                      enum radeon_family family,
                      enum ac_target_machine_options tm_options)
 {
@@ -323,12 +322,10 @@ ac_init_llvm_compiler(struct ac_llvm_compiler *compiler,
                        goto fail;
        }
 
-       if (okay_to_leak_target_library_info || (HAVE_LLVM >= 0x0700)) {
-               compiler->target_library_info =
-                       ac_create_target_library_info(triple);
-               if (!compiler->target_library_info)
-                       goto fail;
-       }
+       compiler->target_library_info =
+               ac_create_target_library_info(triple);
+       if (!compiler->target_library_info)
+               goto fail;
 
        compiler->passmgr = ac_create_passmgr(compiler->target_library_info,
                                              tm_options & AC_TM_CHECK_IR);
@@ -346,11 +343,8 @@ ac_destroy_llvm_compiler(struct ac_llvm_compiler *compiler)
 {
        if (compiler->passmgr)
                LLVMDisposePassManager(compiler->passmgr);
-#if HAVE_LLVM >= 0x0700
-       /* This crashes on LLVM 5.0 and 6.0 and Ubuntu 18.04, so leak it there. */
        if (compiler->target_library_info)
                ac_dispose_target_library_info(compiler->target_library_info);
-#endif
        if (compiler->low_opt_tm)
                LLVMDisposeTargetMachine(compiler->low_opt_tm);
        if (compiler->tm)