aco/isel: Remove loop_context* parameter from begin_loop() / end_loop() helper functions

We can transparently create the context inside the functions, now.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40364>
This commit is contained in:
Daniel Schürmann 2026-04-08 08:50:47 +02:00 committed by Marge Bot
parent 5c1dea7ee4
commit 53836320a9
5 changed files with 25 additions and 25 deletions

View file

@ -248,8 +248,8 @@ isel_context setup_isel_context(Program* program, unsigned shader_count,
/* aco_isel_cfg.cpp */
void emit_loop_break(isel_context* ctx);
void emit_loop_continue(isel_context* ctx);
void begin_loop(isel_context* ctx, loop_context* lc);
void end_loop(isel_context* ctx, loop_context* lc);
void begin_loop(isel_context* ctx);
void end_loop(isel_context* ctx);
void begin_uniform_if_then(isel_context* ctx, if_context* ic, Temp cond);
void begin_uniform_if_else(isel_context* ctx, if_context* ic, bool logical_else = true);
void end_uniform_if(isel_context* ctx, if_context* ic, bool logical_else = true);

View file

@ -116,15 +116,16 @@ update_exec_info(isel_context* ctx)
}
void
begin_loop(isel_context* ctx, loop_context* lc)
begin_loop(isel_context* ctx)
{
loop_context lc;
append_logical_end(ctx);
ctx->block->kind |= block_kind_loop_preheader | block_kind_uniform;
Builder bld(ctx->program, ctx->block);
bld.branch(aco_opcode::p_branch);
unsigned loop_preheader_idx = ctx->block->index;
lc->loop_exit.kind |= (block_kind_loop_exit | (ctx->block->kind & block_kind_top_level));
lc.loop_exit.kind |= (block_kind_loop_exit | (ctx->block->kind & block_kind_top_level));
ctx->program->next_loop_depth++;
@ -135,17 +136,18 @@ begin_loop(isel_context* ctx, loop_context* lc)
append_logical_start(ctx->block);
lc->cf_info_old = ctx->cf_info;
lc->header_idx = loop_header->index;
lc.cf_info_old = ctx->cf_info;
lc.header_idx = loop_header->index;
ctx->cf_info.parent_loop = {false, false};
ctx->cf_info.parent_if.is_divergent = false;
ctx->loop_stack.push_back(std::move(lc));
/* Never enter a loop with empty exec mask. */
assert(!ctx->cf_info.exec.empty());
}
void
end_loop(isel_context* ctx, loop_context* lc)
end_loop(isel_context* ctx)
{
/* No need to check exec.potentially_empty_break/continue originating inside the loop. In the
* only case where it's possible at this point (divergent break after divergent continue), we
@ -153,7 +155,8 @@ end_loop(isel_context* ctx, loop_context* lc)
* divergent control flow requires WQM.
*/
assert(!ctx->cf_info.exec.potentially_empty_discard);
Block& header = ctx->program->blocks[lc->header_idx];
loop_context& lc = ctx->loop_stack.back();
Block& header = ctx->program->blocks[lc.header_idx];
/* Add the trivial continue. */
if (!ctx->cf_info.has_branch) {
@ -176,14 +179,16 @@ end_loop(isel_context* ctx, loop_context* lc)
/* emit loop successor block */
ctx->program->next_loop_depth--;
ctx->block = ctx->program->insert_block(std::move(lc->loop_exit));
ctx->block = ctx->program->insert_block(std::move(lc.loop_exit));
append_logical_start(ctx->block);
/* Propagate information about discards and restore previous CF info. */
lc->cf_info_old.exec.potentially_empty_discard |= ctx->cf_info.exec.potentially_empty_discard;
lc->cf_info_old.had_divergent_discard |= ctx->cf_info.had_divergent_discard;
ctx->cf_info = lc->cf_info_old;
lc.cf_info_old.exec.potentially_empty_discard |= ctx->cf_info.exec.potentially_empty_discard;
lc.cf_info_old.had_divergent_discard |= ctx->cf_info.had_divergent_discard;
ctx->cf_info = lc.cf_info_old;
update_exec_info(ctx);
ctx->loop_stack.pop_back();
}
void

View file

@ -942,16 +942,14 @@ visit_loop(isel_context* ctx, nir_loop* loop)
{
assert(!nir_loop_has_continue_construct(loop));
ctx->loop_stack.push_back(loop_context());
begin_loop(ctx, &ctx->loop_stack.back());
begin_loop(ctx);
ctx->cf_info.parent_loop.has_divergent_break =
loop->divergent_break && nir_block_num_preds(nir_loop_first_block(loop)) > 1;
ctx->cf_info.in_divergent_cf |= ctx->cf_info.parent_loop.has_divergent_break;
visit_cf_list(ctx, &loop->body);
end_loop(ctx, &ctx->loop_stack.back());
ctx->loop_stack.pop_back();
end_loop(ctx);
}
void

View file

@ -3773,8 +3773,7 @@ pops_await_overlapped_waves(isel_context* ctx)
/* Await the overlapped waves. */
ctx->loop_stack.push_back(loop_context());
begin_loop(ctx, &ctx->loop_stack.back());
begin_loop(ctx);
bld.reset(ctx->block);
const Temp exiting_wave_id = bld.pseudo(aco_opcode::p_pops_gfx9_add_exiting_wave_id, bld.def(s1),
@ -3795,7 +3794,7 @@ pops_await_overlapped_waves(isel_context* ctx)
/* Sleep before rechecking to let overlapped waves run for some time. */
bld.sopp(aco_opcode::s_sleep, ctx->program->gfx_level >= GFX10 ? UINT16_MAX : 3);
end_loop(ctx, &ctx->loop_stack.back());
end_loop(ctx);
bld.reset(ctx->block);
/* Indicate the wait has been done to subsequent compilation stages. */

View file

@ -143,8 +143,7 @@ dump_vgprs_to_mem(isel_context* ctx, Builder& bld, Operand rsrc)
Operand(PhysReg{1}, s1) /* SRC0 mode */);
}
ctx->loop_stack.push_back(loop_context());
begin_loop(ctx, &ctx->loop_stack.back());
begin_loop(ctx);
{
bld.reset(ctx->block);
@ -177,7 +176,7 @@ dump_vgprs_to_mem(isel_context* ctx, Builder& bld, Operand rsrc)
}
end_uniform_if(ctx, &loop_break);
}
end_loop(ctx, &ctx->loop_stack.back());
end_loop(ctx);
bld.reset(ctx->block);
if (ctx->program->gfx_level < GFX10) {
@ -240,8 +239,7 @@ dump_lds_to_mem(isel_context* ctx, Builder& bld, Operand rsrc)
Operand m = load_lds_size_m0(bld);
ctx->loop_stack.push_back(loop_context());
begin_loop(ctx, &ctx->loop_stack.back());
begin_loop(ctx);
{
bld.reset(ctx->block);
@ -274,7 +272,7 @@ dump_lds_to_mem(isel_context* ctx, Builder& bld, Operand rsrc)
}
end_uniform_if(ctx, &loop_break);
}
end_loop(ctx, &ctx->loop_stack.back());
end_loop(ctx);
bld.reset(ctx->block);
}
begin_uniform_if_else(ctx, &ic);