nir/vars_to_ssa: Don't build deref nodes for non-local variables
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 9 Jul 2018 04:55:40 +0000 (21:55 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 22 Aug 2018 19:17:38 +0000 (14:17 -0500)
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
src/compiler/nir/nir_lower_vars_to_ssa.c

index 3f37acaed33f7c752da946e6ac25821a1c6cb118..cd679be5be5f24c61f5d43fba2bf16cddee3be80 100644 (file)
@@ -206,6 +206,12 @@ get_deref_node_recur(nir_deref_instr *deref,
 static struct deref_node *
 get_deref_node(nir_deref_instr *deref, struct lower_variables_state *state)
 {
+   /* This pass only works on local variables.  Just ignore any derefs with
+    * a non-local mode.
+    */
+   if (deref->mode != nir_var_local)
+      return NULL;
+
    struct deref_node *node = get_deref_node_recur(deref, state);
    if (!node)
       return NULL;
@@ -506,6 +512,9 @@ rename_variables(struct lower_variables_state *state)
          switch (intrin->intrinsic) {
          case nir_intrinsic_load_deref: {
             nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]);
+            if (deref->mode != nir_var_local)
+               continue;
+
             struct deref_node *node = get_deref_node(deref, state);
             if (node == NULL) {
                /* If we hit this path then we are referencing an invalid
@@ -553,6 +562,9 @@ rename_variables(struct lower_variables_state *state)
 
          case nir_intrinsic_store_deref: {
             nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]);
+            if (deref->mode != nir_var_local)
+               continue;
+
             struct deref_node *node = get_deref_node(deref, state);
 
             assert(intrin->src[1].is_ssa);
@@ -678,10 +690,8 @@ nir_lower_vars_to_ssa_impl(nir_function_impl *impl)
       assert(path->path[0]->deref_type == nir_deref_type_var);
       nir_variable *var = path->path[0]->var;
 
-      if (var->data.mode != nir_var_local) {
-         exec_node_remove(&node->direct_derefs_link);
-         continue;
-      }
+      /* We don't build deref nodes for non-local variables */
+      assert(var->data.mode == nir_var_local);
 
       if (path_may_be_aliased(path, &state)) {
          exec_node_remove(&node->direct_derefs_link);