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));
* 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);
{
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)
{
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)
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)
}
if (!progress) {
-#ifndef NDEBUG
- impl->valid_metadata &= ~nir_metadata_not_properly_reset;
-#endif
+ nir_metadata_preserve(impl, nir_metadata_all);
return false;
}
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)
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) {