diff options
author | Marek Olšák <[email protected]> | 2018-07-05 02:27:45 -0400 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2018-07-19 00:58:49 -0400 |
commit | 9b82d128c96ec73eaef6b167a4651ae9716a0424 (patch) | |
tree | 6601414f4b57a554d831d3e1cd85fdf5b36e2b11 /src | |
parent | 17b5a59b4ee3adb9c99f3d850eb4a561196c69a0 (diff) |
ac: run LLVM optimization passes only on the final function after inlining
Diffstat (limited to 'src')
-rw-r--r-- | src/amd/common/ac_llvm_helper.cpp | 6 | ||||
-rw-r--r-- | src/amd/common/ac_llvm_util.c | 7 | ||||
-rw-r--r-- | src/amd/common/ac_llvm_util.h | 1 |
3 files changed, 14 insertions, 0 deletions
diff --git a/src/amd/common/ac_llvm_helper.cpp b/src/amd/common/ac_llvm_helper.cpp index 4348ebd36ee..e0943135fad 100644 --- a/src/amd/common/ac_llvm_helper.cpp +++ b/src/amd/common/ac_llvm_helper.cpp @@ -36,6 +36,7 @@ #include <llvm/Target/TargetMachine.h> #include <llvm/IR/IRBuilder.h> #include <llvm/Analysis/TargetLibraryInfo.h> +#include <llvm/Transforms/IPO.h> #include <llvm/IR/LegacyPassManager.h> #if HAVE_LLVM < 0x0700 @@ -165,3 +166,8 @@ bool ac_compile_module_to_binary(struct ac_compiler_passes *p, LLVMModuleRef mod fprintf(stderr, "amd: cannot read an ELF shader binary\n"); return success; } + +void ac_llvm_add_barrier_noop_pass(LLVMPassManagerRef passmgr) +{ + llvm::unwrap(passmgr)->add(llvm::createBarrierNoopPass()); +} diff --git a/src/amd/common/ac_llvm_util.c b/src/amd/common/ac_llvm_util.c index 8d73df4e311..0c8dbf1ec51 100644 --- a/src/amd/common/ac_llvm_util.c +++ b/src/amd/common/ac_llvm_util.c @@ -181,6 +181,13 @@ static LLVMPassManagerRef ac_create_passmgr(LLVMTargetLibraryInfoRef target_libr if (check_ir) LLVMAddVerifierPass(passmgr); LLVMAddAlwaysInlinerPass(passmgr); + /* Normally, the pass manager runs all passes on one function before + * moving onto another. Adding a barrier no-op pass forces the pass + * manager to run the inliner on all functions first, which makes sure + * that the following passes are only run on the remaining non-inline + * function, so it removes useless work done on dead inline functions. + */ + ac_llvm_add_barrier_noop_pass(passmgr); /* This pass should eliminate all the load and store instructions. */ LLVMAddPromoteMemoryToRegisterPass(passmgr); LLVMAddScalarReplAggregatesPass(passmgr); diff --git a/src/amd/common/ac_llvm_util.h b/src/amd/common/ac_llvm_util.h index 373fd8d28db..e5b93037d26 100644 --- a/src/amd/common/ac_llvm_util.h +++ b/src/amd/common/ac_llvm_util.h @@ -133,6 +133,7 @@ struct ac_compiler_passes *ac_create_llvm_passes(LLVMTargetMachineRef tm); void ac_destroy_llvm_passes(struct ac_compiler_passes *p); bool ac_compile_module_to_binary(struct ac_compiler_passes *p, LLVMModuleRef module, struct ac_shader_binary *binary); +void ac_llvm_add_barrier_noop_pass(LLVMPassManagerRef passmgr); #ifdef __cplusplus } |