diff --git a/src/compiler/nir/nir_to_lcssa.c b/src/compiler/nir/nir_to_lcssa.c index 527cdca4120..345879acf4f 100644 --- a/src/compiler/nir/nir_to_lcssa.c +++ b/src/compiler/nir/nir_to_lcssa.c @@ -313,8 +313,18 @@ convert_to_lcssa(nir_cf_node *cf_node, lcssa_state *state) foreach_list_typed(nir_cf_node, nested_node, node, &loop->body) convert_to_lcssa(nested_node, state); + state->loop = loop; + /* mark loop-invariant instructions */ if (state->skip_invariants) { + /* Without a loop all instructions are invariant. + * For outer loops, multiple breaks can still create phis. + * The variance then depends on all (nested) break conditions. + * We don't consider this, but assume all not_invariant. + */ + if (nir_loop_first_block(loop)->predecessors->entries == 1) + goto end; + nir_foreach_block_in_cf_node(block, cf_node) { nir_foreach_instr(instr, block) { if (instr->pass_flags == undefined) @@ -323,7 +333,6 @@ convert_to_lcssa(nir_cf_node *cf_node, lcssa_state *state) } } - state->loop = loop; nir_foreach_block_in_cf_node(block, cf_node) { nir_foreach_instr(instr, block) { nir_foreach_ssa_def(instr, convert_loop_exit_for_ssa, state); @@ -334,6 +343,7 @@ convert_to_lcssa(nir_cf_node *cf_node, lcssa_state *state) } } +end: /* For outer loops, the LCSSA-phi should be considered not invariant */ if (state->skip_invariants) { nir_block *block_after_loop =