- return path_may_be_aliased_node(get_deref_node_for_var(var, state),
- &path->path[1], state);
+ /* First see if this variable is ever used by anything other than a
+ * load/store. If there's even so much as a cast in the way, we have to
+ * assume aliasing and bail.
+ */
+ if (var_node->has_complex_use)
+ return true;
+
+ return path_may_be_aliased_node(var_node, &path->path[1], state);
+}
+
+static void
+register_complex_use(nir_deref_instr *deref,
+ struct lower_variables_state *state)
+{
+ assert(deref->deref_type == nir_deref_type_var);
+ struct deref_node *node = get_deref_node_for_var(deref->var, state);
+ if (node == NULL)
+ return;
+
+ node->has_complex_use = true;