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:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user