• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@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
log_error(validate_state * state,const char * cond,const char * file,int line)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
validate_reg_src(nir_src * src,validate_state * state)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
validate_ssa_src(nir_src * src,validate_state * state)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
validate_src(nir_src * src,validate_state * state)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
validate_alu_src(nir_alu_instr * instr,unsigned index,validate_state * state)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
validate_reg_dest(nir_reg_dest * dest,validate_state * state)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
validate_ssa_def(nir_ssa_def * def,validate_state * state)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
validate_dest(nir_dest * dest,validate_state * state)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
validate_alu_dest(nir_alu_instr * instr,validate_state * state)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
validate_alu_instr(nir_alu_instr * instr,validate_state * state)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
validate_deref_chain(nir_deref * deref,validate_state * state)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
validate_var_use(nir_variable * var,validate_state * state)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
validate_deref_var(void * parent_mem_ctx,nir_deref_var * deref,validate_state * state)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
validate_intrinsic_instr(nir_intrinsic_instr * instr,validate_state * state)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
validate_tex_instr(nir_tex_instr * instr,validate_state * state)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
validate_call_instr(nir_call_instr * instr,validate_state * state)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
validate_load_const_instr(nir_load_const_instr * instr,validate_state * state)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
validate_ssa_undef_instr(nir_ssa_undef_instr * instr,validate_state * state)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
validate_phi_instr(nir_phi_instr * instr,validate_state * state)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
validate_instr(nir_instr * instr,validate_state * state)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
validate_phi_src(nir_phi_instr * instr,nir_block * pred,validate_state * state)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
validate_phi_srcs(nir_block * block,nir_block * succ,validate_state * state)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
validate_block(nir_block * block,validate_state * state)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
validate_if(nir_if * if_stmt,validate_state * state)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
validate_loop(nir_loop * loop,validate_state * state)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
validate_cf_node(nir_cf_node * node,validate_state * state)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
prevalidate_reg_decl(nir_register * reg,bool is_global,validate_state * state)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
postvalidate_reg_decl(nir_register * reg,validate_state * state)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
validate_var_decl(nir_variable * var,bool is_global,validate_state * state)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
postvalidate_ssa_def(nir_ssa_def * def,void * void_state)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
validate_function_impl(nir_function_impl * impl,validate_state * state)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
validate_function(nir_function * func,validate_state * state)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
init_validate_state(validate_state * state)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
destroy_validate_state(validate_state * state)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
dump_errors(validate_state * state)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
nir_validate_shader(nir_shader * shader)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