mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-12-03 23:24:17 +08:00
aco: fix NIR infinite loops
The previous solution breaks potential loop header phis.
Move the dummy-break to the bottom of the loop.
Fixes: dEQP-VK.reconvergence.subgroup_uniform_control_flow_ballot.*
Fixes: a9c4a31d8d
('aco: handle NIR loops without breaks')
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21736>
This commit is contained in:
parent
3073810397
commit
cd1e5b1858
@ -10366,19 +10366,6 @@ visit_loop(isel_context* ctx, nir_loop* loop)
|
||||
loop_context lc;
|
||||
begin_loop(ctx, &lc);
|
||||
|
||||
/* NIR seems to allow this, and even though the loop exit has no predecessors, SSA defs from the
|
||||
* loop header are live. Handle this without complicating the ACO IR by creating a dummy break.
|
||||
*/
|
||||
if (nir_cf_node_cf_tree_next(&loop->cf_node)->predecessors->entries == 0) {
|
||||
Builder bld(ctx->program, ctx->block);
|
||||
Temp cond = bld.copy(bld.def(s1, scc), Operand::zero());
|
||||
if_context ic;
|
||||
begin_uniform_if_then(ctx, &ic, cond);
|
||||
emit_loop_break(ctx);
|
||||
begin_uniform_if_else(ctx, &ic);
|
||||
end_uniform_if(ctx, &ic);
|
||||
}
|
||||
|
||||
bool unreachable = visit_cf_list(ctx, &loop->body);
|
||||
|
||||
unsigned loop_header_idx = ctx->cf_info.parent_loop.header_idx;
|
||||
@ -10420,6 +10407,19 @@ visit_loop(isel_context* ctx, nir_loop* loop)
|
||||
}
|
||||
}
|
||||
|
||||
/* NIR seems to allow this, and even though the loop exit has no predecessors, SSA defs from the
|
||||
* loop header are live. Handle this without complicating the ACO IR by creating a dummy break.
|
||||
*/
|
||||
if (nir_cf_node_cf_tree_next(&loop->cf_node)->predecessors->entries == 0) {
|
||||
Builder bld(ctx->program, ctx->block);
|
||||
Temp cond = bld.copy(bld.def(s1, scc), Operand::zero());
|
||||
if_context ic;
|
||||
begin_uniform_if_then(ctx, &ic, cond);
|
||||
emit_loop_break(ctx);
|
||||
begin_uniform_if_else(ctx, &ic);
|
||||
end_uniform_if(ctx, &ic);
|
||||
}
|
||||
|
||||
end_loop(ctx, &lc);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user