From 1bbc36c5d215e55724720ae0b83da9c5703f2f58 Mon Sep 17 00:00:00 2001 From: Job Noorman Date: Fri, 16 Aug 2024 15:54:24 +0200 Subject: [PATCH] ir3: recalculate reconvergence after opt_jump opt_jump destroys the physical cfg but it turns out we need it afterwards in helper_sched. Keeping it correctly up-to-date during opt_jump turned out to be tricky and complex. Simply recalculate it afterwards to keep things simple. Signed-off-by: Job Noorman Part-of: --- src/freedreno/ir3/ir3_legalize.c | 16 ++++++++-------- src/freedreno/ir3/ir3_reconvergence.c | 4 ++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/freedreno/ir3/ir3_legalize.c b/src/freedreno/ir3/ir3_legalize.c index 233f9eecdb8..b2dc883a3f5 100644 --- a/src/freedreno/ir3/ir3_legalize.c +++ b/src/freedreno/ir3/ir3_legalize.c @@ -948,11 +948,6 @@ retarget_jump(struct ir3_instruction *instr, struct ir3_block *new_target) /* and remove old_target's predecessor: */ ir3_block_remove_predecessor(old_target, cur_block); - /* If we reconverged at the old target, we'll reconverge at the new target - * too: - */ - new_target->reconvergence_point |= old_target->reconvergence_point; - instr->cat0.target = new_target; if (old_target->predecessors_count == 0) { @@ -1757,8 +1752,6 @@ ir3_legalize(struct ir3 *ir, struct ir3_shader_variant *so, int *max_bary) } block_sched(ir); - if (so->type == MESA_SHADER_FRAGMENT) - kill_sched(ir, so); foreach_block (block, &ir->block_list) { progress |= apply_fine_deriv_macro(ctx, block); @@ -1772,11 +1765,18 @@ ir3_legalize(struct ir3 *ir, struct ir3_shader_variant *so, int *max_bary) dbg_nop_sched(ir, so); } + bool cfg_changed = false; while (opt_jump(ir)) - ; + cfg_changed = true; prede_sched(ir); + if (cfg_changed) + ir3_calc_reconvergence(so); + + if (so->type == MESA_SHADER_FRAGMENT) + kill_sched(ir, so); + /* TODO: does (eq) exist before a6xx? */ if (so->type == MESA_SHADER_FRAGMENT && so->need_pixlod && so->compiler->gen >= 6) diff --git a/src/freedreno/ir3/ir3_reconvergence.c b/src/freedreno/ir3/ir3_reconvergence.c index 092b8fc5e65..88416799c4b 100644 --- a/src/freedreno/ir3/ir3_reconvergence.c +++ b/src/freedreno/ir3/ir3_reconvergence.c @@ -122,6 +122,10 @@ ir3_calc_reconvergence(struct ir3_shader_variant *so) edge_count++; if (block->successors[1]) edge_count++; + + block->physical_predecessors_count = 0; + block->physical_successors_count = 0; + block->reconvergence_point = false; } struct rb_tree forward_edges, backward_edges;