From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_pipe.c | 30 ++++++++++++++++ src/gallium/drivers/radeonsi/si_pipe.h | 7 ---- src/gallium/drivers/radeonsi/si_shader.h | 1 + .../drivers/radeonsi/si_shader_tgsi_setup.c | 34 +------------------ 4 files changed, 32 insertions(+), 40 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 482d667a7d4..d125f5a1d95 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -34,20 +34,26 @@ #include "util/hash_table.h" #include "util/u_log.h" #include "util/u_memory.h" #include "util/u_suballoc.h" #include "util/u_tests.h" #include "util/u_upload_mgr.h" #include "util/xmlconfig.h" #include "vl/vl_decoder.h" #include "driver_ddebug/dd_util.h" +#include <llvm-c/Transforms/IPO.h> +#include <llvm-c/Transforms/Scalar.h> +#if HAVE_LLVM >= 0x0700 +#include <llvm-c/Transforms/Utils.h> +#endif + static const struct debug_named_value debug_options[] = { /* Shader logging options: */ { "vs", DBG(VS), "Print vertex shaders" }, { "ps", DBG(PS), "Print pixel shaders" }, { "gs", DBG(GS), "Print geometry shaders" }, { "tcs", DBG(TCS), "Print tessellation control shaders" }, { "tes", DBG(TES), "Print tessellation evaluation shaders" }, { "cs", DBG(CS), "Print compute shaders" }, { "noir", DBG(NO_IR), "Don't print the LLVM IR"}, { "notgsi", DBG(NO_TGSI), "Don't print the TGSI"}, @@ -114,24 +120,48 @@ static void si_init_compiler(struct si_screen *sscreen, compiler->tm = ac_create_target_machine(sscreen->info.family, tm_options, &compiler->triple); if (!compiler->tm) return; compiler->target_library_info = gallivm_create_target_library_info(compiler->triple); if (!compiler->target_library_info) return; + + compiler->passmgr = LLVMCreatePassManager(); + if (!compiler->passmgr) + return; + + LLVMAddTargetLibraryInfo(compiler->target_library_info, + compiler->passmgr); + + /* Add LLVM passes into the pass manager. */ + if (sscreen->debug_flags & DBG(CHECK_IR)) + LLVMAddVerifierPass(compiler->passmgr); + + LLVMAddAlwaysInlinerPass(compiler->passmgr); + /* This pass should eliminate all the load and store instructions. */ + LLVMAddPromoteMemoryToRegisterPass(compiler->passmgr); + LLVMAddScalarReplAggregatesPass(compiler->passmgr); + LLVMAddLICMPass(compiler->passmgr); + LLVMAddAggressiveDCEPass(compiler->passmgr); + LLVMAddCFGSimplificationPass(compiler->passmgr); + /* This is recommended by the instruction combining pass. */ + LLVMAddEarlyCSEMemSSAPass(compiler->passmgr); + LLVMAddInstructionCombiningPass(compiler->passmgr); } static void si_destroy_compiler(struct si_compiler *compiler) { + if (compiler->passmgr) + LLVMDisposePassManager(compiler->passmgr); if (compiler->target_library_info) gallivm_dispose_target_library_info(compiler->target_library_info); if (compiler->tm) LLVMDisposeTargetMachine(compiler->tm); } /* * pipe_context */ static void si_destroy_context(struct pipe_context *context) diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 54c9b725fcb..a67786c84d9 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -1384,27 +1384,20 @@ static inline struct si_shader* si_get_vs_state(struct si_context *sctx) struct si_shader_ctx_state *vs = si_get_vs(sctx); return vs->current ? vs->current : NULL; } static inline bool si_can_dump_shader(struct si_screen *sscreen, unsigned processor) { return sscreen->debug_flags & (1 << processor); } -static inline bool si_extra_shader_checks(struct si_screen *sscreen, - unsigned processor) -{ - return (sscreen->debug_flags & DBG(CHECK_IR)) || - si_can_dump_shader(sscreen, processor); -} - static inline bool si_get_strmout_en(struct si_context *sctx) { return sctx->streamout.streamout_enabled || sctx->streamout.prims_gen_query_enabled; } static inline unsigned si_optimal_tcc_alignment(struct si_context *sctx, unsigned upload_size) { unsigned alignment, tcc_cache_line_size; diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index 8761bc7e7c9..a0122d23910 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -309,20 +309,21 @@ enum { SI_FIX_FETCH_RGB_16_INT, }; struct si_shader; /* Per-thread persistent LLVM objects. */ struct si_compiler { LLVMTargetMachineRef tm; const char *triple; LLVMTargetLibraryInfoRef target_library_info; + LLVMPassManagerRef passmgr; }; /* State of the context creating the shader object. */ struct si_compiler_ctx_state { /* Should only be used by si_init_shader_selector_async and * si_build_shader_variant if thread_index == -1 (non-threaded). */ struct si_compiler *compiler; /* Used if thread_index == -1 or if debug.async is true. */ struct pipe_debug_callback debug; diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c index 86366f4063c..29b1e50dc47 100644 --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c @@ -32,25 +32,20 @@ #include "gallivm/lp_bld_intr.h" #include "gallivm/lp_bld_misc.h" #include "gallivm/lp_bld_swizzle.h" #include "tgsi/tgsi_info.h" #include "tgsi/tgsi_parse.h" #include "util/u_math.h" #include "util/u_memory.h" #include "util/u_debug.h" #include <stdio.h> -#include <llvm-c/Transforms/IPO.h> -#include <llvm-c/Transforms/Scalar.h> -#if HAVE_LLVM >= 0x0700 -#include <llvm-c/Transforms/Utils.h> -#endif enum si_llvm_calling_convention { RADEON_LLVM_AMDGPU_VS = 87, RADEON_LLVM_AMDGPU_GS = 88, RADEON_LLVM_AMDGPU_PS = 89, RADEON_LLVM_AMDGPU_CS = 90, RADEON_LLVM_AMDGPU_HS = 93, }; struct si_llvm_diagnostics { @@ -1205,55 +1200,28 @@ void si_llvm_create_func(struct si_shader_context *ctx, break; default: unreachable("Unhandle shader type"); } LLVMSetFunctionCallConv(ctx->main_fn, call_conv); } void si_llvm_optimize_module(struct si_shader_context *ctx) { - struct gallivm_state *gallivm = &ctx->gallivm; - /* Dump LLVM IR before any optimization passes */ if (ctx->screen->debug_flags & DBG(PREOPT_IR) && si_can_dump_shader(ctx->screen, ctx->type)) LLVMDumpModule(ctx->gallivm.module); - /* Create the pass manager */ - gallivm->passmgr = LLVMCreatePassManager(); - - LLVMAddTargetLibraryInfo(ctx->compiler->target_library_info, - gallivm->passmgr); - - if (si_extra_shader_checks(ctx->screen, ctx->type)) - LLVMAddVerifierPass(gallivm->passmgr); - - LLVMAddAlwaysInlinerPass(gallivm->passmgr); - - /* This pass should eliminate all the load and store instructions */ - LLVMAddPromoteMemoryToRegisterPass(gallivm->passmgr); - - /* Add some optimization passes */ - LLVMAddScalarReplAggregatesPass(gallivm->passmgr); - LLVMAddLICMPass(gallivm->passmgr); - LLVMAddAggressiveDCEPass(gallivm->passmgr); - LLVMAddCFGSimplificationPass(gallivm->passmgr); - /* This is recommended by the instruction combining pass. */ - LLVMAddEarlyCSEMemSSAPass(gallivm->passmgr); - LLVMAddInstructionCombiningPass(gallivm->passmgr); - /* Run the pass */ - LLVMRunPassManager(gallivm->passmgr, ctx->gallivm.module); - + LLVMRunPassManager(ctx->compiler->passmgr, ctx->gallivm.module); LLVMDisposeBuilder(ctx->ac.builder); - LLVMDisposePassManager(gallivm->passmgr); } void si_llvm_dispose(struct si_shader_context *ctx) { LLVMDisposeModule(ctx->gallivm.module); LLVMContextDispose(ctx->gallivm.context); FREE(ctx->temp_arrays); ctx->temp_arrays = NULL; FREE(ctx->temp_array_allocas); ctx->temp_array_allocas = NULL; -- 2.17.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev