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>
(cherry picked from commit 09b4ba27a3)
This commit is contained in:
Qiang Yu 2024-06-25 17:42:11 +08:00 committed by Eric Engestrom
parent 00449b8615
commit 11d6ddf559
2 changed files with 6 additions and 3 deletions

View file

@ -294,7 +294,7 @@
"description": "nir: fix lower array to vec metadata preserve",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "35b8f6f40bb45dbffb04dd883ac6644300832981",
"notes": null

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);
@ -127,8 +130,8 @@ nir_lower_array_deref_of_vec_impl(nir_function_impl *impl,
}
if (progress) {
nir_metadata_preserve(impl, nir_metadata_block_index |
nir_metadata_dominance);
/* indirect store lower will change control flow */
nir_metadata_preserve(impl, has_indirect_store ? nir_metadata_none : (nir_metadata_block_index | nir_metadata_dominance));
} else {
nir_metadata_preserve(impl, nir_metadata_all);
}