From 09b4ba27a3200aa6ff7dfba9a8e8d1da849affe6 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Tue, 25 Jun 2024 17:42:11 +0800 Subject: [PATCH] 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: 35b8f6f40bb4 ("nir: Add a new pass to lower array dereferences on vectors") Reviewed-by: Alyssa Rosenzweig Signed-off-by: Qiang Yu Part-of: --- src/compiler/nir/nir_lower_array_deref_of_vec.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/compiler/nir/nir_lower_array_deref_of_vec.c b/src/compiler/nir/nir_lower_array_deref_of_vec.c index b5311a4bada..595095c8f1d 100644 --- a/src/compiler/nir/nir_lower_array_deref_of_vec.c +++ b/src/compiler/nir/nir_lower_array_deref_of_vec.c @@ -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); }