nir/opt_if: Clean up single-src phis in opt_if_loop_terminator

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111071
Fixes: 2a74296f24 "nir: add opt_if_loop_terminator()"
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
Jason Ekstrand
2019-07-10 15:14:42 -05:00
parent ed98f8a63a
commit 7a19e05e8c
3 changed files with 16 additions and 0 deletions

View File

@@ -3882,6 +3882,7 @@ bool nir_opt_peephole_select(nir_shader *shader, unsigned limit,
bool nir_opt_rematerialize_compares(nir_shader *shader); bool nir_opt_rematerialize_compares(nir_shader *shader);
bool nir_opt_remove_phis(nir_shader *shader); bool nir_opt_remove_phis(nir_shader *shader);
bool nir_opt_remove_phis_block(nir_block *block);
bool nir_opt_shrink_load(nir_shader *shader); bool nir_opt_shrink_load(nir_shader *shader);

View File

@@ -1039,6 +1039,13 @@ opt_if_loop_terminator(nir_if *nif)
if (!nir_is_trivial_loop_if(nif, break_blk)) if (!nir_is_trivial_loop_if(nif, break_blk))
return false; return false;
/* Even though this if statement has a jump on one side, we may still have
* phis afterwards. Single-source phis can be produced by loop unrolling
* or dead control-flow passes and are perfectly legal. Run a quick phi
* removal on the block after the if to clean up any such phis.
*/
nir_opt_remove_phis_block(nir_cf_node_as_block(nir_cf_node_next(&nif->cf_node)));
/* Finally, move the continue from branch after the if-statement. */ /* Finally, move the continue from branch after the if-statement. */
nir_cf_list tmp; nir_cf_list tmp;
nir_cf_extract(&tmp, nir_before_block(first_continue_from_blk), nir_cf_extract(&tmp, nir_before_block(first_continue_from_blk),

View File

@@ -137,6 +137,14 @@ remove_phis_block(nir_block *block, nir_builder *b)
return progress; return progress;
} }
bool
nir_opt_remove_phis_block(nir_block *block)
{
nir_builder b;
nir_builder_init(&b, nir_cf_node_get_function(&block->cf_node));
return remove_phis_block(block, &b);
}
static bool static bool
nir_opt_remove_phis_impl(nir_function_impl *impl) nir_opt_remove_phis_impl(nir_function_impl *impl)
{ {