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