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:
@@ -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);
|
||||||
|
|
||||||
|
@@ -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),
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user