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