From 6bfd92123fc2a902cbe9372e847daecff537d208 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 8 Nov 2024 14:31:35 +0100 Subject: [PATCH] aco: simplify postprocessing the trap handler shader Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/compiler/aco_interface.cpp | 106 +++++++++++++------------- src/amd/compiler/aco_shader_info.h | 2 - src/amd/vulkan/radv_aco_shader_info.h | 1 - 3 files changed, 55 insertions(+), 54 deletions(-) diff --git a/src/amd/compiler/aco_interface.cpp b/src/amd/compiler/aco_interface.cpp index 6b539e02027..2551ce92a3f 100644 --- a/src/amd/compiler/aco_interface.cpp +++ b/src/amd/compiler/aco_interface.cpp @@ -90,7 +90,7 @@ get_disasm_string(Program* program, std::vector& code, unsigned exec_s static std::string aco_postprocess_shader(const struct aco_compiler_options* options, - const struct aco_shader_info* info, std::unique_ptr& program) + std::unique_ptr& program) { std::string llvm_ir; @@ -100,35 +100,33 @@ aco_postprocess_shader(const struct aco_compiler_options* options, ASSERTED bool is_valid = validate_cfg(program.get()); assert(is_valid); - if (!info->is_trap_handler_shader) { - dominator_tree(program.get()); - lower_phis(program.get()); + dominator_tree(program.get()); + lower_phis(program.get()); - if (program->gfx_level <= GFX7) - lower_subdword(program.get()); + if (program->gfx_level <= GFX7) + lower_subdword(program.get()); - validate(program.get()); + validate(program.get()); - /* Optimization */ - if (!options->optimisations_disabled) { - if (!(debug_flags & DEBUG_NO_VN)) - value_numbering(program.get()); - if (!(debug_flags & DEBUG_NO_OPT)) - optimize(program.get()); - } - - /* cleanup and exec mask handling */ - setup_reduce_temp(program.get()); - insert_exec_mask(program.get()); - validate(program.get()); - - /* spilling and scheduling */ - live_var_analysis(program.get()); - if (program->collect_statistics) - collect_presched_stats(program.get()); - spill(program.get()); + /* Optimization */ + if (!options->optimisations_disabled) { + if (!(debug_flags & DEBUG_NO_VN)) + value_numbering(program.get()); + if (!(debug_flags & DEBUG_NO_OPT)) + optimize(program.get()); } + /* cleanup and exec mask handling */ + setup_reduce_temp(program.get()); + insert_exec_mask(program.get()); + validate(program.get()); + + /* spilling and scheduling */ + live_var_analysis(program.get()); + if (program->collect_statistics) + collect_presched_stats(program.get()); + spill(program.get()); + if (options->record_ir) { char* data = NULL; size_t size = 0; @@ -147,33 +145,31 @@ aco_postprocess_shader(const struct aco_compiler_options* options, if ((debug_flags & DEBUG_LIVE_INFO) && options->dump_shader) aco_print_program(program.get(), stderr, print_live_vars | print_kill); - if (!info->is_trap_handler_shader) { - if (!options->optimisations_disabled && !(debug_flags & DEBUG_NO_SCHED)) - schedule_program(program.get()); - validate(program.get()); + if (!options->optimisations_disabled && !(debug_flags & DEBUG_NO_SCHED)) + schedule_program(program.get()); + validate(program.get()); - /* Register Allocation */ - register_allocation(program.get()); + /* Register Allocation */ + register_allocation(program.get()); - if (validate_ra(program.get())) { - aco_print_program(program.get(), stderr); - abort(); - } else if (options->dump_shader) { - aco_print_program(program.get(), stderr); - } - - validate(program.get()); - - /* Optimization */ - if (!options->optimisations_disabled && !(debug_flags & DEBUG_NO_OPT)) { - optimize_postRA(program.get()); - validate(program.get()); - } - - ssa_elimination(program.get()); - jump_threading(program.get()); + if (validate_ra(program.get())) { + aco_print_program(program.get(), stderr); + abort(); + } else if (options->dump_shader) { + aco_print_program(program.get(), stderr); } + validate(program.get()); + + /* Optimization */ + if (!options->optimisations_disabled && !(debug_flags & DEBUG_NO_OPT)) { + optimize_postRA(program.get()); + validate(program.get()); + } + + ssa_elimination(program.get()); + jump_threading(program.get()); + /* Lower to HW Instructions */ lower_to_hw_instr(program.get()); validate(program.get()); @@ -232,7 +228,7 @@ aco_compile_shader_part(const struct aco_compiler_options* options, /* Instruction selection */ select_shader_part(program.get(), pinfo, &config, options, info, args); - aco_postprocess_shader(options, info, program); + aco_postprocess_shader(options, program); /* assembly */ std::vector code; @@ -271,7 +267,7 @@ aco_compile_shader(const struct aco_compiler_options* options, const struct aco_ /* Instruction Selection */ select_program(program.get(), shader_count, shaders, &config, options, info, args); - std::string llvm_ir = aco_postprocess_shader(options, info, program); + std::string llvm_ir = aco_postprocess_shader(options, program); /* assembly */ std::vector code; @@ -420,7 +416,15 @@ aco_compile_trap_handler(const struct aco_compiler_options* options, select_trap_handler_shader(program.get(), &config, options, info, args); - aco_postprocess_shader(options, info, program); + if (options->dump_preoptir) + aco_print_program(program.get(), stderr); + validate(program.get()); + + lower_to_hw_instr(program.get()); + validate(program.get()); + + insert_waitcnt(program.get()); + insert_NOPs(program.get()); /* assembly */ std::vector code; diff --git a/src/amd/compiler/aco_shader_info.h b/src/amd/compiler/aco_shader_info.h index ad615e19992..757ea1dace6 100644 --- a/src/amd/compiler/aco_shader_info.h +++ b/src/amd/compiler/aco_shader_info.h @@ -137,8 +137,6 @@ struct aco_shader_info { } cs; uint32_t gfx9_gs_ring_lds_size; - - bool is_trap_handler_shader; }; enum aco_compiler_debug_level { diff --git a/src/amd/vulkan/radv_aco_shader_info.h b/src/amd/vulkan/radv_aco_shader_info.h index 9a0b4d562e0..8a5fdfbc405 100644 --- a/src/amd/vulkan/radv_aco_shader_info.h +++ b/src/amd/vulkan/radv_aco_shader_info.h @@ -43,7 +43,6 @@ radv_aco_convert_shader_info(struct aco_shader_info *aco_info, const struct radv aco_info->ps.spi_ps_input_addr = radv->ps.spi_ps_input_addr; aco_info->ps.has_prolog = false; aco_info->gfx9_gs_ring_lds_size = radv->gs_ring_info.lds_size; - aco_info->is_trap_handler_shader = radv->type == RADV_SHADER_TYPE_TRAP_HANDLER; aco_info->image_2d_view_of_3d = radv_key->image_2d_view_of_3d; aco_info->epilog_pc = radv_args->epilog_pc; aco_info->hw_stage = radv_select_hw_stage(radv, gfx_level);