nir_validate.c revision 7ec681f3
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   void *mem_ctx;
56
57   /* map of register -> validation state (struct above) */
58   struct hash_table *regs;
59
60   /* the current shader being validated */
61   nir_shader *shader;
62
63   /* the current instruction being validated */
64   nir_instr *instr;
65
66   /* the current variable being validated */
67   nir_variable *var;
68
69   /* the current basic block being validated */
70   nir_block *block;
71
72   /* the current if statement being validated */
73   nir_if *if_stmt;
74
75   /* the current loop being visited */
76   nir_loop *loop;
77
78   /* the parent of the current cf node being visited */
79   nir_cf_node *parent_node;
80
81   /* the current function implementation being validated */
82   nir_function_impl *impl;
83
84   /* Set of all blocks in the list */
85   struct set *blocks;
86
87   /* Set of seen SSA sources */
88   struct set *ssa_srcs;
89
90   /* bitset of ssa definitions we have found; used to check uniqueness */
91   BITSET_WORD *ssa_defs_found;
92
93   /* bitset of registers we have currently found; used to check uniqueness */
94   BITSET_WORD *regs_found;
95
96   /* map of variable -> function implementation where it is defined or NULL
97    * if it is a global variable
98    */
99   struct hash_table *var_defs;
100
101   /* map of instruction/var/etc to failed assert string */
102   struct hash_table *errors;
103
104   struct set *shader_gc_list;
105} validate_state;
106
107static void
108log_error(validate_state *state, const char *cond, const char *file, int line)
109{
110   const void *obj;
111
112   if (state->instr)
113      obj = state->instr;
114   else if (state->var)
115      obj = state->var;
116   else
117      obj = cond;
118
119   char *msg = ralloc_asprintf(state->errors, "error: %s (%s:%d)",
120                               cond, file, line);
121
122   _mesa_hash_table_insert(state->errors, obj, msg);
123}
124
125static bool
126validate_assert_impl(validate_state *state, bool cond, const char *str,
127                     const char *file, unsigned line)
128{
129   if (!cond)
130      log_error(state, str, file, line);
131   return cond;
132}
133
134#define validate_assert(state, cond) \
135   validate_assert_impl(state, (cond), #cond, __FILE__, __LINE__)
136
137
138static void validate_src(nir_src *src, validate_state *state,
139                         unsigned bit_sizes, unsigned num_components);
140
141static void
142validate_num_components(validate_state *state, unsigned num_components)
143{
144   validate_assert(state, nir_num_components_valid(num_components));
145}
146
147static void
148validate_reg_src(nir_src *src, validate_state *state,
149                 unsigned bit_sizes, unsigned num_components)
150{
151   validate_assert(state, src->reg.reg != NULL);
152
153   struct hash_entry *entry;
154   entry = _mesa_hash_table_search(state->regs, src->reg.reg);
155   validate_assert(state, entry);
156
157   reg_validate_state *reg_state = (reg_validate_state *) entry->data;
158
159   if (state->instr) {
160      _mesa_set_add(reg_state->uses, src);
161   } else {
162      validate_assert(state, state->if_stmt);
163      _mesa_set_add(reg_state->if_uses, src);
164   }
165
166   validate_assert(state, reg_state->where_defined == state->impl &&
167          "using a register declared in a different function");
168
169   if (bit_sizes)
170      validate_assert(state, src->reg.reg->bit_size & bit_sizes);
171   if (num_components)
172      validate_assert(state, src->reg.reg->num_components == num_components);
173
174   validate_assert(state, (src->reg.reg->num_array_elems == 0 ||
175          src->reg.base_offset < src->reg.reg->num_array_elems) &&
176          "definitely out-of-bounds array access");
177
178   if (src->reg.indirect) {
179      validate_assert(state, src->reg.reg->num_array_elems != 0);
180      validate_assert(state, (src->reg.indirect->is_ssa ||
181              src->reg.indirect->reg.indirect == NULL) &&
182             "only one level of indirection allowed");
183      validate_src(src->reg.indirect, state, 32, 1);
184   }
185}
186
187#define SET_PTR_BIT(ptr, bit) \
188   (void *)(((uintptr_t)(ptr)) | (((uintptr_t)1) << bit))
189
190static void
191validate_ssa_src(nir_src *src, validate_state *state,
192                 unsigned bit_sizes, unsigned num_components)
193{
194   validate_assert(state, src->ssa != NULL);
195
196   /* As we walk SSA defs, we add every use to this set.  We need to make sure
197    * our use is seen in a use list.
198    */
199   struct set_entry *entry;
200   if (state->instr) {
201      entry = _mesa_set_search(state->ssa_srcs, src);
202   } else {
203      entry = _mesa_set_search(state->ssa_srcs, SET_PTR_BIT(src, 0));
204   }
205   validate_assert(state, entry);
206
207   /* This will let us prove that we've seen all the sources */
208   if (entry)
209      _mesa_set_remove(state->ssa_srcs, entry);
210
211   if (bit_sizes)
212      validate_assert(state, src->ssa->bit_size & bit_sizes);
213   if (num_components)
214      validate_assert(state, src->ssa->num_components == num_components);
215
216   /* TODO validate that the use is dominated by the definition */
217}
218
219static void
220validate_src(nir_src *src, validate_state *state,
221             unsigned bit_sizes, unsigned num_components)
222{
223   if (state->instr)
224      validate_assert(state, src->parent_instr == state->instr);
225   else
226      validate_assert(state, src->parent_if == state->if_stmt);
227
228   if (src->is_ssa)
229      validate_ssa_src(src, state, bit_sizes, num_components);
230   else
231      validate_reg_src(src, state, bit_sizes, num_components);
232}
233
234static void
235validate_alu_src(nir_alu_instr *instr, unsigned index, validate_state *state)
236{
237   nir_alu_src *src = &instr->src[index];
238
239   if (instr->op == nir_op_mov)
240      assert(!src->abs && !src->negate);
241
242   unsigned num_components = nir_src_num_components(src->src);
243   for (unsigned i = 0; i < NIR_MAX_VEC_COMPONENTS; i++) {
244      validate_assert(state, src->swizzle[i] < NIR_MAX_VEC_COMPONENTS);
245
246      if (nir_alu_instr_channel_used(instr, index, i))
247         validate_assert(state, src->swizzle[i] < num_components);
248   }
249
250   validate_src(&src->src, state, 0, 0);
251}
252
253static void
254validate_reg_dest(nir_reg_dest *dest, validate_state *state,
255                  unsigned bit_sizes, unsigned num_components)
256{
257   validate_assert(state, dest->reg != NULL);
258
259   validate_assert(state, dest->parent_instr == state->instr);
260
261   struct hash_entry *entry2;
262   entry2 = _mesa_hash_table_search(state->regs, dest->reg);
263
264   validate_assert(state, entry2);
265
266   reg_validate_state *reg_state = (reg_validate_state *) entry2->data;
267   _mesa_set_add(reg_state->defs, dest);
268
269   validate_assert(state, reg_state->where_defined == state->impl &&
270          "writing to a register declared in a different function");
271
272   if (bit_sizes)
273      validate_assert(state, dest->reg->bit_size & bit_sizes);
274   if (num_components)
275      validate_assert(state, dest->reg->num_components == num_components);
276
277   validate_assert(state, (dest->reg->num_array_elems == 0 ||
278          dest->base_offset < dest->reg->num_array_elems) &&
279          "definitely out-of-bounds array access");
280
281   if (dest->indirect) {
282      validate_assert(state, dest->reg->num_array_elems != 0);
283      validate_assert(state, (dest->indirect->is_ssa || dest->indirect->reg.indirect == NULL) &&
284             "only one level of indirection allowed");
285      validate_src(dest->indirect, state, 32, 1);
286   }
287}
288
289static void
290validate_ssa_def(nir_ssa_def *def, validate_state *state)
291{
292   validate_assert(state, def->index < state->impl->ssa_alloc);
293   validate_assert(state, !BITSET_TEST(state->ssa_defs_found, def->index));
294   BITSET_SET(state->ssa_defs_found, def->index);
295
296   validate_assert(state, def->parent_instr == state->instr);
297   validate_num_components(state, def->num_components);
298
299   list_validate(&def->uses);
300   nir_foreach_use(src, def) {
301      validate_assert(state, src->is_ssa);
302      validate_assert(state, src->ssa == def);
303      bool already_seen = false;
304      _mesa_set_search_and_add(state->ssa_srcs, src, &already_seen);
305      /* A nir_src should only appear once and only in one SSA def use list */
306      validate_assert(state, !already_seen);
307   }
308
309   list_validate(&def->if_uses);
310   nir_foreach_if_use(src, def) {
311      validate_assert(state, src->is_ssa);
312      validate_assert(state, src->ssa == def);
313      bool already_seen = false;
314      _mesa_set_search_and_add(state->ssa_srcs, SET_PTR_BIT(src, 0),
315                               &already_seen);
316      /* A nir_src should only appear once and only in one SSA def use list */
317      validate_assert(state, !already_seen);
318   }
319}
320
321static void
322validate_dest(nir_dest *dest, validate_state *state,
323              unsigned bit_sizes, unsigned num_components)
324{
325   if (dest->is_ssa) {
326      if (bit_sizes)
327         validate_assert(state, dest->ssa.bit_size & bit_sizes);
328      if (num_components)
329         validate_assert(state, dest->ssa.num_components == num_components);
330      validate_ssa_def(&dest->ssa, state);
331   } else {
332      validate_reg_dest(&dest->reg, state, bit_sizes, num_components);
333   }
334}
335
336static void
337validate_alu_dest(nir_alu_instr *instr, validate_state *state)
338{
339   nir_alu_dest *dest = &instr->dest;
340
341   if (instr->op == nir_op_mov)
342      assert(!dest->saturate);
343
344   unsigned dest_size = nir_dest_num_components(dest->dest);
345   /*
346    * validate that the instruction doesn't write to components not in the
347    * register/SSA value
348    */
349   validate_assert(state, !(dest->write_mask & ~((1 << dest_size) - 1)));
350
351   /* validate that saturate is only ever used on instructions with
352    * destinations of type float
353    */
354   nir_alu_instr *alu = nir_instr_as_alu(state->instr);
355   validate_assert(state,
356          (nir_alu_type_get_base_type(nir_op_infos[alu->op].output_type) ==
357           nir_type_float) ||
358          !dest->saturate);
359
360   validate_dest(&dest->dest, state, 0, 0);
361}
362
363static void
364validate_alu_instr(nir_alu_instr *instr, validate_state *state)
365{
366   validate_assert(state, instr->op < nir_num_opcodes);
367
368   unsigned instr_bit_size = 0;
369   for (unsigned i = 0; i < nir_op_infos[instr->op].num_inputs; i++) {
370      nir_alu_type src_type = nir_op_infos[instr->op].input_types[i];
371      unsigned src_bit_size = nir_src_bit_size(instr->src[i].src);
372      if (nir_alu_type_get_type_size(src_type)) {
373         validate_assert(state, src_bit_size == nir_alu_type_get_type_size(src_type));
374      } else if (instr_bit_size) {
375         validate_assert(state, src_bit_size == instr_bit_size);
376      } else {
377         instr_bit_size = src_bit_size;
378      }
379
380      if (nir_alu_type_get_base_type(src_type) == nir_type_float) {
381         /* 8-bit float isn't a thing */
382         validate_assert(state, src_bit_size == 16 || src_bit_size == 32 ||
383                                src_bit_size == 64);
384      }
385
386      validate_alu_src(instr, i, state);
387   }
388
389   nir_alu_type dest_type = nir_op_infos[instr->op].output_type;
390   unsigned dest_bit_size = nir_dest_bit_size(instr->dest.dest);
391   if (nir_alu_type_get_type_size(dest_type)) {
392      validate_assert(state, dest_bit_size == nir_alu_type_get_type_size(dest_type));
393   } else if (instr_bit_size) {
394      validate_assert(state, dest_bit_size == instr_bit_size);
395   } else {
396      /* The only unsized thing is the destination so it's vacuously valid */
397   }
398
399   if (nir_alu_type_get_base_type(dest_type) == nir_type_float) {
400      /* 8-bit float isn't a thing */
401      validate_assert(state, dest_bit_size == 16 || dest_bit_size == 32 ||
402                             dest_bit_size == 64);
403   }
404
405   validate_alu_dest(instr, state);
406}
407
408static void
409validate_var_use(nir_variable *var, validate_state *state)
410{
411   struct hash_entry *entry = _mesa_hash_table_search(state->var_defs, var);
412   validate_assert(state, entry);
413   if (entry && var->data.mode == nir_var_function_temp)
414      validate_assert(state, (nir_function_impl *) entry->data == state->impl);
415}
416
417static void
418validate_deref_instr(nir_deref_instr *instr, validate_state *state)
419{
420   if (instr->deref_type == nir_deref_type_var) {
421      /* Variable dereferences are stupid simple. */
422      validate_assert(state, instr->modes == instr->var->data.mode);
423      validate_assert(state, instr->type == instr->var->type);
424      validate_var_use(instr->var, state);
425   } else if (instr->deref_type == nir_deref_type_cast) {
426      /* For cast, we simply have to trust the instruction.  It's up to
427       * lowering passes and front/back-ends to make them sane.
428       */
429      validate_src(&instr->parent, state, 0, 0);
430
431      /* Most variable modes in NIR can only exist by themselves. */
432      if (instr->modes & ~nir_var_mem_generic)
433         validate_assert(state, util_bitcount(instr->modes) == 1);
434
435      nir_deref_instr *parent = nir_src_as_deref(instr->parent);
436      if (parent) {
437         /* Casts can change the mode but it can't change completely.  The new
438          * mode must have some bits in common with the old.
439          */
440         validate_assert(state, instr->modes & parent->modes);
441      } else {
442         /* If our parent isn't a deref, just assert the mode is there */
443         validate_assert(state, instr->modes != 0);
444      }
445
446      /* We just validate that the type is there */
447      validate_assert(state, instr->type);
448      if (instr->cast.align_mul > 0) {
449         validate_assert(state, util_is_power_of_two_nonzero(instr->cast.align_mul));
450         validate_assert(state, instr->cast.align_offset < instr->cast.align_mul);
451      } else {
452         validate_assert(state, instr->cast.align_offset == 0);
453      }
454   } else {
455      /* We require the parent to be SSA.  This may be lifted in the future */
456      validate_assert(state, instr->parent.is_ssa);
457
458      /* The parent pointer value must have the same number of components
459       * as the destination.
460       */
461      validate_src(&instr->parent, state, nir_dest_bit_size(instr->dest),
462                   nir_dest_num_components(instr->dest));
463
464      nir_instr *parent_instr = instr->parent.ssa->parent_instr;
465
466      /* The parent must come from another deref instruction */
467      validate_assert(state, parent_instr->type == nir_instr_type_deref);
468
469      nir_deref_instr *parent = nir_instr_as_deref(parent_instr);
470
471      validate_assert(state, instr->modes == parent->modes);
472
473      switch (instr->deref_type) {
474      case nir_deref_type_struct:
475         validate_assert(state, glsl_type_is_struct_or_ifc(parent->type));
476         validate_assert(state,
477            instr->strct.index < glsl_get_length(parent->type));
478         validate_assert(state, instr->type ==
479            glsl_get_struct_field(parent->type, instr->strct.index));
480         break;
481
482      case nir_deref_type_array:
483      case nir_deref_type_array_wildcard:
484         if (instr->modes & nir_var_vec_indexable_modes) {
485            /* Shared variables and UBO/SSBOs have a bit more relaxed rules
486             * because we need to be able to handle array derefs on vectors.
487             * Fortunately, nir_lower_io handles these just fine.
488             */
489            validate_assert(state, glsl_type_is_array(parent->type) ||
490                                   glsl_type_is_matrix(parent->type) ||
491                                   glsl_type_is_vector(parent->type));
492         } else {
493            /* Most of NIR cannot handle array derefs on vectors */
494            validate_assert(state, glsl_type_is_array(parent->type) ||
495                                   glsl_type_is_matrix(parent->type));
496         }
497         validate_assert(state,
498            instr->type == glsl_get_array_element(parent->type));
499
500         if (instr->deref_type == nir_deref_type_array) {
501            validate_src(&instr->arr.index, state,
502                         nir_dest_bit_size(instr->dest), 1);
503         }
504         break;
505
506      case nir_deref_type_ptr_as_array:
507         /* ptr_as_array derefs must have a parent that is either an array,
508          * ptr_as_array, or cast.  If the parent is a cast, we get the stride
509          * information (if any) from the cast deref.
510          */
511         validate_assert(state,
512                         parent->deref_type == nir_deref_type_array ||
513                         parent->deref_type == nir_deref_type_ptr_as_array ||
514                         parent->deref_type == nir_deref_type_cast);
515         validate_src(&instr->arr.index, state,
516                      nir_dest_bit_size(instr->dest), 1);
517         break;
518
519      default:
520         unreachable("Invalid deref instruction type");
521      }
522   }
523
524   /* We intentionally don't validate the size of the destination because we
525    * want to let other compiler components such as SPIR-V decide how big
526    * pointers should be.
527    */
528   validate_dest(&instr->dest, state, 0, 0);
529
530   /* Deref instructions as if conditions don't make sense because if
531    * conditions expect well-formed Booleans.  If you want to compare with
532    * NULL, an explicit comparison operation should be used.
533    */
534   validate_assert(state, list_is_empty(&instr->dest.ssa.if_uses));
535
536   /* Certain modes cannot be used as sources for phi instructions because
537    * way too many passes assume that they can always chase deref chains.
538    */
539   nir_foreach_use(use, &instr->dest.ssa) {
540      if (use->parent_instr->type == nir_instr_type_phi) {
541         validate_assert(state, !(instr->modes & (nir_var_shader_in |
542                                                  nir_var_shader_out |
543                                                  nir_var_shader_out |
544                                                  nir_var_uniform)));
545      }
546   }
547}
548
549static bool
550vectorized_intrinsic(nir_intrinsic_instr *intr)
551{
552   const nir_intrinsic_info *info = &nir_intrinsic_infos[intr->intrinsic];
553
554   if (info->dest_components == 0)
555      return true;
556
557   for (unsigned i = 0; i < info->num_srcs; i++)
558      if (info->src_components[i] == 0)
559         return true;
560
561   return false;
562}
563
564/** Returns the image format or PIPE_FORMAT_COUNT for incomplete derefs
565 *
566 * We use PIPE_FORMAT_COUNT for incomplete derefs because PIPE_FORMAT_NONE
567 * indicates that we found the variable but it has no format specified.
568 */
569static enum pipe_format
570image_intrin_format(nir_intrinsic_instr *instr)
571{
572   if (nir_intrinsic_format(instr) != PIPE_FORMAT_NONE)
573      return nir_intrinsic_format(instr);
574
575   /* If this not a deref intrinsic, PIPE_FORMAT_NONE is the best we can do */
576   if (nir_intrinsic_infos[instr->intrinsic].src_components[0] != -1)
577      return PIPE_FORMAT_NONE;
578
579   nir_variable *var = nir_intrinsic_get_var(instr, 0);
580   if (var == NULL)
581      return PIPE_FORMAT_COUNT;
582
583   return var->data.image.format;
584}
585
586static void
587validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
588{
589   unsigned dest_bit_size = 0;
590   unsigned src_bit_sizes[NIR_INTRINSIC_MAX_INPUTS] = { 0, };
591   switch (instr->intrinsic) {
592   case nir_intrinsic_convert_alu_types: {
593      nir_alu_type src_type = nir_intrinsic_src_type(instr);
594      nir_alu_type dest_type = nir_intrinsic_dest_type(instr);
595      dest_bit_size = nir_alu_type_get_type_size(dest_type);
596      src_bit_sizes[0] = nir_alu_type_get_type_size(src_type);
597      validate_assert(state, dest_bit_size != 0);
598      validate_assert(state, src_bit_sizes[0] != 0);
599      break;
600   }
601
602   case nir_intrinsic_load_param: {
603      unsigned param_idx = nir_intrinsic_param_idx(instr);
604      validate_assert(state, param_idx < state->impl->function->num_params);
605      nir_parameter *param = &state->impl->function->params[param_idx];
606      validate_assert(state, instr->num_components == param->num_components);
607      dest_bit_size = param->bit_size;
608      break;
609   }
610
611   case nir_intrinsic_load_deref: {
612      nir_deref_instr *src = nir_src_as_deref(instr->src[0]);
613      assert(src);
614      validate_assert(state, glsl_type_is_vector_or_scalar(src->type) ||
615                      (src->modes == nir_var_uniform &&
616                       glsl_get_base_type(src->type) == GLSL_TYPE_SUBROUTINE));
617      validate_assert(state, instr->num_components ==
618                             glsl_get_vector_elements(src->type));
619      dest_bit_size = glsl_get_bit_size(src->type);
620      /* Also allow 32-bit boolean load operations */
621      if (glsl_type_is_boolean(src->type))
622         dest_bit_size |= 32;
623      break;
624   }
625
626   case nir_intrinsic_store_deref: {
627      nir_deref_instr *dst = nir_src_as_deref(instr->src[0]);
628      assert(dst);
629      validate_assert(state, glsl_type_is_vector_or_scalar(dst->type));
630      validate_assert(state, instr->num_components ==
631                             glsl_get_vector_elements(dst->type));
632      src_bit_sizes[1] = glsl_get_bit_size(dst->type);
633      /* Also allow 32-bit boolean store operations */
634      if (glsl_type_is_boolean(dst->type))
635         src_bit_sizes[1] |= 32;
636      validate_assert(state, !nir_deref_mode_may_be(dst, nir_var_read_only_modes));
637      validate_assert(state, (nir_intrinsic_write_mask(instr) & ~((1 << instr->num_components) - 1)) == 0);
638      break;
639   }
640
641   case nir_intrinsic_copy_deref: {
642      nir_deref_instr *dst = nir_src_as_deref(instr->src[0]);
643      nir_deref_instr *src = nir_src_as_deref(instr->src[1]);
644      validate_assert(state, glsl_get_bare_type(dst->type) ==
645                             glsl_get_bare_type(src->type));
646      validate_assert(state, !nir_deref_mode_may_be(dst, nir_var_read_only_modes));
647      break;
648   }
649
650   case nir_intrinsic_load_ubo_vec4: {
651      int bit_size = nir_dest_bit_size(instr->dest);
652      validate_assert(state, bit_size >= 8);
653      validate_assert(state, (nir_intrinsic_component(instr) +
654                              instr->num_components) * (bit_size / 8) <= 16);
655      break;
656   }
657
658   case nir_intrinsic_load_ubo:
659      /* Make sure that the creator didn't forget to set the range_base+range. */
660      validate_assert(state, nir_intrinsic_range(instr) != 0);
661      FALLTHROUGH;
662   case nir_intrinsic_load_ssbo:
663   case nir_intrinsic_load_shared:
664   case nir_intrinsic_load_global:
665   case nir_intrinsic_load_global_constant:
666   case nir_intrinsic_load_scratch:
667   case nir_intrinsic_load_constant:
668      /* These memory load operations must have alignments */
669      validate_assert(state,
670         util_is_power_of_two_nonzero(nir_intrinsic_align_mul(instr)));
671      validate_assert(state, nir_intrinsic_align_offset(instr) <
672                             nir_intrinsic_align_mul(instr));
673      FALLTHROUGH;
674
675   case nir_intrinsic_load_uniform:
676   case nir_intrinsic_load_input:
677   case nir_intrinsic_load_per_vertex_input:
678   case nir_intrinsic_load_interpolated_input:
679   case nir_intrinsic_load_output:
680   case nir_intrinsic_load_per_vertex_output:
681   case nir_intrinsic_load_per_primitive_output:
682   case nir_intrinsic_load_push_constant:
683      /* All memory load operations must load at least a byte */
684      validate_assert(state, nir_dest_bit_size(instr->dest) >= 8);
685      break;
686
687   case nir_intrinsic_store_ssbo:
688   case nir_intrinsic_store_shared:
689   case nir_intrinsic_store_global:
690   case nir_intrinsic_store_scratch:
691      /* These memory store operations must also have alignments */
692      validate_assert(state,
693         util_is_power_of_two_nonzero(nir_intrinsic_align_mul(instr)));
694      validate_assert(state, nir_intrinsic_align_offset(instr) <
695                             nir_intrinsic_align_mul(instr));
696      FALLTHROUGH;
697
698   case nir_intrinsic_store_output:
699   case nir_intrinsic_store_per_vertex_output:
700      /* All memory store operations must store at least a byte */
701      validate_assert(state, nir_src_bit_size(instr->src[0]) >= 8);
702      break;
703
704   case nir_intrinsic_deref_mode_is:
705   case nir_intrinsic_addr_mode_is:
706      validate_assert(state,
707         util_bitcount(nir_intrinsic_memory_modes(instr)) == 1);
708      break;
709
710   case nir_intrinsic_image_deref_atomic_add:
711   case nir_intrinsic_image_deref_atomic_imin:
712   case nir_intrinsic_image_deref_atomic_umin:
713   case nir_intrinsic_image_deref_atomic_imax:
714   case nir_intrinsic_image_deref_atomic_umax:
715   case nir_intrinsic_image_deref_atomic_and:
716   case nir_intrinsic_image_deref_atomic_or:
717   case nir_intrinsic_image_deref_atomic_xor:
718   case nir_intrinsic_image_deref_atomic_comp_swap:
719   case nir_intrinsic_image_atomic_add:
720   case nir_intrinsic_image_atomic_imin:
721   case nir_intrinsic_image_atomic_umin:
722   case nir_intrinsic_image_atomic_imax:
723   case nir_intrinsic_image_atomic_umax:
724   case nir_intrinsic_image_atomic_and:
725   case nir_intrinsic_image_atomic_or:
726   case nir_intrinsic_image_atomic_xor:
727   case nir_intrinsic_image_atomic_comp_swap:
728   case nir_intrinsic_bindless_image_atomic_add:
729   case nir_intrinsic_bindless_image_atomic_imin:
730   case nir_intrinsic_bindless_image_atomic_umin:
731   case nir_intrinsic_bindless_image_atomic_imax:
732   case nir_intrinsic_bindless_image_atomic_umax:
733   case nir_intrinsic_bindless_image_atomic_and:
734   case nir_intrinsic_bindless_image_atomic_or:
735   case nir_intrinsic_bindless_image_atomic_xor:
736   case nir_intrinsic_bindless_image_atomic_comp_swap: {
737      enum pipe_format format = image_intrin_format(instr);
738      if (format != PIPE_FORMAT_COUNT) {
739         validate_assert(state, format == PIPE_FORMAT_R32_UINT ||
740                                format == PIPE_FORMAT_R32_SINT ||
741                                format == PIPE_FORMAT_R64_UINT ||
742                                format == PIPE_FORMAT_R64_SINT);
743         validate_assert(state, nir_dest_bit_size(instr->dest) ==
744                                util_format_get_blocksizebits(format));
745      }
746      break;
747   }
748
749   case nir_intrinsic_image_deref_atomic_exchange:
750   case nir_intrinsic_image_atomic_exchange:
751   case nir_intrinsic_bindless_image_atomic_exchange: {
752      enum pipe_format format = image_intrin_format(instr);
753      if (format != PIPE_FORMAT_COUNT) {
754         validate_assert(state, format == PIPE_FORMAT_R32_UINT ||
755                                format == PIPE_FORMAT_R32_SINT ||
756                                format == PIPE_FORMAT_R32_FLOAT ||
757                                format == PIPE_FORMAT_R64_UINT ||
758                                format == PIPE_FORMAT_R64_SINT);
759         validate_assert(state, nir_dest_bit_size(instr->dest) ==
760                                util_format_get_blocksizebits(format));
761      }
762      break;
763   }
764
765   case nir_intrinsic_image_deref_atomic_fadd:
766   case nir_intrinsic_image_atomic_fadd:
767   case nir_intrinsic_bindless_image_atomic_fadd: {
768      enum pipe_format format = image_intrin_format(instr);
769      validate_assert(state, format == PIPE_FORMAT_COUNT ||
770                             format == PIPE_FORMAT_R32_FLOAT);
771      validate_assert(state, nir_dest_bit_size(instr->dest) == 32);
772      break;
773   }
774
775   case nir_intrinsic_image_deref_atomic_fmin:
776   case nir_intrinsic_image_deref_atomic_fmax:
777   case nir_intrinsic_image_atomic_fmin:
778   case nir_intrinsic_image_atomic_fmax:
779   case nir_intrinsic_bindless_image_atomic_fmin:
780   case nir_intrinsic_bindless_image_atomic_fmax: {
781      enum pipe_format format = image_intrin_format(instr);
782      validate_assert(state, format == PIPE_FORMAT_COUNT ||
783                             format == PIPE_FORMAT_R16_FLOAT ||
784                             format == PIPE_FORMAT_R32_FLOAT ||
785                             format == PIPE_FORMAT_R64_FLOAT);
786      validate_assert(state, nir_dest_bit_size(instr->dest) ==
787                             util_format_get_blocksizebits(format));
788      break;
789   }
790
791   default:
792      break;
793   }
794
795   if (instr->num_components > 0)
796      validate_num_components(state, instr->num_components);
797
798   const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic];
799   unsigned num_srcs = info->num_srcs;
800   for (unsigned i = 0; i < num_srcs; i++) {
801      unsigned components_read = nir_intrinsic_src_components(instr, i);
802
803      validate_num_components(state, components_read);
804
805      validate_src(&instr->src[i], state, src_bit_sizes[i], components_read);
806   }
807
808   if (nir_intrinsic_infos[instr->intrinsic].has_dest) {
809      unsigned components_written = nir_intrinsic_dest_components(instr);
810      unsigned bit_sizes = info->dest_bit_sizes;
811      if (!bit_sizes && info->bit_size_src >= 0)
812         bit_sizes = nir_src_bit_size(instr->src[info->bit_size_src]);
813
814      validate_num_components(state, components_written);
815      if (dest_bit_size && bit_sizes)
816         validate_assert(state, dest_bit_size & bit_sizes);
817      else
818         dest_bit_size = dest_bit_size ? dest_bit_size : bit_sizes;
819
820      validate_dest(&instr->dest, state, dest_bit_size, components_written);
821   }
822
823   if (!vectorized_intrinsic(instr))
824      validate_assert(state, instr->num_components == 0);
825}
826
827static void
828validate_tex_instr(nir_tex_instr *instr, validate_state *state)
829{
830   bool src_type_seen[nir_num_tex_src_types];
831   for (unsigned i = 0; i < nir_num_tex_src_types; i++)
832      src_type_seen[i] = false;
833
834   for (unsigned i = 0; i < instr->num_srcs; i++) {
835      validate_assert(state, !src_type_seen[instr->src[i].src_type]);
836      src_type_seen[instr->src[i].src_type] = true;
837      validate_src(&instr->src[i].src, state,
838                   0, nir_tex_instr_src_size(instr, i));
839
840      switch (instr->src[i].src_type) {
841      case nir_tex_src_coord:
842         validate_assert(state, nir_src_num_components(instr->src[i].src) ==
843                                instr->coord_components);
844         break;
845
846      case nir_tex_src_projector:
847         validate_assert(state, nir_src_num_components(instr->src[i].src) == 1);
848         break;
849
850      case nir_tex_src_comparator:
851         validate_assert(state, instr->is_shadow);
852         validate_assert(state, nir_src_num_components(instr->src[i].src) == 1);
853         break;
854
855      case nir_tex_src_offset:
856         validate_assert(state, nir_src_num_components(instr->src[i].src) ==
857                                instr->coord_components - instr->is_array);
858         break;
859
860      case nir_tex_src_bias:
861         validate_assert(state, instr->op == nir_texop_txb ||
862                                instr->op == nir_texop_tg4);
863         validate_assert(state, nir_src_num_components(instr->src[i].src) == 1);
864         break;
865
866      case nir_tex_src_lod:
867         validate_assert(state, instr->op != nir_texop_tex &&
868                                instr->op != nir_texop_txb &&
869                                instr->op != nir_texop_txd &&
870                                instr->op != nir_texop_lod);
871         validate_assert(state, nir_src_num_components(instr->src[i].src) == 1);
872         break;
873
874      case nir_tex_src_min_lod:
875      case nir_tex_src_ms_index:
876         validate_assert(state, nir_src_num_components(instr->src[i].src) == 1);
877         break;
878
879      case nir_tex_src_ddx:
880      case nir_tex_src_ddy:
881         validate_assert(state, instr->op == nir_texop_txd);
882         validate_assert(state, nir_src_num_components(instr->src[i].src) ==
883                                instr->coord_components - instr->is_array);
884         break;
885
886      case nir_tex_src_texture_deref: {
887         nir_deref_instr *deref = nir_src_as_deref(instr->src[i].src);
888         if (!validate_assert(state, deref))
889            break;
890
891         validate_assert(state, glsl_type_is_image(deref->type) ||
892                                glsl_type_is_sampler(deref->type));
893         break;
894      }
895
896      case nir_tex_src_sampler_deref: {
897         nir_deref_instr *deref = nir_src_as_deref(instr->src[i].src);
898         if (!validate_assert(state, deref))
899            break;
900
901         validate_assert(state, glsl_type_is_sampler(deref->type));
902         break;
903      }
904
905      case nir_tex_src_texture_offset:
906      case nir_tex_src_sampler_offset:
907      case nir_tex_src_plane:
908         validate_assert(state, nir_src_num_components(instr->src[i].src) == 1);
909         break;
910
911      case nir_tex_src_texture_handle:
912      case nir_tex_src_sampler_handle:
913         break;
914
915      default:
916         break;
917      }
918   }
919
920   if (instr->op != nir_texop_tg4)
921      validate_assert(state, instr->component == 0);
922
923   if (nir_tex_instr_has_explicit_tg4_offsets(instr)) {
924      validate_assert(state, instr->op == nir_texop_tg4);
925      validate_assert(state, !src_type_seen[nir_tex_src_offset]);
926   }
927
928   validate_dest(&instr->dest, state, 0, nir_tex_instr_dest_size(instr));
929
930   validate_assert(state,
931                   nir_alu_type_get_type_size(instr->dest_type) ==
932                   nir_dest_bit_size(instr->dest));
933}
934
935static void
936validate_call_instr(nir_call_instr *instr, validate_state *state)
937{
938   validate_assert(state, instr->num_params == instr->callee->num_params);
939
940   for (unsigned i = 0; i < instr->num_params; i++) {
941      validate_src(&instr->params[i], state,
942                   instr->callee->params[i].bit_size,
943                   instr->callee->params[i].num_components);
944   }
945}
946
947static void
948validate_const_value(nir_const_value *val, unsigned bit_size,
949                     validate_state *state)
950{
951   /* In order for block copies to work properly for things like instruction
952    * comparisons and [de]serialization, we require the unused bits of the
953    * nir_const_value to be zero.
954    */
955   nir_const_value cmp_val;
956   memset(&cmp_val, 0, sizeof(cmp_val));
957   switch (bit_size) {
958   case 1:
959      cmp_val.b = val->b;
960      break;
961   case 8:
962      cmp_val.u8 = val->u8;
963      break;
964   case 16:
965      cmp_val.u16 = val->u16;
966      break;
967   case 32:
968      cmp_val.u32 = val->u32;
969      break;
970   case 64:
971      cmp_val.u64 = val->u64;
972      break;
973   default:
974      validate_assert(state, !"Invalid load_const bit size");
975   }
976   validate_assert(state, memcmp(val, &cmp_val, sizeof(cmp_val)) == 0);
977}
978
979static void
980validate_load_const_instr(nir_load_const_instr *instr, validate_state *state)
981{
982   validate_ssa_def(&instr->def, state);
983
984   for (unsigned i = 0; i < instr->def.num_components; i++)
985      validate_const_value(&instr->value[i], instr->def.bit_size, state);
986}
987
988static void
989validate_ssa_undef_instr(nir_ssa_undef_instr *instr, validate_state *state)
990{
991   validate_ssa_def(&instr->def, state);
992}
993
994static void
995validate_phi_instr(nir_phi_instr *instr, validate_state *state)
996{
997   /*
998    * don't validate the sources until we get to them from their predecessor
999    * basic blocks, to avoid validating an SSA use before its definition.
1000    */
1001
1002   validate_dest(&instr->dest, state, 0, 0);
1003
1004   exec_list_validate(&instr->srcs);
1005   validate_assert(state, exec_list_length(&instr->srcs) ==
1006          state->block->predecessors->entries);
1007}
1008
1009static void
1010validate_jump_instr(nir_jump_instr *instr, validate_state *state)
1011{
1012   nir_block *block = state->block;
1013   validate_assert(state, &instr->instr == nir_block_last_instr(block));
1014
1015   switch (instr->type) {
1016   case nir_jump_return:
1017   case nir_jump_halt:
1018      validate_assert(state, block->successors[0] == state->impl->end_block);
1019      validate_assert(state, block->successors[1] == NULL);
1020      validate_assert(state, instr->target == NULL);
1021      validate_assert(state, instr->else_target == NULL);
1022      break;
1023
1024   case nir_jump_break:
1025      validate_assert(state, state->impl->structured);
1026      validate_assert(state, state->loop != NULL);
1027      if (state->loop) {
1028         nir_block *after =
1029            nir_cf_node_as_block(nir_cf_node_next(&state->loop->cf_node));
1030         validate_assert(state, block->successors[0] == after);
1031      }
1032      validate_assert(state, block->successors[1] == NULL);
1033      validate_assert(state, instr->target == NULL);
1034      validate_assert(state, instr->else_target == NULL);
1035      break;
1036
1037   case nir_jump_continue:
1038      validate_assert(state, state->impl->structured);
1039      validate_assert(state, state->loop != NULL);
1040      if (state->loop) {
1041         nir_block *first = nir_loop_first_block(state->loop);
1042         validate_assert(state, block->successors[0] == first);
1043      }
1044      validate_assert(state, block->successors[1] == NULL);
1045      validate_assert(state, instr->target == NULL);
1046      validate_assert(state, instr->else_target == NULL);
1047      break;
1048
1049   case nir_jump_goto:
1050      validate_assert(state, !state->impl->structured);
1051      validate_assert(state, instr->target == block->successors[0]);
1052      validate_assert(state, instr->target != NULL);
1053      validate_assert(state, instr->else_target == NULL);
1054      break;
1055
1056   case nir_jump_goto_if:
1057      validate_assert(state, !state->impl->structured);
1058      validate_assert(state, instr->target == block->successors[1]);
1059      validate_assert(state, instr->else_target == block->successors[0]);
1060      validate_src(&instr->condition, state, 0, 1);
1061      validate_assert(state, instr->target != NULL);
1062      validate_assert(state, instr->else_target != NULL);
1063      break;
1064
1065   default:
1066      validate_assert(state, !"Invalid jump instruction type");
1067      break;
1068   }
1069}
1070
1071static void
1072validate_instr(nir_instr *instr, validate_state *state)
1073{
1074   validate_assert(state, instr->block == state->block);
1075
1076   state->instr = instr;
1077
1078   validate_assert(state, _mesa_set_search(state->shader_gc_list, instr));
1079
1080   switch (instr->type) {
1081   case nir_instr_type_alu:
1082      validate_alu_instr(nir_instr_as_alu(instr), state);
1083      break;
1084
1085   case nir_instr_type_deref:
1086      validate_deref_instr(nir_instr_as_deref(instr), state);
1087      break;
1088
1089   case nir_instr_type_call:
1090      validate_call_instr(nir_instr_as_call(instr), state);
1091      break;
1092
1093   case nir_instr_type_intrinsic:
1094      validate_intrinsic_instr(nir_instr_as_intrinsic(instr), state);
1095      break;
1096
1097   case nir_instr_type_tex:
1098      validate_tex_instr(nir_instr_as_tex(instr), state);
1099      break;
1100
1101   case nir_instr_type_load_const:
1102      validate_load_const_instr(nir_instr_as_load_const(instr), state);
1103      break;
1104
1105   case nir_instr_type_phi:
1106      validate_phi_instr(nir_instr_as_phi(instr), state);
1107      break;
1108
1109   case nir_instr_type_ssa_undef:
1110      validate_ssa_undef_instr(nir_instr_as_ssa_undef(instr), state);
1111      break;
1112
1113   case nir_instr_type_jump:
1114      validate_jump_instr(nir_instr_as_jump(instr), state);
1115      break;
1116
1117   default:
1118      validate_assert(state, !"Invalid ALU instruction type");
1119      break;
1120   }
1121
1122   state->instr = NULL;
1123}
1124
1125static void
1126validate_phi_src(nir_phi_instr *instr, nir_block *pred, validate_state *state)
1127{
1128   state->instr = &instr->instr;
1129
1130   validate_assert(state, instr->dest.is_ssa);
1131
1132   exec_list_validate(&instr->srcs);
1133   nir_foreach_phi_src(src, instr) {
1134      if (src->pred == pred) {
1135         validate_assert(state, src->src.is_ssa);
1136         validate_src(&src->src, state, instr->dest.ssa.bit_size,
1137                      instr->dest.ssa.num_components);
1138         state->instr = NULL;
1139         return;
1140      }
1141   }
1142   validate_assert(state, !"Phi does not have a source corresponding to one "
1143                           "of its predecessor blocks");
1144}
1145
1146static void
1147validate_phi_srcs(nir_block *block, nir_block *succ, validate_state *state)
1148{
1149   nir_foreach_instr(instr, succ) {
1150      if (instr->type != nir_instr_type_phi)
1151         break;
1152
1153      validate_phi_src(nir_instr_as_phi(instr), block, state);
1154   }
1155}
1156
1157static void
1158collect_blocks(struct exec_list *cf_list, validate_state *state)
1159{
1160   /* We walk the blocks manually here rather than using nir_foreach_block for
1161    * a few reasons:
1162    *
1163    *  1. nir_foreach_block() doesn't work properly for unstructured NIR and
1164    *     we need to be able to handle all forms of NIR here.
1165    *
1166    *  2. We want to call exec_list_validate() on every linked list in the IR
1167    *     which means we need to touch every linked and just walking blocks
1168    *     with nir_foreach_block() would make that difficult.  In particular,
1169    *     we want to validate each list before the first time we walk it so
1170    *     that we catch broken lists in exec_list_validate() instead of
1171    *     getting stuck in a hard-to-debug infinite loop in the validator.
1172    *
1173    *  3. nir_foreach_block() depends on several invariants of the CF node
1174    *     hierarchy which nir_validate_shader() is responsible for verifying.
1175    *     If we used nir_foreach_block() in nir_validate_shader(), we could
1176    *     end up blowing up on a bad list walk instead of throwing the much
1177    *     easier to debug validation error.
1178    */
1179   exec_list_validate(cf_list);
1180   foreach_list_typed(nir_cf_node, node, node, cf_list) {
1181      switch (node->type) {
1182      case nir_cf_node_block:
1183         _mesa_set_add(state->blocks, nir_cf_node_as_block(node));
1184         break;
1185
1186      case nir_cf_node_if:
1187         collect_blocks(&nir_cf_node_as_if(node)->then_list, state);
1188         collect_blocks(&nir_cf_node_as_if(node)->else_list, state);
1189         break;
1190
1191      case nir_cf_node_loop:
1192         collect_blocks(&nir_cf_node_as_loop(node)->body, state);
1193         break;
1194
1195      default:
1196         unreachable("Invalid CF node type");
1197      }
1198   }
1199}
1200
1201static void validate_cf_node(nir_cf_node *node, validate_state *state);
1202
1203static void
1204validate_block_predecessors(nir_block *block, validate_state *state)
1205{
1206   for (unsigned i = 0; i < 2; i++) {
1207      if (block->successors[i] == NULL)
1208         continue;
1209
1210      /* The block has to exist in the nir_function_impl */
1211      validate_assert(state, _mesa_set_search(state->blocks,
1212                                              block->successors[i]));
1213
1214      /* And we have to be in our successor's predecessors set */
1215      validate_assert(state,
1216         _mesa_set_search(block->successors[i]->predecessors, block));
1217
1218      validate_phi_srcs(block, block->successors[i], state);
1219   }
1220
1221   /* The start block cannot have any predecessors */
1222   if (block == nir_start_block(state->impl))
1223      validate_assert(state, block->predecessors->entries == 0);
1224
1225   set_foreach(block->predecessors, entry) {
1226      const nir_block *pred = entry->key;
1227      validate_assert(state, _mesa_set_search(state->blocks, pred));
1228      validate_assert(state, pred->successors[0] == block ||
1229                             pred->successors[1] == block);
1230   }
1231}
1232
1233static void
1234validate_block(nir_block *block, validate_state *state)
1235{
1236   validate_assert(state, block->cf_node.parent == state->parent_node);
1237
1238   state->block = block;
1239
1240   exec_list_validate(&block->instr_list);
1241   nir_foreach_instr(instr, block) {
1242      if (instr->type == nir_instr_type_phi) {
1243         validate_assert(state, instr == nir_block_first_instr(block) ||
1244                nir_instr_prev(instr)->type == nir_instr_type_phi);
1245      }
1246
1247      validate_instr(instr, state);
1248   }
1249
1250   validate_assert(state, block->successors[0] != NULL);
1251   validate_assert(state, block->successors[0] != block->successors[1]);
1252   validate_block_predecessors(block, state);
1253
1254   if (!state->impl->structured) {
1255      validate_assert(state, nir_block_ends_in_jump(block));
1256   } else if (!nir_block_ends_in_jump(block)) {
1257      nir_cf_node *next = nir_cf_node_next(&block->cf_node);
1258      if (next == NULL) {
1259         switch (state->parent_node->type) {
1260         case nir_cf_node_loop: {
1261            nir_block *first = nir_loop_first_block(state->loop);
1262            validate_assert(state, block->successors[0] == first);
1263            /* due to the hack for infinite loops, block->successors[1] may
1264             * point to the block after the loop.
1265             */
1266            break;
1267         }
1268
1269         case nir_cf_node_if: {
1270            nir_block *after =
1271               nir_cf_node_as_block(nir_cf_node_next(state->parent_node));
1272            validate_assert(state, block->successors[0] == after);
1273            validate_assert(state, block->successors[1] == NULL);
1274            break;
1275         }
1276
1277         case nir_cf_node_function:
1278            validate_assert(state, block->successors[0] == state->impl->end_block);
1279            validate_assert(state, block->successors[1] == NULL);
1280            break;
1281
1282         default:
1283            unreachable("unknown control flow node type");
1284         }
1285      } else {
1286         if (next->type == nir_cf_node_if) {
1287            nir_if *if_stmt = nir_cf_node_as_if(next);
1288            validate_assert(state, block->successors[0] ==
1289                   nir_if_first_then_block(if_stmt));
1290            validate_assert(state, block->successors[1] ==
1291                   nir_if_first_else_block(if_stmt));
1292         } else if (next->type == nir_cf_node_loop) {
1293            nir_loop *loop = nir_cf_node_as_loop(next);
1294            validate_assert(state, block->successors[0] ==
1295                   nir_loop_first_block(loop));
1296            validate_assert(state, block->successors[1] == NULL);
1297         } else {
1298            validate_assert(state,
1299               !"Structured NIR cannot have consecutive blocks");
1300         }
1301      }
1302   }
1303}
1304
1305
1306static void
1307validate_end_block(nir_block *block, validate_state *state)
1308{
1309   validate_assert(state, block->cf_node.parent == &state->impl->cf_node);
1310
1311   exec_list_validate(&block->instr_list);
1312   validate_assert(state, exec_list_is_empty(&block->instr_list));
1313
1314   validate_assert(state, block->successors[0] == NULL);
1315   validate_assert(state, block->successors[1] == NULL);
1316   validate_block_predecessors(block, state);
1317}
1318
1319static void
1320validate_if(nir_if *if_stmt, validate_state *state)
1321{
1322   validate_assert(state, state->impl->structured);
1323
1324   state->if_stmt = if_stmt;
1325
1326   validate_assert(state, !exec_node_is_head_sentinel(if_stmt->cf_node.node.prev));
1327   nir_cf_node *prev_node = nir_cf_node_prev(&if_stmt->cf_node);
1328   validate_assert(state, prev_node->type == nir_cf_node_block);
1329
1330   validate_assert(state, !exec_node_is_tail_sentinel(if_stmt->cf_node.node.next));
1331   nir_cf_node *next_node = nir_cf_node_next(&if_stmt->cf_node);
1332   validate_assert(state, next_node->type == nir_cf_node_block);
1333
1334   validate_src(&if_stmt->condition, state, 0, 1);
1335
1336   validate_assert(state, !exec_list_is_empty(&if_stmt->then_list));
1337   validate_assert(state, !exec_list_is_empty(&if_stmt->else_list));
1338
1339   nir_cf_node *old_parent = state->parent_node;
1340   state->parent_node = &if_stmt->cf_node;
1341
1342   foreach_list_typed(nir_cf_node, cf_node, node, &if_stmt->then_list) {
1343      validate_cf_node(cf_node, state);
1344   }
1345
1346   foreach_list_typed(nir_cf_node, cf_node, node, &if_stmt->else_list) {
1347      validate_cf_node(cf_node, state);
1348   }
1349
1350   state->parent_node = old_parent;
1351   state->if_stmt = NULL;
1352}
1353
1354static void
1355validate_loop(nir_loop *loop, validate_state *state)
1356{
1357   validate_assert(state, state->impl->structured);
1358
1359   validate_assert(state, !exec_node_is_head_sentinel(loop->cf_node.node.prev));
1360   nir_cf_node *prev_node = nir_cf_node_prev(&loop->cf_node);
1361   validate_assert(state, prev_node->type == nir_cf_node_block);
1362
1363   validate_assert(state, !exec_node_is_tail_sentinel(loop->cf_node.node.next));
1364   nir_cf_node *next_node = nir_cf_node_next(&loop->cf_node);
1365   validate_assert(state, next_node->type == nir_cf_node_block);
1366
1367   validate_assert(state, !exec_list_is_empty(&loop->body));
1368
1369   nir_cf_node *old_parent = state->parent_node;
1370   state->parent_node = &loop->cf_node;
1371   nir_loop *old_loop = state->loop;
1372   state->loop = loop;
1373
1374   foreach_list_typed(nir_cf_node, cf_node, node, &loop->body) {
1375      validate_cf_node(cf_node, state);
1376   }
1377
1378   state->parent_node = old_parent;
1379   state->loop = old_loop;
1380}
1381
1382static void
1383validate_cf_node(nir_cf_node *node, validate_state *state)
1384{
1385   validate_assert(state, node->parent == state->parent_node);
1386
1387   switch (node->type) {
1388   case nir_cf_node_block:
1389      validate_block(nir_cf_node_as_block(node), state);
1390      break;
1391
1392   case nir_cf_node_if:
1393      validate_if(nir_cf_node_as_if(node), state);
1394      break;
1395
1396   case nir_cf_node_loop:
1397      validate_loop(nir_cf_node_as_loop(node), state);
1398      break;
1399
1400   default:
1401      unreachable("Invalid CF node type");
1402   }
1403}
1404
1405static void
1406prevalidate_reg_decl(nir_register *reg, validate_state *state)
1407{
1408   validate_assert(state, reg->index < state->impl->reg_alloc);
1409   validate_assert(state, !BITSET_TEST(state->regs_found, reg->index));
1410   validate_num_components(state, reg->num_components);
1411   BITSET_SET(state->regs_found, reg->index);
1412
1413   list_validate(&reg->uses);
1414   list_validate(&reg->defs);
1415   list_validate(&reg->if_uses);
1416
1417   reg_validate_state *reg_state = ralloc(state->regs, reg_validate_state);
1418   reg_state->uses = _mesa_pointer_set_create(reg_state);
1419   reg_state->if_uses = _mesa_pointer_set_create(reg_state);
1420   reg_state->defs = _mesa_pointer_set_create(reg_state);
1421
1422   reg_state->where_defined = state->impl;
1423
1424   _mesa_hash_table_insert(state->regs, reg, reg_state);
1425}
1426
1427static void
1428postvalidate_reg_decl(nir_register *reg, validate_state *state)
1429{
1430   struct hash_entry *entry = _mesa_hash_table_search(state->regs, reg);
1431
1432   assume(entry);
1433   reg_validate_state *reg_state = (reg_validate_state *) entry->data;
1434
1435   nir_foreach_use(src, reg) {
1436      struct set_entry *entry = _mesa_set_search(reg_state->uses, src);
1437      validate_assert(state, entry);
1438      _mesa_set_remove(reg_state->uses, entry);
1439   }
1440   validate_assert(state, reg_state->uses->entries == 0);
1441
1442   nir_foreach_if_use(src, reg) {
1443      struct set_entry *entry = _mesa_set_search(reg_state->if_uses, src);
1444      validate_assert(state, entry);
1445      _mesa_set_remove(reg_state->if_uses, entry);
1446   }
1447   validate_assert(state, reg_state->if_uses->entries == 0);
1448
1449   nir_foreach_def(src, reg) {
1450      struct set_entry *entry = _mesa_set_search(reg_state->defs, src);
1451      validate_assert(state, entry);
1452      _mesa_set_remove(reg_state->defs, entry);
1453   }
1454   validate_assert(state, reg_state->defs->entries == 0);
1455}
1456
1457static void
1458validate_constant(nir_constant *c, const struct glsl_type *type,
1459                  validate_state *state)
1460{
1461   if (glsl_type_is_vector_or_scalar(type)) {
1462      unsigned num_components = glsl_get_vector_elements(type);
1463      unsigned bit_size = glsl_get_bit_size(type);
1464      for (unsigned i = 0; i < num_components; i++)
1465         validate_const_value(&c->values[i], bit_size, state);
1466      for (unsigned i = num_components; i < NIR_MAX_VEC_COMPONENTS; i++)
1467         validate_assert(state, c->values[i].u64 == 0);
1468   } else {
1469      validate_assert(state, c->num_elements == glsl_get_length(type));
1470      if (glsl_type_is_struct_or_ifc(type)) {
1471         for (unsigned i = 0; i < c->num_elements; i++) {
1472            const struct glsl_type *elem_type = glsl_get_struct_field(type, i);
1473            validate_constant(c->elements[i], elem_type, state);
1474         }
1475      } else if (glsl_type_is_array_or_matrix(type)) {
1476         const struct glsl_type *elem_type = glsl_get_array_element(type);
1477         for (unsigned i = 0; i < c->num_elements; i++)
1478            validate_constant(c->elements[i], elem_type, state);
1479      } else {
1480         validate_assert(state, !"Invalid type for nir_constant");
1481      }
1482   }
1483}
1484
1485static void
1486validate_var_decl(nir_variable *var, nir_variable_mode valid_modes,
1487                  validate_state *state)
1488{
1489   state->var = var;
1490
1491   /* Must have exactly one mode set */
1492   validate_assert(state, util_is_power_of_two_nonzero(var->data.mode));
1493   validate_assert(state, var->data.mode & valid_modes);
1494
1495   if (var->data.compact) {
1496      /* The "compact" flag is only valid on arrays of scalars. */
1497      assert(glsl_type_is_array(var->type));
1498
1499      const struct glsl_type *type = glsl_get_array_element(var->type);
1500      if (nir_is_arrayed_io(var, state->shader->info.stage)) {
1501         assert(glsl_type_is_array(type));
1502         assert(glsl_type_is_scalar(glsl_get_array_element(type)));
1503      } else {
1504         assert(glsl_type_is_scalar(type));
1505      }
1506   }
1507
1508   if (var->num_members > 0) {
1509      const struct glsl_type *without_array = glsl_without_array(var->type);
1510      validate_assert(state, glsl_type_is_struct_or_ifc(without_array));
1511      validate_assert(state, var->num_members == glsl_get_length(without_array));
1512      validate_assert(state, var->members != NULL);
1513   }
1514
1515   if (var->data.per_view)
1516      validate_assert(state, glsl_type_is_array(var->type));
1517
1518   if (var->constant_initializer)
1519      validate_constant(var->constant_initializer, var->type, state);
1520
1521   /*
1522    * TODO validate some things ir_validate.cpp does (requires more GLSL type
1523    * support)
1524    */
1525
1526   _mesa_hash_table_insert(state->var_defs, var,
1527                           valid_modes == nir_var_function_temp ?
1528                           state->impl : NULL);
1529
1530   state->var = NULL;
1531}
1532
1533static bool
1534validate_ssa_def_dominance(nir_ssa_def *def, void *_state)
1535{
1536   validate_state *state = _state;
1537
1538   validate_assert(state, def->index < state->impl->ssa_alloc);
1539   validate_assert(state, !BITSET_TEST(state->ssa_defs_found, def->index));
1540   BITSET_SET(state->ssa_defs_found, def->index);
1541
1542   return true;
1543}
1544
1545static bool
1546validate_src_dominance(nir_src *src, void *_state)
1547{
1548   validate_state *state = _state;
1549   if (!src->is_ssa)
1550      return true;
1551
1552   if (src->ssa->parent_instr->block == src->parent_instr->block) {
1553      validate_assert(state, src->ssa->index < state->impl->ssa_alloc);
1554      validate_assert(state, BITSET_TEST(state->ssa_defs_found,
1555                                         src->ssa->index));
1556   } else {
1557      validate_assert(state, nir_block_dominates(src->ssa->parent_instr->block,
1558                                                 src->parent_instr->block));
1559   }
1560   return true;
1561}
1562
1563static void
1564validate_ssa_dominance(nir_function_impl *impl, validate_state *state)
1565{
1566   nir_metadata_require(impl, nir_metadata_dominance);
1567
1568   nir_foreach_block(block, impl) {
1569      state->block = block;
1570      nir_foreach_instr(instr, block) {
1571         state->instr = instr;
1572         if (instr->type == nir_instr_type_phi) {
1573            nir_phi_instr *phi = nir_instr_as_phi(instr);
1574            nir_foreach_phi_src(src, phi) {
1575               validate_assert(state,
1576                  nir_block_dominates(src->src.ssa->parent_instr->block,
1577                                      src->pred));
1578            }
1579         } else {
1580            nir_foreach_src(instr, validate_src_dominance, state);
1581         }
1582         nir_foreach_ssa_def(instr, validate_ssa_def_dominance, state);
1583      }
1584   }
1585}
1586
1587static void
1588validate_function_impl(nir_function_impl *impl, validate_state *state)
1589{
1590   /* Resize the ssa_srcs set.  It's likely that the size of this set will
1591    * never actually hit the number of SSA defs because we remove sources from
1592    * the set as we visit them.  (It could actually be much larger because
1593    * each SSA def can be used more than once.)  However, growing it now costs
1594    * us very little (the extra memory is already dwarfed by the SSA defs
1595    * themselves) and makes collisions much less likely.
1596    */
1597   _mesa_set_resize(state->ssa_srcs, impl->ssa_alloc);
1598
1599   validate_assert(state, impl->function->impl == impl);
1600   validate_assert(state, impl->cf_node.parent == NULL);
1601
1602   validate_assert(state, exec_list_is_empty(&impl->end_block->instr_list));
1603   validate_assert(state, impl->end_block->successors[0] == NULL);
1604   validate_assert(state, impl->end_block->successors[1] == NULL);
1605
1606   state->impl = impl;
1607   state->parent_node = &impl->cf_node;
1608
1609   exec_list_validate(&impl->locals);
1610   nir_foreach_function_temp_variable(var, impl) {
1611      validate_var_decl(var, nir_var_function_temp, state);
1612   }
1613
1614   state->regs_found = reralloc(state->mem_ctx, state->regs_found,
1615                                BITSET_WORD, BITSET_WORDS(impl->reg_alloc));
1616   memset(state->regs_found, 0, BITSET_WORDS(impl->reg_alloc) *
1617                                sizeof(BITSET_WORD));
1618   exec_list_validate(&impl->registers);
1619   foreach_list_typed(nir_register, reg, node, &impl->registers) {
1620      prevalidate_reg_decl(reg, state);
1621   }
1622
1623   state->ssa_defs_found = reralloc(state->mem_ctx, state->ssa_defs_found,
1624                                    BITSET_WORD, BITSET_WORDS(impl->ssa_alloc));
1625   memset(state->ssa_defs_found, 0, BITSET_WORDS(impl->ssa_alloc) *
1626                                    sizeof(BITSET_WORD));
1627
1628   _mesa_set_clear(state->blocks, NULL);
1629   _mesa_set_resize(state->blocks, impl->num_blocks);
1630   collect_blocks(&impl->body, state);
1631   _mesa_set_add(state->blocks, impl->end_block);
1632   validate_assert(state, !exec_list_is_empty(&impl->body));
1633   foreach_list_typed(nir_cf_node, node, node, &impl->body) {
1634      validate_cf_node(node, state);
1635   }
1636   validate_end_block(impl->end_block, state);
1637
1638   foreach_list_typed(nir_register, reg, node, &impl->registers) {
1639      postvalidate_reg_decl(reg, state);
1640   }
1641
1642   validate_assert(state, state->ssa_srcs->entries == 0);
1643   _mesa_set_clear(state->ssa_srcs, NULL);
1644
1645   static int validate_dominance = -1;
1646   if (validate_dominance < 0) {
1647      validate_dominance =
1648         env_var_as_boolean("NIR_VALIDATE_SSA_DOMINANCE", false);
1649   }
1650   if (validate_dominance)
1651      validate_ssa_dominance(impl, state);
1652}
1653
1654static void
1655validate_function(nir_function *func, validate_state *state)
1656{
1657   if (func->impl != NULL) {
1658      validate_assert(state, func->impl->function == func);
1659      validate_function_impl(func->impl, state);
1660   }
1661}
1662
1663static void
1664init_validate_state(validate_state *state)
1665{
1666   state->mem_ctx = ralloc_context(NULL);
1667   state->regs = _mesa_pointer_hash_table_create(state->mem_ctx);
1668   state->ssa_srcs = _mesa_pointer_set_create(state->mem_ctx);
1669   state->ssa_defs_found = NULL;
1670   state->regs_found = NULL;
1671   state->blocks = _mesa_pointer_set_create(state->mem_ctx);
1672   state->var_defs = _mesa_pointer_hash_table_create(state->mem_ctx);
1673   state->errors = _mesa_pointer_hash_table_create(state->mem_ctx);
1674   state->shader_gc_list = _mesa_pointer_set_create(state->mem_ctx);
1675
1676   state->loop = NULL;
1677   state->instr = NULL;
1678   state->var = NULL;
1679}
1680
1681static void
1682destroy_validate_state(validate_state *state)
1683{
1684   ralloc_free(state->mem_ctx);
1685}
1686
1687mtx_t fail_dump_mutex = _MTX_INITIALIZER_NP;
1688
1689static void
1690dump_errors(validate_state *state, const char *when)
1691{
1692   struct hash_table *errors = state->errors;
1693
1694   /* Lock around dumping so that we get clean dumps in a multi-threaded
1695    * scenario
1696    */
1697   mtx_lock(&fail_dump_mutex);
1698
1699   if (when) {
1700      fprintf(stderr, "NIR validation failed %s\n", when);
1701      fprintf(stderr, "%d errors:\n", _mesa_hash_table_num_entries(errors));
1702   } else {
1703      fprintf(stderr, "NIR validation failed with %d errors:\n",
1704              _mesa_hash_table_num_entries(errors));
1705   }
1706
1707   nir_print_shader_annotated(state->shader, stderr, errors);
1708
1709   if (_mesa_hash_table_num_entries(errors) > 0) {
1710      fprintf(stderr, "%d additional errors:\n",
1711              _mesa_hash_table_num_entries(errors));
1712      hash_table_foreach(errors, entry) {
1713         fprintf(stderr, "%s\n", (char *)entry->data);
1714      }
1715   }
1716
1717   mtx_unlock(&fail_dump_mutex);
1718
1719   abort();
1720}
1721
1722void
1723nir_validate_shader(nir_shader *shader, const char *when)
1724{
1725   static int should_validate = -1;
1726   if (should_validate < 0)
1727      should_validate = env_var_as_boolean("NIR_VALIDATE", true);
1728   if (!should_validate)
1729      return;
1730
1731   validate_state state;
1732   init_validate_state(&state);
1733
1734   list_for_each_entry(nir_instr, instr, &shader->gc_list, gc_node) {
1735      _mesa_set_add(state.shader_gc_list, instr);
1736   }
1737
1738   state.shader = shader;
1739
1740   nir_variable_mode valid_modes =
1741      nir_var_shader_in |
1742      nir_var_shader_out |
1743      nir_var_shader_temp |
1744      nir_var_uniform |
1745      nir_var_mem_ubo |
1746      nir_var_system_value |
1747      nir_var_mem_ssbo |
1748      nir_var_mem_shared |
1749      nir_var_mem_push_const |
1750      nir_var_mem_constant;
1751
1752   if (gl_shader_stage_is_callable(shader->info.stage))
1753      valid_modes |= nir_var_shader_call_data;
1754
1755   if (shader->info.stage == MESA_SHADER_ANY_HIT ||
1756       shader->info.stage == MESA_SHADER_CLOSEST_HIT ||
1757       shader->info.stage == MESA_SHADER_INTERSECTION)
1758      valid_modes |= nir_var_ray_hit_attrib;
1759
1760   exec_list_validate(&shader->variables);
1761   nir_foreach_variable_in_shader(var, shader)
1762     validate_var_decl(var, valid_modes, &state);
1763
1764   exec_list_validate(&shader->functions);
1765   foreach_list_typed(nir_function, func, node, &shader->functions) {
1766      validate_function(func, &state);
1767   }
1768
1769   if (_mesa_hash_table_num_entries(state.errors) > 0)
1770      dump_errors(&state, when);
1771
1772   destroy_validate_state(&state);
1773}
1774
1775void
1776nir_validate_ssa_dominance(nir_shader *shader, const char *when)
1777{
1778   static int should_validate = -1;
1779   if (should_validate < 0)
1780      should_validate = env_var_as_boolean("NIR_VALIDATE", true);
1781   if (!should_validate)
1782      return;
1783
1784   validate_state state;
1785   init_validate_state(&state);
1786
1787   state.shader = shader;
1788
1789   nir_foreach_function(func, shader) {
1790      if (func->impl == NULL)
1791         continue;
1792
1793      state.ssa_defs_found = reralloc(state.mem_ctx, state.ssa_defs_found,
1794                                      BITSET_WORD,
1795                                      BITSET_WORDS(func->impl->ssa_alloc));
1796      memset(state.ssa_defs_found, 0, BITSET_WORDS(func->impl->ssa_alloc) *
1797                                      sizeof(BITSET_WORD));
1798
1799      state.impl = func->impl;
1800      validate_ssa_dominance(func->impl, &state);
1801   }
1802
1803   if (_mesa_hash_table_num_entries(state.errors) > 0)
1804      dump_errors(&state, when);
1805
1806   destroy_validate_state(&state);
1807}
1808
1809#endif /* NDEBUG */
1810