From 7e08f22a72cfc379902feeca3673db6aa344f782 Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Tue, 12 Feb 2019 20:59:35 +0100 Subject: nir/opt_if: don't mark progress if nothing changes if we have something like this: loop { ... if x { break; } else { continue; } } opt_if_loop_last_continue returns true marking progress allthough nothing changes. Fixes: 5921a19d4b0c6 "nir: add if opt opt_if_loop_last_continue()" Signed-off-by: Karol Herbst Reviewed-by: Jason Ekstrand --- src/compiler/nir/nir_opt_if.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/compiler/nir') diff --git a/src/compiler/nir/nir_opt_if.c b/src/compiler/nir/nir_opt_if.c index 9afb901be14..9909faf09a1 100644 --- a/src/compiler/nir/nir_opt_if.c +++ b/src/compiler/nir/nir_opt_if.c @@ -844,6 +844,13 @@ opt_if_loop_last_continue(nir_loop *loop) if (!then_ends_in_continue && !else_ends_in_continue) return false; + /* if the block after the if/else is empty we bail, otherwise we might end + * up looping forever + */ + if (&nif->cf_node == nir_cf_node_prev(&last_block->cf_node) && + exec_list_is_empty(&last_block->instr_list)) + return false; + /* Move the last block of the loop inside the last if-statement */ nir_cf_list tmp; nir_cf_extract(&tmp, nir_after_cf_node(if_node), -- cgit v1.2.3