nir: Add an options parameter to deref_instr_has_complex_use
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 2 Mar 2021 03:22:06 +0000 (21:22 -0600)
committerMarge Bot <emma+marge@anholt.net>
Fri, 24 Jun 2022 19:21:26 +0000 (19:21 +0000)
Reviewed-by: Kristian H. Kristensen <hoegsberg@gmail.com>
Reviewed-by: Jason Ekstrand <jason.ekstrand@collabora.com> (1.5 years later)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13166>

src/compiler/nir/nir.h
src/compiler/nir/nir_deref.c
src/compiler/nir/nir_lower_const_arrays_to_uniforms.c
src/compiler/nir/nir_lower_vars_to_ssa.c
src/compiler/nir/nir_opt_large_constants.c
src/compiler/nir/nir_split_vars.c

index a64513d..08ffa82 100644 (file)
@@ -1686,7 +1686,14 @@ nir_deref_instr_get_variable(const nir_deref_instr *instr)
 
 bool nir_deref_instr_has_indirect(nir_deref_instr *instr);
 bool nir_deref_instr_is_known_out_of_bounds(nir_deref_instr *instr);
-bool nir_deref_instr_has_complex_use(nir_deref_instr *instr);
+
+typedef enum {
+   nir_deref_instr_has_complex_use_allow_memcpy_src = (1 << 0),
+   nir_deref_instr_has_complex_use_allow_memcpy_dst = (1 << 1),
+} nir_deref_instr_has_complex_use_options;
+
+bool nir_deref_instr_has_complex_use(nir_deref_instr *instr,
+                                     nir_deref_instr_has_complex_use_options opts);
 
 bool nir_deref_instr_remove_if_unused(nir_deref_instr *instr);
 
index f9d599c..9e46d0a 100644 (file)
@@ -154,7 +154,8 @@ nir_deref_instr_is_known_out_of_bounds(nir_deref_instr *instr)
 }
 
 bool
-nir_deref_instr_has_complex_use(nir_deref_instr *deref)
+nir_deref_instr_has_complex_use(nir_deref_instr *deref,
+                                nir_deref_instr_has_complex_use_options opts)
 {
    nir_foreach_use(use_src, &deref->dest.ssa) {
       nir_instr *use_instr = use_src->parent_instr;
@@ -184,7 +185,7 @@ nir_deref_instr_has_complex_use(nir_deref_instr *deref)
              use_deref->deref_type != nir_deref_type_array)
             return true;
 
-         if (nir_deref_instr_has_complex_use(use_deref))
+         if (nir_deref_instr_has_complex_use(use_deref, opts))
             return true;
 
          continue;
@@ -214,6 +215,15 @@ nir_deref_instr_has_complex_use(nir_deref_instr *deref)
                continue;
             return true;
 
+         case nir_intrinsic_memcpy_deref:
+            if (use_src == &use_intrin->src[0] &&
+                (opts & nir_deref_instr_has_complex_use_allow_memcpy_dst))
+               continue;
+            if (use_src == &use_intrin->src[1] &&
+                (opts & nir_deref_instr_has_complex_use_allow_memcpy_src))
+               continue;
+            return true;
+
          default:
             return true;
          }
index d7efdf6..72dc706 100644 (file)
@@ -273,7 +273,7 @@ nir_lower_const_arrays_to_uniforms(nir_shader *shader,
             nir_deref_instr *deref = nir_instr_as_deref(instr);
             if (deref->deref_type == nir_deref_type_var &&
                 deref->var->data.mode == nir_var_function_temp &&
-                nir_deref_instr_has_complex_use(deref))
+                nir_deref_instr_has_complex_use(deref, 0))
                var_infos[deref->var->index].is_constant = false;
             continue;
          }
index 292366a..e69a928 100644 (file)
@@ -460,7 +460,7 @@ register_variable_uses(nir_function_impl *impl,
             nir_deref_instr *deref = nir_instr_as_deref(instr);
 
             if (deref->deref_type == nir_deref_type_var &&
-                nir_deref_instr_has_complex_use(deref))
+                nir_deref_instr_has_complex_use(deref, 0))
                register_complex_use(deref, state);
 
             break;
index 1e032f1..08002b2 100644 (file)
@@ -206,7 +206,7 @@ nir_opt_large_constants(nir_shader *shader,
             nir_deref_instr *deref = nir_instr_as_deref(instr);
             if (deref->deref_type == nir_deref_type_var &&
                 deref->var->data.mode == nir_var_function_temp &&
-                nir_deref_instr_has_complex_use(deref))
+                nir_deref_instr_has_complex_use(deref, 0))
                var_infos[deref->var->index].is_constant = false;
             continue;
          }
index ca1a5d2..d7894c3 100644 (file)
@@ -49,7 +49,7 @@ get_complex_used_vars(nir_shader *shader, void *mem_ctx)
              * nir_deref_instr_has_complex_use is recursive.
              */
             if (deref->deref_type == nir_deref_type_var &&
-                nir_deref_instr_has_complex_use(deref))
+                nir_deref_instr_has_complex_use(deref, 0))
                _mesa_set_add(complex_vars, deref->var);
          }
       }
@@ -1044,7 +1044,7 @@ mark_deref_if_complex(nir_deref_instr *deref,
    if (!(deref->var->data.mode & modes))
       return;
 
-   if (!nir_deref_instr_has_complex_use(deref))
+   if (!nir_deref_instr_has_complex_use(deref, 0))
       return;
 
    struct vec_var_usage *usage =