Home | History | Annotate | Download | only in nir
      1 /*
      2  * Copyright  2014 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  * IN THE SOFTWARE.
     22  *
     23  * Authors:
     24  *    Connor Abbott (cwabbott0 (at) gmail.com)
     25  *
     26  */
     27 
     28 #include "nir.h"
     29 #include <assert.h>
     30 
     31 /*
     32  * This file checks for invalid IR indicating a bug somewhere in the compiler.
     33  */
     34 
     35 /* Since this file is just a pile of asserts, don't bother compiling it if
     36  * we're not building a debug build.
     37  */
     38 #ifdef DEBUG
     39 
     40 /*
     41  * Per-register validation state.
     42  */
     43 
     44 typedef struct {
     45    /*
     46     * equivalent to the uses and defs in nir_register, but built up by the
     47     * validator. At the end, we verify that the sets have the same entries.
     48     */
     49    struct set *uses, *if_uses, *defs;
     50    nir_function_impl *where_defined; /* NULL for global registers */
     51 } reg_validate_state;
     52 
     53 typedef struct {
     54    /*
     55     * equivalent to the uses in nir_ssa_def, but built up by the validator.
     56     * At the end, we verify that the sets have the same entries.
     57     */
     58    struct set *uses, *if_uses;
     59    nir_function_impl *where_defined;
     60 } ssa_def_validate_state;
     61 
     62 typedef struct {
     63    /* map of register -> validation state (struct above) */
     64    struct hash_table *regs;
     65 
     66    /* the current shader being validated */
     67    nir_shader *shader;
     68 
     69    /* the current instruction being validated */
     70    nir_instr *instr;
     71 
     72    /* the current variable being validated */
     73    nir_variable *var;
     74 
     75    /* the current basic block being validated */
     76    nir_block *block;
     77 
     78    /* the current if statement being validated */
     79    nir_if *if_stmt;
     80 
     81    /* the current loop being visited */
     82    nir_loop *loop;
     83 
     84    /* the parent of the current cf node being visited */
     85    nir_cf_node *parent_node;
     86 
     87    /* the current function implementation being validated */
     88    nir_function_impl *impl;
     89 
     90    /* map of SSA value -> function implementation where it is defined */
     91    struct hash_table *ssa_defs;
     92 
     93    /* bitset of ssa definitions we have found; used to check uniqueness */
     94    BITSET_WORD *ssa_defs_found;
     95 
     96    /* bitset of registers we have currently found; used to check uniqueness */
     97    BITSET_WORD *regs_found;
     98 
     99    /* map of local variable -> function implementation where it is defined */
    100    struct hash_table *var_defs;
    101 
    102    /* map of instruction/var/etc to failed assert string */
    103    struct hash_table *errors;
    104 } validate_state;
    105 
    106 static void
    107 log_error(validate_state *state, const char *cond, const char *file, int line)
    108 {
    109    const void *obj;
    110 
    111    if (state->instr)
    112       obj = state->instr;
    113    else if (state->var)
    114       obj = state->var;
    115    else
    116       obj = cond;
    117 
    118    char *msg = ralloc_asprintf(state->errors, "error: %s (%s:%d)",
    119                                cond, file, line);
    120 
    121    _mesa_hash_table_insert(state->errors, obj, msg);
    122 }
    123 
    124 #define validate_assert(state, cond) do {             \
    125       if (!(cond))                                    \
    126          log_error(state, #cond, __FILE__, __LINE__); \
    127    } while (0)
    128 
    129 static void validate_src(nir_src *src, validate_state *state);
    130 
    131 static void
    132 validate_reg_src(nir_src *src, validate_state *state)
    133 {
    134    validate_assert(state, src->reg.reg != NULL);
    135 
    136    struct hash_entry *entry;
    137    entry = _mesa_hash_table_search(state->regs, src->reg.reg);
    138    validate_assert(state, entry);
    139 
    140    reg_validate_state *reg_state = (reg_validate_state *) entry->data;
    141 
    142    if (state->instr) {
    143       _mesa_set_add(reg_state->uses, src);
    144    } else {
    145       validate_assert(state, state->if_stmt);
    146       _mesa_set_add(reg_state->if_uses, src);
    147    }
    148 
    149    if (!src->reg.reg->is_global) {
    150       validate_assert(state, reg_state->where_defined == state->impl &&
    151              "using a register declared in a different function");
    152    }
    153 
    154    validate_assert(state, (src->reg.reg->num_array_elems == 0 ||
    155           src->reg.base_offset < src->reg.reg->num_array_elems) &&
    156           "definitely out-of-bounds array access");
    157 
    158    if (src->reg.indirect) {
    159       validate_assert(state, src->reg.reg->num_array_elems != 0);
    160       validate_assert(state, (src->reg.indirect->is_ssa ||
    161               src->reg.indirect->reg.indirect == NULL) &&
    162              "only one level of indirection allowed");
    163       validate_src(src->reg.indirect, state);
    164    }
    165 }
    166 
    167 static void
    168 validate_ssa_src(nir_src *src, validate_state *state)
    169 {
    170    validate_assert(state, src->ssa != NULL);
    171 
    172    struct hash_entry *entry = _mesa_hash_table_search(state->ssa_defs, src->ssa);
    173 
    174    validate_assert(state, entry);
    175 
    176    if (!entry)
    177       return;
    178 
    179    ssa_def_validate_state *def_state = (ssa_def_validate_state *)entry->data;
    180 
    181    validate_assert(state, def_state->where_defined == state->impl &&
    182           "using an SSA value defined in a different function");
    183 
    184    if (state->instr) {
    185       _mesa_set_add(def_state->uses, src);
    186    } else {
    187       validate_assert(state, state->if_stmt);
    188       _mesa_set_add(def_state->if_uses, src);
    189    }
    190 
    191    /* TODO validate that the use is dominated by the definition */
    192 }
    193 
    194 static void
    195 validate_src(nir_src *src, validate_state *state)
    196 {
    197    if (state->instr)
    198       validate_assert(state, src->parent_instr == state->instr);
    199    else
    200       validate_assert(state, src->parent_if == state->if_stmt);
    201 
    202    if (src->is_ssa)
    203       validate_ssa_src(src, state);
    204    else
    205       validate_reg_src(src, state);
    206 }
    207 
    208 static void
    209 validate_alu_src(nir_alu_instr *instr, unsigned index, validate_state *state)
    210 {
    211    nir_alu_src *src = &instr->src[index];
    212 
    213    unsigned num_components;
    214    unsigned src_bit_size;
    215    if (src->src.is_ssa) {
    216       src_bit_size = src->src.ssa->bit_size;
    217       num_components = src->src.ssa->num_components;
    218    } else {
    219       src_bit_size = src->src.reg.reg->bit_size;
    220       if (src->src.reg.reg->is_packed)
    221          num_components = 4; /* can't check anything */
    222       else
    223          num_components = src->src.reg.reg->num_components;
    224    }
    225    for (unsigned i = 0; i < 4; i++) {
    226       validate_assert(state, src->swizzle[i] < 4);
    227 
    228       if (nir_alu_instr_channel_used(instr, index, i))
    229          validate_assert(state, src->swizzle[i] < num_components);
    230    }
    231 
    232    nir_alu_type src_type = nir_op_infos[instr->op].input_types[index];
    233 
    234    /* 8-bit float isn't a thing */
    235    if (nir_alu_type_get_base_type(src_type) == nir_type_float)
    236       validate_assert(state, src_bit_size == 16 || src_bit_size == 32 || src_bit_size == 64);
    237 
    238    if (nir_alu_type_get_type_size(src_type)) {
    239       /* This source has an explicit bit size */
    240       validate_assert(state, nir_alu_type_get_type_size(src_type) == src_bit_size);
    241    } else {
    242       if (!nir_alu_type_get_type_size(nir_op_infos[instr->op].output_type)) {
    243          unsigned dest_bit_size =
    244             instr->dest.dest.is_ssa ? instr->dest.dest.ssa.bit_size
    245                                     : instr->dest.dest.reg.reg->bit_size;
    246          validate_assert(state, dest_bit_size == src_bit_size);
    247       }
    248    }
    249 
    250    validate_src(&src->src, state);
    251 }
    252 
    253 static void
    254 validate_reg_dest(nir_reg_dest *dest, validate_state *state)
    255 {
    256    validate_assert(state, dest->reg != NULL);
    257 
    258    validate_assert(state, dest->parent_instr == state->instr);
    259 
    260    struct hash_entry *entry2;
    261    entry2 = _mesa_hash_table_search(state->regs, dest->reg);
    262 
    263    validate_assert(state, entry2);
    264 
    265    reg_validate_state *reg_state = (reg_validate_state *) entry2->data;
    266    _mesa_set_add(reg_state->defs, dest);
    267 
    268    if (!dest->reg->is_global) {
    269       validate_assert(state, reg_state->where_defined == state->impl &&
    270              "writing to a register declared in a different function");
    271    }
    272 
    273    validate_assert(state, (dest->reg->num_array_elems == 0 ||
    274           dest->base_offset < dest->reg->num_array_elems) &&
    275           "definitely out-of-bounds array access");
    276 
    277    if (dest->indirect) {
    278       validate_assert(state, dest->reg->num_array_elems != 0);
    279       validate_assert(state, (dest->indirect->is_ssa || dest->indirect->reg.indirect == NULL) &&
    280              "only one level of indirection allowed");
    281       validate_src(dest->indirect, state);
    282    }
    283 }
    284 
    285 static void
    286 validate_ssa_def(nir_ssa_def *def, validate_state *state)
    287 {
    288    validate_assert(state, def->index < state->impl->ssa_alloc);
    289    validate_assert(state, !BITSET_TEST(state->ssa_defs_found, def->index));
    290    BITSET_SET(state->ssa_defs_found, def->index);
    291 
    292    validate_assert(state, def->parent_instr == state->instr);
    293 
    294    validate_assert(state, def->num_components <= 4);
    295 
    296    list_validate(&def->uses);
    297    list_validate(&def->if_uses);
    298 
    299    ssa_def_validate_state *def_state = ralloc(state->ssa_defs,
    300                                               ssa_def_validate_state);
    301    def_state->where_defined = state->impl;
    302    def_state->uses = _mesa_set_create(def_state, _mesa_hash_pointer,
    303                                       _mesa_key_pointer_equal);
    304    def_state->if_uses = _mesa_set_create(def_state, _mesa_hash_pointer,
    305                                          _mesa_key_pointer_equal);
    306    _mesa_hash_table_insert(state->ssa_defs, def, def_state);
    307 }
    308 
    309 static void
    310 validate_dest(nir_dest *dest, validate_state *state)
    311 {
    312    if (dest->is_ssa)
    313       validate_ssa_def(&dest->ssa, state);
    314    else
    315       validate_reg_dest(&dest->reg, state);
    316 }
    317 
    318 static void
    319 validate_alu_dest(nir_alu_instr *instr, validate_state *state)
    320 {
    321    nir_alu_dest *dest = &instr->dest;
    322 
    323    unsigned dest_size =
    324       dest->dest.is_ssa ? dest->dest.ssa.num_components
    325                         : dest->dest.reg.reg->num_components;
    326    bool is_packed = !dest->dest.is_ssa && dest->dest.reg.reg->is_packed;
    327    /*
    328     * validate that the instruction doesn't write to components not in the
    329     * register/SSA value
    330     */
    331    validate_assert(state, is_packed || !(dest->write_mask & ~((1 << dest_size) - 1)));
    332 
    333    /* validate that saturate is only ever used on instructions with
    334     * destinations of type float
    335     */
    336    nir_alu_instr *alu = nir_instr_as_alu(state->instr);
    337    validate_assert(state,
    338           (nir_alu_type_get_base_type(nir_op_infos[alu->op].output_type) ==
    339            nir_type_float) ||
    340           !dest->saturate);
    341 
    342    unsigned bit_size = dest->dest.is_ssa ? dest->dest.ssa.bit_size
    343                                          : dest->dest.reg.reg->bit_size;
    344    nir_alu_type type = nir_op_infos[instr->op].output_type;
    345 
    346    /* 8-bit float isn't a thing */
    347    if (nir_alu_type_get_base_type(type) == nir_type_float)
    348       validate_assert(state, bit_size == 16 || bit_size == 32 || bit_size == 64);
    349 
    350    validate_assert(state, nir_alu_type_get_type_size(type) == 0 ||
    351           nir_alu_type_get_type_size(type) == bit_size);
    352 
    353    validate_dest(&dest->dest, state);
    354 }
    355 
    356 static void
    357 validate_alu_instr(nir_alu_instr *instr, validate_state *state)
    358 {
    359    validate_assert(state, instr->op < nir_num_opcodes);
    360 
    361    for (unsigned i = 0; i < nir_op_infos[instr->op].num_inputs; i++) {
    362       validate_alu_src(instr, i, state);
    363    }
    364 
    365    validate_alu_dest(instr, state);
    366 }
    367 
    368 static void
    369 validate_deref_chain(nir_deref *deref, validate_state *state)
    370 {
    371    validate_assert(state, deref->child == NULL || ralloc_parent(deref->child) == deref);
    372 
    373    nir_deref *parent = NULL;
    374    while (deref != NULL) {
    375       switch (deref->deref_type) {
    376       case nir_deref_type_array:
    377          validate_assert(state, deref->type == glsl_get_array_element(parent->type));
    378          if (nir_deref_as_array(deref)->deref_array_type ==
    379              nir_deref_array_type_indirect)
    380             validate_src(&nir_deref_as_array(deref)->indirect, state);
    381          break;
    382 
    383       case nir_deref_type_struct:
    384          assume(parent); /* cannot happen: deref change starts w/ nir_deref_var */
    385          validate_assert(state, deref->type ==
    386                 glsl_get_struct_field(parent->type,
    387                                       nir_deref_as_struct(deref)->index));
    388          break;
    389 
    390       case nir_deref_type_var:
    391          break;
    392 
    393       default:
    394          validate_assert(state, !"Invalid deref type");
    395          break;
    396       }
    397 
    398       parent = deref;
    399       deref = deref->child;
    400    }
    401 }
    402 
    403 static void
    404 validate_var_use(nir_variable *var, validate_state *state)
    405 {
    406    if (var->data.mode == nir_var_local) {
    407       struct hash_entry *entry = _mesa_hash_table_search(state->var_defs, var);
    408 
    409       validate_assert(state, entry);
    410       validate_assert(state, (nir_function_impl *) entry->data == state->impl);
    411    }
    412 }
    413 
    414 static void
    415 validate_deref_var(void *parent_mem_ctx, nir_deref_var *deref, validate_state *state)
    416 {
    417    validate_assert(state, deref != NULL);
    418    validate_assert(state, ralloc_parent(deref) == parent_mem_ctx);
    419    validate_assert(state, deref->deref.type == deref->var->type);
    420 
    421    validate_var_use(deref->var, state);
    422 
    423    validate_deref_chain(&deref->deref, state);
    424 }
    425 
    426 static void
    427 validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
    428 {
    429    unsigned num_srcs = nir_intrinsic_infos[instr->intrinsic].num_srcs;
    430    for (unsigned i = 0; i < num_srcs; i++) {
    431       unsigned components_read =
    432          nir_intrinsic_infos[instr->intrinsic].src_components[i];
    433       if (components_read == 0)
    434          components_read = instr->num_components;
    435 
    436       validate_assert(state, components_read > 0);
    437 
    438       if (instr->src[i].is_ssa) {
    439          validate_assert(state, components_read <= instr->src[i].ssa->num_components);
    440       } else if (!instr->src[i].reg.reg->is_packed) {
    441          validate_assert(state, components_read <= instr->src[i].reg.reg->num_components);
    442       }
    443 
    444       validate_src(&instr->src[i], state);
    445    }
    446 
    447    unsigned num_vars = nir_intrinsic_infos[instr->intrinsic].num_variables;
    448    for (unsigned i = 0; i < num_vars; i++) {
    449       validate_deref_var(instr, instr->variables[i], state);
    450    }
    451 
    452    if (nir_intrinsic_infos[instr->intrinsic].has_dest) {
    453       unsigned components_written =
    454          nir_intrinsic_infos[instr->intrinsic].dest_components;
    455       if (components_written == 0)
    456          components_written = instr->num_components;
    457 
    458       validate_assert(state, components_written > 0);
    459 
    460       if (instr->dest.is_ssa) {
    461          validate_assert(state, components_written <= instr->dest.ssa.num_components);
    462       } else if (!instr->dest.reg.reg->is_packed) {
    463          validate_assert(state, components_written <= instr->dest.reg.reg->num_components);
    464       }
    465 
    466       validate_dest(&instr->dest, state);
    467    }
    468 
    469    switch (instr->intrinsic) {
    470    case nir_intrinsic_load_var: {
    471       const struct glsl_type *type =
    472          nir_deref_tail(&instr->variables[0]->deref)->type;
    473       validate_assert(state, glsl_type_is_vector_or_scalar(type) ||
    474              (instr->variables[0]->var->data.mode == nir_var_uniform &&
    475               glsl_get_base_type(type) == GLSL_TYPE_SUBROUTINE));
    476       validate_assert(state, instr->num_components == glsl_get_vector_elements(type));
    477       break;
    478    }
    479    case nir_intrinsic_store_var: {
    480       const struct glsl_type *type =
    481          nir_deref_tail(&instr->variables[0]->deref)->type;
    482       validate_assert(state, glsl_type_is_vector_or_scalar(type) ||
    483              (instr->variables[0]->var->data.mode == nir_var_uniform &&
    484               glsl_get_base_type(type) == GLSL_TYPE_SUBROUTINE));
    485       validate_assert(state, instr->num_components == glsl_get_vector_elements(type));
    486       validate_assert(state, instr->variables[0]->var->data.mode != nir_var_shader_in &&
    487              instr->variables[0]->var->data.mode != nir_var_uniform &&
    488              instr->variables[0]->var->data.mode != nir_var_shader_storage);
    489       validate_assert(state, (nir_intrinsic_write_mask(instr) & ~((1 << instr->num_components) - 1)) == 0);
    490       break;
    491    }
    492    case nir_intrinsic_copy_var:
    493       validate_assert(state, nir_deref_tail(&instr->variables[0]->deref)->type ==
    494              nir_deref_tail(&instr->variables[1]->deref)->type);
    495       validate_assert(state, instr->variables[0]->var->data.mode != nir_var_shader_in &&
    496              instr->variables[0]->var->data.mode != nir_var_uniform &&
    497              instr->variables[0]->var->data.mode != nir_var_shader_storage);
    498       break;
    499    default:
    500       break;
    501    }
    502 }
    503 
    504 static void
    505 validate_tex_instr(nir_tex_instr *instr, validate_state *state)
    506 {
    507    bool src_type_seen[nir_num_tex_src_types];
    508    for (unsigned i = 0; i < nir_num_tex_src_types; i++)
    509       src_type_seen[i] = false;
    510 
    511    for (unsigned i = 0; i < instr->num_srcs; i++) {
    512       validate_assert(state, !src_type_seen[instr->src[i].src_type]);
    513       src_type_seen[instr->src[i].src_type] = true;
    514       validate_src(&instr->src[i].src, state);
    515    }
    516 
    517    if (instr->texture != NULL)
    518       validate_deref_var(instr, instr->texture, state);
    519 
    520    if (instr->sampler != NULL)
    521       validate_deref_var(instr, instr->sampler, state);
    522 
    523    validate_dest(&instr->dest, state);
    524 }
    525 
    526 static void
    527 validate_call_instr(nir_call_instr *instr, validate_state *state)
    528 {
    529    if (instr->return_deref == NULL) {
    530       validate_assert(state, glsl_type_is_void(instr->callee->return_type));
    531    } else {
    532       validate_assert(state, instr->return_deref->deref.type == instr->callee->return_type);
    533       validate_deref_var(instr, instr->return_deref, state);
    534    }
    535 
    536    validate_assert(state, instr->num_params == instr->callee->num_params);
    537 
    538    for (unsigned i = 0; i < instr->num_params; i++) {
    539       validate_assert(state, instr->callee->params[i].type == instr->params[i]->deref.type);
    540       validate_deref_var(instr, instr->params[i], state);
    541    }
    542 }
    543 
    544 static void
    545 validate_load_const_instr(nir_load_const_instr *instr, validate_state *state)
    546 {
    547    validate_ssa_def(&instr->def, state);
    548 }
    549 
    550 static void
    551 validate_ssa_undef_instr(nir_ssa_undef_instr *instr, validate_state *state)
    552 {
    553    validate_ssa_def(&instr->def, state);
    554 }
    555 
    556 static void
    557 validate_phi_instr(nir_phi_instr *instr, validate_state *state)
    558 {
    559    /*
    560     * don't validate the sources until we get to them from their predecessor
    561     * basic blocks, to avoid validating an SSA use before its definition.
    562     */
    563 
    564    validate_dest(&instr->dest, state);
    565 
    566    exec_list_validate(&instr->srcs);
    567    validate_assert(state, exec_list_length(&instr->srcs) ==
    568           state->block->predecessors->entries);
    569 }
    570 
    571 static void
    572 validate_instr(nir_instr *instr, validate_state *state)
    573 {
    574    validate_assert(state, instr->block == state->block);
    575 
    576    state->instr = instr;
    577 
    578    switch (instr->type) {
    579    case nir_instr_type_alu:
    580       validate_alu_instr(nir_instr_as_alu(instr), state);
    581       break;
    582 
    583    case nir_instr_type_call:
    584       validate_call_instr(nir_instr_as_call(instr), state);
    585       break;
    586 
    587    case nir_instr_type_intrinsic:
    588       validate_intrinsic_instr(nir_instr_as_intrinsic(instr), state);
    589       break;
    590 
    591    case nir_instr_type_tex:
    592       validate_tex_instr(nir_instr_as_tex(instr), state);
    593       break;
    594 
    595    case nir_instr_type_load_const:
    596       validate_load_const_instr(nir_instr_as_load_const(instr), state);
    597       break;
    598 
    599    case nir_instr_type_phi:
    600       validate_phi_instr(nir_instr_as_phi(instr), state);
    601       break;
    602 
    603    case nir_instr_type_ssa_undef:
    604       validate_ssa_undef_instr(nir_instr_as_ssa_undef(instr), state);
    605       break;
    606 
    607    case nir_instr_type_jump:
    608       break;
    609 
    610    default:
    611       validate_assert(state, !"Invalid ALU instruction type");
    612       break;
    613    }
    614 
    615    state->instr = NULL;
    616 }
    617 
    618 static void
    619 validate_phi_src(nir_phi_instr *instr, nir_block *pred, validate_state *state)
    620 {
    621    state->instr = &instr->instr;
    622 
    623    validate_assert(state, instr->dest.is_ssa);
    624 
    625    exec_list_validate(&instr->srcs);
    626    nir_foreach_phi_src(src, instr) {
    627       if (src->pred == pred) {
    628          validate_assert(state, src->src.is_ssa);
    629          validate_assert(state, src->src.ssa->num_components ==
    630                 instr->dest.ssa.num_components);
    631 
    632          validate_src(&src->src, state);
    633          state->instr = NULL;
    634          return;
    635       }
    636    }
    637 
    638    abort();
    639 }
    640 
    641 static void
    642 validate_phi_srcs(nir_block *block, nir_block *succ, validate_state *state)
    643 {
    644    nir_foreach_instr(instr, succ) {
    645       if (instr->type != nir_instr_type_phi)
    646          break;
    647 
    648       validate_phi_src(nir_instr_as_phi(instr), block, state);
    649    }
    650 }
    651 
    652 static void validate_cf_node(nir_cf_node *node, validate_state *state);
    653 
    654 static void
    655 validate_block(nir_block *block, validate_state *state)
    656 {
    657    validate_assert(state, block->cf_node.parent == state->parent_node);
    658 
    659    state->block = block;
    660 
    661    exec_list_validate(&block->instr_list);
    662    nir_foreach_instr(instr, block) {
    663       if (instr->type == nir_instr_type_phi) {
    664          validate_assert(state, instr == nir_block_first_instr(block) ||
    665                 nir_instr_prev(instr)->type == nir_instr_type_phi);
    666       }
    667 
    668       if (instr->type == nir_instr_type_jump) {
    669          validate_assert(state, instr == nir_block_last_instr(block));
    670       }
    671 
    672       validate_instr(instr, state);
    673    }
    674 
    675    validate_assert(state, block->successors[0] != NULL);
    676    validate_assert(state, block->successors[0] != block->successors[1]);
    677 
    678    for (unsigned i = 0; i < 2; i++) {
    679       if (block->successors[i] != NULL) {
    680          struct set_entry *entry =
    681             _mesa_set_search(block->successors[i]->predecessors, block);
    682          validate_assert(state, entry);
    683 
    684          validate_phi_srcs(block, block->successors[i], state);
    685       }
    686    }
    687 
    688    struct set_entry *entry;
    689    set_foreach(block->predecessors, entry) {
    690       const nir_block *pred = entry->key;
    691       validate_assert(state, pred->successors[0] == block ||
    692              pred->successors[1] == block);
    693    }
    694 
    695    if (!exec_list_is_empty(&block->instr_list) &&
    696        nir_block_last_instr(block)->type == nir_instr_type_jump) {
    697       validate_assert(state, block->successors[1] == NULL);
    698       nir_jump_instr *jump = nir_instr_as_jump(nir_block_last_instr(block));
    699       switch (jump->type) {
    700       case nir_jump_break: {
    701          nir_block *after =
    702             nir_cf_node_as_block(nir_cf_node_next(&state->loop->cf_node));
    703          validate_assert(state, block->successors[0] == after);
    704          break;
    705       }
    706 
    707       case nir_jump_continue: {
    708          nir_block *first = nir_loop_first_block(state->loop);
    709          validate_assert(state, block->successors[0] == first);
    710          break;
    711       }
    712 
    713       case nir_jump_return:
    714          validate_assert(state, block->successors[0] == state->impl->end_block);
    715          break;
    716 
    717       default:
    718          unreachable("bad jump type");
    719       }
    720    } else {
    721       nir_cf_node *next = nir_cf_node_next(&block->cf_node);
    722       if (next == NULL) {
    723          switch (state->parent_node->type) {
    724          case nir_cf_node_loop: {
    725             nir_block *first = nir_loop_first_block(state->loop);
    726             validate_assert(state, block->successors[0] == first);
    727             /* due to the hack for infinite loops, block->successors[1] may
    728              * point to the block after the loop.
    729              */
    730             break;
    731          }
    732 
    733          case nir_cf_node_if: {
    734             nir_block *after =
    735                nir_cf_node_as_block(nir_cf_node_next(state->parent_node));
    736             validate_assert(state, block->successors[0] == after);
    737             validate_assert(state, block->successors[1] == NULL);
    738             break;
    739          }
    740 
    741          case nir_cf_node_function:
    742             validate_assert(state, block->successors[0] == state->impl->end_block);
    743             validate_assert(state, block->successors[1] == NULL);
    744             break;
    745 
    746          default:
    747             unreachable("unknown control flow node type");
    748          }
    749       } else {
    750          if (next->type == nir_cf_node_if) {
    751             nir_if *if_stmt = nir_cf_node_as_if(next);
    752             validate_assert(state, block->successors[0] ==
    753                    nir_if_first_then_block(if_stmt));
    754             validate_assert(state, block->successors[1] ==
    755                    nir_if_first_else_block(if_stmt));
    756          } else {
    757             validate_assert(state, next->type == nir_cf_node_loop);
    758             nir_loop *loop = nir_cf_node_as_loop(next);
    759             validate_assert(state, block->successors[0] ==
    760                    nir_loop_first_block(loop));
    761             validate_assert(state, block->successors[1] == NULL);
    762          }
    763       }
    764    }
    765 }
    766 
    767 static void
    768 validate_if(nir_if *if_stmt, validate_state *state)
    769 {
    770    state->if_stmt = if_stmt;
    771 
    772    validate_assert(state, !exec_node_is_head_sentinel(if_stmt->cf_node.node.prev));
    773    nir_cf_node *prev_node = nir_cf_node_prev(&if_stmt->cf_node);
    774    validate_assert(state, prev_node->type == nir_cf_node_block);
    775 
    776    validate_assert(state, !exec_node_is_tail_sentinel(if_stmt->cf_node.node.next));
    777    nir_cf_node *next_node = nir_cf_node_next(&if_stmt->cf_node);
    778    validate_assert(state, next_node->type == nir_cf_node_block);
    779 
    780    validate_src(&if_stmt->condition, state);
    781 
    782    validate_assert(state, !exec_list_is_empty(&if_stmt->then_list));
    783    validate_assert(state, !exec_list_is_empty(&if_stmt->else_list));
    784 
    785    nir_cf_node *old_parent = state->parent_node;
    786    state->parent_node = &if_stmt->cf_node;
    787 
    788    exec_list_validate(&if_stmt->then_list);
    789    foreach_list_typed(nir_cf_node, cf_node, node, &if_stmt->then_list) {
    790       validate_cf_node(cf_node, state);
    791    }
    792 
    793    exec_list_validate(&if_stmt->else_list);
    794    foreach_list_typed(nir_cf_node, cf_node, node, &if_stmt->else_list) {
    795       validate_cf_node(cf_node, state);
    796    }
    797 
    798    state->parent_node = old_parent;
    799    state->if_stmt = NULL;
    800 }
    801 
    802 static void
    803 validate_loop(nir_loop *loop, validate_state *state)
    804 {
    805    validate_assert(state, !exec_node_is_head_sentinel(loop->cf_node.node.prev));
    806    nir_cf_node *prev_node = nir_cf_node_prev(&loop->cf_node);
    807    validate_assert(state, prev_node->type == nir_cf_node_block);
    808 
    809    validate_assert(state, !exec_node_is_tail_sentinel(loop->cf_node.node.next));
    810    nir_cf_node *next_node = nir_cf_node_next(&loop->cf_node);
    811    validate_assert(state, next_node->type == nir_cf_node_block);
    812 
    813    validate_assert(state, !exec_list_is_empty(&loop->body));
    814 
    815    nir_cf_node *old_parent = state->parent_node;
    816    state->parent_node = &loop->cf_node;
    817    nir_loop *old_loop = state->loop;
    818    state->loop = loop;
    819 
    820    exec_list_validate(&loop->body);
    821    foreach_list_typed(nir_cf_node, cf_node, node, &loop->body) {
    822       validate_cf_node(cf_node, state);
    823    }
    824 
    825    state->parent_node = old_parent;
    826    state->loop = old_loop;
    827 }
    828 
    829 static void
    830 validate_cf_node(nir_cf_node *node, validate_state *state)
    831 {
    832    validate_assert(state, node->parent == state->parent_node);
    833 
    834    switch (node->type) {
    835    case nir_cf_node_block:
    836       validate_block(nir_cf_node_as_block(node), state);
    837       break;
    838 
    839    case nir_cf_node_if:
    840       validate_if(nir_cf_node_as_if(node), state);
    841       break;
    842 
    843    case nir_cf_node_loop:
    844       validate_loop(nir_cf_node_as_loop(node), state);
    845       break;
    846 
    847    default:
    848       unreachable("Invalid CF node type");
    849    }
    850 }
    851 
    852 static void
    853 prevalidate_reg_decl(nir_register *reg, bool is_global, validate_state *state)
    854 {
    855    validate_assert(state, reg->is_global == is_global);
    856 
    857    if (is_global)
    858       validate_assert(state, reg->index < state->shader->reg_alloc);
    859    else
    860       validate_assert(state, reg->index < state->impl->reg_alloc);
    861    validate_assert(state, !BITSET_TEST(state->regs_found, reg->index));
    862    BITSET_SET(state->regs_found, reg->index);
    863 
    864    list_validate(&reg->uses);
    865    list_validate(&reg->defs);
    866    list_validate(&reg->if_uses);
    867 
    868    reg_validate_state *reg_state = ralloc(state->regs, reg_validate_state);
    869    reg_state->uses = _mesa_set_create(reg_state, _mesa_hash_pointer,
    870                                       _mesa_key_pointer_equal);
    871    reg_state->if_uses = _mesa_set_create(reg_state, _mesa_hash_pointer,
    872                                          _mesa_key_pointer_equal);
    873    reg_state->defs = _mesa_set_create(reg_state, _mesa_hash_pointer,
    874                                       _mesa_key_pointer_equal);
    875 
    876    reg_state->where_defined = is_global ? NULL : state->impl;
    877 
    878    _mesa_hash_table_insert(state->regs, reg, reg_state);
    879 }
    880 
    881 static void
    882 postvalidate_reg_decl(nir_register *reg, validate_state *state)
    883 {
    884    struct hash_entry *entry = _mesa_hash_table_search(state->regs, reg);
    885 
    886    assume(entry);
    887    reg_validate_state *reg_state = (reg_validate_state *) entry->data;
    888 
    889    nir_foreach_use(src, reg) {
    890       struct set_entry *entry = _mesa_set_search(reg_state->uses, src);
    891       validate_assert(state, entry);
    892       _mesa_set_remove(reg_state->uses, entry);
    893    }
    894 
    895    if (reg_state->uses->entries != 0) {
    896       printf("extra entries in register uses:\n");
    897       struct set_entry *entry;
    898       set_foreach(reg_state->uses, entry)
    899          printf("%p\n", entry->key);
    900 
    901       abort();
    902    }
    903 
    904    nir_foreach_if_use(src, reg) {
    905       struct set_entry *entry = _mesa_set_search(reg_state->if_uses, src);
    906       validate_assert(state, entry);
    907       _mesa_set_remove(reg_state->if_uses, entry);
    908    }
    909 
    910    if (reg_state->if_uses->entries != 0) {
    911       printf("extra entries in register if_uses:\n");
    912       struct set_entry *entry;
    913       set_foreach(reg_state->if_uses, entry)
    914          printf("%p\n", entry->key);
    915 
    916       abort();
    917    }
    918 
    919    nir_foreach_def(src, reg) {
    920       struct set_entry *entry = _mesa_set_search(reg_state->defs, src);
    921       validate_assert(state, entry);
    922       _mesa_set_remove(reg_state->defs, entry);
    923    }
    924 
    925    if (reg_state->defs->entries != 0) {
    926       printf("extra entries in register defs:\n");
    927       struct set_entry *entry;
    928       set_foreach(reg_state->defs, entry)
    929          printf("%p\n", entry->key);
    930 
    931       abort();
    932    }
    933 }
    934 
    935 static void
    936 validate_var_decl(nir_variable *var, bool is_global, validate_state *state)
    937 {
    938    state->var = var;
    939 
    940    validate_assert(state, is_global == nir_variable_is_global(var));
    941 
    942    /* Must have exactly one mode set */
    943    validate_assert(state, util_bitcount(var->data.mode) == 1);
    944 
    945    if (var->data.compact) {
    946       /* The "compact" flag is only valid on arrays of scalars. */
    947       assert(glsl_type_is_array(var->type));
    948 
    949       const struct glsl_type *type = glsl_get_array_element(var->type);
    950       if (nir_is_per_vertex_io(var, state->shader->stage)) {
    951          assert(glsl_type_is_array(type));
    952          assert(glsl_type_is_scalar(glsl_get_array_element(type)));
    953       } else {
    954          assert(glsl_type_is_scalar(type));
    955       }
    956    }
    957 
    958    /*
    959     * TODO validate some things ir_validate.cpp does (requires more GLSL type
    960     * support)
    961     */
    962 
    963    if (!is_global) {
    964       _mesa_hash_table_insert(state->var_defs, var, state->impl);
    965    }
    966 
    967    state->var = NULL;
    968 }
    969 
    970 static bool
    971 postvalidate_ssa_def(nir_ssa_def *def, void *void_state)
    972 {
    973    validate_state *state = void_state;
    974 
    975    struct hash_entry *entry = _mesa_hash_table_search(state->ssa_defs, def);
    976 
    977    assume(entry);
    978    ssa_def_validate_state *def_state = (ssa_def_validate_state *)entry->data;
    979 
    980    nir_foreach_use(src, def) {
    981       struct set_entry *entry = _mesa_set_search(def_state->uses, src);
    982       validate_assert(state, entry);
    983       _mesa_set_remove(def_state->uses, entry);
    984    }
    985 
    986    if (def_state->uses->entries != 0) {
    987       printf("extra entries in SSA def uses:\n");
    988       struct set_entry *entry;
    989       set_foreach(def_state->uses, entry)
    990          printf("%p\n", entry->key);
    991 
    992       abort();
    993    }
    994 
    995    nir_foreach_if_use(src, def) {
    996       struct set_entry *entry = _mesa_set_search(def_state->if_uses, src);
    997       validate_assert(state, entry);
    998       _mesa_set_remove(def_state->if_uses, entry);
    999    }
   1000 
   1001    if (def_state->if_uses->entries != 0) {
   1002       printf("extra entries in SSA def uses:\n");
   1003       struct set_entry *entry;
   1004       set_foreach(def_state->if_uses, entry)
   1005          printf("%p\n", entry->key);
   1006 
   1007       abort();
   1008    }
   1009 
   1010    return true;
   1011 }
   1012 
   1013 static void
   1014 validate_function_impl(nir_function_impl *impl, validate_state *state)
   1015 {
   1016    validate_assert(state, impl->function->impl == impl);
   1017    validate_assert(state, impl->cf_node.parent == NULL);
   1018 
   1019    validate_assert(state, impl->num_params == impl->function->num_params);
   1020    for (unsigned i = 0; i < impl->num_params; i++) {
   1021       validate_assert(state, impl->params[i]->type == impl->function->params[i].type);
   1022       validate_assert(state, impl->params[i]->data.mode == nir_var_param);
   1023       validate_assert(state, impl->params[i]->data.location == i);
   1024       validate_var_decl(impl->params[i], false, state);
   1025    }
   1026 
   1027    if (glsl_type_is_void(impl->function->return_type)) {
   1028       validate_assert(state, impl->return_var == NULL);
   1029    } else {
   1030       validate_assert(state, impl->return_var->type == impl->function->return_type);
   1031       validate_assert(state, impl->return_var->data.mode == nir_var_param);
   1032       validate_assert(state, impl->return_var->data.location == -1);
   1033       validate_var_decl(impl->return_var, false, state);
   1034    }
   1035 
   1036    validate_assert(state, exec_list_is_empty(&impl->end_block->instr_list));
   1037    validate_assert(state, impl->end_block->successors[0] == NULL);
   1038    validate_assert(state, impl->end_block->successors[1] == NULL);
   1039 
   1040    state->impl = impl;
   1041    state->parent_node = &impl->cf_node;
   1042 
   1043    exec_list_validate(&impl->locals);
   1044    nir_foreach_variable(var, &impl->locals) {
   1045       validate_var_decl(var, false, state);
   1046    }
   1047 
   1048    state->regs_found = realloc(state->regs_found,
   1049                                BITSET_WORDS(impl->reg_alloc) *
   1050                                sizeof(BITSET_WORD));
   1051    memset(state->regs_found, 0, BITSET_WORDS(impl->reg_alloc) *
   1052                                 sizeof(BITSET_WORD));
   1053    exec_list_validate(&impl->registers);
   1054    foreach_list_typed(nir_register, reg, node, &impl->registers) {
   1055       prevalidate_reg_decl(reg, false, state);
   1056    }
   1057 
   1058    state->ssa_defs_found = realloc(state->ssa_defs_found,
   1059                                    BITSET_WORDS(impl->ssa_alloc) *
   1060                                    sizeof(BITSET_WORD));
   1061    memset(state->ssa_defs_found, 0, BITSET_WORDS(impl->ssa_alloc) *
   1062                                     sizeof(BITSET_WORD));
   1063    exec_list_validate(&impl->body);
   1064    foreach_list_typed(nir_cf_node, node, node, &impl->body) {
   1065       validate_cf_node(node, state);
   1066    }
   1067 
   1068    foreach_list_typed(nir_register, reg, node, &impl->registers) {
   1069       postvalidate_reg_decl(reg, state);
   1070    }
   1071 
   1072    nir_foreach_block(block, impl) {
   1073       nir_foreach_instr(instr, block)
   1074          nir_foreach_ssa_def(instr, postvalidate_ssa_def, state);
   1075    }
   1076 }
   1077 
   1078 static void
   1079 validate_function(nir_function *func, validate_state *state)
   1080 {
   1081    if (func->impl != NULL) {
   1082       validate_assert(state, func->impl->function == func);
   1083       validate_function_impl(func->impl, state);
   1084    }
   1085 }
   1086 
   1087 static void
   1088 init_validate_state(validate_state *state)
   1089 {
   1090    state->regs = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
   1091                                          _mesa_key_pointer_equal);
   1092    state->ssa_defs = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
   1093                                              _mesa_key_pointer_equal);
   1094    state->ssa_defs_found = NULL;
   1095    state->regs_found = NULL;
   1096    state->var_defs = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
   1097                                              _mesa_key_pointer_equal);
   1098    state->errors = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
   1099                                            _mesa_key_pointer_equal);
   1100 
   1101    state->loop = NULL;
   1102    state->instr = NULL;
   1103    state->var = NULL;
   1104 }
   1105 
   1106 static void
   1107 destroy_validate_state(validate_state *state)
   1108 {
   1109    _mesa_hash_table_destroy(state->regs, NULL);
   1110    _mesa_hash_table_destroy(state->ssa_defs, NULL);
   1111    free(state->ssa_defs_found);
   1112    free(state->regs_found);
   1113    _mesa_hash_table_destroy(state->var_defs, NULL);
   1114    _mesa_hash_table_destroy(state->errors, NULL);
   1115 }
   1116 
   1117 static void
   1118 dump_errors(validate_state *state)
   1119 {
   1120    struct hash_table *errors = state->errors;
   1121 
   1122    fprintf(stderr, "%d errors:\n", _mesa_hash_table_num_entries(errors));
   1123 
   1124    nir_print_shader_annotated(state->shader, stderr, errors);
   1125 
   1126    if (_mesa_hash_table_num_entries(errors) > 0) {
   1127       fprintf(stderr, "%d additional errors:\n",
   1128               _mesa_hash_table_num_entries(errors));
   1129       struct hash_entry *entry;
   1130       hash_table_foreach(errors, entry) {
   1131          fprintf(stderr, "%s\n", (char *)entry->data);
   1132       }
   1133    }
   1134 
   1135    abort();
   1136 }
   1137 
   1138 void
   1139 nir_validate_shader(nir_shader *shader)
   1140 {
   1141    static int should_validate = -1;
   1142    if (should_validate < 0)
   1143       should_validate = env_var_as_boolean("NIR_VALIDATE", true);
   1144    if (!should_validate)
   1145       return;
   1146 
   1147    validate_state state;
   1148    init_validate_state(&state);
   1149 
   1150    state.shader = shader;
   1151 
   1152    exec_list_validate(&shader->uniforms);
   1153    nir_foreach_variable(var, &shader->uniforms) {
   1154       validate_var_decl(var, true, &state);
   1155    }
   1156 
   1157    exec_list_validate(&shader->inputs);
   1158    nir_foreach_variable(var, &shader->inputs) {
   1159      validate_var_decl(var, true, &state);
   1160    }
   1161 
   1162    exec_list_validate(&shader->outputs);
   1163    nir_foreach_variable(var, &shader->outputs) {
   1164      validate_var_decl(var, true, &state);
   1165    }
   1166 
   1167    exec_list_validate(&shader->shared);
   1168    nir_foreach_variable(var, &shader->shared) {
   1169       validate_var_decl(var, true, &state);
   1170    }
   1171 
   1172    exec_list_validate(&shader->globals);
   1173    nir_foreach_variable(var, &shader->globals) {
   1174      validate_var_decl(var, true, &state);
   1175    }
   1176 
   1177    exec_list_validate(&shader->system_values);
   1178    nir_foreach_variable(var, &shader->system_values) {
   1179      validate_var_decl(var, true, &state);
   1180    }
   1181 
   1182    state.regs_found = realloc(state.regs_found,
   1183                               BITSET_WORDS(shader->reg_alloc) *
   1184                               sizeof(BITSET_WORD));
   1185    memset(state.regs_found, 0, BITSET_WORDS(shader->reg_alloc) *
   1186                                sizeof(BITSET_WORD));
   1187    exec_list_validate(&shader->registers);
   1188    foreach_list_typed(nir_register, reg, node, &shader->registers) {
   1189       prevalidate_reg_decl(reg, true, &state);
   1190    }
   1191 
   1192    exec_list_validate(&shader->functions);
   1193    foreach_list_typed(nir_function, func, node, &shader->functions) {
   1194       validate_function(func, &state);
   1195    }
   1196 
   1197    foreach_list_typed(nir_register, reg, node, &shader->registers) {
   1198       postvalidate_reg_decl(reg, &state);
   1199    }
   1200 
   1201    if (_mesa_hash_table_num_entries(state.errors) > 0)
   1202       dump_errors(&state);
   1203 
   1204    destroy_validate_state(&state);
   1205 }
   1206 
   1207 #endif /* NDEBUG */
   1208