diff --git a/src/amd/compiler/aco_interface.cpp b/src/amd/compiler/aco_interface.cpp index f011072289e..5843f0407c6 100644 --- a/src/amd/compiler/aco_interface.cpp +++ b/src/amd/compiler/aco_interface.cpp @@ -119,6 +119,9 @@ aco_postprocess_shader(const struct aco_compiler_options* options, if (options->dump_preoptir) aco_print_program(program.get(), stderr); + ASSERTED bool is_valid = aco::validate_cfg(program.get()); + assert(is_valid); + aco::live live_vars; if (!info->is_trap_handler_shader) { aco::dominator_tree(program.get()); diff --git a/src/amd/compiler/aco_ir.h b/src/amd/compiler/aco_ir.h index 6a7100b054c..8f8b5deb736 100644 --- a/src/amd/compiler/aco_ir.h +++ b/src/amd/compiler/aco_ir.h @@ -2266,6 +2266,7 @@ unsigned emit_program(Program* program, std::vector& code, bool check_print_asm_support(Program* program); bool print_asm(Program* program, std::vector& binary, unsigned exec_size, FILE* output); bool validate_ir(Program* program); +bool validate_cfg(Program* program); bool validate_ra(Program* program); #ifndef NDEBUG void perfwarn(Program* program, bool cond, const char* msg, Instruction* instr = NULL); diff --git a/src/amd/compiler/aco_validate.cpp b/src/amd/compiler/aco_validate.cpp index 2d0db3cc51e..142c42a9158 100644 --- a/src/amd/compiler/aco_validate.cpp +++ b/src/amd/compiler/aco_validate.cpp @@ -102,15 +102,6 @@ validate_ir(Program* program) } }; - auto check_block = [&program, &is_valid](bool success, const char* msg, - aco::Block* block) -> void - { - if (!success) { - aco_err(program, "%s: BB%u", msg, block->index); - is_valid = false; - } - }; - for (Block& block : program->blocks) { for (aco_ptr& instr : block.instructions) { @@ -783,6 +774,25 @@ validate_ir(Program* program) } } + return is_valid; +} + +bool +validate_cfg(Program* program) +{ + if (!(debug_flags & DEBUG_VALIDATE_IR)) + return true; + + bool is_valid = true; + auto check_block = [&program, &is_valid](bool success, const char* msg, + aco::Block* block) -> void + { + if (!success) { + aco_err(program, "%s: BB%u", msg, block->index); + is_valid = false; + } + }; + /* validate CFG */ for (unsigned i = 0; i < program->blocks.size(); i++) { Block& block = program->blocks[i];