From 32d0bae8ec382b5f604d75b2375e75ffec986fa7 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Fri, 10 Sep 2021 18:20:03 +0100 Subject: [PATCH] aco: fix branch definition validation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Like how they have to be register allocated differently, branch definitions at merge block predecessors need to be validated differently. Signed-off-by: Rhys Perry Reviewed-by: Daniel Schürmann Part-of: --- src/amd/compiler/aco_validate.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/amd/compiler/aco_validate.cpp b/src/amd/compiler/aco_validate.cpp index 7df92a5da39..13e1b55f602 100644 --- a/src/amd/compiler/aco_validate.cpp +++ b/src/amd/compiler/aco_validate.cpp @@ -1133,7 +1133,8 @@ validate_ra(Program* program) } } - err |= validate_instr_defs(program, regs, assignments, loc, instr); + if (!instr->isBranch() || block.linear_succs.size() != 1) + err |= validate_instr_defs(program, regs, assignments, loc, instr); if (!is_phi(instr)) { for (const Operand& op : instr->operands) { @@ -1144,6 +1145,13 @@ validate_ra(Program* program) regs[op.physReg().reg_b + j] = 0; } } + } else if (block.linear_preds.size() != 1 || + program->blocks[block.linear_preds[0]].linear_succs.size() == 1) { + for (unsigned pred : block.linear_preds) { + aco_ptr& br = program->blocks[pred].instructions.back(); + assert(br->isBranch()); + err |= validate_instr_defs(program, regs, assignments, loc, br); + } } } }