ac: run LLVM optimization passes only on the final function after inlining
authorMarek Olšák <marek.olsak@amd.com>
Thu, 5 Jul 2018 06:27:45 +0000 (02:27 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 19 Jul 2018 04:58:49 +0000 (00:58 -0400)
src/amd/common/ac_llvm_helper.cpp
src/amd/common/ac_llvm_util.c
src/amd/common/ac_llvm_util.h

index 4348ebd36ee0d3cbbc3d836eff28b551d581020f..e0943135faddabaf73003c984323a9d1cf3f94a1 100644 (file)
@@ -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());
+}
index 8d73df4e31198b8de534f66d58e3ec22b428b5fd..0c8dbf1ec514086d289739c9dbad122d014ab666 100644 (file)
@@ -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);
index 373fd8d28dbb468766ba25c1321fec8c5350fe19..e5b93037d260d6f527c82e1a7e90a0d53cb4cc73 100644 (file)
@@ -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
 }