[Mesa-dev] [PATCH 007/133] nir: add a validation pass

Eric Anholt eric at anholt.net
Wed Dec 17 23:01:48 PST 2014


Jason Ekstrand <jason at jlekstrand.net> writes:

> From: Connor Abbott <connor.abbott at intel.com>
>
> This is similar to ir_validate.cpp.
>
> v2: Jason Ekstrand <jason.ekstrand at intel.com>:
>    whitespace fixes

I have again not reviewed the control flow bits.  Couple of questions I
had, though:

> +static void
> +validate_var_use(nir_variable *var, validate_state *state)
> +{
> +   if (var->data.mode == nir_var_local) {
> +      struct hash_entry *entry =
> +         _mesa_hash_table_search(state->var_defs, _mesa_hash_pointer(var),
> +                                 var);
> +
> +      assert(entry);
> +      assert((nir_function_impl *) entry->data == state->impl);
> +   }
> +}

Is there guaranteed to be a def of a local variable before a use?  It
would be undefined execution behavior, but not assertion failure
quality, right?

> +static void
> +postvalidate_reg_decl(nir_register *reg, validate_state *state)
> +{
> +   struct hash_entry *entry = _mesa_hash_table_search(state->regs,
> +                                                      _mesa_hash_pointer(reg),
> +                                                      reg);
> +
> +   reg_validate_state *reg_state = (reg_validate_state *) entry->data;
> +
> +   if (reg_state->uses->entries != reg->uses->entries) {
> +      printf("extra entries in register uses:\n");
> +      struct set_entry *entry;
> +      set_foreach(reg->uses, entry) {
> +         struct set_entry *entry2 =
> +            _mesa_set_search(reg_state->uses, _mesa_hash_pointer(entry->key),
> +                             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;
> +      set_foreach(reg->defs, entry) {
> +         struct set_entry *entry2 =
> +            _mesa_set_search(reg_state->defs, _mesa_hash_pointer(entry->key),
> +                             entry->key);
> +
> +         if (entry2 == NULL) {
> +            printf("%p\n", entry->key);
> +         }
> +      }

Couldn't these failures go the other way and there be, for example,
defs that weren't tracked in the reg?

(Not necessarily important to fix, since you'll at least get the
abort())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141217/1f90a830/attachment.sig>


More information about the mesa-dev mailing list