radv: add a workaround for Monster Hunter World and LLVM 7&8
[mesa.git] / src / amd / common / ac_llvm_util.c
index dc9b684e9dd287d5bb558d9ad3868a9d0975228d..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,11 +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 "gfx902"; /* TODO: use gfx909 when it's available */
+               return HAVE_LLVM >= 0x0800 ? "gfx909" : "gfx902";
        default:
                return "";
        }
@@ -153,13 +151,14 @@ static LLVMTargetMachineRef ac_create_target_machine(enum radeon_family family,
        LLVMTargetRef target = ac_get_llvm_target(triple);
 
        snprintf(features, sizeof(features),
-                "+DumpCode,-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" : "");
-       
+                tm_options & AC_TM_PROMOTE_ALLOCA_TO_SCRATCH ? ",-promote-alloca" : "",
+                tm_options & AC_TM_NO_LOAD_STORE_OPT ? ",-load-store-opt" : "");
+
        LLVMTargetMachineRef tm = LLVMCreateTargetMachine(
                                     target,
                                     triple,
@@ -303,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)
 {
@@ -324,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);
@@ -347,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)