X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Famd%2Fcompiler%2Faco_interface.cpp;h=4dfba2618ccb2d3c52a034426dc8b6b9298f4a33;hb=c2b1978aa47c5b8876a589aa035a670d55e87c2e;hp=19c98c8196ccfa41992a451fd82c0df7495a47f8;hpb=507956ed04fcdcfd44419d1b16f032e1d81d0dcb;p=mesa.git diff --git a/src/amd/compiler/aco_interface.cpp b/src/amd/compiler/aco_interface.cpp index 19c98c8196c..4dfba2618cc 100644 --- a/src/amd/compiler/aco_interface.cpp +++ b/src/amd/compiler/aco_interface.cpp @@ -25,35 +25,10 @@ #include "aco_ir.h" #include "vulkan/radv_shader.h" #include "vulkan/radv_shader_args.h" -#include "c11/threads.h" -#include "util/debug.h" #include #include -namespace aco { -uint64_t debug_flags = 0; - -static const struct debug_control aco_debug_options[] = { - {"validateir", DEBUG_VALIDATE}, - {"validatera", DEBUG_VALIDATE_RA}, - {"perfwarn", DEBUG_PERFWARN}, - {NULL, 0} -}; - -static once_flag init_once_flag = ONCE_FLAG_INIT; - -static void init() -{ - debug_flags = parse_debug_string(getenv("ACO_DEBUG"), aco_debug_options); - - #ifndef NDEBUG - /* enable some flags by default on debug builds */ - debug_flags |= aco::DEBUG_VALIDATE; - #endif -} -} - static radv_compiler_statistic_info statistic_infos[] = { [aco::statistic_hash] = {"Hash", "CRC32 hash of code and constant data"}, [aco::statistic_instructions] = {"Instructions", "Instruction count"}, @@ -68,17 +43,26 @@ static radv_compiler_statistic_info statistic_infos[] = { [aco::statistic_vgpr_presched] = {"Pre-Sched VGPRs", "VGPR usage before scheduling"}, }; +static void validate(aco::Program *program) +{ + if (!(aco::debug_flags & aco::DEBUG_VALIDATE_IR)) + return; + + bool is_valid = aco::validate_ir(program); + assert(is_valid); +} + void aco_compile_shader(unsigned shader_count, struct nir_shader *const *shaders, struct radv_shader_binary **binary, struct radv_shader_args *args) { - call_once(&aco::init_once_flag, aco::init); + aco::init(); ac_shader_config config = {0}; std::unique_ptr program{new aco::Program}; - program->collect_statistics = args->options->record_ir; + program->collect_statistics = args->options->record_stats; if (program->collect_statistics) memset(program->statistics, 0, sizeof(program->statistics)); @@ -91,34 +75,25 @@ void aco_compile_shader(unsigned shader_count, std::cerr << "After Instruction Selection:\n"; aco_print_program(program.get(), stderr); } - aco::validate(program.get(), stderr); - - /* Boolean phi lowering */ - aco::lower_bool_phis(program.get()); - //std::cerr << "After Boolean Phi Lowering:\n"; - //aco_print_program(program.get(), stderr); + /* Phi lowering */ + aco::lower_phis(program.get()); aco::dominator_tree(program.get()); + validate(program.get()); /* Optimization */ aco::value_numbering(program.get()); aco::optimize(program.get()); - aco::validate(program.get(), stderr); + /* cleanup and exec mask handling */ aco::setup_reduce_temp(program.get()); aco::insert_exec_mask(program.get()); - aco::validate(program.get(), stderr); + validate(program.get()); + /* spilling and scheduling */ aco::live live_vars = aco::live_var_analysis(program.get(), args->options); aco::spill(program.get(), live_vars, args->options); - if (program->collect_statistics) - aco::collect_presched_stats(program.get()); - - //std::cerr << "Before Schedule:\n"; - //aco_print_program(program.get(), stderr); - aco::schedule_program(program.get(), live_vars); - std::string llvm_ir; if (args->options->record_ir) { char *data = NULL; @@ -134,6 +109,11 @@ void aco_compile_shader(unsigned shader_count, free(data); } + if (program->collect_statistics) + aco::collect_presched_stats(program.get()); + aco::schedule_program(program.get(), live_vars); + validate(program.get()); + /* Register Allocation */ aco::register_allocation(program.get(), live_vars.live_out); if (args->options->dump_shader) { @@ -141,25 +121,22 @@ void aco_compile_shader(unsigned shader_count, aco_print_program(program.get(), stderr); } - if (aco::validate_ra(program.get(), args->options, stderr)) { + if (aco::validate_ra(program.get(), args->options)) { std::cerr << "Program after RA validation failure:\n"; aco_print_program(program.get(), stderr); abort(); } - aco::ssa_elimination(program.get()); + validate(program.get()); + /* Lower to HW Instructions */ + aco::ssa_elimination(program.get()); aco::lower_to_hw_instr(program.get()); - //std::cerr << "After Eliminate Pseudo Instr:\n"; - //aco_print_program(program.get(), stderr); /* Insert Waitcnt */ aco::insert_wait_states(program.get()); aco::insert_NOPs(program.get()); - //std::cerr << "After Insert-Waitcnt:\n"; - //aco_print_program(program.get(), stderr); - if (program->collect_statistics) aco::collect_preasm_stats(program.get());