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