nir: make nir_to_lcssa() a general NIR pass.

Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
Rhys Perry
2019-01-31 16:33:23 +00:00
committed by Daniel Schürmann
parent 204846ad06
commit 8a6cfaa15a
2 changed files with 42 additions and 3 deletions

View File

@@ -3923,6 +3923,7 @@ bool nir_repair_ssa_impl(nir_function_impl *impl);
bool nir_repair_ssa(nir_shader *shader);
void nir_convert_loop_to_lcssa(nir_loop *loop);
bool nir_convert_to_lcssa(nir_shader *shader);
/* If phi_webs_only is true, only convert SSA values involved in phi nodes to
* registers. If false, convert all values (even those not involved in a phi

View File

@@ -45,6 +45,7 @@ typedef struct {
/* The loop we store information for */
nir_loop *loop;
bool progress;
} lcssa_state;
static bool
@@ -168,6 +169,7 @@ convert_loop_exit_for_ssa(nir_ssa_def *def, void *void_state)
}
}
state->progress = true;
return true;
}
@@ -176,8 +178,10 @@ convert_to_lcssa(nir_cf_node *cf_node, lcssa_state *state)
{
switch (cf_node->type) {
case nir_cf_node_block:
if (state->loop) {
nir_foreach_instr(instr, nir_cf_node_as_block(cf_node))
nir_foreach_ssa_def(instr, convert_loop_exit_for_ssa, state);
}
return;
case nir_cf_node_if: {
nir_if *if_stmt = nir_cf_node_as_if(cf_node);
@@ -203,7 +207,8 @@ convert_to_lcssa(nir_cf_node *cf_node, lcssa_state *state)
}
void
nir_convert_loop_to_lcssa(nir_loop *loop) {
nir_convert_loop_to_lcssa(nir_loop *loop)
{
nir_function_impl *impl = nir_cf_node_get_function(&loop->cf_node);
nir_metadata_require(impl, nir_metadata_block_index);
@@ -217,3 +222,36 @@ nir_convert_loop_to_lcssa(nir_loop *loop) {
ralloc_free(state);
}
bool
nir_convert_to_lcssa(nir_shader *shader)
{
bool progress = false;
lcssa_state *state = rzalloc(NULL, lcssa_state);
state->shader = shader;
nir_foreach_function(function, shader) {
if (function->impl == NULL)
continue;
state->progress = false;
nir_metadata_require(function->impl, nir_metadata_block_index);
foreach_list_typed(nir_cf_node, node, node, &function->impl->body)
convert_to_lcssa(node, state);
if (state->progress) {
progress = true;
nir_metadata_preserve(function->impl, nir_metadata_block_index |
nir_metadata_dominance);
} else {
#ifndef NDEBUG
function->impl->valid_metadata &= ~nir_metadata_not_properly_reset;
#endif
}
}
ralloc_free(state);
return progress;
}