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:
parent
afb75e71e0
commit
29bfe18abd
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue