From 2a723f7a8d622870fb5d7082949fcfc252e65e3b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marcin=20=C5=9Alusarz?= Date: Tue, 10 Aug 2021 11:50:04 +0200 Subject: [PATCH] nir: use nir_shader_instructions_pass in nir_split_per_member_structs Changes: - nir_metadata_preserve(..., nir_metadata_block_index | nir_metadata_dominance) is called only when pass makes progress - nir_metadata_preserve(..., nir_metadata_all) is called when pass doesn't make progress Reviewed-by: Alyssa Rosenzweig Part-of: --- src/compiler/nir/nir_split_per_member_structs.c | 42 ++++++++++--------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/src/compiler/nir/nir_split_per_member_structs.c b/src/compiler/nir/nir_split_per_member_structs.c index b5cf32b..2e92012 100644 --- a/src/compiler/nir/nir_split_per_member_structs.c +++ b/src/compiler/nir/nir_split_per_member_structs.c @@ -115,13 +115,18 @@ build_member_deref(nir_builder *b, nir_deref_instr *deref, nir_variable *member) } } -static void -rewrite_deref_instr(nir_builder *b, nir_deref_instr *deref, - struct hash_table *var_to_member_map) +static bool +rewrite_deref_instr(nir_builder *b, nir_instr *instr, void *cb_data) { + if (instr->type != nir_instr_type_deref) + return false; + + nir_deref_instr *deref = nir_instr_as_deref(instr); + struct hash_table *var_to_member_map = cb_data; + /* We must be a struct deref */ if (deref->deref_type != nir_deref_type_struct) - return; + return false; nir_deref_instr *base; for (base = nir_deref_instr_parent(deref); @@ -130,12 +135,12 @@ rewrite_deref_instr(nir_builder *b, nir_deref_instr *deref, /* If this struct is nested inside another, bail */ if (base->deref_type == nir_deref_type_struct) - return; + return false; } /* We must be on a variable with members */ if (!base || base->var->num_members == 0) - return; + return false; nir_variable *member = find_var_member(base->var, deref->strct.index, var_to_member_map); @@ -149,6 +154,8 @@ rewrite_deref_instr(nir_builder *b, nir_deref_instr *deref, /* The referenced variable is no longer valid, clean up the deref */ nir_deref_instr_remove_if_unused(deref); + + return true; } bool @@ -175,25 +182,10 @@ nir_split_per_member_structs(nir_shader *shader) return false; } - nir_foreach_function(function, shader) { - if (!function->impl) - continue; - - nir_builder b; - nir_builder_init(&b, function->impl); - nir_foreach_block(block, function->impl) { - nir_foreach_instr_safe(instr, block) { - if (instr->type == nir_instr_type_deref) { - rewrite_deref_instr(&b, nir_instr_as_deref(instr), - var_to_member_map); - } - } - } - - nir_metadata_preserve(function->impl, - nir_metadata_block_index | - nir_metadata_dominance); - } + nir_shader_instructions_pass(shader, rewrite_deref_instr, + nir_metadata_block_index | + nir_metadata_dominance, + var_to_member_map); ralloc_free(dead_ctx); -- 2.7.4