nir: handle shared pointers in lowering indirect derefs.

Check if the base ends up with no variable, and continue
if we see that case outside the loop.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
Dave Airlie 2018-11-19 13:54:33 +10:00
parent 760859cac2
commit c8a35285f0
1 changed files with 2 additions and 2 deletions

View File

@ -135,7 +135,7 @@ lower_indirect_derefs_block(nir_block *block, nir_builder *b,
/* Walk the deref chain back to the base and look for indirects */
bool has_indirect = false;
nir_deref_instr *base = deref;
while (base->deref_type != nir_deref_type_var) {
while (base && base->deref_type != nir_deref_type_var) {
if (base->deref_type == nir_deref_type_array &&
!nir_src_is_const(base->arr.index))
has_indirect = true;
@ -143,7 +143,7 @@ lower_indirect_derefs_block(nir_block *block, nir_builder *b,
base = nir_deref_instr_parent(base);
}
if (!has_indirect)
if (!has_indirect || !base)
continue;
/* Only lower variables whose mode is in the mask, or compact