13010ae21d29d39532a6acaf407a9de10eb77eaf
[mesa.git] / src / glsl / 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 /* map of register -> validation state (struct above) */
55 struct hash_table *regs;
56
57 /* the current shader being validated */
58 nir_shader *shader;
59
60 /* the current instruction being validated */
61 nir_instr *instr;
62
63 /* the current basic block being validated */
64 nir_block *block;
65
66 /* the current if statement being validated */
67 nir_if *if_stmt;
68
69 /* the parent of the current cf node being visited */
70 nir_cf_node *parent_node;
71
72 /* the current function implementation being validated */
73 nir_function_impl *impl;
74
75 /* map of SSA value -> function implementation where it is defined */
76 struct hash_table *ssa_defs;
77
78 /* bitset of ssa definitions we have found; used to check uniqueness */
79 BITSET_WORD *ssa_defs_found;
80
81 /* bitset of registers we have currently found; used to check uniqueness */
82 BITSET_WORD *regs_found;
83
84 /* map of local variable -> function implementation where it is defined */
85 struct hash_table *var_defs;
86 } validate_state;
87
88 static void validate_src(nir_src *src, validate_state *state);
89
90 static void
91 validate_reg_src(nir_reg_src *src, validate_state *state)
92 {
93 assert(src->reg != NULL);
94
95 struct hash_entry *entry;
96 entry = _mesa_hash_table_search(state->regs, src->reg);
97 assert(entry);
98
99 reg_validate_state *reg_state = (reg_validate_state *) entry->data;
100
101 if (state->instr) {
102 _mesa_set_add(reg_state->uses, state->instr);
103
104 assert(_mesa_set_search(src->reg->uses, state->instr));
105 } else {
106 assert(state->if_stmt);
107 _mesa_set_add(reg_state->if_uses, state->if_stmt);
108
109 assert(_mesa_set_search(src->reg->if_uses, state->if_stmt));
110 }
111
112 if (!src->reg->is_global) {
113 assert(reg_state->where_defined == state->impl &&
114 "using a register declared in a different function");
115 }
116
117 assert((src->reg->num_array_elems == 0 ||
118 src->base_offset < src->reg->num_array_elems) &&
119 "definitely out-of-bounds array access");
120
121 if (src->indirect) {
122 assert(src->reg->num_array_elems != 0);
123 assert((src->indirect->is_ssa || src->indirect->reg.indirect == NULL) &&
124 "only one level of indirection allowed");
125 validate_src(src->indirect, state);
126 }
127 }
128
129 static void
130 validate_ssa_src(nir_ssa_def *def, validate_state *state)
131 {
132 assert(def != NULL);
133
134 struct hash_entry *entry = _mesa_hash_table_search(state->ssa_defs, def);
135
136 assert(entry);
137
138 assert((nir_function_impl *) entry->data == state->impl &&
139 "using an SSA value defined in a different function");
140
141 struct set_entry *entry2;
142
143 if (state->instr) {
144 entry2 = _mesa_set_search(def->uses, state->instr);
145 } else {
146 assert(state->if_stmt);
147 entry2 = _mesa_set_search(def->if_uses, state->if_stmt);
148 }
149
150 assert(entry2 && "SSA use missing");
151
152 /* TODO validate that the use is dominated by the definition */
153 }
154
155 static void
156 validate_src(nir_src *src, validate_state *state)
157 {
158 if (src->is_ssa)
159 validate_ssa_src(src->ssa, state);
160 else
161 validate_reg_src(&src->reg, state);
162 }
163
164 static void
165 validate_alu_src(nir_alu_instr *instr, unsigned index, validate_state *state)
166 {
167 nir_alu_src *src = &instr->src[index];
168
169 unsigned num_components;
170 if (src->src.is_ssa)
171 num_components = src->src.ssa->num_components;
172 else {
173 if (src->src.reg.reg->is_packed)
174 num_components = 4; /* can't check anything */
175 else
176 num_components = src->src.reg.reg->num_components;
177 }
178 for (unsigned i = 0; i < 4; i++) {
179 assert(src->swizzle[i] < 4);
180
181 if (nir_alu_instr_channel_used(instr, index, i))
182 assert(src->swizzle[i] < num_components);
183 }
184
185 validate_src(&src->src, state);
186 }
187
188 static void
189 validate_reg_dest(nir_reg_dest *dest, validate_state *state)
190 {
191 assert(dest->reg != NULL);
192
193 struct set_entry *entry = _mesa_set_search(dest->reg->defs, state->instr);
194 assert(entry && "definition not in nir_register.defs");
195
196 struct hash_entry *entry2;
197 entry2 = _mesa_hash_table_search(state->regs, dest->reg);
198
199 assert(entry2);
200
201 reg_validate_state *reg_state = (reg_validate_state *) entry2->data;
202 _mesa_set_add(reg_state->defs, state->instr);
203
204 if (!dest->reg->is_global) {
205 assert(reg_state->where_defined == state->impl &&
206 "writing to a register declared in a different function");
207 }
208
209 assert((dest->reg->num_array_elems == 0 ||
210 dest->base_offset < dest->reg->num_array_elems) &&
211 "definitely out-of-bounds array access");
212
213 if (dest->indirect) {
214 assert(dest->reg->num_array_elems != 0);
215 assert((dest->indirect->is_ssa || dest->indirect->reg.indirect == NULL) &&
216 "only one level of indirection allowed");
217 validate_src(dest->indirect, state);
218 }
219 }
220
221 static void
222 validate_ssa_def(nir_ssa_def *def, validate_state *state)
223 {
224 assert(def->index < state->impl->ssa_alloc);
225 assert(!BITSET_TEST(state->ssa_defs_found, def->index));
226 BITSET_SET(state->ssa_defs_found, def->index);
227
228 assert(def->num_components <= 4);
229 _mesa_hash_table_insert(state->ssa_defs, def, state->impl);
230 }
231
232 static void
233 validate_dest(nir_dest *dest, validate_state *state)
234 {
235 if (dest->is_ssa)
236 validate_ssa_def(&dest->ssa, state);
237 else
238 validate_reg_dest(&dest->reg, state);
239 }
240
241 static void
242 validate_alu_dest(nir_alu_dest *dest, validate_state *state)
243 {
244 unsigned dest_size =
245 dest->dest.is_ssa ? dest->dest.ssa.num_components
246 : dest->dest.reg.reg->num_components;
247 bool is_packed = !dest->dest.is_ssa && dest->dest.reg.reg->is_packed;
248 /*
249 * validate that the instruction doesn't write to components not in the
250 * register/SSA value
251 */
252 assert(is_packed || !(dest->write_mask & ~((1 << dest_size) - 1)));
253
254 /* validate that saturate is only ever used on instructions with
255 * destinations of type float
256 */
257 nir_alu_instr *alu = nir_instr_as_alu(state->instr);
258 assert(nir_op_infos[alu->op].output_type == nir_type_float ||
259 !dest->saturate);
260
261 validate_dest(&dest->dest, state);
262 }
263
264 static void
265 validate_alu_instr(nir_alu_instr *instr, validate_state *state)
266 {
267 assert(instr->op < nir_num_opcodes);
268
269 validate_alu_dest(&instr->dest, state);
270
271 for (unsigned i = 0; i < nir_op_infos[instr->op].num_inputs; i++) {
272 validate_alu_src(instr, i, state);
273 }
274 }
275
276 static void
277 validate_deref_chain(nir_deref *deref, validate_state *state)
278 {
279 nir_deref *parent = NULL;
280 while (deref != NULL) {
281 switch (deref->deref_type) {
282 case nir_deref_type_array:
283 assert(deref->type == glsl_get_array_element(parent->type));
284 if (nir_deref_as_array(deref)->deref_array_type ==
285 nir_deref_array_type_indirect)
286 validate_src(&nir_deref_as_array(deref)->indirect, state);
287 break;
288
289 case nir_deref_type_struct:
290 assert(deref->type ==
291 glsl_get_struct_field(parent->type,
292 nir_deref_as_struct(deref)->index));
293 break;
294
295 case nir_deref_type_var:
296 break;
297
298 default:
299 assert(!"Invalid deref type");
300 break;
301 }
302
303 parent = deref;
304 deref = deref->child;
305 }
306 }
307
308 static void
309 validate_var_use(nir_variable *var, validate_state *state)
310 {
311 if (var->data.mode == nir_var_local) {
312 struct hash_entry *entry = _mesa_hash_table_search(state->var_defs, var);
313
314 assert(entry);
315 assert((nir_function_impl *) entry->data == state->impl);
316 }
317 }
318
319 static void
320 validate_deref_var(nir_deref_var *deref, validate_state *state)
321 {
322 assert(deref != NULL);
323 assert(deref->deref.type == deref->var->type);
324
325 validate_var_use(deref->var, state);
326
327 validate_deref_chain(&deref->deref, state);
328 }
329
330 static void
331 validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
332 {
333 unsigned num_srcs = nir_intrinsic_infos[instr->intrinsic].num_srcs;
334 for (unsigned i = 0; i < num_srcs; i++) {
335 unsigned components_read =
336 nir_intrinsic_infos[instr->intrinsic].src_components[i];
337 if (components_read == 0)
338 components_read = instr->num_components;
339
340 assert(components_read > 0);
341
342 if (instr->src[i].is_ssa) {
343 assert(components_read <= instr->src[i].ssa->num_components);
344 } else if (!instr->src[i].reg.reg->is_packed) {
345 assert(components_read <= instr->src[i].reg.reg->num_components);
346 }
347
348 validate_src(&instr->src[i], state);
349 }
350
351 if (nir_intrinsic_infos[instr->intrinsic].has_dest) {
352 unsigned components_written =
353 nir_intrinsic_infos[instr->intrinsic].dest_components;
354 if (components_written == 0)
355 components_written = instr->num_components;
356
357 assert(components_written > 0);
358
359 if (instr->dest.is_ssa) {
360 assert(components_written <= instr->dest.ssa.num_components);
361 } else if (!instr->dest.reg.reg->is_packed) {
362 assert(components_written <= instr->dest.reg.reg->num_components);
363 }
364
365 validate_dest(&instr->dest, state);
366 }
367
368 unsigned num_vars = nir_intrinsic_infos[instr->intrinsic].num_variables;
369 for (unsigned i = 0; i < num_vars; i++) {
370 validate_deref_var(instr->variables[i], state);
371 }
372
373 switch (instr->intrinsic) {
374 case nir_intrinsic_load_var:
375 assert(instr->variables[0]->var->data.mode != nir_var_shader_out);
376 break;
377 case nir_intrinsic_store_var:
378 assert(instr->variables[0]->var->data.mode != nir_var_shader_in &&
379 instr->variables[0]->var->data.mode != nir_var_uniform);
380 break;
381 case nir_intrinsic_copy_var:
382 assert(instr->variables[0]->var->data.mode != nir_var_shader_in &&
383 instr->variables[0]->var->data.mode != nir_var_uniform);
384 assert(instr->variables[1]->var->data.mode != nir_var_shader_out);
385 break;
386 default:
387 break;
388 }
389 }
390
391 static void
392 validate_tex_instr(nir_tex_instr *instr, validate_state *state)
393 {
394 validate_dest(&instr->dest, state);
395
396 bool src_type_seen[nir_num_tex_src_types];
397 for (unsigned i = 0; i < nir_num_tex_src_types; i++)
398 src_type_seen[i] = false;
399
400 for (unsigned i = 0; i < instr->num_srcs; i++) {
401 assert(!src_type_seen[instr->src[i].src_type]);
402 src_type_seen[instr->src[i].src_type] = true;
403 validate_src(&instr->src[i].src, state);
404 }
405
406 if (instr->sampler != NULL)
407 validate_deref_var(instr->sampler, state);
408 }
409
410 static void
411 validate_call_instr(nir_call_instr *instr, validate_state *state)
412 {
413 if (instr->return_deref == NULL)
414 assert(glsl_type_is_void(instr->callee->return_type));
415 else
416 assert(instr->return_deref->deref.type == instr->callee->return_type);
417
418 assert(instr->num_params == instr->callee->num_params);
419
420 for (unsigned i = 0; i < instr->num_params; i++) {
421 assert(instr->callee->params[i].type == instr->params[i]->deref.type);
422 validate_deref_var(instr->params[i], state);
423 }
424
425 validate_deref_var(instr->return_deref, state);
426 }
427
428 static void
429 validate_load_const_instr(nir_load_const_instr *instr, validate_state *state)
430 {
431 validate_ssa_def(&instr->def, state);
432 }
433
434 static void
435 validate_ssa_undef_instr(nir_ssa_undef_instr *instr, validate_state *state)
436 {
437 validate_ssa_def(&instr->def, state);
438 }
439
440 static void
441 validate_phi_instr(nir_phi_instr *instr, validate_state *state)
442 {
443 /*
444 * don't validate the sources until we get to them from their predecessor
445 * basic blocks, to avoid validating an SSA use before its definition.
446 */
447
448 validate_dest(&instr->dest, state);
449
450 exec_list_validate(&instr->srcs);
451 assert(exec_list_length(&instr->srcs) ==
452 state->block->predecessors->entries);
453 }
454
455 static void
456 validate_instr(nir_instr *instr, validate_state *state)
457 {
458 assert(instr->block == state->block);
459
460 state->instr = instr;
461
462 switch (instr->type) {
463 case nir_instr_type_alu:
464 validate_alu_instr(nir_instr_as_alu(instr), state);
465 break;
466
467 case nir_instr_type_call:
468 validate_call_instr(nir_instr_as_call(instr), state);
469 break;
470
471 case nir_instr_type_intrinsic:
472 validate_intrinsic_instr(nir_instr_as_intrinsic(instr), state);
473 break;
474
475 case nir_instr_type_tex:
476 validate_tex_instr(nir_instr_as_tex(instr), state);
477 break;
478
479 case nir_instr_type_load_const:
480 validate_load_const_instr(nir_instr_as_load_const(instr), state);
481 break;
482
483 case nir_instr_type_phi:
484 validate_phi_instr(nir_instr_as_phi(instr), state);
485 break;
486
487 case nir_instr_type_ssa_undef:
488 validate_ssa_undef_instr(nir_instr_as_ssa_undef(instr), state);
489 break;
490
491 case nir_instr_type_jump:
492 break;
493
494 default:
495 assert(!"Invalid ALU instruction type");
496 break;
497 }
498
499 state->instr = NULL;
500 }
501
502 static void
503 validate_phi_src(nir_phi_instr *instr, nir_block *pred, validate_state *state)
504 {
505 state->instr = &instr->instr;
506
507 assert(instr->dest.is_ssa);
508
509 exec_list_validate(&instr->srcs);
510 nir_foreach_phi_src(instr, src) {
511 if (src->pred == pred) {
512 assert(src->src.is_ssa);
513 assert(src->src.ssa->num_components ==
514 instr->dest.ssa.num_components);
515
516 validate_src(&src->src, state);
517 state->instr = NULL;
518 return;
519 }
520 }
521
522 abort();
523 }
524
525 static void
526 validate_phi_srcs(nir_block *block, nir_block *succ, validate_state *state)
527 {
528 nir_foreach_instr(succ, instr) {
529 if (instr->type != nir_instr_type_phi)
530 break;
531
532 validate_phi_src(nir_instr_as_phi(instr), block, state);
533 }
534 }
535
536 static void validate_cf_node(nir_cf_node *node, validate_state *state);
537
538 static void
539 validate_block(nir_block *block, validate_state *state)
540 {
541 assert(block->cf_node.parent == state->parent_node);
542
543 state->block = block;
544
545 exec_list_validate(&block->instr_list);
546 nir_foreach_instr(block, instr) {
547 if (instr->type == nir_instr_type_phi) {
548 assert(instr == nir_block_first_instr(block) ||
549 nir_instr_prev(instr)->type == nir_instr_type_phi);
550 }
551
552 if (instr->type == nir_instr_type_jump) {
553 assert(instr == nir_block_last_instr(block));
554 }
555
556 validate_instr(instr, state);
557 }
558
559 assert(block->successors[0] != NULL);
560
561 for (unsigned i = 0; i < 2; i++) {
562 if (block->successors[i] != NULL) {
563 struct set_entry *entry =
564 _mesa_set_search(block->successors[i]->predecessors, block);
565 assert(entry);
566
567 validate_phi_srcs(block, block->successors[i], state);
568 }
569 }
570
571 if (!exec_list_is_empty(&block->instr_list) &&
572 nir_block_last_instr(block)->type == nir_instr_type_jump)
573 assert(block->successors[1] == NULL);
574 }
575
576 static void
577 validate_if(nir_if *if_stmt, validate_state *state)
578 {
579 state->if_stmt = if_stmt;
580
581 assert(!exec_node_is_head_sentinel(if_stmt->cf_node.node.prev));
582 nir_cf_node *prev_node = nir_cf_node_prev(&if_stmt->cf_node);
583 assert(prev_node->type == nir_cf_node_block);
584
585 nir_block *prev_block = nir_cf_node_as_block(prev_node);
586 assert(&prev_block->successors[0]->cf_node ==
587 nir_if_first_then_node(if_stmt));
588 assert(&prev_block->successors[1]->cf_node ==
589 nir_if_first_else_node(if_stmt));
590
591 assert(!exec_node_is_tail_sentinel(if_stmt->cf_node.node.next));
592 nir_cf_node *next_node = nir_cf_node_next(&if_stmt->cf_node);
593 assert(next_node->type == nir_cf_node_block);
594
595 validate_src(&if_stmt->condition, state);
596
597 assert(!exec_list_is_empty(&if_stmt->then_list));
598 assert(!exec_list_is_empty(&if_stmt->else_list));
599
600 nir_cf_node *old_parent = state->parent_node;
601 state->parent_node = &if_stmt->cf_node;
602
603 exec_list_validate(&if_stmt->then_list);
604 foreach_list_typed(nir_cf_node, cf_node, node, &if_stmt->then_list) {
605 validate_cf_node(cf_node, state);
606 }
607
608 exec_list_validate(&if_stmt->else_list);
609 foreach_list_typed(nir_cf_node, cf_node, node, &if_stmt->else_list) {
610 validate_cf_node(cf_node, state);
611 }
612
613 state->parent_node = old_parent;
614 state->if_stmt = NULL;
615 }
616
617 static void
618 validate_loop(nir_loop *loop, validate_state *state)
619 {
620 assert(!exec_node_is_head_sentinel(loop->cf_node.node.prev));
621 nir_cf_node *prev_node = nir_cf_node_prev(&loop->cf_node);
622 assert(prev_node->type == nir_cf_node_block);
623
624 nir_block *prev_block = nir_cf_node_as_block(prev_node);
625 assert(&prev_block->successors[0]->cf_node == nir_loop_first_cf_node(loop));
626 assert(prev_block->successors[1] == NULL);
627
628 assert(!exec_node_is_tail_sentinel(loop->cf_node.node.next));
629 nir_cf_node *next_node = nir_cf_node_next(&loop->cf_node);
630 assert(next_node->type == nir_cf_node_block);
631
632 assert(!exec_list_is_empty(&loop->body));
633
634 nir_cf_node *old_parent = state->parent_node;
635 state->parent_node = &loop->cf_node;
636
637 exec_list_validate(&loop->body);
638 foreach_list_typed(nir_cf_node, cf_node, node, &loop->body) {
639 validate_cf_node(cf_node, state);
640 }
641
642 state->parent_node = old_parent;
643 }
644
645 static void
646 validate_cf_node(nir_cf_node *node, validate_state *state)
647 {
648 assert(node->parent == state->parent_node);
649
650 switch (node->type) {
651 case nir_cf_node_block:
652 validate_block(nir_cf_node_as_block(node), state);
653 break;
654
655 case nir_cf_node_if:
656 validate_if(nir_cf_node_as_if(node), state);
657 break;
658
659 case nir_cf_node_loop:
660 validate_loop(nir_cf_node_as_loop(node), state);
661 break;
662
663 default:
664 assert(!"Invalid ALU instruction type");
665 break;
666 }
667 }
668
669 static void
670 prevalidate_reg_decl(nir_register *reg, bool is_global, validate_state *state)
671 {
672 assert(reg->is_global == is_global);
673
674 if (is_global)
675 assert(reg->index < state->shader->reg_alloc);
676 else
677 assert(reg->index < state->impl->reg_alloc);
678 assert(!BITSET_TEST(state->regs_found, reg->index));
679 BITSET_SET(state->regs_found, reg->index);
680
681 reg_validate_state *reg_state = ralloc(state->regs, reg_validate_state);
682 reg_state->uses = _mesa_set_create(reg_state, _mesa_hash_pointer,
683 _mesa_key_pointer_equal);
684 reg_state->if_uses = _mesa_set_create(reg_state, _mesa_hash_pointer,
685 _mesa_key_pointer_equal);
686 reg_state->defs = _mesa_set_create(reg_state, _mesa_hash_pointer,
687 _mesa_key_pointer_equal);
688
689 reg_state->where_defined = is_global ? NULL : state->impl;
690
691 _mesa_hash_table_insert(state->regs, reg, reg_state);
692 }
693
694 static void
695 postvalidate_reg_decl(nir_register *reg, validate_state *state)
696 {
697 struct hash_entry *entry = _mesa_hash_table_search(state->regs, reg);
698
699 reg_validate_state *reg_state = (reg_validate_state *) entry->data;
700
701 if (reg_state->uses->entries != reg->uses->entries) {
702 printf("extra entries in register uses:\n");
703 struct set_entry *entry;
704 set_foreach(reg->uses, entry) {
705 struct set_entry *entry2 =
706 _mesa_set_search(reg_state->uses, entry->key);
707
708 if (entry2 == NULL) {
709 printf("%p\n", entry->key);
710 }
711 }
712
713 abort();
714 }
715
716 if (reg_state->if_uses->entries != reg->if_uses->entries) {
717 printf("extra entries in register if_uses:\n");
718 struct set_entry *entry;
719 set_foreach(reg->if_uses, entry) {
720 struct set_entry *entry2 =
721 _mesa_set_search(reg_state->if_uses, entry->key);
722
723 if (entry2 == NULL) {
724 printf("%p\n", entry->key);
725 }
726 }
727
728 abort();
729 }
730
731 if (reg_state->defs->entries != reg->defs->entries) {
732 printf("extra entries in register defs:\n");
733 struct set_entry *entry;
734 set_foreach(reg->defs, entry) {
735 struct set_entry *entry2 =
736 _mesa_set_search(reg_state->defs, entry->key);
737
738 if (entry2 == NULL) {
739 printf("%p\n", entry->key);
740 }
741 }
742
743 abort();
744 }
745 }
746
747 static void
748 validate_var_decl(nir_variable *var, bool is_global, validate_state *state)
749 {
750 assert(is_global != (var->data.mode == nir_var_local));
751
752 /*
753 * TODO validate some things ir_validate.cpp does (requires more GLSL type
754 * support)
755 */
756
757 if (!is_global) {
758 _mesa_hash_table_insert(state->var_defs, var, state->impl);
759 }
760 }
761
762 static void
763 validate_function_impl(nir_function_impl *impl, validate_state *state)
764 {
765 assert(impl->overload->impl == impl);
766 assert(impl->cf_node.parent == NULL);
767
768 assert(impl->num_params == impl->overload->num_params);
769 for (unsigned i = 0; i < impl->num_params; i++)
770 assert(impl->params[i]->type == impl->overload->params[i].type);
771
772 if (glsl_type_is_void(impl->overload->return_type))
773 assert(impl->return_var == NULL);
774 else
775 assert(impl->return_var->type == impl->overload->return_type);
776
777 assert(exec_list_is_empty(&impl->end_block->instr_list));
778 assert(impl->end_block->successors[0] == NULL);
779 assert(impl->end_block->successors[1] == NULL);
780
781 state->impl = impl;
782 state->parent_node = &impl->cf_node;
783
784 exec_list_validate(&impl->locals);
785 foreach_list_typed(nir_variable, var, node, &impl->locals) {
786 validate_var_decl(var, false, state);
787 }
788
789 state->regs_found = realloc(state->regs_found,
790 BITSET_WORDS(impl->reg_alloc) *
791 sizeof(BITSET_WORD));
792 memset(state->regs_found, 0, BITSET_WORDS(impl->reg_alloc) *
793 sizeof(BITSET_WORD));
794 exec_list_validate(&impl->registers);
795 foreach_list_typed(nir_register, reg, node, &impl->registers) {
796 prevalidate_reg_decl(reg, false, state);
797 }
798
799 state->ssa_defs_found = realloc(state->ssa_defs_found,
800 BITSET_WORDS(impl->ssa_alloc) *
801 sizeof(BITSET_WORD));
802 memset(state->ssa_defs_found, 0, BITSET_WORDS(impl->ssa_alloc) *
803 sizeof(BITSET_WORD));
804 exec_list_validate(&impl->body);
805 foreach_list_typed(nir_cf_node, node, node, &impl->body) {
806 validate_cf_node(node, state);
807 }
808
809 foreach_list_typed(nir_register, reg, node, &impl->registers) {
810 postvalidate_reg_decl(reg, state);
811 }
812 }
813
814 static void
815 validate_function_overload(nir_function_overload *overload,
816 validate_state *state)
817 {
818 if (overload->impl != NULL)
819 validate_function_impl(overload->impl, state);
820 }
821
822 static void
823 validate_function(nir_function *func, validate_state *state)
824 {
825 exec_list_validate(&func->overload_list);
826 foreach_list_typed(nir_function_overload, overload, node, &func->overload_list) {
827 assert(overload->function == func);
828 validate_function_overload(overload, state);
829 }
830 }
831
832 static void
833 init_validate_state(validate_state *state)
834 {
835 state->regs = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
836 _mesa_key_pointer_equal);
837 state->ssa_defs = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
838 _mesa_key_pointer_equal);
839 state->ssa_defs_found = NULL;
840 state->regs_found = NULL;
841 state->var_defs = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
842 _mesa_key_pointer_equal);
843 }
844
845 static void
846 destroy_validate_state(validate_state *state)
847 {
848 _mesa_hash_table_destroy(state->regs, NULL);
849 _mesa_hash_table_destroy(state->ssa_defs, NULL);
850 free(state->ssa_defs_found);
851 free(state->regs_found);
852 _mesa_hash_table_destroy(state->var_defs, NULL);
853 }
854
855 void
856 nir_validate_shader(nir_shader *shader)
857 {
858 validate_state state;
859 init_validate_state(&state);
860
861 state.shader = shader;
862
863 struct hash_entry *entry;
864 hash_table_foreach(shader->uniforms, entry) {
865 validate_var_decl((nir_variable *) entry->data, true, &state);
866 }
867
868 hash_table_foreach(shader->inputs, entry) {
869 validate_var_decl((nir_variable *) entry->data, true, &state);
870 }
871
872 hash_table_foreach(shader->outputs, entry) {
873 validate_var_decl((nir_variable *) entry->data, true, &state);
874 }
875
876 exec_list_validate(&shader->globals);
877 foreach_list_typed(nir_variable, var, node, &shader->globals) {
878 validate_var_decl(var, true, &state);
879 }
880
881 exec_list_validate(&shader->system_values);
882 foreach_list_typed(nir_variable, var, node, &shader->system_values) {
883 validate_var_decl(var, true, &state);
884 }
885
886 state.regs_found = realloc(state.regs_found,
887 BITSET_WORDS(shader->reg_alloc) *
888 sizeof(BITSET_WORD));
889 memset(state.regs_found, 0, BITSET_WORDS(shader->reg_alloc) *
890 sizeof(BITSET_WORD));
891 exec_list_validate(&shader->registers);
892 foreach_list_typed(nir_register, reg, node, &shader->registers) {
893 prevalidate_reg_decl(reg, true, &state);
894 }
895
896 exec_list_validate(&shader->functions);
897 foreach_list_typed(nir_function, func, node, &shader->functions) {
898 validate_function(func, &state);
899 }
900
901 foreach_list_typed(nir_register, reg, node, &shader->registers) {
902 postvalidate_reg_decl(reg, &state);
903 }
904
905 destroy_validate_state(&state);
906 }
907
908 #endif /* NDEBUG */