nir/linking_helpers: Look at derefs for modes
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 13 Dec 2018 20:31:54 +0000 (14:31 -0600)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 18 Dec 2018 19:13:28 +0000 (13:13 -0600)
This is instead of looking all the way back to the variable which may
not exist for all derefs.  This makes this code properly ignore casts
with modes other than the mode[s] we care about (where casts aren't
allowed).

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/nir/nir_linking_helpers.c

index 1ab9c09565725dc45f9c89680b0c40ec0ba457e4..ffe2d3702264380a474e587b81b1e6349280fb01 100644 (file)
@@ -75,12 +75,11 @@ tcs_add_output_reads(nir_shader *shader, uint64_t *read, uint64_t *patches_read)
             if (intrin->intrinsic != nir_intrinsic_load_deref)
                continue;
 
-            nir_variable *var =
-               nir_deref_instr_get_variable(nir_src_as_deref(intrin->src[0]));
-
-            if (var->data.mode != nir_var_shader_out)
+            nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]);
+            if (deref->mode != nir_var_shader_out)
                continue;
 
+            nir_variable *var = nir_deref_instr_get_variable(deref);
             if (var->data.patch) {
                patches_read[var->data.location_frac] |=
                   get_variable_io_mask(var, shader->info.stage);
@@ -565,12 +564,12 @@ static bool
 try_replace_constant_input(nir_shader *shader,
                            nir_intrinsic_instr *store_intr)
 {
-   nir_variable *out_var =
-      nir_deref_instr_get_variable(nir_src_as_deref(store_intr->src[0]));
-
-   if (out_var->data.mode != nir_var_shader_out)
+   nir_deref_instr *out_deref = nir_src_as_deref(store_intr->src[0]);
+   if (out_deref->mode != nir_var_shader_out)
       return false;
 
+   nir_variable *out_var = nir_deref_instr_get_variable(out_deref);
+
    /* Skip types that require more complex handling.
     * TODO: add support for these types.
     */
@@ -605,12 +604,12 @@ try_replace_constant_input(nir_shader *shader,
          if (intr->intrinsic != nir_intrinsic_load_deref)
             continue;
 
-         nir_variable *in_var =
-            nir_deref_instr_get_variable(nir_src_as_deref(intr->src[0]));
-
-         if (in_var->data.mode != nir_var_shader_in)
+         nir_deref_instr *in_deref = nir_src_as_deref(intr->src[0]);
+         if (in_deref->mode != nir_var_shader_in)
             continue;
 
+         nir_variable *in_var = nir_deref_instr_get_variable(in_deref);
+
          if (in_var->data.location != out_var->data.location ||
              in_var->data.location_frac != out_var->data.location_frac)
             continue;