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 <jnoorman@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29409>
This commit is contained in:
Job Noorman
2024-08-16 15:54:24 +02:00
committed by Marge Bot
parent c67381538d
commit 1bbc36c5d2
2 changed files with 12 additions and 8 deletions
+8 -8
View File
@@ -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)
+4
View File
@@ -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;