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(®->uses); 974 list_validate(®->defs); 975 list_validate(®->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