1 /* 2 * Copyright 2010 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 21 * DEALINGS IN THE SOFTWARE. 22 */ 23 24 /** 25 * \file ir_validate.cpp 26 * 27 * Attempts to verify that various invariants of the IR tree are true. 28 * 29 * In particular, at the moment it makes sure that no single 30 * ir_instruction node except for ir_variable appears multiple times 31 * in the ir tree. ir_variable does appear multiple times: Once as a 32 * declaration in an exec_list, and multiple times as the endpoint of 33 * a dereference chain. 34 */ 35 36 #include "ir.h" 37 #include "ir_hierarchical_visitor.h" 38 #include "util/hash_table.h" 39 #include "util/set.h" 40 #include "compiler/glsl_types.h" 41 42 namespace { 43 44 class ir_validate : public ir_hierarchical_visitor { 45 public: 46 ir_validate() 47 { 48 this->ir_set = _mesa_set_create(NULL, _mesa_hash_pointer, 49 _mesa_key_pointer_equal); 50 51 this->current_function = NULL; 52 53 this->callback_enter = ir_validate::validate_ir; 54 this->data_enter = ir_set; 55 } 56 57 ~ir_validate() 58 { 59 _mesa_set_destroy(this->ir_set, NULL); 60 } 61 62 virtual ir_visitor_status visit(ir_variable *v); 63 virtual ir_visitor_status visit(ir_dereference_variable *ir); 64 65 virtual ir_visitor_status visit_enter(ir_discard *ir); 66 virtual ir_visitor_status visit_enter(ir_if *ir); 67 68 virtual ir_visitor_status visit_enter(ir_function *ir); 69 virtual ir_visitor_status visit_leave(ir_function *ir); 70 virtual ir_visitor_status visit_enter(ir_function_signature *ir); 71 72 virtual ir_visitor_status visit_leave(ir_expression *ir); 73 virtual ir_visitor_status visit_leave(ir_swizzle *ir); 74 75 virtual ir_visitor_status visit_enter(class ir_dereference_array *); 76 77 virtual ir_visitor_status visit_enter(ir_assignment *ir); 78 virtual ir_visitor_status visit_enter(ir_call *ir); 79 80 static void validate_ir(ir_instruction *ir, void *data); 81 82 ir_function *current_function; 83 84 struct set *ir_set; 85 }; 86 87 } /* anonymous namespace */ 88 89 ir_visitor_status 90 ir_validate::visit(ir_dereference_variable *ir) 91 { 92 if ((ir->var == NULL) || (ir->var->as_variable() == NULL)) { 93 printf("ir_dereference_variable @ %p does not specify a variable %p\n", 94 (void *) ir, (void *) ir->var); 95 abort(); 96 } 97 98 if (_mesa_set_search(ir_set, ir->var) == NULL) { 99 printf("ir_dereference_variable @ %p specifies undeclared variable " 100 "`%s' @ %p\n", 101 (void *) ir, ir->var->name, (void *) ir->var); 102 abort(); 103 } 104 105 this->validate_ir(ir, this->data_enter); 106 107 return visit_continue; 108 } 109 110 ir_visitor_status 111 ir_validate::visit_enter(class ir_dereference_array *ir) 112 { 113 if (!ir->array->type->is_array() && !ir->array->type->is_matrix() && 114 !ir->array->type->is_vector()) { 115 printf("ir_dereference_array @ %p does not specify an array, a vector " 116 "or a matrix\n", 117 (void *) ir); 118 ir->print(); 119 printf("\n"); 120 abort(); 121 } 122 123 if (!ir->array_index->type->is_scalar()) { 124 printf("ir_dereference_array @ %p does not have scalar index: %s\n", 125 (void *) ir, ir->array_index->type->name); 126 abort(); 127 } 128 129 if (!ir->array_index->type->is_integer()) { 130 printf("ir_dereference_array @ %p does not have integer index: %s\n", 131 (void *) ir, ir->array_index->type->name); 132 abort(); 133 } 134 135 return visit_continue; 136 } 137 138 ir_visitor_status 139 ir_validate::visit_enter(ir_discard *ir) 140 { 141 if (ir->condition && ir->condition->type != glsl_type::bool_type) { 142 printf("ir_discard condition %s type instead of bool.\n", 143 ir->condition->type->name); 144 ir->print(); 145 printf("\n"); 146 abort(); 147 } 148 149 return visit_continue; 150 } 151 152 ir_visitor_status 153 ir_validate::visit_enter(ir_if *ir) 154 { 155 if (ir->condition->type != glsl_type::bool_type) { 156 printf("ir_if condition %s type instead of bool.\n", 157 ir->condition->type->name); 158 ir->print(); 159 printf("\n"); 160 abort(); 161 } 162 163 return visit_continue; 164 } 165 166 167 ir_visitor_status 168 ir_validate::visit_enter(ir_function *ir) 169 { 170 /* Function definitions cannot be nested. 171 */ 172 if (this->current_function != NULL) { 173 printf("Function definition nested inside another function " 174 "definition:\n"); 175 printf("%s %p inside %s %p\n", 176 ir->name, (void *) ir, 177 this->current_function->name, (void *) this->current_function); 178 abort(); 179 } 180 181 /* Store the current function hierarchy being traversed. This is used 182 * by the function signature visitor to ensure that the signatures are 183 * linked with the correct functions. 184 */ 185 this->current_function = ir; 186 187 this->validate_ir(ir, this->data_enter); 188 189 /* Verify that all of the things stored in the list of signatures are, 190 * in fact, function signatures. 191 */ 192 foreach_in_list(ir_instruction, sig, &ir->signatures) { 193 if (sig->ir_type != ir_type_function_signature) { 194 printf("Non-signature in signature list of function `%s'\n", 195 ir->name); 196 abort(); 197 } 198 } 199 200 return visit_continue; 201 } 202 203 ir_visitor_status 204 ir_validate::visit_leave(ir_function *ir) 205 { 206 assert(ralloc_parent(ir->name) == ir); 207 208 this->current_function = NULL; 209 return visit_continue; 210 } 211 212 ir_visitor_status 213 ir_validate::visit_enter(ir_function_signature *ir) 214 { 215 if (this->current_function != ir->function()) { 216 printf("Function signature nested inside wrong function " 217 "definition:\n"); 218 printf("%p inside %s %p instead of %s %p\n", 219 (void *) ir, 220 this->current_function->name, (void *) this->current_function, 221 ir->function_name(), (void *) ir->function()); 222 abort(); 223 } 224 225 if (ir->return_type == NULL) { 226 printf("Function signature %p for function %s has NULL return type.\n", 227 (void *) ir, ir->function_name()); 228 abort(); 229 } 230 231 this->validate_ir(ir, this->data_enter); 232 233 return visit_continue; 234 } 235 236 ir_visitor_status 237 ir_validate::visit_leave(ir_expression *ir) 238 { 239 switch (ir->operation) { 240 case ir_unop_bit_not: 241 assert(ir->operands[0]->type == ir->type); 242 break; 243 case ir_unop_logic_not: 244 assert(ir->type->base_type == GLSL_TYPE_BOOL); 245 assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL); 246 break; 247 248 case ir_unop_neg: 249 assert(ir->type == ir->operands[0]->type); 250 break; 251 252 case ir_unop_abs: 253 case ir_unop_sign: 254 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT || 255 ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT || 256 ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE); 257 assert(ir->type == ir->operands[0]->type); 258 break; 259 260 case ir_unop_rcp: 261 case ir_unop_rsq: 262 case ir_unop_sqrt: 263 assert(ir->type->base_type == GLSL_TYPE_FLOAT || 264 ir->type->base_type == GLSL_TYPE_DOUBLE); 265 assert(ir->type == ir->operands[0]->type); 266 break; 267 268 case ir_unop_exp: 269 case ir_unop_log: 270 case ir_unop_exp2: 271 case ir_unop_log2: 272 case ir_unop_saturate: 273 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); 274 assert(ir->type == ir->operands[0]->type); 275 break; 276 277 case ir_unop_f2i: 278 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); 279 assert(ir->type->base_type == GLSL_TYPE_INT); 280 break; 281 case ir_unop_f2u: 282 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); 283 assert(ir->type->base_type == GLSL_TYPE_UINT); 284 break; 285 case ir_unop_i2f: 286 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT); 287 assert(ir->type->base_type == GLSL_TYPE_FLOAT); 288 break; 289 case ir_unop_f2b: 290 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); 291 assert(ir->type->base_type == GLSL_TYPE_BOOL); 292 break; 293 case ir_unop_b2f: 294 assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL); 295 assert(ir->type->base_type == GLSL_TYPE_FLOAT); 296 break; 297 case ir_unop_i2b: 298 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT); 299 assert(ir->type->base_type == GLSL_TYPE_BOOL); 300 break; 301 case ir_unop_b2i: 302 assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL); 303 assert(ir->type->base_type == GLSL_TYPE_INT); 304 break; 305 case ir_unop_u2f: 306 assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT); 307 assert(ir->type->base_type == GLSL_TYPE_FLOAT); 308 break; 309 case ir_unop_i2u: 310 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT); 311 assert(ir->type->base_type == GLSL_TYPE_UINT); 312 break; 313 case ir_unop_u2i: 314 assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT); 315 assert(ir->type->base_type == GLSL_TYPE_INT); 316 break; 317 case ir_unop_bitcast_i2f: 318 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT); 319 assert(ir->type->base_type == GLSL_TYPE_FLOAT); 320 break; 321 case ir_unop_bitcast_f2i: 322 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); 323 assert(ir->type->base_type == GLSL_TYPE_INT); 324 break; 325 case ir_unop_bitcast_u2f: 326 assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT); 327 assert(ir->type->base_type == GLSL_TYPE_FLOAT); 328 break; 329 case ir_unop_bitcast_f2u: 330 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); 331 assert(ir->type->base_type == GLSL_TYPE_UINT); 332 break; 333 334 case ir_unop_trunc: 335 case ir_unop_round_even: 336 case ir_unop_ceil: 337 case ir_unop_floor: 338 case ir_unop_fract: 339 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT || 340 ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE); 341 assert(ir->operands[0]->type == ir->type); 342 break; 343 case ir_unop_sin: 344 case ir_unop_cos: 345 case ir_unop_dFdx: 346 case ir_unop_dFdx_coarse: 347 case ir_unop_dFdx_fine: 348 case ir_unop_dFdy: 349 case ir_unop_dFdy_coarse: 350 case ir_unop_dFdy_fine: 351 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); 352 assert(ir->operands[0]->type == ir->type); 353 break; 354 355 case ir_unop_pack_snorm_2x16: 356 case ir_unop_pack_unorm_2x16: 357 case ir_unop_pack_half_2x16: 358 assert(ir->type == glsl_type::uint_type); 359 assert(ir->operands[0]->type == glsl_type::vec2_type); 360 break; 361 362 case ir_unop_pack_snorm_4x8: 363 case ir_unop_pack_unorm_4x8: 364 assert(ir->type == glsl_type::uint_type); 365 assert(ir->operands[0]->type == glsl_type::vec4_type); 366 break; 367 368 case ir_unop_pack_double_2x32: 369 assert(ir->type == glsl_type::double_type); 370 assert(ir->operands[0]->type == glsl_type::uvec2_type); 371 break; 372 373 case ir_unop_unpack_snorm_2x16: 374 case ir_unop_unpack_unorm_2x16: 375 case ir_unop_unpack_half_2x16: 376 assert(ir->type == glsl_type::vec2_type); 377 assert(ir->operands[0]->type == glsl_type::uint_type); 378 break; 379 380 case ir_unop_unpack_snorm_4x8: 381 case ir_unop_unpack_unorm_4x8: 382 assert(ir->type == glsl_type::vec4_type); 383 assert(ir->operands[0]->type == glsl_type::uint_type); 384 break; 385 386 case ir_unop_unpack_double_2x32: 387 assert(ir->type == glsl_type::uvec2_type); 388 assert(ir->operands[0]->type == glsl_type::double_type); 389 break; 390 391 case ir_unop_bitfield_reverse: 392 assert(ir->operands[0]->type == ir->type); 393 assert(ir->type->is_integer()); 394 break; 395 396 case ir_unop_bit_count: 397 case ir_unop_find_msb: 398 case ir_unop_find_lsb: 399 assert(ir->operands[0]->type->vector_elements == ir->type->vector_elements); 400 assert(ir->operands[0]->type->is_integer()); 401 assert(ir->type->base_type == GLSL_TYPE_INT); 402 break; 403 404 case ir_unop_noise: 405 /* XXX what can we assert here? */ 406 break; 407 408 case ir_unop_interpolate_at_centroid: 409 assert(ir->operands[0]->type == ir->type); 410 assert(ir->operands[0]->type->is_float()); 411 break; 412 413 case ir_unop_get_buffer_size: 414 assert(ir->type == glsl_type::int_type); 415 assert(ir->operands[0]->type == glsl_type::uint_type); 416 break; 417 418 case ir_unop_ssbo_unsized_array_length: 419 assert(ir->type == glsl_type::int_type); 420 assert(ir->operands[0]->type->is_array()); 421 assert(ir->operands[0]->type->is_unsized_array()); 422 break; 423 424 case ir_unop_d2f: 425 assert(ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE); 426 assert(ir->type->base_type == GLSL_TYPE_FLOAT); 427 break; 428 case ir_unop_f2d: 429 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); 430 assert(ir->type->base_type == GLSL_TYPE_DOUBLE); 431 break; 432 case ir_unop_d2i: 433 assert(ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE); 434 assert(ir->type->base_type == GLSL_TYPE_INT); 435 break; 436 case ir_unop_i2d: 437 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT); 438 assert(ir->type->base_type == GLSL_TYPE_DOUBLE); 439 break; 440 case ir_unop_d2u: 441 assert(ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE); 442 assert(ir->type->base_type == GLSL_TYPE_UINT); 443 break; 444 case ir_unop_u2d: 445 assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT); 446 assert(ir->type->base_type == GLSL_TYPE_DOUBLE); 447 break; 448 case ir_unop_d2b: 449 assert(ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE); 450 assert(ir->type->base_type == GLSL_TYPE_BOOL); 451 break; 452 453 case ir_unop_frexp_sig: 454 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT || 455 ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE); 456 assert(ir->type->base_type == GLSL_TYPE_DOUBLE); 457 break; 458 case ir_unop_frexp_exp: 459 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT || 460 ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE); 461 assert(ir->type->base_type == GLSL_TYPE_INT); 462 break; 463 case ir_unop_subroutine_to_int: 464 assert(ir->operands[0]->type->base_type == GLSL_TYPE_SUBROUTINE); 465 assert(ir->type->base_type == GLSL_TYPE_INT); 466 break; 467 468 case ir_unop_vote_any: 469 case ir_unop_vote_all: 470 case ir_unop_vote_eq: 471 assert(ir->type == glsl_type::bool_type); 472 assert(ir->operands[0]->type == glsl_type::bool_type); 473 break; 474 475 case ir_binop_add: 476 case ir_binop_sub: 477 case ir_binop_mul: 478 case ir_binop_div: 479 case ir_binop_mod: 480 case ir_binop_min: 481 case ir_binop_max: 482 case ir_binop_pow: 483 assert(ir->operands[0]->type->base_type == 484 ir->operands[1]->type->base_type); 485 486 if (ir->operands[0]->type->is_scalar()) 487 assert(ir->operands[1]->type == ir->type); 488 else if (ir->operands[1]->type->is_scalar()) 489 assert(ir->operands[0]->type == ir->type); 490 else if (ir->operands[0]->type->is_vector() && 491 ir->operands[1]->type->is_vector()) { 492 assert(ir->operands[0]->type == ir->operands[1]->type); 493 assert(ir->operands[0]->type == ir->type); 494 } 495 break; 496 497 case ir_binop_imul_high: 498 assert(ir->type == ir->operands[0]->type); 499 assert(ir->type == ir->operands[1]->type); 500 assert(ir->type->is_integer()); 501 break; 502 503 case ir_binop_carry: 504 case ir_binop_borrow: 505 assert(ir->type == ir->operands[0]->type); 506 assert(ir->type == ir->operands[1]->type); 507 assert(ir->type->base_type == GLSL_TYPE_UINT); 508 break; 509 510 case ir_binop_less: 511 case ir_binop_greater: 512 case ir_binop_lequal: 513 case ir_binop_gequal: 514 case ir_binop_equal: 515 case ir_binop_nequal: 516 /* The semantics of the IR operators differ from the GLSL <, >, <=, >=, 517 * ==, and != operators. The IR operators perform a component-wise 518 * comparison on scalar or vector types and return a boolean scalar or 519 * vector type of the same size. 520 */ 521 assert(ir->type->base_type == GLSL_TYPE_BOOL); 522 assert(ir->operands[0]->type == ir->operands[1]->type); 523 assert(ir->operands[0]->type->is_vector() 524 || ir->operands[0]->type->is_scalar()); 525 assert(ir->operands[0]->type->vector_elements 526 == ir->type->vector_elements); 527 break; 528 529 case ir_binop_all_equal: 530 case ir_binop_any_nequal: 531 /* GLSL == and != operate on scalars, vectors, matrices and arrays, and 532 * return a scalar boolean. The IR matches that. 533 */ 534 assert(ir->type == glsl_type::bool_type); 535 assert(ir->operands[0]->type == ir->operands[1]->type); 536 break; 537 538 case ir_binop_lshift: 539 case ir_binop_rshift: 540 assert(ir->operands[0]->type->is_integer() && 541 ir->operands[1]->type->is_integer()); 542 if (ir->operands[0]->type->is_scalar()) { 543 assert(ir->operands[1]->type->is_scalar()); 544 } 545 if (ir->operands[0]->type->is_vector() && 546 ir->operands[1]->type->is_vector()) { 547 assert(ir->operands[0]->type->components() == 548 ir->operands[1]->type->components()); 549 } 550 assert(ir->type == ir->operands[0]->type); 551 break; 552 553 case ir_binop_bit_and: 554 case ir_binop_bit_xor: 555 case ir_binop_bit_or: 556 assert(ir->operands[0]->type->base_type == 557 ir->operands[1]->type->base_type); 558 assert(ir->type->is_integer()); 559 if (ir->operands[0]->type->is_vector() && 560 ir->operands[1]->type->is_vector()) { 561 assert(ir->operands[0]->type->vector_elements == 562 ir->operands[1]->type->vector_elements); 563 } 564 break; 565 566 case ir_binop_logic_and: 567 case ir_binop_logic_xor: 568 case ir_binop_logic_or: 569 assert(ir->type->base_type == GLSL_TYPE_BOOL); 570 assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL); 571 assert(ir->operands[1]->type->base_type == GLSL_TYPE_BOOL); 572 break; 573 574 case ir_binop_dot: 575 assert(ir->type == glsl_type::float_type || 576 ir->type == glsl_type::double_type); 577 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT || 578 ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE); 579 assert(ir->operands[0]->type->is_vector()); 580 assert(ir->operands[0]->type == ir->operands[1]->type); 581 break; 582 583 case ir_binop_ubo_load: 584 assert(ir->operands[0]->type == glsl_type::uint_type); 585 586 assert(ir->operands[1]->type == glsl_type::uint_type); 587 break; 588 589 case ir_binop_ldexp: 590 assert(ir->operands[0]->type == ir->type); 591 assert(ir->operands[0]->type->is_float() || 592 ir->operands[0]->type->is_double()); 593 assert(ir->operands[1]->type->base_type == GLSL_TYPE_INT); 594 assert(ir->operands[0]->type->components() == 595 ir->operands[1]->type->components()); 596 break; 597 598 case ir_binop_vector_extract: 599 assert(ir->operands[0]->type->is_vector()); 600 assert(ir->operands[1]->type->is_scalar() 601 && ir->operands[1]->type->is_integer()); 602 break; 603 604 case ir_binop_interpolate_at_offset: 605 assert(ir->operands[0]->type == ir->type); 606 assert(ir->operands[0]->type->is_float()); 607 assert(ir->operands[1]->type->components() == 2); 608 assert(ir->operands[1]->type->is_float()); 609 break; 610 611 case ir_binop_interpolate_at_sample: 612 assert(ir->operands[0]->type == ir->type); 613 assert(ir->operands[0]->type->is_float()); 614 assert(ir->operands[1]->type == glsl_type::int_type); 615 break; 616 617 case ir_triop_fma: 618 assert(ir->type->base_type == GLSL_TYPE_FLOAT || 619 ir->type->base_type == GLSL_TYPE_DOUBLE); 620 assert(ir->type == ir->operands[0]->type); 621 assert(ir->type == ir->operands[1]->type); 622 assert(ir->type == ir->operands[2]->type); 623 break; 624 625 case ir_triop_lrp: 626 assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT || 627 ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE); 628 assert(ir->operands[0]->type == ir->operands[1]->type); 629 assert(ir->operands[2]->type == ir->operands[0]->type || 630 ir->operands[2]->type == glsl_type::float_type || 631 ir->operands[2]->type == glsl_type::double_type); 632 break; 633 634 case ir_triop_csel: 635 assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL); 636 assert(ir->type->vector_elements == ir->operands[0]->type->vector_elements); 637 assert(ir->type == ir->operands[1]->type); 638 assert(ir->type == ir->operands[2]->type); 639 break; 640 641 case ir_triop_bitfield_extract: 642 assert(ir->type->is_integer()); 643 assert(ir->operands[0]->type == ir->type); 644 assert(ir->operands[1]->type == ir->type); 645 assert(ir->operands[2]->type == ir->type); 646 break; 647 648 case ir_triop_vector_insert: 649 assert(ir->operands[0]->type->is_vector()); 650 assert(ir->operands[1]->type->is_scalar()); 651 assert(ir->operands[0]->type->base_type == ir->operands[1]->type->base_type); 652 assert(ir->operands[2]->type->is_scalar() 653 && ir->operands[2]->type->is_integer()); 654 assert(ir->type == ir->operands[0]->type); 655 break; 656 657 case ir_quadop_bitfield_insert: 658 assert(ir->type->is_integer()); 659 assert(ir->operands[0]->type == ir->type); 660 assert(ir->operands[1]->type == ir->type); 661 assert(ir->operands[2]->type == ir->type); 662 assert(ir->operands[3]->type == ir->type); 663 break; 664 665 case ir_quadop_vector: 666 /* The vector operator collects some number of scalars and generates a 667 * vector from them. 668 * 669 * - All of the operands must be scalar. 670 * - Number of operands must matche the size of the resulting vector. 671 * - Base type of the operands must match the base type of the result. 672 */ 673 assert(ir->type->is_vector()); 674 switch (ir->type->vector_elements) { 675 case 2: 676 assert(ir->operands[0]->type->is_scalar()); 677 assert(ir->operands[0]->type->base_type == ir->type->base_type); 678 assert(ir->operands[1]->type->is_scalar()); 679 assert(ir->operands[1]->type->base_type == ir->type->base_type); 680 assert(ir->operands[2] == NULL); 681 assert(ir->operands[3] == NULL); 682 break; 683 case 3: 684 assert(ir->operands[0]->type->is_scalar()); 685 assert(ir->operands[0]->type->base_type == ir->type->base_type); 686 assert(ir->operands[1]->type->is_scalar()); 687 assert(ir->operands[1]->type->base_type == ir->type->base_type); 688 assert(ir->operands[2]->type->is_scalar()); 689 assert(ir->operands[2]->type->base_type == ir->type->base_type); 690 assert(ir->operands[3] == NULL); 691 break; 692 case 4: 693 assert(ir->operands[0]->type->is_scalar()); 694 assert(ir->operands[0]->type->base_type == ir->type->base_type); 695 assert(ir->operands[1]->type->is_scalar()); 696 assert(ir->operands[1]->type->base_type == ir->type->base_type); 697 assert(ir->operands[2]->type->is_scalar()); 698 assert(ir->operands[2]->type->base_type == ir->type->base_type); 699 assert(ir->operands[3]->type->is_scalar()); 700 assert(ir->operands[3]->type->base_type == ir->type->base_type); 701 break; 702 default: 703 /* The is_vector assertion above should prevent execution from ever 704 * getting here. 705 */ 706 assert(!"Should not get here."); 707 break; 708 } 709 } 710 711 return visit_continue; 712 } 713 714 ir_visitor_status 715 ir_validate::visit_leave(ir_swizzle *ir) 716 { 717 unsigned int chans[4] = {ir->mask.x, ir->mask.y, ir->mask.z, ir->mask.w}; 718 719 for (unsigned int i = 0; i < ir->type->vector_elements; i++) { 720 if (chans[i] >= ir->val->type->vector_elements) { 721 printf("ir_swizzle @ %p specifies a channel not present " 722 "in the value.\n", (void *) ir); 723 ir->print(); 724 abort(); 725 } 726 } 727 728 return visit_continue; 729 } 730 731 ir_visitor_status 732 ir_validate::visit(ir_variable *ir) 733 { 734 /* An ir_variable is the one thing that can (and will) appear multiple times 735 * in an IR tree. It is added to the hashtable so that it can be used 736 * in the ir_dereference_variable handler to ensure that a variable is 737 * declared before it is dereferenced. 738 */ 739 if (ir->name && ir->is_name_ralloced()) 740 assert(ralloc_parent(ir->name) == ir); 741 742 _mesa_set_add(ir_set, ir); 743 744 /* If a variable is an array, verify that the maximum array index is in 745 * bounds. There was once an error in AST-to-HIR conversion that set this 746 * to be out of bounds. 747 */ 748 if (ir->type->array_size() > 0) { 749 if (ir->data.max_array_access >= (int)ir->type->length) { 750 printf("ir_variable has maximum access out of bounds (%d vs %d)\n", 751 ir->data.max_array_access, ir->type->length - 1); 752 ir->print(); 753 abort(); 754 } 755 } 756 757 /* If a variable is an interface block (or an array of interface blocks), 758 * verify that the maximum array index for each interface member is in 759 * bounds. 760 */ 761 if (ir->is_interface_instance()) { 762 const glsl_struct_field *fields = 763 ir->get_interface_type()->fields.structure; 764 for (unsigned i = 0; i < ir->get_interface_type()->length; i++) { 765 if (fields[i].type->array_size() > 0 && 766 !fields[i].implicit_sized_array) { 767 const int *const max_ifc_array_access = 768 ir->get_max_ifc_array_access(); 769 770 assert(max_ifc_array_access != NULL); 771 772 if (max_ifc_array_access[i] >= (int)fields[i].type->length) { 773 printf("ir_variable has maximum access out of bounds for " 774 "field %s (%d vs %d)\n", fields[i].name, 775 max_ifc_array_access[i], fields[i].type->length); 776 ir->print(); 777 abort(); 778 } 779 } 780 } 781 } 782 783 if (ir->constant_initializer != NULL && !ir->data.has_initializer) { 784 printf("ir_variable didn't have an initializer, but has a constant " 785 "initializer value.\n"); 786 ir->print(); 787 abort(); 788 } 789 790 if (ir->data.mode == ir_var_uniform 791 && is_gl_identifier(ir->name) 792 && ir->get_state_slots() == NULL) { 793 printf("built-in uniform has no state\n"); 794 ir->print(); 795 abort(); 796 } 797 798 return visit_continue; 799 } 800 801 ir_visitor_status 802 ir_validate::visit_enter(ir_assignment *ir) 803 { 804 const ir_dereference *const lhs = ir->lhs; 805 if (lhs->type->is_scalar() || lhs->type->is_vector()) { 806 if (ir->write_mask == 0) { 807 printf("Assignment LHS is %s, but write mask is 0:\n", 808 lhs->type->is_scalar() ? "scalar" : "vector"); 809 ir->print(); 810 abort(); 811 } 812 813 int lhs_components = 0; 814 for (int i = 0; i < 4; i++) { 815 if (ir->write_mask & (1 << i)) 816 lhs_components++; 817 } 818 819 if (lhs_components != ir->rhs->type->vector_elements) { 820 printf("Assignment count of LHS write mask channels enabled not\n" 821 "matching RHS vector size (%d LHS, %d RHS).\n", 822 lhs_components, ir->rhs->type->vector_elements); 823 ir->print(); 824 abort(); 825 } 826 } 827 828 this->validate_ir(ir, this->data_enter); 829 830 return visit_continue; 831 } 832 833 ir_visitor_status 834 ir_validate::visit_enter(ir_call *ir) 835 { 836 ir_function_signature *const callee = ir->callee; 837 838 if (callee->ir_type != ir_type_function_signature) { 839 printf("IR called by ir_call is not ir_function_signature!\n"); 840 abort(); 841 } 842 843 if (ir->return_deref) { 844 if (ir->return_deref->type != callee->return_type) { 845 printf("callee type %s does not match return storage type %s\n", 846 callee->return_type->name, ir->return_deref->type->name); 847 abort(); 848 } 849 } else if (callee->return_type != glsl_type::void_type) { 850 printf("ir_call has non-void callee but no return storage\n"); 851 abort(); 852 } 853 854 const exec_node *formal_param_node = callee->parameters.get_head_raw(); 855 const exec_node *actual_param_node = ir->actual_parameters.get_head_raw(); 856 while (true) { 857 if (formal_param_node->is_tail_sentinel() 858 != actual_param_node->is_tail_sentinel()) { 859 printf("ir_call has the wrong number of parameters:\n"); 860 goto dump_ir; 861 } 862 if (formal_param_node->is_tail_sentinel()) { 863 break; 864 } 865 const ir_variable *formal_param 866 = (const ir_variable *) formal_param_node; 867 const ir_rvalue *actual_param 868 = (const ir_rvalue *) actual_param_node; 869 if (formal_param->type != actual_param->type) { 870 printf("ir_call parameter type mismatch:\n"); 871 goto dump_ir; 872 } 873 if (formal_param->data.mode == ir_var_function_out 874 || formal_param->data.mode == ir_var_function_inout) { 875 if (!actual_param->is_lvalue()) { 876 printf("ir_call out/inout parameters must be lvalues:\n"); 877 goto dump_ir; 878 } 879 } 880 formal_param_node = formal_param_node->next; 881 actual_param_node = actual_param_node->next; 882 } 883 884 return visit_continue; 885 886 dump_ir: 887 ir->print(); 888 printf("callee:\n"); 889 callee->print(); 890 abort(); 891 return visit_stop; 892 } 893 894 void 895 ir_validate::validate_ir(ir_instruction *ir, void *data) 896 { 897 struct set *ir_set = (struct set *) data; 898 899 if (_mesa_set_search(ir_set, ir)) { 900 printf("Instruction node present twice in ir tree:\n"); 901 ir->print(); 902 printf("\n"); 903 abort(); 904 } 905 _mesa_set_add(ir_set, ir); 906 } 907 908 void 909 check_node_type(ir_instruction *ir, void *data) 910 { 911 (void) data; 912 913 if (ir->ir_type >= ir_type_max) { 914 printf("Instruction node with unset type\n"); 915 ir->print(); printf("\n"); 916 } 917 ir_rvalue *value = ir->as_rvalue(); 918 if (value != NULL) 919 assert(value->type != glsl_type::error_type); 920 } 921 922 void 923 validate_ir_tree(exec_list *instructions) 924 { 925 /* We shouldn't have any reason to validate IR in a release build, 926 * and it's half composed of assert()s anyway which wouldn't do 927 * anything. 928 */ 929 #ifdef DEBUG 930 ir_validate v; 931 932 v.run(instructions); 933 934 foreach_in_list(ir_instruction, ir, instructions) { 935 visit_tree(ir, check_node_type, NULL); 936 } 937 #endif 938 } 939