From 21f0aca948b2bbaefb39407c3bf3fe605d05caf5 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Wed, 19 Jul 2023 14:05:11 +0100 Subject: [PATCH] nir/opt_dead_cf: remove nodes after a jump earlier In the case of: halt // succs: b9 if %618 { block b3:// preds: break // succs: b6 } else { block b4: // preds: , succs: b5 } block b5: // preds: b4 32 %556 = iadd %617, %2 (0x1) opt_constant_if() doesn't work because stitch_blocks() can't join blocks if the before ends in a jump and the after isn't empty. Signed-off-by: Rhys Perry Reviewed-by: Konstantin Seurer Cc: mesa-stable Part-of: --- src/compiler/nir/nir_opt_dead_cf.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/compiler/nir/nir_opt_dead_cf.c b/src/compiler/nir/nir_opt_dead_cf.c index 36675ab3de4..454f6f09464 100644 --- a/src/compiler/nir/nir_opt_dead_cf.c +++ b/src/compiler/nir/nir_opt_dead_cf.c @@ -275,6 +275,13 @@ node_is_dead(nir_cf_node *node) static bool dead_cf_block(nir_block *block) { + /* opt_constant_if() doesn't handle this case. */ + if (nir_block_ends_in_jump(block) && + !exec_node_is_tail_sentinel(block->cf_node.node.next)) { + remove_after_cf_node(&block->cf_node); + return true; + } + nir_if *following_if = nir_block_get_following_if(block); if (following_if) { if (nir_src_is_const(following_if->condition)) { @@ -332,12 +339,8 @@ dead_cf_list(struct exec_list *list, bool *list_ends_in_jump) } if (nir_block_ends_in_jump(block)) { + assert(exec_node_is_tail_sentinel(cur->node.next)); *list_ends_in_jump = true; - - if (!exec_node_is_tail_sentinel(cur->node.next)) { - remove_after_cf_node(cur); - return true; - } } break;