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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user