nir/validate: Validate if_uses on registers

Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
This commit is contained in:
Jason Ekstrand 2015-02-04 13:58:12 -08:00
parent 98ecb25f89
commit 34952b5671
1 changed files with 44 additions and 18 deletions

View File

@ -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;