nir: fix lower array to vec metadata preserve
indirect store lowering will change control flow,
so we should not preserve control flow metadate
when it's present.
Fixes: 35b8f6f40b
("nir: Add a new pass to lower array dereferences on vectors")
Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29894>
This commit is contained in:
@@ -30,6 +30,7 @@ nir_lower_array_deref_of_vec_impl(nir_function_impl *impl,
|
||||
nir_lower_array_deref_of_vec_options options)
|
||||
{
|
||||
bool progress = false;
|
||||
bool has_indirect_store = false;
|
||||
|
||||
nir_builder b = nir_builder_create(impl);
|
||||
|
||||
@@ -91,6 +92,8 @@ nir_lower_array_deref_of_vec_impl(nir_function_impl *impl,
|
||||
nir_def *index = deref->arr.index.ssa;
|
||||
nir_build_write_masked_stores(&b, vec_deref, value, index,
|
||||
0, num_components);
|
||||
|
||||
has_indirect_store = true;
|
||||
}
|
||||
nir_instr_remove(&intrin->instr);
|
||||
|
||||
@@ -125,7 +128,8 @@ nir_lower_array_deref_of_vec_impl(nir_function_impl *impl,
|
||||
}
|
||||
|
||||
if (progress) {
|
||||
nir_metadata_preserve(impl, nir_metadata_control_flow);
|
||||
/* indirect store lower will change control flow */
|
||||
nir_metadata_preserve(impl, has_indirect_store ? nir_metadata_none : nir_metadata_control_flow);
|
||||
} else {
|
||||
nir_metadata_preserve(impl, nir_metadata_all);
|
||||
}
|
||||
|
Reference in New Issue
Block a user