nir: Use instructions_pass() for nir_fixup_deref_modes()
authorCaio Oliveira <caio.oliveira@intel.com>
Tue, 18 Jul 2023 18:55:01 +0000 (11:55 -0700)
committerMarge Bot <emma+marge@anholt.net>
Wed, 19 Jul 2023 20:15:12 +0000 (20:15 +0000)
Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24220>

src/compiler/nir/nir_deref.c

index 0ffc40b..03c2728 100644 (file)
@@ -414,33 +414,41 @@ nir_remove_dead_derefs(nir_shader *shader)
    return progress;
 }
 
-void
-nir_fixup_deref_modes(nir_shader *shader)
+static bool
+nir_fixup_deref_modes_instr(UNUSED struct nir_builder *b, nir_instr *instr, UNUSED void *data)
 {
-   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;
+   if (instr->type != nir_instr_type_deref)
+      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;
-            }
+   nir_deref_instr *deref = nir_instr_as_deref(instr);
+   if (deref->deref_type == nir_deref_type_cast)
+      return false;
 
-            deref->modes = parent_modes;
-         }
-      }
+   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_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