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