nir: move getting deref from var after we check deref type.
authorDave Airlie <airlied@redhat.com>
Mon, 19 Nov 2018 03:51:48 +0000 (13:51 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 19 Nov 2018 19:36:38 +0000 (05:36 +1000)
I posted a load of hacks before to do this, Jason suggested this,
just check the deref mode, not the variable mode and delay getting
the variable until we know the type.

avoids crashes when derefing shared memory pointers.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/nir/nir_gather_info.c

index 15d38f036b5bbfa23467a046dc72cb4eed8344de..7eaa4c27c1f224b8d171de20048bcae0f3a8d689 100644 (file)
@@ -210,10 +210,9 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
    case nir_intrinsic_load_deref:
    case nir_intrinsic_store_deref:{
       nir_deref_instr *deref = nir_src_as_deref(instr->src[0]);
-      nir_variable *var = nir_deref_instr_get_variable(deref);
-
-      if (var->data.mode == nir_var_shader_in ||
-          var->data.mode == nir_var_shader_out) {
+      if (deref->mode == nir_var_shader_in ||
+          deref->mode == nir_var_shader_out) {
+         nir_variable *var = nir_deref_instr_get_variable(deref);
          bool is_output_read = false;
          if (var->data.mode == nir_var_shader_out &&
              instr->intrinsic == nir_intrinsic_load_deref)