summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2017-03-09 11:49:57 -0800
committerMatt Turner <mattst88@gmail.com>2017-03-16 10:23:29 -0700
commit7b9e9d6c49b3baba397ea01d22913aee987faf4a (patch)
tree75e152897202ebfa01f32b3626f22ee9bfe7901e
parentd05897ad968f238e25cbbac7194cd836bdc62c56 (diff)
nir: Return progress from nir_convert_from_ssa().
-rw-r--r--src/compiler/nir/nir.h2
-rw-r--r--src/compiler/nir/nir_from_ssa.c21
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;
}