[Mesa-dev] [PATCH 3/7] nir/lower_io_arrays_to_elements: Look at derefs for modes
Jason Ekstrand
jason at jlekstrand.net
Tue Dec 18 04:44:35 UTC 2018
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).
---
src/compiler/nir/nir_lower_io_arrays_to_elements.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/compiler/nir/nir_lower_io_arrays_to_elements.c b/src/compiler/nir/nir_lower_io_arrays_to_elements.c
index b9b3cdb2335..34020249199 100644
--- a/src/compiler/nir/nir_lower_io_arrays_to_elements.c
+++ b/src/compiler/nir/nir_lower_io_arrays_to_elements.c
@@ -227,11 +227,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);
@@ -276,8 +276,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;
--
2.19.2
More information about the mesa-dev
mailing list