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 <alyssa@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12282>
This commit is contained in:

committed by
Marge Bot

parent
67fe9ae5c3
commit
2a723f7a8d
@@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user