When we're about to re-arrange a bunch of blocks, it's a good idea to
make sure that we don't have deref uses crossing block boundaries.
Otherwise we may end up with a deref going through a phi and that would
be bad.
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Cc: "18.2" <mesa-stable@lists.freedesktop.org>
static void
loop_prepare_for_unroll(nir_loop *loop)
{
+ nir_rematerialize_derefs_in_use_blocks_impl(
+ nir_cf_node_get_function(&loop->cf_node));
+
nir_convert_loop_to_lcssa(loop);
/* Lower phis at the top level of the loop body */
&has_nested_loop);
}
- if (progress) {
+ if (progress)
nir_lower_regs_to_ssa_impl(impl);
- /* Calling nir_convert_loop_to_lcssa() adds extra phi nodes which may
- * not be valid if they're used for something such as a deref.
- * Remove any unneeded phis.
- */
- nir_copy_prop(impl->function->shader);
- nir_opt_remove_phis_impl(impl);
- }
-
return progress;
}