nir: Add a NIR_VALIDATE environment variable
[mesa.git] / src / compiler / nir / nir_validate.c
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
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 ssa_def_validate_state *def_state = (ssa_def_validate_state *)entry->data;
177
178 validate_assert(state, def_state->where_defined == state->impl &&
179 "using an SSA value defined in a different function");
180
181 if (state->instr) {
182 _mesa_set_add(def_state->uses, src);
183 } else {
184 validate_assert(state, state->if_stmt);
185 _mesa_set_add(def_state->if_uses, src);
186 }
187
188 /* TODO validate that the use is dominated by the definition */
189 }
190
191 static void
192 validate_src(nir_src *src, validate_state *state)
193 {
194 if (state->instr)
195 validate_assert(state, src->parent_instr == state->instr);
196 else
197 validate_assert(state, src->parent_if == state->if_stmt);
198
199 if (src->is_ssa)
200 validate_ssa_src(src, state);
201 else
202 validate_reg_src(src, state);
203 }
204
205 static void
206 validate_alu_src(nir_alu_instr *instr, unsigned index, validate_state *state)
207 {
208 nir_alu_src *src = &instr->src[index];
209
210 unsigned num_components;
211 unsigned src_bit_size;
212 if (src->src.is_ssa) {
213 src_bit_size = src->src.ssa->bit_size;
214 num_components = src->src.ssa->num_components;
215 } else {
216 src_bit_size = src->src.reg.reg->bit_size;
217 if (src->src.reg.reg->is_packed)
218 num_components = 4; /* can't check anything */
219 else
220 num_components = src->src.reg.reg->num_components;
221 }
222 for (unsigned i = 0; i < 4; i++) {
223 validate_assert(state, src->swizzle[i] < 4);
224
225 if (nir_alu_instr_channel_used(instr, index, i))
226 validate_assert(state, src->swizzle[i] < num_components);
227 }
228
229 nir_alu_type src_type = nir_op_infos[instr->op].input_types[index];
230
231 /* 8-bit float isn't a thing */
232 if (nir_alu_type_get_base_type(src_type) == nir_type_float)
233 validate_assert(state, src_bit_size == 16 || src_bit_size == 32 || src_bit_size == 64);
234
235 if (nir_alu_type_get_type_size(src_type)) {
236 /* This source has an explicit bit size */
237 validate_assert(state, nir_alu_type_get_type_size(src_type) == src_bit_size);
238 } else {
239 if (!nir_alu_type_get_type_size(nir_op_infos[instr->op].output_type)) {
240 unsigned dest_bit_size =
241 instr->dest.dest.is_ssa ? instr->dest.dest.ssa.bit_size
242 : instr->dest.dest.reg.reg->bit_size;
243 validate_assert(state, dest_bit_size == src_bit_size);
244 }
245 }
246
247 validate_src(&src->src, state);
248 }
249
250 static void
251 validate_reg_dest(nir_reg_dest *dest, validate_state *state)
252 {
253 validate_assert(state, dest->reg != NULL);
254
255 validate_assert(state, dest->parent_instr == state->instr);
256
257 struct hash_entry *entry2;
258 entry2 = _mesa_hash_table_search(state->regs, dest->reg);
259
260 validate_assert(state, entry2);
261
262 reg_validate_state *reg_state = (reg_validate_state *) entry2->data;
263 _mesa_set_add(reg_state->defs, dest);
264
265 if (!dest->reg->is_global) {
266 validate_assert(state, reg_state->where_defined == state->impl &&
267 "writing to a register declared in a different function");
268 }
269
270 validate_assert(state, (dest->reg->num_array_elems == 0 ||
271 dest->base_offset < dest->reg->num_array_elems) &&
272 "definitely out-of-bounds array access");
273
274 if (dest->indirect) {
275 validate_assert(state, dest->reg->num_array_elems != 0);
276 validate_assert(state, (dest->indirect->is_ssa || dest->indirect->reg.indirect == NULL) &&
277 "only one level of indirection allowed");
278 validate_src(dest->indirect, state);
279 }
280 }
281
282 static void
283 validate_ssa_def(nir_ssa_def *def, validate_state *state)
284 {
285 validate_assert(state, def->index < state->impl->ssa_alloc);
286 validate_assert(state, !BITSET_TEST(state->ssa_defs_found, def->index));
287 BITSET_SET(state->ssa_defs_found, def->index);
288
289 validate_assert(state, def->parent_instr == state->instr);
290
291 validate_assert(state, def->num_components <= 4);
292
293 list_validate(&def->uses);
294 list_validate(&def->if_uses);
295
296 ssa_def_validate_state *def_state = ralloc(state->ssa_defs,
297 ssa_def_validate_state);
298 def_state->where_defined = state->impl;
299 def_state->uses = _mesa_set_create(def_state, _mesa_hash_pointer,
300 _mesa_key_pointer_equal);
301 def_state->if_uses = _mesa_set_create(def_state, _mesa_hash_pointer,
302 _mesa_key_pointer_equal);
303 _mesa_hash_table_insert(state->ssa_defs, def, def_state);
304 }
305
306 static void
307 validate_dest(nir_dest *dest, validate_state *state)
308 {
309 if (dest->is_ssa)
310 validate_ssa_def(&dest->ssa, state);
311 else
312 validate_reg_dest(&dest->reg, state);
313 }
314
315 static void
316 validate_alu_dest(nir_alu_instr *instr, validate_state *state)
317 {
318 nir_alu_dest *dest = &instr->dest;
319
320 unsigned dest_size =
321 dest->dest.is_ssa ? dest->dest.ssa.num_components
322 : dest->dest.reg.reg->num_components;
323 bool is_packed = !dest->dest.is_ssa && dest->dest.reg.reg->is_packed;
324 /*
325 * validate that the instruction doesn't write to components not in the
326 * register/SSA value
327 */
328 validate_assert(state, is_packed || !(dest->write_mask & ~((1 << dest_size) - 1)));
329
330 /* validate that saturate is only ever used on instructions with
331 * destinations of type float
332 */
333 nir_alu_instr *alu = nir_instr_as_alu(state->instr);
334 validate_assert(state,
335 (nir_alu_type_get_base_type(nir_op_infos[alu->op].output_type) ==
336 nir_type_float) ||
337 !dest->saturate);
338
339 unsigned bit_size = dest->dest.is_ssa ? dest->dest.ssa.bit_size
340 : dest->dest.reg.reg->bit_size;
341 nir_alu_type type = nir_op_infos[instr->op].output_type;
342
343 /* 8-bit float isn't a thing */
344 if (nir_alu_type_get_base_type(type) == nir_type_float)
345 validate_assert(state, bit_size == 16 || bit_size == 32 || bit_size == 64);
346
347 validate_assert(state, nir_alu_type_get_type_size(type) == 0 ||
348 nir_alu_type_get_type_size(type) == bit_size);
349
350 validate_dest(&dest->dest, state);
351 }
352
353 static void
354 validate_alu_instr(nir_alu_instr *instr, validate_state *state)
355 {
356 validate_assert(state, instr->op < nir_num_opcodes);
357
358 for (unsigned i = 0; i < nir_op_infos[instr->op].num_inputs; i++) {
359 validate_alu_src(instr, i, state);
360 }
361
362 validate_alu_dest(instr, state);
363 }
364
365 static void
366 validate_deref_chain(nir_deref *deref, validate_state *state)
367 {
368 validate_assert(state, deref->child == NULL || ralloc_parent(deref->child) == deref);
369
370 nir_deref *parent = NULL;
371 while (deref != NULL) {
372 switch (deref->deref_type) {
373 case nir_deref_type_array:
374 validate_assert(state, deref->type == glsl_get_array_element(parent->type));
375 if (nir_deref_as_array(deref)->deref_array_type ==
376 nir_deref_array_type_indirect)
377 validate_src(&nir_deref_as_array(deref)->indirect, state);
378 break;
379
380 case nir_deref_type_struct:
381 assume(parent); /* cannot happen: deref change starts w/ nir_deref_var */
382 validate_assert(state, deref->type ==
383 glsl_get_struct_field(parent->type,
384 nir_deref_as_struct(deref)->index));
385 break;
386
387 case nir_deref_type_var:
388 break;
389
390 default:
391 validate_assert(state, !"Invalid deref type");
392 break;
393 }
394
395 parent = deref;
396 deref = deref->child;
397 }
398 }
399
400 static void
401 validate_var_use(nir_variable *var, validate_state *state)
402 {
403 if (var->data.mode == nir_var_local) {
404 struct hash_entry *entry = _mesa_hash_table_search(state->var_defs, var);
405
406 validate_assert(state, entry);
407 validate_assert(state, (nir_function_impl *) entry->data == state->impl);
408 }
409 }
410
411 static void
412 validate_deref_var(void *parent_mem_ctx, nir_deref_var *deref, validate_state *state)
413 {
414 validate_assert(state, deref != NULL);
415 validate_assert(state, ralloc_parent(deref) == parent_mem_ctx);
416 validate_assert(state, deref->deref.type == deref->var->type);
417
418 validate_var_use(deref->var, state);
419
420 validate_deref_chain(&deref->deref, state);
421 }
422
423 static void
424 validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
425 {
426 unsigned num_srcs = nir_intrinsic_infos[instr->intrinsic].num_srcs;
427 for (unsigned i = 0; i < num_srcs; i++) {
428 unsigned components_read =
429 nir_intrinsic_infos[instr->intrinsic].src_components[i];
430 if (components_read == 0)
431 components_read = instr->num_components;
432
433 validate_assert(state, components_read > 0);
434
435 if (instr->src[i].is_ssa) {
436 validate_assert(state, components_read <= instr->src[i].ssa->num_components);
437 } else if (!instr->src[i].reg.reg->is_packed) {
438 validate_assert(state, components_read <= instr->src[i].reg.reg->num_components);
439 }
440
441 validate_src(&instr->src[i], state);
442 }
443
444 unsigned num_vars = nir_intrinsic_infos[instr->intrinsic].num_variables;
445 for (unsigned i = 0; i < num_vars; i++) {
446 validate_deref_var(instr, instr->variables[i], state);
447 }
448
449 if (nir_intrinsic_infos[instr->intrinsic].has_dest) {
450 unsigned components_written =
451 nir_intrinsic_infos[instr->intrinsic].dest_components;
452 if (components_written == 0)
453 components_written = instr->num_components;
454
455 validate_assert(state, components_written > 0);
456
457 if (instr->dest.is_ssa) {
458 validate_assert(state, components_written <= instr->dest.ssa.num_components);
459 } else if (!instr->dest.reg.reg->is_packed) {
460 validate_assert(state, components_written <= instr->dest.reg.reg->num_components);
461 }
462
463 validate_dest(&instr->dest, state);
464 }
465
466 switch (instr->intrinsic) {
467 case nir_intrinsic_load_var: {
468 const struct glsl_type *type =
469 nir_deref_tail(&instr->variables[0]->deref)->type;
470 validate_assert(state, glsl_type_is_vector_or_scalar(type) ||
471 (instr->variables[0]->var->data.mode == nir_var_uniform &&
472 glsl_get_base_type(type) == GLSL_TYPE_SUBROUTINE));
473 validate_assert(state, instr->num_components == glsl_get_vector_elements(type));
474 break;
475 }
476 case nir_intrinsic_store_var: {
477 const struct glsl_type *type =
478 nir_deref_tail(&instr->variables[0]->deref)->type;
479 validate_assert(state, glsl_type_is_vector_or_scalar(type) ||
480 (instr->variables[0]->var->data.mode == nir_var_uniform &&
481 glsl_get_base_type(type) == GLSL_TYPE_SUBROUTINE));
482 validate_assert(state, instr->num_components == glsl_get_vector_elements(type));
483 validate_assert(state, instr->variables[0]->var->data.mode != nir_var_shader_in &&
484 instr->variables[0]->var->data.mode != nir_var_uniform &&
485 instr->variables[0]->var->data.mode != nir_var_shader_storage);
486 validate_assert(state, (nir_intrinsic_write_mask(instr) & ~((1 << instr->num_components) - 1)) == 0);
487 break;
488 }
489 case nir_intrinsic_copy_var:
490 validate_assert(state, nir_deref_tail(&instr->variables[0]->deref)->type ==
491 nir_deref_tail(&instr->variables[1]->deref)->type);
492 validate_assert(state, instr->variables[0]->var->data.mode != nir_var_shader_in &&
493 instr->variables[0]->var->data.mode != nir_var_uniform &&
494 instr->variables[0]->var->data.mode != nir_var_shader_storage);
495 break;
496 default:
497 break;
498 }
499 }
500
501 static void
502 validate_tex_instr(nir_tex_instr *instr, validate_state *state)
503 {
504 bool src_type_seen[nir_num_tex_src_types];
505 for (unsigned i = 0; i < nir_num_tex_src_types; i++)
506 src_type_seen[i] = false;
507
508 for (unsigned i = 0; i < instr->num_srcs; i++) {
509 validate_assert(state, !src_type_seen[instr->src[i].src_type]);
510 src_type_seen[instr->src[i].src_type] = true;
511 validate_src(&instr->src[i].src, state);
512 }
513
514 if (instr->texture != NULL)
515 validate_deref_var(instr, instr->texture, state);
516
517 if (instr->sampler != NULL)
518 validate_deref_var(instr, instr->sampler, state);
519
520 validate_dest(&instr->dest, state);
521 }
522
523 static void
524 validate_call_instr(nir_call_instr *instr, validate_state *state)
525 {
526 if (instr->return_deref == NULL) {
527 validate_assert(state, glsl_type_is_void(instr->callee->return_type));
528 } else {
529 validate_assert(state, instr->return_deref->deref.type == instr->callee->return_type);
530 validate_deref_var(instr, instr->return_deref, state);
531 }
532
533 validate_assert(state, instr->num_params == instr->callee->num_params);
534
535 for (unsigned i = 0; i < instr->num_params; i++) {
536 validate_assert(state, instr->callee->params[i].type == instr->params[i]->deref.type);
537 validate_deref_var(instr, instr->params[i], state);
538 }
539 }
540
541 static void
542 validate_load_const_instr(nir_load_const_instr *instr, validate_state *state)
543 {
544 validate_ssa_def(&instr->def, state);
545 }
546
547 static void
548 validate_ssa_undef_instr(nir_ssa_undef_instr *instr, validate_state *state)
549 {
550 validate_ssa_def(&instr->def, state);
551 }
552
553 static void
554 validate_phi_instr(nir_phi_instr *instr, validate_state *state)
555 {
556 /*
557 * don't validate the sources until we get to them from their predecessor
558 * basic blocks, to avoid validating an SSA use before its definition.
559 */
560
561 validate_dest(&instr->dest, state);
562
563 exec_list_validate(&instr->srcs);
564 validate_assert(state, exec_list_length(&instr->srcs) ==
565 state->block->predecessors->entries);
566 }
567
568 static void
569 validate_instr(nir_instr *instr, validate_state *state)
570 {
571 validate_assert(state, instr->block == state->block);
572
573 state->instr = instr;
574
575 switch (instr->type) {
576 case nir_instr_type_alu:
577 validate_alu_instr(nir_instr_as_alu(instr), state);
578 break;
579
580 case nir_instr_type_call:
581 validate_call_instr(nir_instr_as_call(instr), state);
582 break;
583
584 case nir_instr_type_intrinsic:
585 validate_intrinsic_instr(nir_instr_as_intrinsic(instr), state);
586 break;
587
588 case nir_instr_type_tex:
589 validate_tex_instr(nir_instr_as_tex(instr), state);
590 break;
591
592 case nir_instr_type_load_const:
593 validate_load_const_instr(nir_instr_as_load_const(instr), state);
594 break;
595
596 case nir_instr_type_phi:
597 validate_phi_instr(nir_instr_as_phi(instr), state);
598 break;
599
600 case nir_instr_type_ssa_undef:
601 validate_ssa_undef_instr(nir_instr_as_ssa_undef(instr), state);
602 break;
603
604 case nir_instr_type_jump:
605 break;
606
607 default:
608 validate_assert(state, !"Invalid ALU instruction type");
609 break;
610 }
611
612 state->instr = NULL;
613 }
614
615 static void
616 validate_phi_src(nir_phi_instr *instr, nir_block *pred, validate_state *state)
617 {
618 state->instr = &instr->instr;
619
620 validate_assert(state, instr->dest.is_ssa);
621
622 exec_list_validate(&instr->srcs);
623 nir_foreach_phi_src(src, instr) {
624 if (src->pred == pred) {
625 validate_assert(state, src->src.is_ssa);
626 validate_assert(state, src->src.ssa->num_components ==
627 instr->dest.ssa.num_components);
628
629 validate_src(&src->src, state);
630 state->instr = NULL;
631 return;
632 }
633 }
634
635 abort();
636 }
637
638 static void
639 validate_phi_srcs(nir_block *block, nir_block *succ, validate_state *state)
640 {
641 nir_foreach_instr(instr, succ) {
642 if (instr->type != nir_instr_type_phi)
643 break;
644
645 validate_phi_src(nir_instr_as_phi(instr), block, state);
646 }
647 }
648
649 static void validate_cf_node(nir_cf_node *node, validate_state *state);
650
651 static void
652 validate_block(nir_block *block, validate_state *state)
653 {
654 validate_assert(state, block->cf_node.parent == state->parent_node);
655
656 state->block = block;
657
658 exec_list_validate(&block->instr_list);
659 nir_foreach_instr(instr, block) {
660 if (instr->type == nir_instr_type_phi) {
661 validate_assert(state, instr == nir_block_first_instr(block) ||
662 nir_instr_prev(instr)->type == nir_instr_type_phi);
663 }
664
665 if (instr->type == nir_instr_type_jump) {
666 validate_assert(state, instr == nir_block_last_instr(block));
667 }
668
669 validate_instr(instr, state);
670 }
671
672 validate_assert(state, block->successors[0] != NULL);
673 validate_assert(state, block->successors[0] != block->successors[1]);
674
675 for (unsigned i = 0; i < 2; i++) {
676 if (block->successors[i] != NULL) {
677 struct set_entry *entry =
678 _mesa_set_search(block->successors[i]->predecessors, block);
679 validate_assert(state, entry);
680
681 validate_phi_srcs(block, block->successors[i], state);
682 }
683 }
684
685 struct set_entry *entry;
686 set_foreach(block->predecessors, entry) {
687 const nir_block *pred = entry->key;
688 validate_assert(state, pred->successors[0] == block ||
689 pred->successors[1] == block);
690 }
691
692 if (!exec_list_is_empty(&block->instr_list) &&
693 nir_block_last_instr(block)->type == nir_instr_type_jump) {
694 validate_assert(state, block->successors[1] == NULL);
695 nir_jump_instr *jump = nir_instr_as_jump(nir_block_last_instr(block));
696 switch (jump->type) {
697 case nir_jump_break: {
698 nir_block *after =
699 nir_cf_node_as_block(nir_cf_node_next(&state->loop->cf_node));
700 validate_assert(state, block->successors[0] == after);
701 break;
702 }
703
704 case nir_jump_continue: {
705 nir_block *first =
706 nir_cf_node_as_block(nir_loop_first_cf_node(state->loop));
707 validate_assert(state, block->successors[0] == first);
708 break;
709 }
710
711 case nir_jump_return:
712 validate_assert(state, block->successors[0] == state->impl->end_block);
713 break;
714
715 default:
716 unreachable("bad jump type");
717 }
718 } else {
719 nir_cf_node *next = nir_cf_node_next(&block->cf_node);
720 if (next == NULL) {
721 switch (state->parent_node->type) {
722 case nir_cf_node_loop: {
723 nir_block *first =
724 nir_cf_node_as_block(nir_loop_first_cf_node(state->loop));
725 validate_assert(state, block->successors[0] == first);
726 /* due to the hack for infinite loops, block->successors[1] may
727 * point to the block after the loop.
728 */
729 break;
730 }
731
732 case nir_cf_node_if: {
733 nir_block *after =
734 nir_cf_node_as_block(nir_cf_node_next(state->parent_node));
735 validate_assert(state, block->successors[0] == after);
736 validate_assert(state, block->successors[1] == NULL);
737 break;
738 }
739
740 case nir_cf_node_function:
741 validate_assert(state, block->successors[0] == state->impl->end_block);
742 validate_assert(state, block->successors[1] == NULL);
743 break;
744
745 default:
746 unreachable("unknown control flow node type");
747 }
748 } else {
749 if (next->type == nir_cf_node_if) {
750 nir_if *if_stmt = nir_cf_node_as_if(next);
751 validate_assert(state, &block->successors[0]->cf_node ==
752 nir_if_first_then_node(if_stmt));
753 validate_assert(state, &block->successors[1]->cf_node ==
754 nir_if_first_else_node(if_stmt));
755 } else {
756 validate_assert(state, next->type == nir_cf_node_loop);
757 nir_loop *loop = nir_cf_node_as_loop(next);
758 validate_assert(state, &block->successors[0]->cf_node ==
759 nir_loop_first_cf_node(loop));
760 validate_assert(state, block->successors[1] == NULL);
761 }
762 }
763 }
764 }
765
766 static void
767 validate_if(nir_if *if_stmt, validate_state *state)
768 {
769 state->if_stmt = if_stmt;
770
771 validate_assert(state, !exec_node_is_head_sentinel(if_stmt->cf_node.node.prev));
772 nir_cf_node *prev_node = nir_cf_node_prev(&if_stmt->cf_node);
773 validate_assert(state, prev_node->type == nir_cf_node_block);
774
775 validate_assert(state, !exec_node_is_tail_sentinel(if_stmt->cf_node.node.next));
776 nir_cf_node *next_node = nir_cf_node_next(&if_stmt->cf_node);
777 validate_assert(state, next_node->type == nir_cf_node_block);
778
779 validate_src(&if_stmt->condition, state);
780
781 validate_assert(state, !exec_list_is_empty(&if_stmt->then_list));
782 validate_assert(state, !exec_list_is_empty(&if_stmt->else_list));
783
784 nir_cf_node *old_parent = state->parent_node;
785 state->parent_node = &if_stmt->cf_node;
786
787 exec_list_validate(&if_stmt->then_list);
788 foreach_list_typed(nir_cf_node, cf_node, node, &if_stmt->then_list) {
789 validate_cf_node(cf_node, state);
790 }
791
792 exec_list_validate(&if_stmt->else_list);
793 foreach_list_typed(nir_cf_node, cf_node, node, &if_stmt->else_list) {
794 validate_cf_node(cf_node, state);
795 }
796
797 state->parent_node = old_parent;
798 state->if_stmt = NULL;
799 }
800
801 static void
802 validate_loop(nir_loop *loop, validate_state *state)
803 {
804 validate_assert(state, !exec_node_is_head_sentinel(loop->cf_node.node.prev));
805 nir_cf_node *prev_node = nir_cf_node_prev(&loop->cf_node);
806 validate_assert(state, prev_node->type == nir_cf_node_block);
807
808 validate_assert(state, !exec_node_is_tail_sentinel(loop->cf_node.node.next));
809 nir_cf_node *next_node = nir_cf_node_next(&loop->cf_node);
810 validate_assert(state, next_node->type == nir_cf_node_block);
811
812 validate_assert(state, !exec_list_is_empty(&loop->body));
813
814 nir_cf_node *old_parent = state->parent_node;
815 state->parent_node = &loop->cf_node;
816 nir_loop *old_loop = state->loop;
817 state->loop = loop;
818
819 exec_list_validate(&loop->body);
820 foreach_list_typed(nir_cf_node, cf_node, node, &loop->body) {
821 validate_cf_node(cf_node, state);
822 }
823
824 state->parent_node = old_parent;
825 state->loop = old_loop;
826 }
827
828 static void
829 validate_cf_node(nir_cf_node *node, validate_state *state)
830 {
831 validate_assert(state, node->parent == state->parent_node);
832
833 switch (node->type) {
834 case nir_cf_node_block:
835 validate_block(nir_cf_node_as_block(node), state);
836 break;
837
838 case nir_cf_node_if:
839 validate_if(nir_cf_node_as_if(node), state);
840 break;
841
842 case nir_cf_node_loop:
843 validate_loop(nir_cf_node_as_loop(node), state);
844 break;
845
846 default:
847 unreachable("Invalid CF node type");
848 }
849 }
850
851 static void
852 prevalidate_reg_decl(nir_register *reg, bool is_global, validate_state *state)
853 {
854 validate_assert(state, reg->is_global == is_global);
855
856 if (is_global)
857 validate_assert(state, reg->index < state->shader->reg_alloc);
858 else
859 validate_assert(state, reg->index < state->impl->reg_alloc);
860 validate_assert(state, !BITSET_TEST(state->regs_found, reg->index));
861 BITSET_SET(state->regs_found, reg->index);
862
863 list_validate(&reg->uses);
864 list_validate(&reg->defs);
865 list_validate(&reg->if_uses);
866
867 reg_validate_state *reg_state = ralloc(state->regs, reg_validate_state);
868 reg_state->uses = _mesa_set_create(reg_state, _mesa_hash_pointer,
869 _mesa_key_pointer_equal);
870 reg_state->if_uses = _mesa_set_create(reg_state, _mesa_hash_pointer,
871 _mesa_key_pointer_equal);
872 reg_state->defs = _mesa_set_create(reg_state, _mesa_hash_pointer,
873 _mesa_key_pointer_equal);
874
875 reg_state->where_defined = is_global ? NULL : state->impl;
876
877 _mesa_hash_table_insert(state->regs, reg, reg_state);
878 }
879
880 static void
881 postvalidate_reg_decl(nir_register *reg, validate_state *state)
882 {
883 struct hash_entry *entry = _mesa_hash_table_search(state->regs, reg);
884
885 assume(entry);
886 reg_validate_state *reg_state = (reg_validate_state *) entry->data;
887
888 nir_foreach_use(src, reg) {
889 struct set_entry *entry = _mesa_set_search(reg_state->uses, src);
890 validate_assert(state, entry);
891 _mesa_set_remove(reg_state->uses, entry);
892 }
893
894 if (reg_state->uses->entries != 0) {
895 printf("extra entries in register uses:\n");
896 struct set_entry *entry;
897 set_foreach(reg_state->uses, entry)
898 printf("%p\n", entry->key);
899
900 abort();
901 }
902
903 nir_foreach_if_use(src, reg) {
904 struct set_entry *entry = _mesa_set_search(reg_state->if_uses, src);
905 validate_assert(state, entry);
906 _mesa_set_remove(reg_state->if_uses, entry);
907 }
908
909 if (reg_state->if_uses->entries != 0) {
910 printf("extra entries in register if_uses:\n");
911 struct set_entry *entry;
912 set_foreach(reg_state->if_uses, entry)
913 printf("%p\n", entry->key);
914
915 abort();
916 }
917
918 nir_foreach_def(src, reg) {
919 struct set_entry *entry = _mesa_set_search(reg_state->defs, src);
920 validate_assert(state, entry);
921 _mesa_set_remove(reg_state->defs, entry);
922 }
923
924 if (reg_state->defs->entries != 0) {
925 printf("extra entries in register defs:\n");
926 struct set_entry *entry;
927 set_foreach(reg_state->defs, entry)
928 printf("%p\n", entry->key);
929
930 abort();
931 }
932 }
933
934 static void
935 validate_var_decl(nir_variable *var, bool is_global, validate_state *state)
936 {
937 state->var = var;
938
939 validate_assert(state, is_global == nir_variable_is_global(var));
940
941 /* Must have exactly one mode set */
942 validate_assert(state, util_bitcount(var->data.mode) == 1);
943
944 /*
945 * TODO validate some things ir_validate.cpp does (requires more GLSL type
946 * support)
947 */
948
949 if (!is_global) {
950 _mesa_hash_table_insert(state->var_defs, var, state->impl);
951 }
952
953 state->var = NULL;
954 }
955
956 static bool
957 postvalidate_ssa_def(nir_ssa_def *def, void *void_state)
958 {
959 validate_state *state = void_state;
960
961 struct hash_entry *entry = _mesa_hash_table_search(state->ssa_defs, def);
962
963 assume(entry);
964 ssa_def_validate_state *def_state = (ssa_def_validate_state *)entry->data;
965
966 nir_foreach_use(src, def) {
967 struct set_entry *entry = _mesa_set_search(def_state->uses, src);
968 validate_assert(state, entry);
969 _mesa_set_remove(def_state->uses, entry);
970 }
971
972 if (def_state->uses->entries != 0) {
973 printf("extra entries in register uses:\n");
974 struct set_entry *entry;
975 set_foreach(def_state->uses, entry)
976 printf("%p\n", entry->key);
977
978 abort();
979 }
980
981 nir_foreach_if_use(src, def) {
982 struct set_entry *entry = _mesa_set_search(def_state->if_uses, src);
983 validate_assert(state, entry);
984 _mesa_set_remove(def_state->if_uses, entry);
985 }
986
987 if (def_state->if_uses->entries != 0) {
988 printf("extra entries in register uses:\n");
989 struct set_entry *entry;
990 set_foreach(def_state->if_uses, entry)
991 printf("%p\n", entry->key);
992
993 abort();
994 }
995
996 return true;
997 }
998
999 static void
1000 validate_function_impl(nir_function_impl *impl, validate_state *state)
1001 {
1002 validate_assert(state, impl->function->impl == impl);
1003 validate_assert(state, impl->cf_node.parent == NULL);
1004
1005 validate_assert(state, impl->num_params == impl->function->num_params);
1006 for (unsigned i = 0; i < impl->num_params; i++) {
1007 validate_assert(state, impl->params[i]->type == impl->function->params[i].type);
1008 validate_assert(state, impl->params[i]->data.mode == nir_var_param);
1009 validate_assert(state, impl->params[i]->data.location == i);
1010 validate_var_decl(impl->params[i], false, state);
1011 }
1012
1013 if (glsl_type_is_void(impl->function->return_type)) {
1014 validate_assert(state, impl->return_var == NULL);
1015 } else {
1016 validate_assert(state, impl->return_var->type == impl->function->return_type);
1017 validate_assert(state, impl->return_var->data.mode == nir_var_param);
1018 validate_assert(state, impl->return_var->data.location == -1);
1019 validate_var_decl(impl->return_var, false, state);
1020 }
1021
1022 validate_assert(state, exec_list_is_empty(&impl->end_block->instr_list));
1023 validate_assert(state, impl->end_block->successors[0] == NULL);
1024 validate_assert(state, impl->end_block->successors[1] == NULL);
1025
1026 state->impl = impl;
1027 state->parent_node = &impl->cf_node;
1028
1029 exec_list_validate(&impl->locals);
1030 nir_foreach_variable(var, &impl->locals) {
1031 validate_var_decl(var, false, state);
1032 }
1033
1034 state->regs_found = realloc(state->regs_found,
1035 BITSET_WORDS(impl->reg_alloc) *
1036 sizeof(BITSET_WORD));
1037 memset(state->regs_found, 0, BITSET_WORDS(impl->reg_alloc) *
1038 sizeof(BITSET_WORD));
1039 exec_list_validate(&impl->registers);
1040 foreach_list_typed(nir_register, reg, node, &impl->registers) {
1041 prevalidate_reg_decl(reg, false, state);
1042 }
1043
1044 state->ssa_defs_found = realloc(state->ssa_defs_found,
1045 BITSET_WORDS(impl->ssa_alloc) *
1046 sizeof(BITSET_WORD));
1047 memset(state->ssa_defs_found, 0, BITSET_WORDS(impl->ssa_alloc) *
1048 sizeof(BITSET_WORD));
1049 exec_list_validate(&impl->body);
1050 foreach_list_typed(nir_cf_node, node, node, &impl->body) {
1051 validate_cf_node(node, state);
1052 }
1053
1054 foreach_list_typed(nir_register, reg, node, &impl->registers) {
1055 postvalidate_reg_decl(reg, state);
1056 }
1057
1058 nir_foreach_block(block, impl) {
1059 nir_foreach_instr(instr, block)
1060 nir_foreach_ssa_def(instr, postvalidate_ssa_def, state);
1061 }
1062 }
1063
1064 static void
1065 validate_function(nir_function *func, validate_state *state)
1066 {
1067 if (func->impl != NULL) {
1068 validate_assert(state, func->impl->function == func);
1069 validate_function_impl(func->impl, state);
1070 }
1071 }
1072
1073 static void
1074 init_validate_state(validate_state *state)
1075 {
1076 state->regs = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
1077 _mesa_key_pointer_equal);
1078 state->ssa_defs = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
1079 _mesa_key_pointer_equal);
1080 state->ssa_defs_found = NULL;
1081 state->regs_found = NULL;
1082 state->var_defs = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
1083 _mesa_key_pointer_equal);
1084 state->errors = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
1085 _mesa_key_pointer_equal);
1086
1087 state->loop = NULL;
1088 state->instr = NULL;
1089 state->var = NULL;
1090 }
1091
1092 static void
1093 destroy_validate_state(validate_state *state)
1094 {
1095 _mesa_hash_table_destroy(state->regs, NULL);
1096 _mesa_hash_table_destroy(state->ssa_defs, NULL);
1097 free(state->ssa_defs_found);
1098 free(state->regs_found);
1099 _mesa_hash_table_destroy(state->var_defs, NULL);
1100 _mesa_hash_table_destroy(state->errors, NULL);
1101 }
1102
1103 static void
1104 dump_errors(validate_state *state)
1105 {
1106 struct hash_table *errors = state->errors;
1107
1108 fprintf(stderr, "%d errors:\n", _mesa_hash_table_num_entries(errors));
1109
1110 nir_print_shader_annotated(state->shader, stderr, errors);
1111
1112 if (_mesa_hash_table_num_entries(errors) > 0) {
1113 fprintf(stderr, "%d additional errors:\n",
1114 _mesa_hash_table_num_entries(errors));
1115 struct hash_entry *entry;
1116 hash_table_foreach(errors, entry) {
1117 fprintf(stderr, "%s\n", (char *)entry->data);
1118 }
1119 }
1120
1121 abort();
1122 }
1123
1124 void
1125 nir_validate_shader(nir_shader *shader)
1126 {
1127 static int should_validate = -1;
1128 if (should_validate < 0)
1129 should_validate = env_var_as_boolean("NIR_VALIDATE", true);
1130 if (!should_validate)
1131 return;
1132
1133 validate_state state;
1134 init_validate_state(&state);
1135
1136 state.shader = shader;
1137
1138 exec_list_validate(&shader->uniforms);
1139 nir_foreach_variable(var, &shader->uniforms) {
1140 validate_var_decl(var, true, &state);
1141 }
1142
1143 exec_list_validate(&shader->inputs);
1144 nir_foreach_variable(var, &shader->inputs) {
1145 validate_var_decl(var, true, &state);
1146 }
1147
1148 exec_list_validate(&shader->outputs);
1149 nir_foreach_variable(var, &shader->outputs) {
1150 validate_var_decl(var, true, &state);
1151 }
1152
1153 exec_list_validate(&shader->shared);
1154 nir_foreach_variable(var, &shader->shared) {
1155 validate_var_decl(var, true, &state);
1156 }
1157
1158 exec_list_validate(&shader->globals);
1159 nir_foreach_variable(var, &shader->globals) {
1160 validate_var_decl(var, true, &state);
1161 }
1162
1163 exec_list_validate(&shader->system_values);
1164 nir_foreach_variable(var, &shader->system_values) {
1165 validate_var_decl(var, true, &state);
1166 }
1167
1168 state.regs_found = realloc(state.regs_found,
1169 BITSET_WORDS(shader->reg_alloc) *
1170 sizeof(BITSET_WORD));
1171 memset(state.regs_found, 0, BITSET_WORDS(shader->reg_alloc) *
1172 sizeof(BITSET_WORD));
1173 exec_list_validate(&shader->registers);
1174 foreach_list_typed(nir_register, reg, node, &shader->registers) {
1175 prevalidate_reg_decl(reg, true, &state);
1176 }
1177
1178 exec_list_validate(&shader->functions);
1179 foreach_list_typed(nir_function, func, node, &shader->functions) {
1180 validate_function(func, &state);
1181 }
1182
1183 foreach_list_typed(nir_register, reg, node, &shader->registers) {
1184 postvalidate_reg_decl(reg, &state);
1185 }
1186
1187 if (_mesa_hash_table_num_entries(state.errors) > 0)
1188 dump_errors(&state);
1189
1190 destroy_validate_state(&state);
1191 }
1192
1193 #endif /* NDEBUG */