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