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:
Qiang Yu
2024-06-25 17:42:11 +08:00
committed by Marge Bot
parent 7be1912625
commit 09b4ba27a3

View File

@@ -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);
}