X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Famd%2Fcompiler%2Faco_interface.cpp;h=b95c4507c804ffdac44938e05cfe5f411dfc01ec;hb=1bbb64f300f66fbb292078072f89f04231ffd541;hp=8991d616eed641c27f7156c5a6f73f97fb670d87;hpb=7e6aec668772eb9cac014d78ba95272a063167fe;p=mesa.git diff --git a/src/amd/compiler/aco_interface.cpp b/src/amd/compiler/aco_interface.cpp index 8991d616eed..b95c4507c80 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,12 +43,21 @@ 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)) + return; + + bool is_valid = aco::validate(program, stderr); + 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}; @@ -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) { @@ -147,19 +127,16 @@ void aco_compile_shader(unsigned shader_count, 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());