nir/xfb: do not use bare interface type
[mesa.git] / src / compiler / nir / nir_lower_indirect_derefs.c
index 897a0620872eabef5f8388d8ea5f37cddcd1b3fe..1e1e84fb3b0e54faaaa5524da11a270c02246ad1 100644 (file)
@@ -40,9 +40,8 @@ emit_indirect_load_store_deref(nir_builder *b, nir_intrinsic_instr *orig_instr,
 {
    assert(start < end);
    if (start == end - 1) {
-      nir_ssa_def *index = nir_imm_int(b, start);
       emit_load_store_deref(b, orig_instr,
-                            nir_build_deref_array(b, parent, index),
+                            nir_build_deref_array_imm(b, parent, start),
                             deref_arr + 1, dest, src);
    } else {
       int mid = start + (end - start) / 2;
@@ -135,7 +134,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 +142,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
@@ -205,9 +204,6 @@ nir_lower_indirect_derefs(nir_shader *shader, nir_variable_mode modes)
 {
    bool progress = false;
 
-   if (modes == 0)
-      return false;
-
    nir_foreach_function(function, shader) {
       if (function->impl)
          progress = lower_indirects_impl(function->impl, modes) || progress;