diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index be7b92dd7d2..c16ce547642 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2903,6 +2903,7 @@ bool nir_opt_move_load_ubo(nir_shader *shader); bool nir_opt_peephole_select(nir_shader *shader, unsigned limit); +bool nir_opt_remove_phis_impl(nir_function_impl *impl); bool nir_opt_remove_phis(nir_shader *shader); bool nir_opt_shrink_load(nir_shader *shader); diff --git a/src/compiler/nir/nir_opt_if.c b/src/compiler/nir/nir_opt_if.c index 863ca630fbd..ec5bf1c9027 100644 --- a/src/compiler/nir/nir_opt_if.c +++ b/src/compiler/nir/nir_opt_if.c @@ -403,6 +403,13 @@ nir_opt_if(nir_shader *shader) * that don't dominate their uses. */ nir_lower_regs_to_ssa_impl(function->impl); + + /* Calling nir_convert_loop_to_lcssa() in opt_peel_loop_initial_if() + * adds extra phi nodes which may not be valid if they're used for + * something such as a deref. Remove any unneeded phis. + */ + nir_opt_remove_phis_impl(function->impl); + progress = true; } } diff --git a/src/compiler/nir/nir_opt_remove_phis.c b/src/compiler/nir/nir_opt_remove_phis.c index b20ff729156..e2d3994c49e 100644 --- a/src/compiler/nir/nir_opt_remove_phis.c +++ b/src/compiler/nir/nir_opt_remove_phis.c @@ -139,8 +139,8 @@ remove_phis_block(nir_block *block, nir_builder *b) return progress; } -static bool -remove_phis_impl(nir_function_impl *impl) +bool +nir_opt_remove_phis_impl(nir_function_impl *impl) { bool progress = false; nir_builder bld; @@ -165,7 +165,7 @@ nir_opt_remove_phis(nir_shader *shader) nir_foreach_function(function, shader) if (function->impl) - progress = remove_phis_impl(function->impl) || progress; + progress = nir_opt_remove_phis_impl(function->impl) || progress; return progress; }