nir/lower_io_arrays_to_elements: Look at derefs for modes

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>
This commit is contained in:
Jason Ekstrand 2018-12-13 14:33:41 -06:00
parent 8cc0f92492
commit 3fe0363dda
1 changed files with 8 additions and 5 deletions

View 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;