diff options
author | Matt Turner <mattst88@gmail.com> | 2017-03-09 11:49:57 -0800 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2017-03-16 10:23:29 -0700 |
commit | 7b9e9d6c49b3baba397ea01d22913aee987faf4a (patch) | |
tree | 75e152897202ebfa01f32b3626f22ee9bfe7901e | |
parent | d05897ad968f238e25cbbac7194cd836bdc62c56 (diff) |
nir: Return progress from nir_convert_from_ssa().
-rw-r--r-- | src/compiler/nir/nir.h | 2 | ||||
-rw-r--r-- | src/compiler/nir/nir_from_ssa.c | 21 |
2 files changed, 16 insertions, 7 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 9f6c4ab2611..96af9aa0052 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2581,7 +2581,7 @@ void nir_convert_loop_to_lcssa(nir_loop *loop); * registers. If false, convert all values (even those not involved in a phi * node) to registers. */ -void nir_convert_from_ssa(nir_shader *shader, bool phi_webs_only); +bool nir_convert_from_ssa(nir_shader *shader, bool phi_webs_only); bool nir_lower_phis_to_regs_block(nir_block *block); bool nir_lower_ssa_defs_to_regs_block(nir_block *block); diff --git a/src/compiler/nir/nir_from_ssa.c b/src/compiler/nir/nir_from_ssa.c index d2646c63c47..07fcceb8e15 100644 --- a/src/compiler/nir/nir_from_ssa.c +++ b/src/compiler/nir/nir_from_ssa.c @@ -524,18 +524,21 @@ rewrite_ssa_def(nir_ssa_def *def, void *void_state) static bool resolve_registers_block(nir_block *block, struct from_ssa_state *state) { + bool progress = false; + nir_foreach_instr_safe(instr, block) { state->instr = instr; - nir_foreach_ssa_def(instr, rewrite_ssa_def, state); + progress |= nir_foreach_ssa_def(instr, rewrite_ssa_def, state); if (instr->type == nir_instr_type_phi) { nir_instr_remove(instr); ralloc_steal(state->dead_ctx, instr); + progress = true; } } state->instr = NULL; - return true; + return progress; } static void @@ -756,10 +759,11 @@ resolve_parallel_copies_block(nir_block *block, struct from_ssa_state *state) return true; } -static void +static bool nir_convert_from_ssa_impl(nir_function_impl *impl, bool phi_webs_only) { struct from_ssa_state state; + bool progress = false; nir_builder_init(&state.builder, impl); state.dead_ctx = ralloc_context(NULL); @@ -791,7 +795,7 @@ nir_convert_from_ssa_impl(nir_function_impl *impl, bool phi_webs_only) } nir_foreach_block(block, impl) { - resolve_registers_block(block, &state); + progress |= resolve_registers_block(block, &state); } nir_foreach_block(block, impl) { @@ -804,15 +808,20 @@ nir_convert_from_ssa_impl(nir_function_impl *impl, bool phi_webs_only) /* Clean up dead instructions and the hash tables */ _mesa_hash_table_destroy(state.merge_node_table, NULL); ralloc_free(state.dead_ctx); + return progress; } -void +bool nir_convert_from_ssa(nir_shader *shader, bool phi_webs_only) { + bool progress = false; + nir_foreach_function(function, shader) { if (function->impl) - nir_convert_from_ssa_impl(function->impl, phi_webs_only); + progress |= nir_convert_from_ssa_impl(function->impl, phi_webs_only); } + + return progress; } |