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 "c11/threads.h"
30#include <assert.h>
31
32/*
33 * This file checks for invalid IR indicating a bug somewhere in the compiler.
34 */
35
36/* Since this file is just a pile of asserts, don't bother compiling it if
37 * we're not building a debug build.
38 */
39#ifndef NDEBUG
40
41/*
42 * Per-register validation state.
43 */
44
45typedef struct {
46   /*
47    * equivalent to the uses and defs in nir_register, but built up by the
48    * validator. At the end, we verify that the sets have the same entries.
49    */
50   struct set *uses, *if_uses, *defs;
51   nir_function_impl *where_defined; /* NULL for global registers */
52} reg_validate_state;
53
54typedef struct {
55   /*
56    * equivalent to the uses in nir_ssa_def, but built up by the validator.
57    * At the end, we verify that the sets have the same entries.
58    */
59   struct set *uses, *if_uses;
60   nir_function_impl *where_defined;
61} ssa_def_validate_state;
62
63typedef struct {
64   /* map of register -> validation state (struct above) */
65   struct hash_table *regs;
66
67   /* the current shader being validated */
68   nir_shader *shader;
69
70   /* the current instruction being validated */
71   nir_instr *instr;
72
73   /* the current variable being validated */
74   nir_variable *var;
75
76   /* the current basic block being validated */
77   nir_block *block;
78
79   /* the current if statement being validated */
80   nir_if *if_stmt;
81
82   /* the current loop being visited */
83   nir_loop *loop;
84
85   /* the parent of the current cf node being visited */
86   nir_cf_node *parent_node;
87
88   /* the current function implementation being validated */
89   nir_function_impl *impl;
90
91   /* map of SSA value -> function implementation where it is defined */
92   struct hash_table *ssa_defs;
93
94   /* bitset of ssa definitions we have found; used to check uniqueness */
95   BITSET_WORD *ssa_defs_found;
96
97   /* bitset of registers we have currently found; used to check uniqueness */
98   BITSET_WORD *regs_found;
99
100   /* map of variable -> function implementation where it is defined or NULL
101    * if it is a global variable
102    */
103   struct hash_table *var_defs;
104
105   /* map of instruction/var/etc to failed assert string */
106   struct hash_table *errors;
107} validate_state;
108
109static void
110log_error(validate_state *state, const char *cond, const char *file, int line)
111{
112   const void *obj;
113
114   if (state->instr)
115      obj = state->instr;
116   else if (state->var)
117      obj = state->var;
118   else
119      obj = cond;
120
121   char *msg = ralloc_asprintf(state->errors, "error: %s (%s:%d)",
122                               cond, file, line);
123
124   _mesa_hash_table_insert(state->errors, obj, msg);
125}
126
127#define validate_assert(state, cond) do {             \
128      if (!(cond))                                    \
129         log_error(state, #cond, __FILE__, __LINE__); \
130   } while (0)
131
132static void validate_src(nir_src *src, validate_state *state,
133                         unsigned bit_sizes, unsigned num_components);
134
135static void
136validate_reg_src(nir_src *src, validate_state *state,
137                 unsigned bit_sizes, unsigned num_components)
138{
139   validate_assert(state, src->reg.reg != NULL);
140
141   struct hash_entry *entry;
142   entry = _mesa_hash_table_search(state->regs, src->reg.reg);
143   validate_assert(state, entry);
144
145   reg_validate_state *reg_state = (reg_validate_state *) entry->data;
146
147   if (state->instr) {
148      _mesa_set_add(reg_state->uses, src);
149   } else {
150      validate_assert(state, state->if_stmt);
151      _mesa_set_add(reg_state->if_uses, src);
152   }
153
154   validate_assert(state, reg_state->where_defined == state->impl &&
155          "using a register declared in a different function");
156
157   if (bit_sizes)
158      validate_assert(state, src->reg.reg->bit_size & bit_sizes);
159   if (num_components)
160      validate_assert(state, src->reg.reg->num_components == num_components);
161
162   validate_assert(state, (src->reg.reg->num_array_elems == 0 ||
163          src->reg.base_offset < src->reg.reg->num_array_elems) &&
164          "definitely out-of-bounds array access");
165
166   if (src->reg.indirect) {
167      validate_assert(state, src->reg.reg->num_array_elems != 0);
168      validate_assert(state, (src->reg.indirect->is_ssa ||
169              src->reg.indirect->reg.indirect == NULL) &&
170             "only one level of indirection allowed");
171      validate_src(src->reg.indirect, state, 32, 1);
172   }
173}
174
175static void
176validate_ssa_src(nir_src *src, validate_state *state,
177                 unsigned bit_sizes, unsigned num_components)
178{
179   validate_assert(state, src->ssa != NULL);
180
181   struct hash_entry *entry = _mesa_hash_table_search(state->ssa_defs, src->ssa);
182
183   validate_assert(state, entry);
184
185   if (!entry)
186      return;
187
188   ssa_def_validate_state *def_state = (ssa_def_validate_state *)entry->data;
189
190   validate_assert(state, def_state->where_defined == state->impl &&
191          "using an SSA value defined in a different function");
192
193   if (state->instr) {
194      _mesa_set_add(def_state->uses, src);
195   } else {
196      validate_assert(state, state->if_stmt);
197      _mesa_set_add(def_state->if_uses, src);
198   }
199
200   if (bit_sizes)
201      validate_assert(state, src->ssa->bit_size & bit_sizes);
202   if (num_components)
203      validate_assert(state, src->ssa->num_components == num_components);
204
205   /* TODO validate that the use is dominated by the definition */
206}
207
208static void
209validate_src(nir_src *src, validate_state *state,
210             unsigned bit_sizes, unsigned num_components)
211{
212   if (state->instr)
213      validate_assert(state, src->parent_instr == state->instr);
214   else
215      validate_assert(state, src->parent_if == state->if_stmt);
216
217   if (src->is_ssa)
218      validate_ssa_src(src, state, bit_sizes, num_components);
219   else
220      validate_reg_src(src, state, bit_sizes, num_components);
221}
222
223static void
224validate_alu_src(nir_alu_instr *instr, unsigned index, validate_state *state)
225{
226   nir_alu_src *src = &instr->src[index];
227
228   unsigned num_components = nir_src_num_components(src->src);
229   for (unsigned i = 0; i < NIR_MAX_VEC_COMPONENTS; i++) {
230      validate_assert(state, src->swizzle[i] < NIR_MAX_VEC_COMPONENTS);
231
232      if (nir_alu_instr_channel_used(instr, index, i))
233         validate_assert(state, src->swizzle[i] < num_components);
234   }
235
236   validate_src(&src->src, state, 0, 0);
237}
238
239static void
240validate_reg_dest(nir_reg_dest *dest, validate_state *state,
241                  unsigned bit_sizes, unsigned num_components)
242{
243   validate_assert(state, dest->reg != NULL);
244
245   validate_assert(state, dest->parent_instr == state->instr);
246
247   struct hash_entry *entry2;
248   entry2 = _mesa_hash_table_search(state->regs, dest->reg);
249
250   validate_assert(state, entry2);
251
252   reg_validate_state *reg_state = (reg_validate_state *) entry2->data;
253   _mesa_set_add(reg_state->defs, dest);
254
255   validate_assert(state, reg_state->where_defined == state->impl &&
256          "writing to a register declared in a different function");
257
258   if (bit_sizes)
259      validate_assert(state, dest->reg->bit_size & bit_sizes);
260   if (num_components)
261      validate_assert(state, dest->reg->num_components == num_components);
262
263   validate_assert(state, (dest->reg->num_array_elems == 0 ||
264          dest->base_offset < dest->reg->num_array_elems) &&
265          "definitely out-of-bounds array access");
266
267   if (dest->indirect) {
268      validate_assert(state, dest->reg->num_array_elems != 0);
269      validate_assert(state, (dest->indirect->is_ssa || dest->indirect->reg.indirect == NULL) &&
270             "only one level of indirection allowed");
271      validate_src(dest->indirect, state, 32, 1);
272   }
273}
274
275static void
276validate_ssa_def(nir_ssa_def *def, validate_state *state)
277{
278   validate_assert(state, def->index < state->impl->ssa_alloc);
279   validate_assert(state, !BITSET_TEST(state->ssa_defs_found, def->index));
280   BITSET_SET(state->ssa_defs_found, def->index);
281
282   validate_assert(state, def->parent_instr == state->instr);
283
284   validate_assert(state, (def->num_components <= 4) ||
285                          (def->num_components == 8) ||
286                          (def->num_components == 16));
287
288   list_validate(&def->uses);
289   list_validate(&def->if_uses);
290
291   ssa_def_validate_state *def_state = ralloc(state->ssa_defs,
292                                              ssa_def_validate_state);
293   def_state->where_defined = state->impl;
294   def_state->uses = _mesa_pointer_set_create(def_state);
295   def_state->if_uses = _mesa_pointer_set_create(def_state);
296   _mesa_hash_table_insert(state->ssa_defs, def, def_state);
297}
298
299static void
300validate_dest(nir_dest *dest, validate_state *state,
301              unsigned bit_sizes, unsigned num_components)
302{
303   if (dest->is_ssa) {
304      if (bit_sizes)
305         validate_assert(state, dest->ssa.bit_size & bit_sizes);
306      if (num_components)
307         validate_assert(state, dest->ssa.num_components == num_components);
308      validate_ssa_def(&dest->ssa, state);
309   } else {
310      validate_reg_dest(&dest->reg, state, bit_sizes, num_components);
311   }
312}
313
314static void
315validate_alu_dest(nir_alu_instr *instr, validate_state *state)
316{
317   nir_alu_dest *dest = &instr->dest;
318
319   unsigned dest_size = nir_dest_num_components(dest->dest);
320   /*
321    * validate that the instruction doesn't write to components not in the
322    * register/SSA value
323    */
324   validate_assert(state, !(dest->write_mask & ~((1 << dest_size) - 1)));
325
326   /* validate that saturate is only ever used on instructions with
327    * destinations of type float
328    */
329   nir_alu_instr *alu = nir_instr_as_alu(state->instr);
330   validate_assert(state,
331          (nir_alu_type_get_base_type(nir_op_infos[alu->op].output_type) ==
332           nir_type_float) ||
333          !dest->saturate);
334
335   validate_dest(&dest->dest, state, 0, 0);
336}
337
338static void
339validate_alu_instr(nir_alu_instr *instr, validate_state *state)
340{
341   validate_assert(state, instr->op < nir_num_opcodes);
342
343   unsigned instr_bit_size = 0;
344   for (unsigned i = 0; i < nir_op_infos[instr->op].num_inputs; i++) {
345      nir_alu_type src_type = nir_op_infos[instr->op].input_types[i];
346      unsigned src_bit_size = nir_src_bit_size(instr->src[i].src);
347      if (nir_alu_type_get_type_size(src_type)) {
348         validate_assert(state, src_bit_size == nir_alu_type_get_type_size(src_type));
349      } else if (instr_bit_size) {
350         validate_assert(state, src_bit_size == instr_bit_size);
351      } else {
352         instr_bit_size = src_bit_size;
353      }
354
355      if (nir_alu_type_get_base_type(src_type) == nir_type_float) {
356         /* 8-bit float isn't a thing */
357         validate_assert(state, src_bit_size == 16 || src_bit_size == 32 ||
358                                src_bit_size == 64);
359      }
360
361      validate_alu_src(instr, i, state);
362   }
363
364   nir_alu_type dest_type = nir_op_infos[instr->op].output_type;
365   unsigned dest_bit_size = nir_dest_bit_size(instr->dest.dest);
366   if (nir_alu_type_get_type_size(dest_type)) {
367      validate_assert(state, dest_bit_size == nir_alu_type_get_type_size(dest_type));
368   } else if (instr_bit_size) {
369      validate_assert(state, dest_bit_size == instr_bit_size);
370   } else {
371      /* The only unsized thing is the destination so it's vacuously valid */
372   }
373
374   if (nir_alu_type_get_base_type(dest_type) == nir_type_float) {
375      /* 8-bit float isn't a thing */
376      validate_assert(state, dest_bit_size == 16 || dest_bit_size == 32 ||
377                             dest_bit_size == 64);
378   }
379
380   validate_alu_dest(instr, state);
381}
382
383static void
384validate_var_use(nir_variable *var, validate_state *state)
385{
386   struct hash_entry *entry = _mesa_hash_table_search(state->var_defs, var);
387   validate_assert(state, entry);
388   if (var->data.mode == nir_var_function_temp)
389      validate_assert(state, (nir_function_impl *) entry->data == state->impl);
390}
391
392static void
393validate_deref_instr(nir_deref_instr *instr, validate_state *state)
394{
395   if (instr->deref_type == nir_deref_type_var) {
396      /* Variable dereferences are stupid simple. */
397      validate_assert(state, instr->mode == instr->var->data.mode);
398      validate_assert(state, instr->type == instr->var->type);
399      validate_var_use(instr->var, state);
400   } else if (instr->deref_type == nir_deref_type_cast) {
401      /* For cast, we simply have to trust the instruction.  It's up to
402       * lowering passes and front/back-ends to make them sane.
403       */
404      validate_src(&instr->parent, state, 0, 0);
405
406      /* We just validate that the type and mode are there */
407      validate_assert(state, instr->mode);
408      validate_assert(state, instr->type);
409   } else {
410      /* We require the parent to be SSA.  This may be lifted in the future */
411      validate_assert(state, instr->parent.is_ssa);
412
413      /* The parent pointer value must have the same number of components
414       * as the destination.
415       */
416      validate_src(&instr->parent, state, nir_dest_bit_size(instr->dest),
417                   nir_dest_num_components(instr->dest));
418
419      nir_instr *parent_instr = instr->parent.ssa->parent_instr;
420
421      /* The parent must come from another deref instruction */
422      validate_assert(state, parent_instr->type == nir_instr_type_deref);
423
424      nir_deref_instr *parent = nir_instr_as_deref(parent_instr);
425
426      validate_assert(state, instr->mode == parent->mode);
427
428      switch (instr->deref_type) {
429      case nir_deref_type_struct:
430         validate_assert(state, glsl_type_is_struct_or_ifc(parent->type));
431         validate_assert(state,
432            instr->strct.index < glsl_get_length(parent->type));
433         validate_assert(state, instr->type ==
434            glsl_get_struct_field(parent->type, instr->strct.index));
435         break;
436
437      case nir_deref_type_array:
438      case nir_deref_type_array_wildcard:
439         if (instr->mode == nir_var_mem_ubo ||
440             instr->mode == nir_var_mem_ssbo ||
441             instr->mode == nir_var_mem_shared ||
442             instr->mode == nir_var_mem_global) {
443            /* Shared variables and UBO/SSBOs have a bit more relaxed rules
444             * because we need to be able to handle array derefs on vectors.
445             * Fortunately, nir_lower_io handles these just fine.
446             */
447            validate_assert(state, glsl_type_is_array(parent->type) ||
448                                   glsl_type_is_matrix(parent->type) ||
449                                   glsl_type_is_vector(parent->type));
450         } else {
451            /* Most of NIR cannot handle array derefs on vectors */
452            validate_assert(state, glsl_type_is_array(parent->type) ||
453                                   glsl_type_is_matrix(parent->type));
454         }
455         validate_assert(state,
456            instr->type == glsl_get_array_element(parent->type));
457
458         if (instr->deref_type == nir_deref_type_array) {
459            validate_src(&instr->arr.index, state,
460                         nir_dest_bit_size(instr->dest), 1);
461         }
462         break;
463
464      case nir_deref_type_ptr_as_array:
465         /* ptr_as_array derefs must have a parent that is either an array,
466          * ptr_as_array, or cast.  If the parent is a cast, we get the stride
467          * information (if any) from the cast deref.
468          */
469         validate_assert(state,
470                         parent->deref_type == nir_deref_type_array ||
471                         parent->deref_type == nir_deref_type_ptr_as_array ||
472                         parent->deref_type == nir_deref_type_cast);
473         validate_src(&instr->arr.index, state,
474                      nir_dest_bit_size(instr->dest), 1);
475         break;
476
477      default:
478         unreachable("Invalid deref instruction type");
479      }
480   }
481
482   /* We intentionally don't validate the size of the destination because we
483    * want to let other compiler components such as SPIR-V decide how big
484    * pointers should be.
485    */
486   validate_dest(&instr->dest, state, 0, 0);
487
488   /* Deref instructions as if conditions don't make sense because if
489    * conditions expect well-formed Booleans.  If you want to compare with
490    * NULL, an explicit comparison operation should be used.
491    */
492   validate_assert(state, list_empty(&instr->dest.ssa.if_uses));
493}
494
495static void
496validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
497{
498   unsigned dest_bit_size = 0;
499   unsigned src_bit_sizes[NIR_INTRINSIC_MAX_INPUTS] = { 0, };
500   switch (instr->intrinsic) {
501   case nir_intrinsic_load_param: {
502      unsigned param_idx = nir_intrinsic_param_idx(instr);
503      validate_assert(state, param_idx < state->impl->function->num_params);
504      nir_parameter *param = &state->impl->function->params[param_idx];
505      validate_assert(state, instr->num_components == param->num_components);
506      dest_bit_size = param->bit_size;
507      break;
508   }
509
510   case nir_intrinsic_load_deref: {
511      nir_deref_instr *src = nir_src_as_deref(instr->src[0]);
512      validate_assert(state, glsl_type_is_vector_or_scalar(src->type) ||
513                      (src->mode == nir_var_uniform &&
514                       glsl_get_base_type(src->type) == GLSL_TYPE_SUBROUTINE));
515      validate_assert(state, instr->num_components ==
516                             glsl_get_vector_elements(src->type));
517      dest_bit_size = glsl_get_bit_size(src->type);
518      /* Also allow 32-bit boolean load operations */
519      if (glsl_type_is_boolean(src->type))
520         dest_bit_size |= 32;
521      break;
522   }
523
524   case nir_intrinsic_store_deref: {
525      nir_deref_instr *dst = nir_src_as_deref(instr->src[0]);
526      validate_assert(state, glsl_type_is_vector_or_scalar(dst->type));
527      validate_assert(state, instr->num_components ==
528                             glsl_get_vector_elements(dst->type));
529      src_bit_sizes[1] = glsl_get_bit_size(dst->type);
530      /* Also allow 32-bit boolean store operations */
531      if (glsl_type_is_boolean(dst->type))
532         src_bit_sizes[1] |= 32;
533      validate_assert(state, (dst->mode & (nir_var_shader_in |
534                                           nir_var_uniform)) == 0);
535      validate_assert(state, (nir_intrinsic_write_mask(instr) & ~((1 << instr->num_components) - 1)) == 0);
536      break;
537   }
538
539   case nir_intrinsic_copy_deref: {
540      nir_deref_instr *dst = nir_src_as_deref(instr->src[0]);
541      nir_deref_instr *src = nir_src_as_deref(instr->src[1]);
542      validate_assert(state, glsl_get_bare_type(dst->type) ==
543                             glsl_get_bare_type(src->type));
544      validate_assert(state, (dst->mode & (nir_var_shader_in |
545                                           nir_var_uniform)) == 0);
546      break;
547   }
548
549   default:
550      break;
551   }
552
553   unsigned num_srcs = nir_intrinsic_infos[instr->intrinsic].num_srcs;
554   for (unsigned i = 0; i < num_srcs; i++) {
555      unsigned components_read = nir_intrinsic_src_components(instr, i);
556
557      validate_assert(state, components_read > 0);
558
559      validate_src(&instr->src[i], state, src_bit_sizes[i], components_read);
560   }
561
562   if (nir_intrinsic_infos[instr->intrinsic].has_dest) {
563      unsigned components_written = nir_intrinsic_dest_components(instr);
564      unsigned bit_sizes = nir_intrinsic_infos[instr->intrinsic].dest_bit_sizes;
565
566      validate_assert(state, components_written > 0);
567
568      if (dest_bit_size && bit_sizes)
569         validate_assert(state, dest_bit_size & bit_sizes);
570      else
571         dest_bit_size = dest_bit_size ? dest_bit_size : bit_sizes;
572
573      validate_dest(&instr->dest, state, dest_bit_size, components_written);
574   }
575}
576
577static void
578validate_tex_instr(nir_tex_instr *instr, validate_state *state)
579{
580   bool src_type_seen[nir_num_tex_src_types];
581   for (unsigned i = 0; i < nir_num_tex_src_types; i++)
582      src_type_seen[i] = false;
583
584   for (unsigned i = 0; i < instr->num_srcs; i++) {
585      validate_assert(state, !src_type_seen[instr->src[i].src_type]);
586      src_type_seen[instr->src[i].src_type] = true;
587      validate_src(&instr->src[i].src, state,
588                   0, nir_tex_instr_src_size(instr, i));
589
590      switch (instr->src[i].src_type) {
591      case nir_tex_src_texture_deref:
592      case nir_tex_src_sampler_deref:
593         validate_assert(state, instr->src[i].src.is_ssa);
594         validate_assert(state,
595                         instr->src[i].src.ssa->parent_instr->type == nir_instr_type_deref);
596         break;
597      default:
598         break;
599      }
600   }
601
602   if (nir_tex_instr_has_explicit_tg4_offsets(instr)) {
603      validate_assert(state, instr->op == nir_texop_tg4);
604      validate_assert(state, !src_type_seen[nir_tex_src_offset]);
605   }
606
607   validate_dest(&instr->dest, state, 0, nir_tex_instr_dest_size(instr));
608}
609
610static void
611validate_call_instr(nir_call_instr *instr, validate_state *state)
612{
613   validate_assert(state, instr->num_params == instr->callee->num_params);
614
615   for (unsigned i = 0; i < instr->num_params; i++) {
616      validate_src(&instr->params[i], state,
617                   instr->callee->params[i].bit_size,
618                   instr->callee->params[i].num_components);
619   }
620}
621
622static void
623validate_const_value(nir_const_value *val, unsigned bit_size,
624                     validate_state *state)
625{
626   /* In order for block copies to work properly for things like instruction
627    * comparisons and [de]serialization, we require the unused bits of the
628    * nir_const_value to be zero.
629    */
630   nir_const_value cmp_val;
631   memset(&cmp_val, 0, sizeof(cmp_val));
632   switch (bit_size) {
633   case 1:
634      cmp_val.b = val->b;
635      break;
636   case 8:
637      cmp_val.u8 = val->u8;
638      break;
639   case 16:
640      cmp_val.u16 = val->u16;
641      break;
642   case 32:
643      cmp_val.u32 = val->u32;
644      break;
645   case 64:
646      cmp_val.u64 = val->u64;
647      break;
648   default:
649      validate_assert(state, !"Invalid load_const bit size");
650   }
651   validate_assert(state, memcmp(val, &cmp_val, sizeof(cmp_val)) == 0);
652}
653
654static void
655validate_load_const_instr(nir_load_const_instr *instr, validate_state *state)
656{
657   validate_ssa_def(&instr->def, state);
658
659   for (unsigned i = 0; i < instr->def.num_components; i++)
660      validate_const_value(&instr->value[i], instr->def.bit_size, state);
661}
662
663static void
664validate_ssa_undef_instr(nir_ssa_undef_instr *instr, validate_state *state)
665{
666   validate_ssa_def(&instr->def, state);
667}
668
669static void
670validate_phi_instr(nir_phi_instr *instr, validate_state *state)
671{
672   /*
673    * don't validate the sources until we get to them from their predecessor
674    * basic blocks, to avoid validating an SSA use before its definition.
675    */
676
677   validate_dest(&instr->dest, state, 0, 0);
678
679   exec_list_validate(&instr->srcs);
680   validate_assert(state, exec_list_length(&instr->srcs) ==
681          state->block->predecessors->entries);
682}
683
684static void
685validate_instr(nir_instr *instr, validate_state *state)
686{
687   validate_assert(state, instr->block == state->block);
688
689   state->instr = instr;
690
691   switch (instr->type) {
692   case nir_instr_type_alu:
693      validate_alu_instr(nir_instr_as_alu(instr), state);
694      break;
695
696   case nir_instr_type_deref:
697      validate_deref_instr(nir_instr_as_deref(instr), state);
698      break;
699
700   case nir_instr_type_call:
701      validate_call_instr(nir_instr_as_call(instr), state);
702      break;
703
704   case nir_instr_type_intrinsic:
705      validate_intrinsic_instr(nir_instr_as_intrinsic(instr), state);
706      break;
707
708   case nir_instr_type_tex:
709      validate_tex_instr(nir_instr_as_tex(instr), state);
710      break;
711
712   case nir_instr_type_load_const:
713      validate_load_const_instr(nir_instr_as_load_const(instr), state);
714      break;
715
716   case nir_instr_type_phi:
717      validate_phi_instr(nir_instr_as_phi(instr), state);
718      break;
719
720   case nir_instr_type_ssa_undef:
721      validate_ssa_undef_instr(nir_instr_as_ssa_undef(instr), state);
722      break;
723
724   case nir_instr_type_jump:
725      break;
726
727   default:
728      validate_assert(state, !"Invalid ALU instruction type");
729      break;
730   }
731
732   state->instr = NULL;
733}
734
735static void
736validate_phi_src(nir_phi_instr *instr, nir_block *pred, validate_state *state)
737{
738   state->instr = &instr->instr;
739
740   validate_assert(state, instr->dest.is_ssa);
741
742   exec_list_validate(&instr->srcs);
743   nir_foreach_phi_src(src, instr) {
744      if (src->pred == pred) {
745         validate_assert(state, src->src.is_ssa);
746         validate_src(&src->src, state, instr->dest.ssa.bit_size,
747                      instr->dest.ssa.num_components);
748         state->instr = NULL;
749         return;
750      }
751   }
752
753   abort();
754}
755
756static void
757validate_phi_srcs(nir_block *block, nir_block *succ, validate_state *state)
758{
759   nir_foreach_instr(instr, succ) {
760      if (instr->type != nir_instr_type_phi)
761         break;
762
763      validate_phi_src(nir_instr_as_phi(instr), block, state);
764   }
765}
766
767static void validate_cf_node(nir_cf_node *node, validate_state *state);
768
769static void
770validate_block(nir_block *block, validate_state *state)
771{
772   validate_assert(state, block->cf_node.parent == state->parent_node);
773
774   state->block = block;
775
776   exec_list_validate(&block->instr_list);
777   nir_foreach_instr(instr, block) {
778      if (instr->type == nir_instr_type_phi) {
779         validate_assert(state, instr == nir_block_first_instr(block) ||
780                nir_instr_prev(instr)->type == nir_instr_type_phi);
781      }
782
783      if (instr->type == nir_instr_type_jump) {
784         validate_assert(state, instr == nir_block_last_instr(block));
785      }
786
787      validate_instr(instr, state);
788   }
789
790   validate_assert(state, block->successors[0] != NULL);
791   validate_assert(state, block->successors[0] != block->successors[1]);
792
793   for (unsigned i = 0; i < 2; i++) {
794      if (block->successors[i] != NULL) {
795         struct set_entry *entry =
796            _mesa_set_search(block->successors[i]->predecessors, block);
797         validate_assert(state, entry);
798
799         validate_phi_srcs(block, block->successors[i], state);
800      }
801   }
802
803   set_foreach(block->predecessors, entry) {
804      const nir_block *pred = entry->key;
805      validate_assert(state, pred->successors[0] == block ||
806             pred->successors[1] == block);
807   }
808
809   if (!exec_list_is_empty(&block->instr_list) &&
810       nir_block_last_instr(block)->type == nir_instr_type_jump) {
811      validate_assert(state, block->successors[1] == NULL);
812      nir_jump_instr *jump = nir_instr_as_jump(nir_block_last_instr(block));
813      switch (jump->type) {
814      case nir_jump_break: {
815         nir_block *after =
816            nir_cf_node_as_block(nir_cf_node_next(&state->loop->cf_node));
817         validate_assert(state, block->successors[0] == after);
818         break;
819      }
820
821      case nir_jump_continue: {
822         nir_block *first = nir_loop_first_block(state->loop);
823         validate_assert(state, block->successors[0] == first);
824         break;
825      }
826
827      case nir_jump_return:
828         validate_assert(state, block->successors[0] == state->impl->end_block);
829         break;
830
831      default:
832         unreachable("bad jump type");
833      }
834   } else {
835      nir_cf_node *next = nir_cf_node_next(&block->cf_node);
836      if (next == NULL) {
837         switch (state->parent_node->type) {
838         case nir_cf_node_loop: {
839            nir_block *first = nir_loop_first_block(state->loop);
840            validate_assert(state, block->successors[0] == first);
841            /* due to the hack for infinite loops, block->successors[1] may
842             * point to the block after the loop.
843             */
844            break;
845         }
846
847         case nir_cf_node_if: {
848            nir_block *after =
849               nir_cf_node_as_block(nir_cf_node_next(state->parent_node));
850            validate_assert(state, block->successors[0] == after);
851            validate_assert(state, block->successors[1] == NULL);
852            break;
853         }
854
855         case nir_cf_node_function:
856            validate_assert(state, block->successors[0] == state->impl->end_block);
857            validate_assert(state, block->successors[1] == NULL);
858            break;
859
860         default:
861            unreachable("unknown control flow node type");
862         }
863      } else {
864         if (next->type == nir_cf_node_if) {
865            nir_if *if_stmt = nir_cf_node_as_if(next);
866            validate_assert(state, block->successors[0] ==
867                   nir_if_first_then_block(if_stmt));
868            validate_assert(state, block->successors[1] ==
869                   nir_if_first_else_block(if_stmt));
870         } else {
871            validate_assert(state, next->type == nir_cf_node_loop);
872            nir_loop *loop = nir_cf_node_as_loop(next);
873            validate_assert(state, block->successors[0] ==
874                   nir_loop_first_block(loop));
875            validate_assert(state, block->successors[1] == NULL);
876         }
877      }
878   }
879}
880
881static void
882validate_if(nir_if *if_stmt, validate_state *state)
883{
884   state->if_stmt = if_stmt;
885
886   validate_assert(state, !exec_node_is_head_sentinel(if_stmt->cf_node.node.prev));
887   nir_cf_node *prev_node = nir_cf_node_prev(&if_stmt->cf_node);
888   validate_assert(state, prev_node->type == nir_cf_node_block);
889
890   validate_assert(state, !exec_node_is_tail_sentinel(if_stmt->cf_node.node.next));
891   nir_cf_node *next_node = nir_cf_node_next(&if_stmt->cf_node);
892   validate_assert(state, next_node->type == nir_cf_node_block);
893
894   validate_src(&if_stmt->condition, state, 0, 1);
895
896   validate_assert(state, !exec_list_is_empty(&if_stmt->then_list));
897   validate_assert(state, !exec_list_is_empty(&if_stmt->else_list));
898
899   nir_cf_node *old_parent = state->parent_node;
900   state->parent_node = &if_stmt->cf_node;
901
902   exec_list_validate(&if_stmt->then_list);
903   foreach_list_typed(nir_cf_node, cf_node, node, &if_stmt->then_list) {
904      validate_cf_node(cf_node, state);
905   }
906
907   exec_list_validate(&if_stmt->else_list);
908   foreach_list_typed(nir_cf_node, cf_node, node, &if_stmt->else_list) {
909      validate_cf_node(cf_node, state);
910   }
911
912   state->parent_node = old_parent;
913   state->if_stmt = NULL;
914}
915
916static void
917validate_loop(nir_loop *loop, validate_state *state)
918{
919   validate_assert(state, !exec_node_is_head_sentinel(loop->cf_node.node.prev));
920   nir_cf_node *prev_node = nir_cf_node_prev(&loop->cf_node);
921   validate_assert(state, prev_node->type == nir_cf_node_block);
922
923   validate_assert(state, !exec_node_is_tail_sentinel(loop->cf_node.node.next));
924   nir_cf_node *next_node = nir_cf_node_next(&loop->cf_node);
925   validate_assert(state, next_node->type == nir_cf_node_block);
926
927   validate_assert(state, !exec_list_is_empty(&loop->body));
928
929   nir_cf_node *old_parent = state->parent_node;
930   state->parent_node = &loop->cf_node;
931   nir_loop *old_loop = state->loop;
932   state->loop = loop;
933
934   exec_list_validate(&loop->body);
935   foreach_list_typed(nir_cf_node, cf_node, node, &loop->body) {
936      validate_cf_node(cf_node, state);
937   }
938
939   state->parent_node = old_parent;
940   state->loop = old_loop;
941}
942
943static void
944validate_cf_node(nir_cf_node *node, validate_state *state)
945{
946   validate_assert(state, node->parent == state->parent_node);
947
948   switch (node->type) {
949   case nir_cf_node_block:
950      validate_block(nir_cf_node_as_block(node), state);
951      break;
952
953   case nir_cf_node_if:
954      validate_if(nir_cf_node_as_if(node), state);
955      break;
956
957   case nir_cf_node_loop:
958      validate_loop(nir_cf_node_as_loop(node), state);
959      break;
960
961   default:
962      unreachable("Invalid CF node type");
963   }
964}
965
966static void
967prevalidate_reg_decl(nir_register *reg, validate_state *state)
968{
969   validate_assert(state, reg->index < state->impl->reg_alloc);
970   validate_assert(state, !BITSET_TEST(state->regs_found, reg->index));
971   BITSET_SET(state->regs_found, reg->index);
972
973   list_validate(&reg->uses);
974   list_validate(&reg->defs);
975   list_validate(&reg->if_uses);
976
977   reg_validate_state *reg_state = ralloc(state->regs, reg_validate_state);
978   reg_state->uses = _mesa_pointer_set_create(reg_state);
979   reg_state->if_uses = _mesa_pointer_set_create(reg_state);
980   reg_state->defs = _mesa_pointer_set_create(reg_state);
981
982   reg_state->where_defined = state->impl;
983
984   _mesa_hash_table_insert(state->regs, reg, reg_state);
985}
986
987static void
988postvalidate_reg_decl(nir_register *reg, validate_state *state)
989{
990   struct hash_entry *entry = _mesa_hash_table_search(state->regs, reg);
991
992   assume(entry);
993   reg_validate_state *reg_state = (reg_validate_state *) entry->data;
994
995   nir_foreach_use(src, reg) {
996      struct set_entry *entry = _mesa_set_search(reg_state->uses, src);
997      validate_assert(state, entry);
998      _mesa_set_remove(reg_state->uses, entry);
999   }
1000
1001   if (reg_state->uses->entries != 0) {
1002      printf("extra entries in register uses:\n");
1003      set_foreach(reg_state->uses, entry)
1004         printf("%p\n", entry->key);
1005
1006      abort();
1007   }
1008
1009   nir_foreach_if_use(src, reg) {
1010      struct set_entry *entry = _mesa_set_search(reg_state->if_uses, src);
1011      validate_assert(state, entry);
1012      _mesa_set_remove(reg_state->if_uses, entry);
1013   }
1014
1015   if (reg_state->if_uses->entries != 0) {
1016      printf("extra entries in register if_uses:\n");
1017      set_foreach(reg_state->if_uses, entry)
1018         printf("%p\n", entry->key);
1019
1020      abort();
1021   }
1022
1023   nir_foreach_def(src, reg) {
1024      struct set_entry *entry = _mesa_set_search(reg_state->defs, src);
1025      validate_assert(state, entry);
1026      _mesa_set_remove(reg_state->defs, entry);
1027   }
1028
1029   if (reg_state->defs->entries != 0) {
1030      printf("extra entries in register defs:\n");
1031      set_foreach(reg_state->defs, entry)
1032         printf("%p\n", entry->key);
1033
1034      abort();
1035   }
1036}
1037
1038static void
1039validate_var_decl(nir_variable *var, bool is_global, validate_state *state)
1040{
1041   state->var = var;
1042
1043   validate_assert(state, is_global == nir_variable_is_global(var));
1044
1045   /* Must have exactly one mode set */
1046   validate_assert(state, util_is_power_of_two_nonzero(var->data.mode));
1047
1048   if (var->data.compact) {
1049      /* The "compact" flag is only valid on arrays of scalars. */
1050      assert(glsl_type_is_array(var->type));
1051
1052      const struct glsl_type *type = glsl_get_array_element(var->type);
1053      if (nir_is_per_vertex_io(var, state->shader->info.stage)) {
1054         assert(glsl_type_is_array(type));
1055         assert(glsl_type_is_scalar(glsl_get_array_element(type)));
1056      } else {
1057         assert(glsl_type_is_scalar(type));
1058      }
1059   }
1060
1061   if (var->num_members > 0) {
1062      const struct glsl_type *without_array = glsl_without_array(var->type);
1063      validate_assert(state, glsl_type_is_struct_or_ifc(without_array));
1064      validate_assert(state, var->num_members == glsl_get_length(without_array));
1065      validate_assert(state, var->members != NULL);
1066   }
1067
1068   /*
1069    * TODO validate some things ir_validate.cpp does (requires more GLSL type
1070    * support)
1071    */
1072
1073   _mesa_hash_table_insert(state->var_defs, var,
1074                           is_global ? NULL : state->impl);
1075
1076   state->var = NULL;
1077}
1078
1079static bool
1080postvalidate_ssa_def(nir_ssa_def *def, void *void_state)
1081{
1082   validate_state *state = void_state;
1083
1084   struct hash_entry *entry = _mesa_hash_table_search(state->ssa_defs, def);
1085
1086   assume(entry);
1087   ssa_def_validate_state *def_state = (ssa_def_validate_state *)entry->data;
1088
1089   nir_foreach_use(src, def) {
1090      struct set_entry *entry = _mesa_set_search(def_state->uses, src);
1091      validate_assert(state, entry);
1092      _mesa_set_remove(def_state->uses, entry);
1093   }
1094
1095   if (def_state->uses->entries != 0) {
1096      printf("extra entries in SSA def uses:\n");
1097      set_foreach(def_state->uses, entry)
1098         printf("%p\n", entry->key);
1099
1100      abort();
1101   }
1102
1103   nir_foreach_if_use(src, def) {
1104      struct set_entry *entry = _mesa_set_search(def_state->if_uses, src);
1105      validate_assert(state, entry);
1106      _mesa_set_remove(def_state->if_uses, entry);
1107   }
1108
1109   if (def_state->if_uses->entries != 0) {
1110      printf("extra entries in SSA def uses:\n");
1111      set_foreach(def_state->if_uses, entry)
1112         printf("%p\n", entry->key);
1113
1114      abort();
1115   }
1116
1117   return true;
1118}
1119
1120static void
1121validate_function_impl(nir_function_impl *impl, validate_state *state)
1122{
1123   validate_assert(state, impl->function->impl == impl);
1124   validate_assert(state, impl->cf_node.parent == NULL);
1125
1126   validate_assert(state, exec_list_is_empty(&impl->end_block->instr_list));
1127   validate_assert(state, impl->end_block->successors[0] == NULL);
1128   validate_assert(state, impl->end_block->successors[1] == NULL);
1129
1130   state->impl = impl;
1131   state->parent_node = &impl->cf_node;
1132
1133   exec_list_validate(&impl->locals);
1134   nir_foreach_variable(var, &impl->locals) {
1135      validate_var_decl(var, false, state);
1136   }
1137
1138   state->regs_found = realloc(state->regs_found,
1139                               BITSET_WORDS(impl->reg_alloc) *
1140                               sizeof(BITSET_WORD));
1141   memset(state->regs_found, 0, BITSET_WORDS(impl->reg_alloc) *
1142                                sizeof(BITSET_WORD));
1143   exec_list_validate(&impl->registers);
1144   foreach_list_typed(nir_register, reg, node, &impl->registers) {
1145      prevalidate_reg_decl(reg, state);
1146   }
1147
1148   state->ssa_defs_found = realloc(state->ssa_defs_found,
1149                                   BITSET_WORDS(impl->ssa_alloc) *
1150                                   sizeof(BITSET_WORD));
1151   memset(state->ssa_defs_found, 0, BITSET_WORDS(impl->ssa_alloc) *
1152                                    sizeof(BITSET_WORD));
1153   exec_list_validate(&impl->body);
1154   foreach_list_typed(nir_cf_node, node, node, &impl->body) {
1155      validate_cf_node(node, state);
1156   }
1157
1158   foreach_list_typed(nir_register, reg, node, &impl->registers) {
1159      postvalidate_reg_decl(reg, state);
1160   }
1161
1162   nir_foreach_block(block, impl) {
1163      nir_foreach_instr(instr, block)
1164         nir_foreach_ssa_def(instr, postvalidate_ssa_def, state);
1165   }
1166}
1167
1168static void
1169validate_function(nir_function *func, validate_state *state)
1170{
1171   if (func->impl != NULL) {
1172      validate_assert(state, func->impl->function == func);
1173      validate_function_impl(func->impl, state);
1174   }
1175}
1176
1177static void
1178init_validate_state(validate_state *state)
1179{
1180   state->regs = _mesa_pointer_hash_table_create(NULL);
1181   state->ssa_defs = _mesa_pointer_hash_table_create(NULL);
1182   state->ssa_defs_found = NULL;
1183   state->regs_found = NULL;
1184   state->var_defs = _mesa_pointer_hash_table_create(NULL);
1185   state->errors = _mesa_pointer_hash_table_create(NULL);
1186
1187   state->loop = NULL;
1188   state->instr = NULL;
1189   state->var = NULL;
1190}
1191
1192static void
1193destroy_validate_state(validate_state *state)
1194{
1195   _mesa_hash_table_destroy(state->regs, NULL);
1196   _mesa_hash_table_destroy(state->ssa_defs, NULL);
1197   free(state->ssa_defs_found);
1198   free(state->regs_found);
1199   _mesa_hash_table_destroy(state->var_defs, NULL);
1200   _mesa_hash_table_destroy(state->errors, NULL);
1201}
1202
1203mtx_t fail_dump_mutex = _MTX_INITIALIZER_NP;
1204
1205static void
1206dump_errors(validate_state *state, const char *when)
1207{
1208   struct hash_table *errors = state->errors;
1209
1210   /* Lock around dumping so that we get clean dumps in a multi-threaded
1211    * scenario
1212    */
1213   mtx_lock(&fail_dump_mutex);
1214
1215   if (when) {
1216      fprintf(stderr, "NIR validation failed %s\n", when);
1217      fprintf(stderr, "%d errors:\n", _mesa_hash_table_num_entries(errors));
1218   } else {
1219      fprintf(stderr, "NIR validation failed with %d errors:\n",
1220              _mesa_hash_table_num_entries(errors));
1221   }
1222
1223   nir_print_shader_annotated(state->shader, stderr, errors);
1224
1225   if (_mesa_hash_table_num_entries(errors) > 0) {
1226      fprintf(stderr, "%d additional errors:\n",
1227              _mesa_hash_table_num_entries(errors));
1228      hash_table_foreach(errors, entry) {
1229         fprintf(stderr, "%s\n", (char *)entry->data);
1230      }
1231   }
1232
1233   mtx_unlock(&fail_dump_mutex);
1234
1235   abort();
1236}
1237
1238void
1239nir_validate_shader(nir_shader *shader, const char *when)
1240{
1241   static int should_validate = -1;
1242   if (should_validate < 0)
1243      should_validate = env_var_as_boolean("NIR_VALIDATE", true);
1244   if (!should_validate)
1245      return;
1246
1247   validate_state state;
1248   init_validate_state(&state);
1249
1250   state.shader = shader;
1251
1252   exec_list_validate(&shader->uniforms);
1253   nir_foreach_variable(var, &shader->uniforms) {
1254      validate_var_decl(var, true, &state);
1255   }
1256
1257   exec_list_validate(&shader->inputs);
1258   nir_foreach_variable(var, &shader->inputs) {
1259     validate_var_decl(var, true, &state);
1260   }
1261
1262   exec_list_validate(&shader->outputs);
1263   nir_foreach_variable(var, &shader->outputs) {
1264     validate_var_decl(var, true, &state);
1265   }
1266
1267   exec_list_validate(&shader->shared);
1268   nir_foreach_variable(var, &shader->shared) {
1269      validate_var_decl(var, true, &state);
1270   }
1271
1272   exec_list_validate(&shader->globals);
1273   nir_foreach_variable(var, &shader->globals) {
1274     validate_var_decl(var, true, &state);
1275   }
1276
1277   exec_list_validate(&shader->system_values);
1278   nir_foreach_variable(var, &shader->system_values) {
1279     validate_var_decl(var, true, &state);
1280   }
1281
1282   exec_list_validate(&shader->functions);
1283   foreach_list_typed(nir_function, func, node, &shader->functions) {
1284      validate_function(func, &state);
1285   }
1286
1287   if (_mesa_hash_table_num_entries(state.errors) > 0)
1288      dump_errors(&state, when);
1289
1290   destroy_validate_state(&state);
1291}
1292
1293#endif /* NDEBUG */
1294