nir: Use instructions_pass() for nir_fixup_deref_modes()

Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24220>
This commit is contained in:
Caio Oliveira
2023-07-18 11:55:01 -07:00
committed by Marge Bot
parent a0d426370d
commit 97c79cdf19
+32 -24
View File
@@ -414,33 +414,41 @@ nir_remove_dead_derefs(nir_shader *shader)
return progress;
}
static bool
nir_fixup_deref_modes_instr(UNUSED struct nir_builder *b, nir_instr *instr, UNUSED void *data)
{
if (instr->type != nir_instr_type_deref)
return false;
nir_deref_instr *deref = nir_instr_as_deref(instr);
if (deref->deref_type == nir_deref_type_cast)
return false;
nir_variable_mode parent_modes;
if (deref->deref_type == nir_deref_type_var) {
parent_modes = deref->var->data.mode;
} else {
assert(deref->parent.is_ssa);
nir_deref_instr *parent =
nir_instr_as_deref(deref->parent.ssa->parent_instr);
parent_modes = parent->modes;
}
if (deref->modes == parent_modes)
return false;
deref->modes = parent_modes;
return true;
}
void
nir_fixup_deref_modes(nir_shader *shader)
{
nir_foreach_function_impl(impl, shader) {
nir_foreach_block(block, impl) {
nir_foreach_instr(instr, block) {
if (instr->type != nir_instr_type_deref)
continue;
nir_deref_instr *deref = nir_instr_as_deref(instr);
if (deref->deref_type == nir_deref_type_cast)
continue;
nir_variable_mode parent_modes;
if (deref->deref_type == nir_deref_type_var) {
parent_modes = deref->var->data.mode;
} else {
assert(deref->parent.is_ssa);
nir_deref_instr *parent =
nir_instr_as_deref(deref->parent.ssa->parent_instr);
parent_modes = parent->modes;
}
deref->modes = parent_modes;
}
}
}
nir_shader_instructions_pass(shader, nir_fixup_deref_modes_instr,
nir_metadata_block_index |
nir_metadata_dominance |
nir_metadata_live_ssa_defs |
nir_metadata_instr_index, NULL);
}
static bool