From 34952b56716a0f97812d68cd69540ab6bcc54c82 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 4 Feb 2015 13:58:12 -0800 Subject: [PATCH] nir/validate: Validate if_uses on registers Reviewed-by: Connor Abbott --- src/glsl/nir/nir_validate.c | 62 ++++++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/src/glsl/nir/nir_validate.c b/src/glsl/nir/nir_validate.c index a34a017..13010ae 100644 --- a/src/glsl/nir/nir_validate.c +++ b/src/glsl/nir/nir_validate.c @@ -46,7 +46,7 @@ typedef struct { * equivalent to the uses and defs in nir_register, but built up by the * validator. At the end, we verify that the sets have the same entries. */ - struct set *uses, *defs; + struct set *uses, *if_uses, *defs; nir_function_impl *where_defined; /* NULL for global registers */ } reg_validate_state; @@ -92,16 +92,22 @@ validate_reg_src(nir_reg_src *src, validate_state *state) { assert(src->reg != NULL); - struct set_entry *entry = _mesa_set_search(src->reg->uses, state->instr); - assert(entry && "use not in nir_register.uses"); + struct hash_entry *entry; + entry = _mesa_hash_table_search(state->regs, src->reg); + assert(entry); - struct hash_entry *entry2; - entry2 = _mesa_hash_table_search(state->regs, src->reg); + reg_validate_state *reg_state = (reg_validate_state *) entry->data; - assert(entry2); + if (state->instr) { + _mesa_set_add(reg_state->uses, state->instr); - reg_validate_state *reg_state = (reg_validate_state *) entry2->data; - _mesa_set_add(reg_state->uses, state->instr); + assert(_mesa_set_search(src->reg->uses, state->instr)); + } else { + assert(state->if_stmt); + _mesa_set_add(reg_state->if_uses, state->if_stmt); + + assert(_mesa_set_search(src->reg->if_uses, state->if_stmt)); + } if (!src->reg->is_global) { assert(reg_state->where_defined == state->impl && @@ -134,7 +140,12 @@ validate_ssa_src(nir_ssa_def *def, validate_state *state) struct set_entry *entry2; - entry2 = _mesa_set_search(def->uses, state->instr); + if (state->instr) { + entry2 = _mesa_set_search(def->uses, state->instr); + } else { + assert(state->if_stmt); + entry2 = _mesa_set_search(def->if_uses, state->if_stmt); + } assert(entry2 && "SSA use missing"); @@ -484,6 +495,8 @@ validate_instr(nir_instr *instr, validate_state *state) assert(!"Invalid ALU instruction type"); break; } + + state->instr = NULL; } static void @@ -501,6 +514,7 @@ validate_phi_src(nir_phi_instr *instr, nir_block *pred, validate_state *state) instr->dest.ssa.num_components); validate_src(&src->src, state); + state->instr = NULL; return; } } @@ -562,6 +576,8 @@ validate_block(nir_block *block, validate_state *state) static void validate_if(nir_if *if_stmt, validate_state *state) { + state->if_stmt = if_stmt; + assert(!exec_node_is_head_sentinel(if_stmt->cf_node.node.prev)); nir_cf_node *prev_node = nir_cf_node_prev(&if_stmt->cf_node); assert(prev_node->type == nir_cf_node_block); @@ -576,15 +592,7 @@ validate_if(nir_if *if_stmt, validate_state *state) nir_cf_node *next_node = nir_cf_node_next(&if_stmt->cf_node); assert(next_node->type == nir_cf_node_block); - if (!if_stmt->condition.is_ssa) { - nir_register *reg = if_stmt->condition.reg.reg; - struct set_entry *entry = _mesa_set_search(reg->if_uses, if_stmt); - assert(entry); - } else { - nir_ssa_def *def = if_stmt->condition.ssa; - struct set_entry *entry = _mesa_set_search(def->if_uses, if_stmt); - assert(entry); - } + validate_src(&if_stmt->condition, state); assert(!exec_list_is_empty(&if_stmt->then_list)); assert(!exec_list_is_empty(&if_stmt->else_list)); @@ -603,6 +611,7 @@ validate_if(nir_if *if_stmt, validate_state *state) } state->parent_node = old_parent; + state->if_stmt = NULL; } static void @@ -672,6 +681,8 @@ prevalidate_reg_decl(nir_register *reg, bool is_global, validate_state *state) reg_validate_state *reg_state = ralloc(state->regs, reg_validate_state); reg_state->uses = _mesa_set_create(reg_state, _mesa_hash_pointer, _mesa_key_pointer_equal); + reg_state->if_uses = _mesa_set_create(reg_state, _mesa_hash_pointer, + _mesa_key_pointer_equal); reg_state->defs = _mesa_set_create(reg_state, _mesa_hash_pointer, _mesa_key_pointer_equal); @@ -702,6 +713,21 @@ postvalidate_reg_decl(nir_register *reg, validate_state *state) abort(); } + if (reg_state->if_uses->entries != reg->if_uses->entries) { + printf("extra entries in register if_uses:\n"); + struct set_entry *entry; + set_foreach(reg->if_uses, entry) { + struct set_entry *entry2 = + _mesa_set_search(reg_state->if_uses, entry->key); + + if (entry2 == NULL) { + printf("%p\n", entry->key); + } + } + + abort(); + } + if (reg_state->defs->entries != reg->defs->entries) { printf("extra entries in register defs:\n"); struct set_entry *entry; -- 2.7.4