diff options
author | Rhys Perry <[email protected]> | 2019-01-31 16:33:23 +0000 |
---|---|---|
committer | Daniel Schürmann <[email protected]> | 2019-08-20 17:39:54 +0200 |
commit | 8a6cfaa15a50a990a2bde4623c7a21f889d7daf2 (patch) | |
tree | 6f84297e560aab50ada6ca4f653060c40bccad3e /src/compiler | |
parent | 204846ad062fe4e154406fa2d9093cdab4461ea2 (diff) |
nir: make nir_to_lcssa() a general NIR pass.
Reviewed-by: Connor Abbott <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/nir/nir.h | 1 | ||||
-rw-r--r-- | src/compiler/nir/nir_to_lcssa.c | 44 |
2 files changed, 42 insertions, 3 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index f00cc3fdc50..734fb1b11e3 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -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 diff --git a/src/compiler/nir/nir_to_lcssa.c b/src/compiler/nir/nir_to_lcssa.c index 6057c66586d..691e50a02d6 100644 --- a/src/compiler/nir/nir_to_lcssa.c +++ b/src/compiler/nir/nir_to_lcssa.c @@ -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: - nir_foreach_instr(instr, nir_cf_node_as_block(cf_node)) - nir_foreach_ssa_def(instr, convert_loop_exit_for_ssa, state); + 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; +} + |