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 45 typedef 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 54 typedef 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 107 static void log_error(validate_state * state,const char * cond,const char * file,int line)108 log_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 125 static bool validate_assert_impl(validate_state * state,bool cond,const char * str,const char * file,unsigned line)126 validate_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 138 static void validate_src(nir_src *src, validate_state *state, 139 unsigned bit_sizes, unsigned num_components); 140 141 static void validate_num_components(validate_state * state,unsigned num_components)142 validate_num_components(validate_state *state, unsigned num_components) 143 { 144 validate_assert(state, nir_num_components_valid(num_components)); 145 } 146 147 static void validate_reg_src(nir_src * src,validate_state * state,unsigned bit_sizes,unsigned num_components)148 validate_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 190 static void validate_ssa_src(nir_src * src,validate_state * state,unsigned bit_sizes,unsigned num_components)191 validate_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 219 static void validate_src(nir_src * src,validate_state * state,unsigned bit_sizes,unsigned num_components)220 validate_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 234 static void validate_alu_src(nir_alu_instr * instr,unsigned index,validate_state * state)235 validate_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 253 static void validate_reg_dest(nir_reg_dest * dest,validate_state * state,unsigned bit_sizes,unsigned num_components)254 validate_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 289 static void validate_ssa_def(nir_ssa_def * def,validate_state * state)290 validate_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 321 static void validate_dest(nir_dest * dest,validate_state * state,unsigned bit_sizes,unsigned num_components)322 validate_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 336 static void validate_alu_dest(nir_alu_instr * instr,validate_state * state)337 validate_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 363 static void validate_alu_instr(nir_alu_instr * instr,validate_state * state)364 validate_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 408 static void validate_var_use(nir_variable * var,validate_state * state)409 validate_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 417 static void validate_deref_instr(nir_deref_instr * instr,validate_state * state)418 validate_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 549 static bool vectorized_intrinsic(nir_intrinsic_instr * intr)550 vectorized_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 */ 569 static enum pipe_format image_intrin_format(nir_intrinsic_instr * instr)570 image_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 586 static void validate_intrinsic_instr(nir_intrinsic_instr * instr,validate_state * state)587 validate_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 827 static void validate_tex_instr(nir_tex_instr * instr,validate_state * state)828 validate_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 935 static void validate_call_instr(nir_call_instr * instr,validate_state * state)936 validate_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 947 static void validate_const_value(nir_const_value * val,unsigned bit_size,validate_state * state)948 validate_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 979 static void validate_load_const_instr(nir_load_const_instr * instr,validate_state * state)980 validate_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 988 static void validate_ssa_undef_instr(nir_ssa_undef_instr * instr,validate_state * state)989 validate_ssa_undef_instr(nir_ssa_undef_instr *instr, validate_state *state) 990 { 991 validate_ssa_def(&instr->def, state); 992 } 993 994 static void validate_phi_instr(nir_phi_instr * instr,validate_state * state)995 validate_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 1009 static void validate_jump_instr(nir_jump_instr * instr,validate_state * state)1010 validate_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 1071 static void validate_instr(nir_instr * instr,validate_state * state)1072 validate_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 1125 static void validate_phi_src(nir_phi_instr * instr,nir_block * pred,validate_state * state)1126 validate_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 1146 static void validate_phi_srcs(nir_block * block,nir_block * succ,validate_state * state)1147 validate_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 1157 static void collect_blocks(struct exec_list * cf_list,validate_state * state)1158 collect_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 1201 static void validate_cf_node(nir_cf_node *node, validate_state *state); 1202 1203 static void validate_block_predecessors(nir_block * block,validate_state * state)1204 validate_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 1233 static void validate_block(nir_block * block,validate_state * state)1234 validate_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 1306 static void validate_end_block(nir_block * block,validate_state * state)1307 validate_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 1319 static void validate_if(nir_if * if_stmt,validate_state * state)1320 validate_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 1354 static void validate_loop(nir_loop * loop,validate_state * state)1355 validate_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 1382 static void validate_cf_node(nir_cf_node * node,validate_state * state)1383 validate_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 1405 static void prevalidate_reg_decl(nir_register * reg,validate_state * state)1406 prevalidate_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(®->uses); 1414 list_validate(®->defs); 1415 list_validate(®->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 1427 static void postvalidate_reg_decl(nir_register * reg,validate_state * state)1428 postvalidate_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 1457 static void validate_constant(nir_constant * c,const struct glsl_type * type,validate_state * state)1458 validate_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 1485 static void validate_var_decl(nir_variable * var,nir_variable_mode valid_modes,validate_state * state)1486 validate_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 1533 static bool validate_ssa_def_dominance(nir_ssa_def * def,void * _state)1534 validate_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 1545 static bool validate_src_dominance(nir_src * src,void * _state)1546 validate_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 1563 static void validate_ssa_dominance(nir_function_impl * impl,validate_state * state)1564 validate_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 1587 static void validate_function_impl(nir_function_impl * impl,validate_state * state)1588 validate_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 1654 static void validate_function(nir_function * func,validate_state * state)1655 validate_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 1663 static void init_validate_state(validate_state * state)1664 init_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 1681 static void destroy_validate_state(validate_state * state)1682 destroy_validate_state(validate_state *state) 1683 { 1684 ralloc_free(state->mem_ctx); 1685 } 1686 1687 mtx_t fail_dump_mutex = _MTX_INITIALIZER_NP; 1688 1689 static void dump_errors(validate_state * state,const char * when)1690 dump_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 1722 void nir_validate_shader(nir_shader * shader,const char * when)1723 nir_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 1775 void nir_validate_ssa_dominance(nir_shader * shader,const char * when)1776 nir_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