nir/lower_io_arrays_to_elements: Look at derefs for modes
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 13 Dec 2018 20:33:41 +0000 (14:33 -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_lower_io_arrays_to_elements.c

index f0bc487d6bec720378401550b62f0f486ac9cc9f..4453eaa1f48626b32dab700bd1c0e633e8901e20 100644 (file)
@@ -229,11 +229,11 @@ create_indirects_mask(nir_shader *shader, uint64_t *indirects,
                   continue;
 
                nir_deref_instr *deref = nir_src_as_deref(intr->src[0]);
-               nir_variable *var = nir_deref_instr_get_variable(deref);
-
-               if (var->data.mode != mode)
+               if (deref->mode != mode)
                   continue;
 
+               nir_variable *var = nir_deref_instr_get_variable(deref);
+
                nir_deref_path path;
                nir_deref_path_init(&path, deref, NULL);
 
@@ -278,8 +278,11 @@ lower_io_arrays_to_elements(nir_shader *shader, nir_variable_mode mask,
                    intr->intrinsic != nir_intrinsic_interp_deref_at_offset)
                   continue;
 
-               nir_variable *var =
-                  nir_deref_instr_get_variable(nir_src_as_deref(intr->src[0]));
+               nir_deref_instr *deref = nir_src_as_deref(intr->src[0]);
+               if (!(deref->mode & mask))
+                  continue;
+
+               nir_variable *var = nir_deref_instr_get_variable(deref);
 
                /* Skip indirects */
                uint64_t loc_mask = ((uint64_t)1) << var->data.location;