From ffef3d1709daa1ed81d98d8f12f3fcb74e9c4f95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Tue, 16 Apr 2024 17:32:29 +0200 Subject: [PATCH] nir/opt_sink: ignore loops without backedge Loops without backedge should not be considered loops. For RADV, 2069 (2.61% of 79395) affected shaders. Reviewed-by: Georg Lehmann Part-of: --- src/compiler/nir/nir_opt_sink.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/compiler/nir/nir_opt_sink.c b/src/compiler/nir/nir_opt_sink.c index 170824f2ad9..126a9d5fe2c 100644 --- a/src/compiler/nir/nir_opt_sink.c +++ b/src/compiler/nir/nir_opt_sink.c @@ -132,8 +132,11 @@ static nir_loop * get_innermost_loop(nir_cf_node *node) { for (; node != NULL; node = node->parent) { - if (node->type == nir_cf_node_loop) - return (nir_loop *)node; + if (node->type == nir_cf_node_loop) { + nir_loop *loop = nir_cf_node_as_loop(node); + if (nir_loop_first_block(loop)->predecessors->entries > 1) + return loop; + } } return NULL; } @@ -171,7 +174,8 @@ adjust_block_for_loops(nir_block *use_block, nir_block *def_block, } nir_cf_node *next = nir_cf_node_next(&cur_block->cf_node); - if (next && next->type == nir_cf_node_loop) { + if (next && next->type == nir_cf_node_loop && + nir_block_cf_tree_next(cur_block)->predecessors->entries > 1) { nir_loop *following_loop = nir_cf_node_as_loop(next); if (loop_contains_block(following_loop, use_block)) { use_block = cur_block;