nir: Add a nir_op_is_vec helper
[mesa.git] / src / compiler / nir / nir_opt_dce.c
index 570e43000c08a5d9367404c7bccef460b737b5b2..724cf3f20349277e86ab8ae167e2e75695b3cf38 100644 (file)
@@ -52,6 +52,7 @@ static void
 init_instr(nir_instr *instr, nir_instr_worklist *worklist)
 {
    nir_alu_instr *alu_instr;
+   nir_deref_instr *deref_instr;
    nir_intrinsic_instr *intrin_instr;
    nir_tex_instr *tex_instr;
 
@@ -73,6 +74,12 @@ init_instr(nir_instr *instr, nir_instr_worklist *worklist)
          mark_and_push(worklist, instr);
       break;
 
+   case nir_instr_type_deref:
+      deref_instr = nir_instr_as_deref(instr);
+      if (!deref_instr->dest.is_ssa)
+         mark_and_push(worklist, instr);
+      break;
+
    case nir_instr_type_intrinsic:
       intrin_instr = nir_instr_as_intrinsic(instr);
       if (nir_intrinsic_infos[intrin_instr->intrinsic].flags &
@@ -122,8 +129,7 @@ nir_opt_dce_impl(nir_function_impl *impl)
       init_block(block, worklist);
    }
 
-   nir_instr *instr = NULL;
-   nir_instr_worklist_foreach(worklist, instr)
+   nir_foreach_instr_in_worklist(instr, worklist)
       nir_foreach_src(instr, mark_live_cb, worklist);
 
    nir_instr_worklist_destroy(worklist);
@@ -139,9 +145,14 @@ nir_opt_dce_impl(nir_function_impl *impl)
       }
    }
 
-   if (progress)
+   if (progress) {
       nir_metadata_preserve(impl, nir_metadata_block_index |
                                   nir_metadata_dominance);
+   } else {
+#ifndef NDEBUG
+      impl->valid_metadata &= ~nir_metadata_not_properly_reset;
+#endif
+   }
 
    return progress;
 }