radeonsi: Only call nir_lower_var_copies at the end of the opt loop

In 283ad85944, radeonsi started using nir_find_var_copies.  However,
it was also calling nir_lower_var_copies in the optimization loop and
the two can end up fighting.  The simple solution is to wait to lower
copies until the end of the optimization loop.

Fixes: 283ad85944
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3550

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6841>
This commit is contained in:
Jason Ekstrand
2020-09-23 13:14:26 -05:00
committed by Marge Bot
parent 7971918924
commit 472a20c5fc

View File

@@ -496,23 +496,11 @@ static void si_nir_opts(struct si_screen *sscreen, struct nir_shader *nir, bool
bool lower_phis_to_scalar = false;
if (first) {
bool opt_find_array_copies = false;
NIR_PASS(progress, nir, nir_split_array_vars, nir_var_function_temp);
NIR_PASS(lower_alu_to_scalar, nir, nir_shrink_vec_array_vars, nir_var_function_temp);
NIR_PASS(opt_find_array_copies, nir, nir_opt_find_array_copies);
NIR_PASS(progress, nir, nir_opt_copy_prop_vars);
/* Call nir_lower_var_copies() to remove any copies introduced
* by nir_opt_find_array_copies().
*/
if (opt_find_array_copies)
NIR_PASS(progress, nir, nir_lower_var_copies);
progress |= opt_find_array_copies;
} else {
NIR_PASS(progress, nir, nir_opt_copy_prop_vars);
NIR_PASS(progress, nir, nir_opt_find_array_copies);
}
NIR_PASS(progress, nir, nir_opt_copy_prop_vars);
NIR_PASS(progress, nir, nir_opt_dead_write_vars);
NIR_PASS(lower_alu_to_scalar, nir, nir_opt_trivial_continues);
@@ -564,6 +552,8 @@ static void si_nir_opts(struct si_screen *sscreen, struct nir_shader *nir, bool
if (sscreen->info.has_packed_math_16bit)
NIR_PASS(progress, nir, nir_opt_vectorize, NULL, NULL);
} while (progress);
NIR_PASS_V(nir, nir_lower_var_copies);
}
static int type_size_vec4(const struct glsl_type *type, bool bindless)