nir/algebraic: mark some optimizations with fsat(NaN) as inexact
[mesa.git] / src / compiler / nir / nir_lower_vars_to_ssa.c
index d04d84f9e20b560b0e6ff56c373969b7c1dff9fd..30870e6e35c41b239687d63fbdc70ee9774bba98 100644 (file)
@@ -161,6 +161,9 @@ get_deref_node_recur(nir_deref_instr *deref,
    if (parent == NULL)
       return NULL;
 
+   if (parent == UNDEF_NODE)
+      return UNDEF_NODE;
+
    switch (deref->deref_type) {
    case nir_deref_type_struct:
       assert(glsl_type_is_struct_or_ifc(parent->type));
@@ -232,7 +235,8 @@ get_deref_node(nir_deref_instr *deref, struct lower_variables_state *state)
     * already in the list and we only bother for deref nodes which are used
     * directly in a load or store.
     */
-   if (node->is_direct && state->add_to_direct_deref_nodes &&
+   if (node != UNDEF_NODE && node->is_direct &&
+       state->add_to_direct_deref_nodes &&
        node->direct_derefs_link.next == NULL) {
       nir_deref_path_init(&node->path, deref, state->dead_ctx);
       assert(deref->var != NULL);
@@ -404,7 +408,7 @@ register_load_instr(nir_intrinsic_instr *load_instr,
 {
    nir_deref_instr *deref = nir_src_as_deref(load_instr->src[0]);
    struct deref_node *node = get_deref_node(deref, state);
-   if (node == NULL)
+   if (node == NULL || node == UNDEF_NODE)
       return;
 
    if (node->loads == NULL)
@@ -419,7 +423,7 @@ register_store_instr(nir_intrinsic_instr *store_instr,
 {
    nir_deref_instr *deref = nir_src_as_deref(store_instr->src[0]);
    struct deref_node *node = get_deref_node(deref, state);
-   if (node == NULL)
+   if (node == NULL || node == UNDEF_NODE)
       return;
 
    if (node->stores == NULL)
@@ -435,7 +439,7 @@ register_copy_instr(nir_intrinsic_instr *copy_instr,
    for (unsigned idx = 0; idx < 2; idx++) {
       nir_deref_instr *deref = nir_src_as_deref(copy_instr->src[idx]);
       struct deref_node *node = get_deref_node(deref, state);
-      if (node == NULL)
+      if (node == NULL || node == UNDEF_NODE)
          continue;
 
       if (node->copies == NULL)
@@ -746,9 +750,7 @@ nir_lower_vars_to_ssa_impl(nir_function_impl *impl)
    }
 
    if (!progress) {
-#ifndef NDEBUG
-      impl->valid_metadata &= ~nir_metadata_not_properly_reset;
-#endif
+      nir_metadata_preserve(impl, nir_metadata_all);
       return false;
    }
 
@@ -764,7 +766,9 @@ nir_lower_vars_to_ssa_impl(nir_function_impl *impl)
 
    state.phi_builder = nir_phi_builder_create(state.impl);
 
-   NIR_VLA(BITSET_WORD, store_blocks, BITSET_WORDS(state.impl->num_blocks));
+   BITSET_WORD *store_blocks =
+      ralloc_array(state.dead_ctx, BITSET_WORD,
+                   BITSET_WORDS(state.impl->num_blocks));
    foreach_list_typed(struct deref_node, node, direct_derefs_link,
                       &state.direct_deref_nodes) {
       if (!node->lower_to_ssa)
@@ -773,7 +777,8 @@ nir_lower_vars_to_ssa_impl(nir_function_impl *impl)
       memset(store_blocks, 0,
              BITSET_WORDS(state.impl->num_blocks) * sizeof(*store_blocks));
 
-      assert(node->path.path[0]->var->constant_initializer == NULL);
+      assert(node->path.path[0]->var->constant_initializer == NULL &&
+             node->path.path[0]->var->pointer_initializer == NULL);
 
       if (node->stores) {
          set_foreach(node->stores, store_entry) {