From 2d8a3fa7ea994ad02a40ff497109f966e3fcbeec Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 13 Sep 2016 15:14:28 -0700 Subject: nir: Report progress from nir_lower_phis_to_scalar. Signed-off-by: Kenneth Graunke Reviewed-by: Eric Anholt --- src/compiler/nir/nir.h | 2 +- src/compiler/nir/nir_lower_phis_to_scalar.c | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) (limited to 'src/compiler/nir') diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 3b3d6ae839..94eae6d303 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2413,7 +2413,7 @@ bool nir_lower_vec_to_movs(nir_shader *shader); bool nir_lower_alu_to_scalar(nir_shader *shader); void nir_lower_load_const_to_scalar(nir_shader *shader); -void nir_lower_phis_to_scalar(nir_shader *shader); +bool nir_lower_phis_to_scalar(nir_shader *shader); void nir_lower_io_to_scalar(nir_shader *shader, nir_variable_mode mask); void nir_lower_samplers(nir_shader *shader, diff --git a/src/compiler/nir/nir_lower_phis_to_scalar.c b/src/compiler/nir/nir_lower_phis_to_scalar.c index 9fd00cc784..b12718f273 100644 --- a/src/compiler/nir/nir_lower_phis_to_scalar.c +++ b/src/compiler/nir/nir_lower_phis_to_scalar.c @@ -166,6 +166,8 @@ static bool lower_phis_to_scalar_block(nir_block *block, struct lower_phis_to_scalar_state *state) { + bool progress = false; + /* Find the last phi node in the block */ nir_phi_instr *last_phi = NULL; nir_foreach_instr(instr, block) { @@ -248,6 +250,8 @@ lower_phis_to_scalar_block(nir_block *block, ralloc_steal(state->dead_ctx, phi); nir_instr_remove(&phi->instr); + progress = true; + /* We're using the safe iterator and inserting all the newly * scalarized phi nodes before their non-scalarized version so that's * ok. However, we are also inserting vec operations after all of @@ -258,13 +262,14 @@ lower_phis_to_scalar_block(nir_block *block, break; } - return true; + return progress; } -static void +static bool lower_phis_to_scalar_impl(nir_function_impl *impl) { struct lower_phis_to_scalar_state state; + bool progress = false; state.mem_ctx = ralloc_parent(impl); state.dead_ctx = ralloc_context(NULL); @@ -272,13 +277,14 @@ lower_phis_to_scalar_impl(nir_function_impl *impl) _mesa_key_pointer_equal); nir_foreach_block(block, impl) { - lower_phis_to_scalar_block(block, &state); + progress = lower_phis_to_scalar_block(block, &state) || progress; } nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); ralloc_free(state.dead_ctx); + return progress; } /** A pass that lowers vector phi nodes to scalar @@ -288,11 +294,15 @@ lower_phis_to_scalar_impl(nir_function_impl *impl) * instance, if one of the sources is a non-scalarizable vector, then we * don't bother lowering because that would generate hard-to-coalesce movs. */ -void +bool nir_lower_phis_to_scalar(nir_shader *shader) { + bool progress = false; + nir_foreach_function(function, shader) { if (function->impl) - lower_phis_to_scalar_impl(function->impl); + progress = lower_phis_to_scalar_impl(function->impl) || progress; } + + return progress; } -- cgit v1.2.3