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