From c67381538d02edebe9a6d5316e1d015be210892d Mon Sep 17 00:00:00 2001 From: Job Noorman Date: Fri, 16 Aug 2024 15:54:24 +0200 Subject: [PATCH] ir3: fix reconvergence of blocks with multiple divergent predecessors When calling ir3_calc_reconvergence after opt_jump, it may happen that there are multiple divergent branches to the same block. This was handled incorrectly since first_divergent_pred was unconditionally overwritten for successors of divergent branches. This patch fixes this by only making sure only the earliest divergent predecessor is used. Signed-off-by: Job Noorman Part-of: --- src/freedreno/ir3/ir3_reconvergence.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/freedreno/ir3/ir3_reconvergence.c b/src/freedreno/ir3/ir3_reconvergence.c index 5101fb39a95..092b8fc5e65 100644 --- a/src/freedreno/ir3/ir3_reconvergence.c +++ b/src/freedreno/ir3/ir3_reconvergence.c @@ -222,7 +222,12 @@ ir3_calc_reconvergence(struct ir3_shader_variant *so) for (unsigned i = 0; i < num_reconv_points; i++) { struct ir3_block *reconv_point = reconv_points[i]; reconv_point->reconvergence_point = true; - blocks[reconv_point->index].first_divergent_pred = block->index; + + struct block_data *reconv_point_data = &blocks[reconv_point->index]; + if (reconv_point_data->first_divergent_pred > block->index) { + reconv_point_data->first_divergent_pred = block->index; + } + u_worklist_push_tail(&worklist, reconv_point, index); } }