Home | History | Annotate | Download | only in glsl
      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 "program/hash_table.h"
     39 #include "glsl_types.h"
     40 
     41 class ir_validate : public ir_hierarchical_visitor {
     42 public:
     43    ir_validate()
     44    {
     45       this->ht = hash_table_ctor(0, hash_table_pointer_hash,
     46 				 hash_table_pointer_compare);
     47 
     48       this->current_function = NULL;
     49 
     50       this->callback = ir_validate::validate_ir;
     51       this->data = ht;
     52    }
     53 
     54    ~ir_validate()
     55    {
     56       hash_table_dtor(this->ht);
     57    }
     58 
     59    virtual ir_visitor_status visit(ir_variable *v);
     60    virtual ir_visitor_status visit(ir_dereference_variable *ir);
     61 
     62    virtual ir_visitor_status visit_enter(ir_if *ir);
     63 
     64    virtual ir_visitor_status visit_leave(ir_loop *ir);
     65    virtual ir_visitor_status visit_enter(ir_function *ir);
     66    virtual ir_visitor_status visit_leave(ir_function *ir);
     67    virtual ir_visitor_status visit_enter(ir_function_signature *ir);
     68 
     69    virtual ir_visitor_status visit_leave(ir_expression *ir);
     70    virtual ir_visitor_status visit_leave(ir_swizzle *ir);
     71 
     72    virtual ir_visitor_status visit_enter(ir_assignment *ir);
     73    virtual ir_visitor_status visit_enter(ir_call *ir);
     74 
     75    static void validate_ir(ir_instruction *ir, void *data);
     76 
     77    ir_function *current_function;
     78 
     79    struct hash_table *ht;
     80 };
     81 
     82 
     83 ir_visitor_status
     84 ir_validate::visit(ir_dereference_variable *ir)
     85 {
     86    if ((ir->var == NULL) || (ir->var->as_variable() == NULL)) {
     87       printf("ir_dereference_variable @ %p does not specify a variable %p\n",
     88 	     (void *) ir, (void *) ir->var);
     89       abort();
     90    }
     91 
     92    if (hash_table_find(ht, ir->var) == NULL) {
     93       printf("ir_dereference_variable @ %p specifies undeclared variable "
     94 	     "`%s' @ %p\n",
     95 	     (void *) ir, ir->var->name, (void *) ir->var);
     96       abort();
     97    }
     98 
     99    this->validate_ir(ir, this->data);
    100 
    101    return visit_continue;
    102 }
    103 
    104 ir_visitor_status
    105 ir_validate::visit_enter(ir_if *ir)
    106 {
    107    if (ir->condition->type != glsl_type::bool_type) {
    108       printf("ir_if condition %s type instead of bool.\n",
    109 	     ir->condition->type->name);
    110       ir->print();
    111       printf("\n");
    112       abort();
    113    }
    114 
    115    return visit_continue;
    116 }
    117 
    118 
    119 ir_visitor_status
    120 ir_validate::visit_leave(ir_loop *ir)
    121 {
    122    if (ir->counter != NULL) {
    123       if ((ir->from == NULL) || (ir->to == NULL) || (ir->increment == NULL)) {
    124 	 printf("ir_loop has invalid loop controls:\n"
    125 		"    counter:   %p\n"
    126 		"    from:      %p\n"
    127 		"    to:        %p\n"
    128 		"    increment: %p\n",
    129 		(void *) ir->counter, (void *) ir->from, (void *) ir->to,
    130                 (void *) ir->increment);
    131 	 abort();
    132       }
    133 
    134       if ((ir->cmp < ir_binop_less) || (ir->cmp > ir_binop_nequal)) {
    135 	 printf("ir_loop has invalid comparitor %d\n", ir->cmp);
    136 	 abort();
    137       }
    138    } else {
    139       if ((ir->from != NULL) || (ir->to != NULL) || (ir->increment != NULL)) {
    140 	 printf("ir_loop has invalid loop controls:\n"
    141 		"    counter:   %p\n"
    142 		"    from:      %p\n"
    143 		"    to:        %p\n"
    144 		"    increment: %p\n",
    145 		(void *) ir->counter, (void *) ir->from, (void *) ir->to,
    146                 (void *) ir->increment);
    147 	 abort();
    148       }
    149    }
    150 
    151    return visit_continue;
    152 }
    153 
    154 
    155 ir_visitor_status
    156 ir_validate::visit_enter(ir_function *ir)
    157 {
    158    /* Function definitions cannot be nested.
    159     */
    160    if (this->current_function != NULL) {
    161       printf("Function definition nested inside another function "
    162 	     "definition:\n");
    163       printf("%s %p inside %s %p\n",
    164 	     ir->name, (void *) ir,
    165 	     this->current_function->name, (void *) this->current_function);
    166       abort();
    167    }
    168 
    169    /* Store the current function hierarchy being traversed.  This is used
    170     * by the function signature visitor to ensure that the signatures are
    171     * linked with the correct functions.
    172     */
    173    this->current_function = ir;
    174 
    175    this->validate_ir(ir, this->data);
    176 
    177    /* Verify that all of the things stored in the list of signatures are,
    178     * in fact, function signatures.
    179     */
    180    foreach_list(node, &ir->signatures) {
    181       ir_instruction *sig = (ir_instruction *) node;
    182 
    183       if (sig->ir_type != ir_type_function_signature) {
    184 	 printf("Non-signature in signature list of function `%s'\n",
    185 		ir->name);
    186 	 abort();
    187       }
    188    }
    189 
    190    return visit_continue;
    191 }
    192 
    193 ir_visitor_status
    194 ir_validate::visit_leave(ir_function *ir)
    195 {
    196    assert(ralloc_parent(ir->name) == ir);
    197 
    198    this->current_function = NULL;
    199    return visit_continue;
    200 }
    201 
    202 ir_visitor_status
    203 ir_validate::visit_enter(ir_function_signature *ir)
    204 {
    205    if (this->current_function != ir->function()) {
    206       printf("Function signature nested inside wrong function "
    207 	     "definition:\n");
    208       printf("%p inside %s %p instead of %s %p\n",
    209 	     (void *) ir,
    210 	     this->current_function->name, (void *) this->current_function,
    211 	     ir->function_name(), (void *) ir->function());
    212       abort();
    213    }
    214 
    215    if (ir->return_type == NULL) {
    216       printf("Function signature %p for function %s has NULL return type.\n",
    217 	     (void *) ir, ir->function_name());
    218       abort();
    219    }
    220 
    221    this->validate_ir(ir, this->data);
    222 
    223    return visit_continue;
    224 }
    225 
    226 ir_visitor_status
    227 ir_validate::visit_leave(ir_expression *ir)
    228 {
    229    switch (ir->operation) {
    230    case ir_unop_bit_not:
    231       assert(ir->operands[0]->type == ir->type);
    232       break;
    233    case ir_unop_logic_not:
    234       assert(ir->type->base_type == GLSL_TYPE_BOOL);
    235       assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL);
    236       break;
    237 
    238    case ir_unop_neg:
    239    case ir_unop_abs:
    240    case ir_unop_sign:
    241    case ir_unop_rcp:
    242    case ir_unop_rsq:
    243    case ir_unop_sqrt:
    244       assert(ir->type == ir->operands[0]->type);
    245       break;
    246 
    247    case ir_unop_exp:
    248    case ir_unop_log:
    249    case ir_unop_exp2:
    250    case ir_unop_log2:
    251       assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
    252       assert(ir->type == ir->operands[0]->type);
    253       break;
    254 
    255    case ir_unop_f2i:
    256       assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
    257       assert(ir->type->base_type == GLSL_TYPE_INT);
    258       break;
    259    case ir_unop_f2u:
    260       assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
    261       assert(ir->type->base_type == GLSL_TYPE_UINT);
    262       break;
    263    case ir_unop_i2f:
    264       assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
    265       assert(ir->type->base_type == GLSL_TYPE_FLOAT);
    266       break;
    267    case ir_unop_f2b:
    268       assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
    269       assert(ir->type->base_type == GLSL_TYPE_BOOL);
    270       break;
    271    case ir_unop_b2f:
    272       assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL);
    273       assert(ir->type->base_type == GLSL_TYPE_FLOAT);
    274       break;
    275    case ir_unop_i2b:
    276       assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
    277       assert(ir->type->base_type == GLSL_TYPE_BOOL);
    278       break;
    279    case ir_unop_b2i:
    280       assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL);
    281       assert(ir->type->base_type == GLSL_TYPE_INT);
    282       break;
    283    case ir_unop_u2f:
    284       assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT);
    285       assert(ir->type->base_type == GLSL_TYPE_FLOAT);
    286       break;
    287    case ir_unop_i2u:
    288       assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
    289       assert(ir->type->base_type == GLSL_TYPE_UINT);
    290       break;
    291    case ir_unop_u2i:
    292       assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT);
    293       assert(ir->type->base_type == GLSL_TYPE_INT);
    294       break;
    295    case ir_unop_bitcast_i2f:
    296       assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
    297       assert(ir->type->base_type == GLSL_TYPE_FLOAT);
    298       break;
    299    case ir_unop_bitcast_f2i:
    300       assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
    301       assert(ir->type->base_type == GLSL_TYPE_INT);
    302       break;
    303    case ir_unop_bitcast_u2f:
    304       assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT);
    305       assert(ir->type->base_type == GLSL_TYPE_FLOAT);
    306       break;
    307    case ir_unop_bitcast_f2u:
    308       assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
    309       assert(ir->type->base_type == GLSL_TYPE_UINT);
    310       break;
    311 
    312    case ir_unop_any:
    313       assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL);
    314       assert(ir->type == glsl_type::bool_type);
    315       break;
    316 
    317    case ir_unop_trunc:
    318    case ir_unop_round_even:
    319    case ir_unop_ceil:
    320    case ir_unop_floor:
    321    case ir_unop_fract:
    322    case ir_unop_sin:
    323    case ir_unop_cos:
    324    case ir_unop_sin_reduced:
    325    case ir_unop_cos_reduced:
    326    case ir_unop_dFdx:
    327    case ir_unop_dFdy:
    328       assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
    329       assert(ir->operands[0]->type == ir->type);
    330       break;
    331 
    332    case ir_unop_noise:
    333       /* XXX what can we assert here? */
    334       break;
    335 
    336    case ir_binop_add:
    337    case ir_binop_sub:
    338    case ir_binop_mul:
    339    case ir_binop_div:
    340    case ir_binop_mod:
    341    case ir_binop_min:
    342    case ir_binop_max:
    343    case ir_binop_pow:
    344       if (ir->operands[0]->type->is_scalar())
    345 	 assert(ir->operands[1]->type == ir->type);
    346       else if (ir->operands[1]->type->is_scalar())
    347 	 assert(ir->operands[0]->type == ir->type);
    348       else if (ir->operands[0]->type->is_vector() &&
    349 	       ir->operands[1]->type->is_vector()) {
    350 	 assert(ir->operands[0]->type == ir->operands[1]->type);
    351 	 assert(ir->operands[0]->type == ir->type);
    352       }
    353       break;
    354 
    355    case ir_binop_less:
    356    case ir_binop_greater:
    357    case ir_binop_lequal:
    358    case ir_binop_gequal:
    359    case ir_binop_equal:
    360    case ir_binop_nequal:
    361       /* The semantics of the IR operators differ from the GLSL <, >, <=, >=,
    362        * ==, and != operators.  The IR operators perform a component-wise
    363        * comparison on scalar or vector types and return a boolean scalar or
    364        * vector type of the same size.
    365        */
    366       assert(ir->type->base_type == GLSL_TYPE_BOOL);
    367       assert(ir->operands[0]->type == ir->operands[1]->type);
    368       assert(ir->operands[0]->type->is_vector()
    369 	     || ir->operands[0]->type->is_scalar());
    370       assert(ir->operands[0]->type->vector_elements
    371 	     == ir->type->vector_elements);
    372       break;
    373 
    374    case ir_binop_all_equal:
    375    case ir_binop_any_nequal:
    376       /* GLSL == and != operate on scalars, vectors, matrices and arrays, and
    377        * return a scalar boolean.  The IR matches that.
    378        */
    379       assert(ir->type == glsl_type::bool_type);
    380       assert(ir->operands[0]->type == ir->operands[1]->type);
    381       break;
    382 
    383    case ir_binop_lshift:
    384    case ir_binop_rshift:
    385       assert(ir->operands[0]->type->is_integer() &&
    386              ir->operands[1]->type->is_integer());
    387       if (ir->operands[0]->type->is_scalar()) {
    388           assert(ir->operands[1]->type->is_scalar());
    389       }
    390       if (ir->operands[0]->type->is_vector() &&
    391           ir->operands[1]->type->is_vector()) {
    392           assert(ir->operands[0]->type->components() ==
    393                  ir->operands[1]->type->components());
    394       }
    395       assert(ir->type == ir->operands[0]->type);
    396       break;
    397 
    398    case ir_binop_bit_and:
    399    case ir_binop_bit_xor:
    400    case ir_binop_bit_or:
    401        assert(ir->operands[0]->type->base_type ==
    402               ir->operands[1]->type->base_type);
    403        assert(ir->type->is_integer());
    404        if (ir->operands[0]->type->is_vector() &&
    405            ir->operands[1]->type->is_vector()) {
    406            assert(ir->operands[0]->type->vector_elements ==
    407                   ir->operands[1]->type->vector_elements);
    408        }
    409        break;
    410 
    411    case ir_binop_logic_and:
    412    case ir_binop_logic_xor:
    413    case ir_binop_logic_or:
    414       assert(ir->type == glsl_type::bool_type);
    415       assert(ir->operands[0]->type == glsl_type::bool_type);
    416       assert(ir->operands[1]->type == glsl_type::bool_type);
    417       break;
    418 
    419    case ir_binop_dot:
    420       assert(ir->type == glsl_type::float_type);
    421       assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT);
    422       assert(ir->operands[0]->type->is_vector());
    423       assert(ir->operands[0]->type == ir->operands[1]->type);
    424       break;
    425 
    426    case ir_binop_ubo_load:
    427       assert(ir->operands[0]->as_constant());
    428       assert(ir->operands[0]->type == glsl_type::uint_type);
    429 
    430       assert(ir->operands[1]->type == glsl_type::uint_type);
    431       break;
    432 
    433    case ir_quadop_vector:
    434       /* The vector operator collects some number of scalars and generates a
    435        * vector from them.
    436        *
    437        *  - All of the operands must be scalar.
    438        *  - Number of operands must matche the size of the resulting vector.
    439        *  - Base type of the operands must match the base type of the result.
    440        */
    441       assert(ir->type->is_vector());
    442       switch (ir->type->vector_elements) {
    443       case 2:
    444 	 assert(ir->operands[0]->type->is_scalar());
    445 	 assert(ir->operands[0]->type->base_type == ir->type->base_type);
    446 	 assert(ir->operands[1]->type->is_scalar());
    447 	 assert(ir->operands[1]->type->base_type == ir->type->base_type);
    448 	 assert(ir->operands[2] == NULL);
    449 	 assert(ir->operands[3] == NULL);
    450 	 break;
    451       case 3:
    452 	 assert(ir->operands[0]->type->is_scalar());
    453 	 assert(ir->operands[0]->type->base_type == ir->type->base_type);
    454 	 assert(ir->operands[1]->type->is_scalar());
    455 	 assert(ir->operands[1]->type->base_type == ir->type->base_type);
    456 	 assert(ir->operands[2]->type->is_scalar());
    457 	 assert(ir->operands[2]->type->base_type == ir->type->base_type);
    458 	 assert(ir->operands[3] == NULL);
    459 	 break;
    460       case 4:
    461 	 assert(ir->operands[0]->type->is_scalar());
    462 	 assert(ir->operands[0]->type->base_type == ir->type->base_type);
    463 	 assert(ir->operands[1]->type->is_scalar());
    464 	 assert(ir->operands[1]->type->base_type == ir->type->base_type);
    465 	 assert(ir->operands[2]->type->is_scalar());
    466 	 assert(ir->operands[2]->type->base_type == ir->type->base_type);
    467 	 assert(ir->operands[3]->type->is_scalar());
    468 	 assert(ir->operands[3]->type->base_type == ir->type->base_type);
    469 	 break;
    470       default:
    471 	 /* The is_vector assertion above should prevent execution from ever
    472 	  * getting here.
    473 	  */
    474 	 assert(!"Should not get here.");
    475 	 break;
    476       }
    477    }
    478 
    479    return visit_continue;
    480 }
    481 
    482 ir_visitor_status
    483 ir_validate::visit_leave(ir_swizzle *ir)
    484 {
    485    unsigned int chans[4] = {ir->mask.x, ir->mask.y, ir->mask.z, ir->mask.w};
    486 
    487    for (unsigned int i = 0; i < ir->type->vector_elements; i++) {
    488       if (chans[i] >= ir->val->type->vector_elements) {
    489 	 printf("ir_swizzle @ %p specifies a channel not present "
    490 		"in the value.\n", (void *) ir);
    491 	 ir->print();
    492 	 abort();
    493       }
    494    }
    495 
    496    return visit_continue;
    497 }
    498 
    499 ir_visitor_status
    500 ir_validate::visit(ir_variable *ir)
    501 {
    502    /* An ir_variable is the one thing that can (and will) appear multiple times
    503     * in an IR tree.  It is added to the hashtable so that it can be used
    504     * in the ir_dereference_variable handler to ensure that a variable is
    505     * declared before it is dereferenced.
    506     */
    507    if (ir->name)
    508       assert(ralloc_parent(ir->name) == ir);
    509 
    510    hash_table_insert(ht, ir, ir);
    511 
    512 
    513    /* If a variable is an array, verify that the maximum array index is in
    514     * bounds.  There was once an error in AST-to-HIR conversion that set this
    515     * to be out of bounds.
    516     */
    517    if (ir->type->array_size() > 0) {
    518       if (ir->max_array_access >= ir->type->length) {
    519 	 printf("ir_variable has maximum access out of bounds (%d vs %d)\n",
    520 		ir->max_array_access, ir->type->length - 1);
    521 	 ir->print();
    522 	 abort();
    523       }
    524    }
    525 
    526    if (ir->constant_initializer != NULL && !ir->has_initializer) {
    527       printf("ir_variable didn't have an initializer, but has a constant "
    528 	     "initializer value.\n");
    529       ir->print();
    530       abort();
    531    }
    532 
    533    return visit_continue;
    534 }
    535 
    536 ir_visitor_status
    537 ir_validate::visit_enter(ir_assignment *ir)
    538 {
    539    const ir_dereference *const lhs = ir->lhs;
    540    if (lhs->type->is_scalar() || lhs->type->is_vector()) {
    541       if (ir->write_mask == 0) {
    542 	 printf("Assignment LHS is %s, but write mask is 0:\n",
    543 		lhs->type->is_scalar() ? "scalar" : "vector");
    544 	 ir->print();
    545 	 abort();
    546       }
    547 
    548       int lhs_components = 0;
    549       for (int i = 0; i < 4; i++) {
    550 	 if (ir->write_mask & (1 << i))
    551 	    lhs_components++;
    552       }
    553 
    554       if (lhs_components != ir->rhs->type->vector_elements) {
    555 	 printf("Assignment count of LHS write mask channels enabled not\n"
    556 		"matching RHS vector size (%d LHS, %d RHS).\n",
    557 		lhs_components, ir->rhs->type->vector_elements);
    558 	 ir->print();
    559 	 abort();
    560       }
    561    }
    562 
    563    this->validate_ir(ir, this->data);
    564 
    565    return visit_continue;
    566 }
    567 
    568 ir_visitor_status
    569 ir_validate::visit_enter(ir_call *ir)
    570 {
    571    ir_function_signature *const callee = ir->callee;
    572 
    573    if (callee->ir_type != ir_type_function_signature) {
    574       printf("IR called by ir_call is not ir_function_signature!\n");
    575       abort();
    576    }
    577 
    578    if (ir->return_deref) {
    579       if (ir->return_deref->type != callee->return_type) {
    580 	 printf("callee type %s does not match return storage type %s\n",
    581 	        callee->return_type->name, ir->return_deref->type->name);
    582 	 abort();
    583       }
    584    } else if (callee->return_type != glsl_type::void_type) {
    585       printf("ir_call has non-void callee but no return storage\n");
    586       abort();
    587    }
    588 
    589    const exec_node *formal_param_node = callee->parameters.head;
    590    const exec_node *actual_param_node = ir->actual_parameters.head;
    591    while (true) {
    592       if (formal_param_node->is_tail_sentinel()
    593           != actual_param_node->is_tail_sentinel()) {
    594          printf("ir_call has the wrong number of parameters:\n");
    595          goto dump_ir;
    596       }
    597       if (formal_param_node->is_tail_sentinel()) {
    598          break;
    599       }
    600       const ir_variable *formal_param
    601          = (const ir_variable *) formal_param_node;
    602       const ir_rvalue *actual_param
    603          = (const ir_rvalue *) actual_param_node;
    604       if (formal_param->type != actual_param->type) {
    605          printf("ir_call parameter type mismatch:\n");
    606          goto dump_ir;
    607       }
    608       if (formal_param->mode == ir_var_out
    609           || formal_param->mode == ir_var_inout) {
    610          if (!actual_param->is_lvalue()) {
    611             printf("ir_call out/inout parameters must be lvalues:\n");
    612             goto dump_ir;
    613          }
    614       }
    615       formal_param_node = formal_param_node->next;
    616       actual_param_node = actual_param_node->next;
    617    }
    618 
    619    return visit_continue;
    620 
    621 dump_ir:
    622    ir->print();
    623    printf("callee:\n");
    624    callee->print();
    625    abort();
    626    return visit_stop;
    627 }
    628 
    629 void
    630 ir_validate::validate_ir(ir_instruction *ir, void *data)
    631 {
    632    struct hash_table *ht = (struct hash_table *) data;
    633 
    634    if (hash_table_find(ht, ir)) {
    635       printf("Instruction node present twice in ir tree:\n");
    636       ir->print();
    637       printf("\n");
    638       abort();
    639    }
    640    hash_table_insert(ht, ir, ir);
    641 }
    642 
    643 void
    644 check_node_type(ir_instruction *ir, void *data)
    645 {
    646    (void) data;
    647 
    648    if (ir->ir_type <= ir_type_unset || ir->ir_type >= ir_type_max) {
    649       printf("Instruction node with unset type\n");
    650       ir->print(); printf("\n");
    651    }
    652    ir_rvalue *value = ir->as_rvalue();
    653    if (value != NULL)
    654       assert(value->type != glsl_type::error_type);
    655 }
    656 
    657 void
    658 validate_ir_tree(exec_list *instructions)
    659 {
    660    ir_validate v;
    661 
    662    v.run(instructions);
    663 
    664    foreach_iter(exec_list_iterator, iter, *instructions) {
    665       ir_instruction *ir = (ir_instruction *)iter.get();
    666 
    667       visit_tree(ir, check_node_type, NULL);
    668    }
    669 }
    670