aco: fix fall-through test in try_remove_simple_block() with back-edges

3bca0af2 enhanced empty block determination which exposed this bug and
created an infinite loop in a Guild Wars 2 shader.

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Fixes: 3bca0af25d
     ('aco: ignore parallelcopies to the same register on jump threading')

Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/2364
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3452>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3452>
This commit is contained in:
Rhys Perry 2020-01-17 20:08:34 +00:00 committed by Marge Bot
parent afb75e71e0
commit 29bfe18abd
1 changed files with 3 additions and 1 deletions

View File

@ -207,7 +207,7 @@ void try_remove_simple_block(ssa_elimination_ctx& ctx, Block* block)
branch->opcode = aco_opcode::p_branch;
} else if (branch->target[1] == block->index) {
/* check if there is a fall-through path from block to succ */
bool falls_through = true;
bool falls_through = block->index < succ.index;
for (unsigned j = block->index + 1; falls_through && j < succ.index; j++) {
assert(ctx.program->blocks[j].index == j);
if (!ctx.program->blocks[j].instructions.empty())
@ -217,6 +217,8 @@ void try_remove_simple_block(ssa_elimination_ctx& ctx, Block* block)
branch->target[1] = succ.index;
} else {
/* check if there is a fall-through path for the alternative target */
if (block->index >= branch->target[0])
return;
for (unsigned j = block->index + 1; j < branch->target[0]; j++) {
if (!ctx.program->blocks[j].instructions.empty())
return;