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 #include <string.h>
     24 #include "main/core.h" /* for MAX2 */
     25 #include "ir.h"
     26 #include "ir_visitor.h"
     27 #include "glsl_types.h"
     28 
     29 ir_rvalue::ir_rvalue()
     30 {
     31    this->type = glsl_type::error_type;
     32 }
     33 
     34 bool ir_rvalue::is_zero() const
     35 {
     36    return false;
     37 }
     38 
     39 bool ir_rvalue::is_one() const
     40 {
     41    return false;
     42 }
     43 
     44 bool ir_rvalue::is_negative_one() const
     45 {
     46    return false;
     47 }
     48 
     49 /**
     50  * Modify the swizzle make to move one component to another
     51  *
     52  * \param m    IR swizzle to be modified
     53  * \param from Component in the RHS that is to be swizzled
     54  * \param to   Desired swizzle location of \c from
     55  */
     56 static void
     57 update_rhs_swizzle(ir_swizzle_mask &m, unsigned from, unsigned to)
     58 {
     59    switch (to) {
     60    case 0: m.x = from; break;
     61    case 1: m.y = from; break;
     62    case 2: m.z = from; break;
     63    case 3: m.w = from; break;
     64    default: assert(!"Should not get here.");
     65    }
     66 
     67    m.num_components = MAX2(m.num_components, (to + 1));
     68 }
     69 
     70 void
     71 ir_assignment::set_lhs(ir_rvalue *lhs)
     72 {
     73    void *mem_ctx = this;
     74    bool swizzled = false;
     75 
     76    while (lhs != NULL) {
     77       ir_swizzle *swiz = lhs->as_swizzle();
     78 
     79       if (swiz == NULL)
     80 	 break;
     81 
     82       unsigned write_mask = 0;
     83       ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
     84 
     85       for (unsigned i = 0; i < swiz->mask.num_components; i++) {
     86 	 unsigned c = 0;
     87 
     88 	 switch (i) {
     89 	 case 0: c = swiz->mask.x; break;
     90 	 case 1: c = swiz->mask.y; break;
     91 	 case 2: c = swiz->mask.z; break;
     92 	 case 3: c = swiz->mask.w; break;
     93 	 default: assert(!"Should not get here.");
     94 	 }
     95 
     96 	 write_mask |= (((this->write_mask >> i) & 1) << c);
     97 	 update_rhs_swizzle(rhs_swiz, i, c);
     98       }
     99 
    100       this->write_mask = write_mask;
    101       lhs = swiz->val;
    102 
    103       this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
    104       swizzled = true;
    105    }
    106 
    107    if (swizzled) {
    108       /* Now, RHS channels line up with the LHS writemask.  Collapse it
    109        * to just the channels that will be written.
    110        */
    111       ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
    112       int rhs_chan = 0;
    113       for (int i = 0; i < 4; i++) {
    114 	 if (write_mask & (1 << i))
    115 	    update_rhs_swizzle(rhs_swiz, i, rhs_chan++);
    116       }
    117       this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
    118    }
    119 
    120    assert((lhs == NULL) || lhs->as_dereference());
    121 
    122    this->lhs = (ir_dereference *) lhs;
    123 }
    124 
    125 ir_variable *
    126 ir_assignment::whole_variable_written()
    127 {
    128    ir_variable *v = this->lhs->whole_variable_referenced();
    129 
    130    if (v == NULL)
    131       return NULL;
    132 
    133    if (v->type->is_scalar())
    134       return v;
    135 
    136    if (v->type->is_vector()) {
    137       const unsigned mask = (1U << v->type->vector_elements) - 1;
    138 
    139       if (mask != this->write_mask)
    140 	 return NULL;
    141    }
    142 
    143    /* Either all the vector components are assigned or the variable is some
    144     * composite type (and the whole thing is assigned.
    145     */
    146    return v;
    147 }
    148 
    149 ir_assignment::ir_assignment(ir_dereference *lhs, ir_rvalue *rhs,
    150 			     ir_rvalue *condition, unsigned write_mask)
    151 {
    152    this->ir_type = ir_type_assignment;
    153    this->condition = condition;
    154    this->rhs = rhs;
    155    this->lhs = lhs;
    156    this->write_mask = write_mask;
    157 
    158    if (lhs->type->is_scalar() || lhs->type->is_vector()) {
    159       int lhs_components = 0;
    160       for (int i = 0; i < 4; i++) {
    161 	 if (write_mask & (1 << i))
    162 	    lhs_components++;
    163       }
    164 
    165       assert(lhs_components == this->rhs->type->vector_elements);
    166    }
    167 }
    168 
    169 ir_assignment::ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs,
    170 			     ir_rvalue *condition)
    171 {
    172    this->ir_type = ir_type_assignment;
    173    this->condition = condition;
    174    this->rhs = rhs;
    175 
    176    /* If the RHS is a vector type, assume that all components of the vector
    177     * type are being written to the LHS.  The write mask comes from the RHS
    178     * because we can have a case where the LHS is a vec4 and the RHS is a
    179     * vec3.  In that case, the assignment is:
    180     *
    181     *     (assign (...) (xyz) (var_ref lhs) (var_ref rhs))
    182     */
    183    if (rhs->type->is_vector())
    184       this->write_mask = (1U << rhs->type->vector_elements) - 1;
    185    else if (rhs->type->is_scalar())
    186       this->write_mask = 1;
    187    else // TODO: write masking for matrix
    188       this->write_mask = 0;
    189 
    190    this->set_lhs(lhs);
    191 }
    192 
    193 
    194 ir_expression::ir_expression(int op, const struct glsl_type *type,
    195 			     ir_rvalue *op0)
    196 {
    197    assert(get_num_operands(ir_expression_operation(op)) == 1);
    198    this->ir_type = ir_type_expression;
    199    this->type = type;
    200    this->operation = ir_expression_operation(op);
    201    this->operands[0] = op0;
    202    this->operands[1] = NULL;
    203    this->operands[2] = NULL;
    204    this->operands[3] = NULL;
    205 }
    206 
    207 ir_expression::ir_expression(int op, const struct glsl_type *type,
    208 			     ir_rvalue *op0, ir_rvalue *op1)
    209 {
    210    assert(((op1 == NULL) && (get_num_operands(ir_expression_operation(op)) == 1))
    211 	  || (get_num_operands(ir_expression_operation(op)) == 2));
    212    this->ir_type = ir_type_expression;
    213    this->type = type;
    214    this->operation = ir_expression_operation(op);
    215    this->operands[0] = op0;
    216    this->operands[1] = op1;
    217    this->operands[2] = NULL;
    218    this->operands[3] = NULL;
    219 }
    220 
    221 ir_expression::ir_expression(int op, const struct glsl_type *type,
    222 			     ir_rvalue *op0, ir_rvalue *op1,
    223 			     ir_rvalue *op2, ir_rvalue *op3)
    224 {
    225    this->ir_type = ir_type_expression;
    226    this->type = type;
    227    this->operation = ir_expression_operation(op);
    228    this->operands[0] = op0;
    229    this->operands[1] = op1;
    230    this->operands[2] = op2;
    231    this->operands[3] = op3;
    232 }
    233 
    234 ir_expression::ir_expression(int op, ir_rvalue *op0)
    235 {
    236    this->ir_type = ir_type_expression;
    237 
    238    this->operation = ir_expression_operation(op);
    239    this->operands[0] = op0;
    240    this->operands[1] = NULL;
    241    this->operands[2] = NULL;
    242    this->operands[3] = NULL;
    243 
    244    assert(op <= ir_last_unop);
    245 
    246    switch (this->operation) {
    247    case ir_unop_bit_not:
    248    case ir_unop_logic_not:
    249    case ir_unop_neg:
    250    case ir_unop_abs:
    251    case ir_unop_sign:
    252    case ir_unop_rcp:
    253    case ir_unop_rsq:
    254    case ir_unop_sqrt:
    255    case ir_unop_exp:
    256    case ir_unop_log:
    257    case ir_unop_exp2:
    258    case ir_unop_log2:
    259    case ir_unop_trunc:
    260    case ir_unop_ceil:
    261    case ir_unop_floor:
    262    case ir_unop_fract:
    263    case ir_unop_round_even:
    264    case ir_unop_cos:
    265    case ir_unop_dFdx:
    266    case ir_unop_dFdy:
    267       this->type = op0->type;
    268       break;
    269 
    270    case ir_unop_any:
    271       this->type = glsl_type::bool_type;
    272       break;
    273 
    274    default:
    275       assert(!"not reached: missing automatic type setup for ir_expression");
    276       this->type = op0->type;
    277       break;
    278    }
    279 }
    280 
    281 ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1)
    282 {
    283    this->ir_type = ir_type_expression;
    284 
    285    this->operation = ir_expression_operation(op);
    286    this->operands[0] = op0;
    287    this->operands[1] = op1;
    288    this->operands[2] = NULL;
    289    this->operands[3] = NULL;
    290 
    291    assert(op > ir_last_unop);
    292 
    293    switch (this->operation) {
    294    case ir_binop_all_equal:
    295    case ir_binop_any_nequal:
    296       this->type = glsl_type::bool_type;
    297       break;
    298 
    299    case ir_binop_add:
    300    case ir_binop_sub:
    301    case ir_binop_min:
    302    case ir_binop_max:
    303    case ir_binop_pow:
    304    case ir_binop_mul:
    305       if (op0->type->is_scalar()) {
    306 	 this->type = op1->type;
    307       } else if (op1->type->is_scalar()) {
    308 	 this->type = op0->type;
    309       } else {
    310 	 /* FINISHME: matrix types */
    311 	 assert(!op0->type->is_matrix() && !op1->type->is_matrix());
    312 	 assert(op0->type == op1->type);
    313 	 this->type = op0->type;
    314       }
    315       break;
    316 
    317    case ir_binop_logic_and:
    318    case ir_binop_logic_or:
    319       if (op0->type->is_scalar()) {
    320 	 this->type = op1->type;
    321       } else if (op1->type->is_scalar()) {
    322 	 this->type = op0->type;
    323       }
    324       break;
    325 
    326    case ir_binop_dot:
    327       this->type = glsl_type::float_type;
    328       break;
    329 
    330    default:
    331       assert(!"not reached: missing automatic type setup for ir_expression");
    332       this->type = glsl_type::float_type;
    333    }
    334 }
    335 
    336 unsigned int
    337 ir_expression::get_num_operands(ir_expression_operation op)
    338 {
    339    assert(op <= ir_last_opcode);
    340 
    341    if (op <= ir_last_unop)
    342       return 1;
    343 
    344    if (op <= ir_last_binop)
    345       return 2;
    346 
    347    if (op == ir_quadop_vector)
    348       return 4;
    349 
    350    assert(false);
    351    return 0;
    352 }
    353 
    354 static const char *const operator_strs[] = {
    355    "~",
    356    "!",
    357    "neg",
    358    "abs",
    359    "sign",
    360    "rcp",
    361    "rsq",
    362    "sqrt",
    363    "exp",
    364    "log",
    365    "exp2",
    366    "log2",
    367    "f2i",
    368    "i2f",
    369    "f2b",
    370    "b2f",
    371    "i2b",
    372    "b2i",
    373    "u2f",
    374    "any",
    375    "trunc",
    376    "ceil",
    377    "floor",
    378    "fract",
    379    "round_even",
    380    "sin",
    381    "cos",
    382    "sin_reduced",
    383    "cos_reduced",
    384    "dFdx",
    385    "dFdy",
    386    "noise",
    387    "+",
    388    "-",
    389    "*",
    390    "/",
    391    "%",
    392    "<",
    393    ">",
    394    "<=",
    395    ">=",
    396    "==",
    397    "!=",
    398    "all_equal",
    399    "any_nequal",
    400    "<<",
    401    ">>",
    402    "&",
    403    "^",
    404    "|",
    405    "&&",
    406    "^^",
    407    "||",
    408    "dot",
    409    "min",
    410    "max",
    411    "pow",
    412    "vector",
    413 };
    414 
    415 const char *ir_expression::operator_string(ir_expression_operation op)
    416 {
    417    assert((unsigned int) op < Elements(operator_strs));
    418    assert(Elements(operator_strs) == (ir_quadop_vector + 1));
    419    return operator_strs[op];
    420 }
    421 
    422 const char *ir_expression::operator_string()
    423 {
    424    return operator_string(this->operation);
    425 }
    426 
    427 ir_expression_operation
    428 ir_expression::get_operator(const char *str)
    429 {
    430    const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]);
    431    for (int op = 0; op < operator_count; op++) {
    432       if (strcmp(str, operator_strs[op]) == 0)
    433 	 return (ir_expression_operation) op;
    434    }
    435    return (ir_expression_operation) -1;
    436 }
    437 
    438 ir_constant::ir_constant()
    439 {
    440    this->ir_type = ir_type_constant;
    441 }
    442 
    443 ir_constant::ir_constant(const struct glsl_type *type,
    444 			 const ir_constant_data *data)
    445 {
    446    assert((type->base_type >= GLSL_TYPE_UINT)
    447 	  && (type->base_type <= GLSL_TYPE_BOOL));
    448 
    449    this->ir_type = ir_type_constant;
    450    this->type = type;
    451    memcpy(& this->value, data, sizeof(this->value));
    452 }
    453 
    454 ir_constant::ir_constant(float f)
    455 {
    456    this->ir_type = ir_type_constant;
    457    this->type = glsl_type::float_type;
    458    this->value.f[0] = f;
    459    for (int i = 1; i < 16; i++)  {
    460       this->value.f[i] = 0;
    461    }
    462 }
    463 
    464 ir_constant::ir_constant(unsigned int u)
    465 {
    466    this->ir_type = ir_type_constant;
    467    this->type = glsl_type::uint_type;
    468    this->value.u[0] = u;
    469    for (int i = 1; i < 16; i++) {
    470       this->value.u[i] = 0;
    471    }
    472 }
    473 
    474 ir_constant::ir_constant(int i)
    475 {
    476    this->ir_type = ir_type_constant;
    477    this->type = glsl_type::int_type;
    478    this->value.i[0] = i;
    479    for (int i = 1; i < 16; i++) {
    480       this->value.i[i] = 0;
    481    }
    482 }
    483 
    484 ir_constant::ir_constant(bool b)
    485 {
    486    this->ir_type = ir_type_constant;
    487    this->type = glsl_type::bool_type;
    488    this->value.b[0] = b;
    489    for (int i = 1; i < 16; i++) {
    490       this->value.b[i] = false;
    491    }
    492 }
    493 
    494 ir_constant::ir_constant(const ir_constant *c, unsigned i)
    495 {
    496    this->ir_type = ir_type_constant;
    497    this->type = c->type->get_base_type();
    498 
    499    switch (this->type->base_type) {
    500    case GLSL_TYPE_UINT:  this->value.u[0] = c->value.u[i]; break;
    501    case GLSL_TYPE_INT:   this->value.i[0] = c->value.i[i]; break;
    502    case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
    503    case GLSL_TYPE_BOOL:  this->value.b[0] = c->value.b[i]; break;
    504    default:              assert(!"Should not get here."); break;
    505    }
    506 }
    507 
    508 ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
    509 {
    510    this->ir_type = ir_type_constant;
    511    this->type = type;
    512 
    513    assert(type->is_scalar() || type->is_vector() || type->is_matrix()
    514 	  || type->is_record() || type->is_array());
    515 
    516    if (type->is_array()) {
    517       this->array_elements = hieralloc_array(this, ir_constant *, type->length);
    518       unsigned i = 0;
    519       foreach_list(node, value_list) {
    520 	 ir_constant *value = (ir_constant *) node;
    521 	 assert(value->as_constant() != NULL);
    522 
    523 	 this->array_elements[i++] = value;
    524       }
    525       return;
    526    }
    527 
    528    /* If the constant is a record, the types of each of the entries in
    529     * value_list must be a 1-for-1 match with the structure components.  Each
    530     * entry must also be a constant.  Just move the nodes from the value_list
    531     * to the list in the ir_constant.
    532     */
    533    /* FINISHME: Should there be some type checking and / or assertions here? */
    534    /* FINISHME: Should the new constant take ownership of the nodes from
    535     * FINISHME: value_list, or should it make copies?
    536     */
    537    if (type->is_record()) {
    538       value_list->move_nodes_to(& this->components);
    539       return;
    540    }
    541 
    542    for (unsigned i = 0; i < 16; i++) {
    543       this->value.u[i] = 0;
    544    }
    545 
    546    ir_constant *value = (ir_constant *) (value_list->head);
    547 
    548    /* Constructors with exactly one scalar argument are special for vectors
    549     * and matrices.  For vectors, the scalar value is replicated to fill all
    550     * the components.  For matrices, the scalar fills the components of the
    551     * diagonal while the rest is filled with 0.
    552     */
    553    if (value->type->is_scalar() && value->next->is_tail_sentinel()) {
    554       if (type->is_matrix()) {
    555 	 /* Matrix - fill diagonal (rest is already set to 0) */
    556 	 assert(type->base_type == GLSL_TYPE_FLOAT);
    557 	 for (unsigned i = 0; i < type->matrix_columns; i++)
    558 	    this->value.f[i * type->vector_elements + i] = value->value.f[0];
    559       } else {
    560 	 /* Vector or scalar - fill all components */
    561 	 switch (type->base_type) {
    562 	 case GLSL_TYPE_UINT:
    563 	 case GLSL_TYPE_INT:
    564 	    for (unsigned i = 0; i < type->components(); i++)
    565 	       this->value.u[i] = value->value.u[0];
    566 	    break;
    567 	 case GLSL_TYPE_FLOAT:
    568 	    for (unsigned i = 0; i < type->components(); i++)
    569 	       this->value.f[i] = value->value.f[0];
    570 	    break;
    571 	 case GLSL_TYPE_BOOL:
    572 	    for (unsigned i = 0; i < type->components(); i++)
    573 	       this->value.b[i] = value->value.b[0];
    574 	    break;
    575 	 default:
    576 	    assert(!"Should not get here.");
    577 	    break;
    578 	 }
    579       }
    580       return;
    581    }
    582 
    583    if (type->is_matrix() && value->type->is_matrix()) {
    584       assert(value->next->is_tail_sentinel());
    585 
    586       /* From section 5.4.2 of the GLSL 1.20 spec:
    587        * "If a matrix is constructed from a matrix, then each component
    588        *  (column i, row j) in the result that has a corresponding component
    589        *  (column i, row j) in the argument will be initialized from there."
    590        */
    591       unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns);
    592       unsigned rows = MIN2(type->vector_elements, value->type->vector_elements);
    593       for (unsigned i = 0; i < cols; i++) {
    594 	 for (unsigned j = 0; j < rows; j++) {
    595 	    const unsigned src = i * value->type->vector_elements + j;
    596 	    const unsigned dst = i * type->vector_elements + j;
    597 	    this->value.f[dst] = value->value.f[src];
    598 	 }
    599       }
    600 
    601       /* "All other components will be initialized to the identity matrix." */
    602       for (unsigned i = cols; i < type->matrix_columns; i++)
    603 	 this->value.f[i * type->vector_elements + i] = 1.0;
    604 
    605       return;
    606    }
    607 
    608    /* Use each component from each entry in the value_list to initialize one
    609     * component of the constant being constructed.
    610     */
    611    for (unsigned i = 0; i < type->components(); /* empty */) {
    612       assert(value->as_constant() != NULL);
    613       assert(!value->is_tail_sentinel());
    614 
    615       for (unsigned j = 0; j < value->type->components(); j++) {
    616 	 switch (type->base_type) {
    617 	 case GLSL_TYPE_UINT:
    618 	    this->value.u[i] = value->get_uint_component(j);
    619 	    break;
    620 	 case GLSL_TYPE_INT:
    621 	    this->value.i[i] = value->get_int_component(j);
    622 	    break;
    623 	 case GLSL_TYPE_FLOAT:
    624 	    this->value.f[i] = value->get_float_component(j);
    625 	    break;
    626 	 case GLSL_TYPE_BOOL:
    627 	    this->value.b[i] = value->get_bool_component(j);
    628 	    break;
    629 	 default:
    630 	    /* FINISHME: What to do?  Exceptions are not the answer.
    631 	     */
    632 	    break;
    633 	 }
    634 
    635 	 i++;
    636 	 if (i >= type->components())
    637 	    break;
    638       }
    639 
    640       value = (ir_constant *) value->next;
    641    }
    642 }
    643 
    644 ir_constant *
    645 ir_constant::zero(void *mem_ctx, const glsl_type *type)
    646 {
    647    assert(type->is_numeric() || type->is_boolean());
    648 
    649    ir_constant *c = new(mem_ctx) ir_constant;
    650    c->type = type;
    651    memset(&c->value, 0, sizeof(c->value));
    652 
    653    return c;
    654 }
    655 
    656 bool
    657 ir_constant::get_bool_component(unsigned i) const
    658 {
    659    switch (this->type->base_type) {
    660    case GLSL_TYPE_UINT:  return this->value.u[i] != 0;
    661    case GLSL_TYPE_INT:   return this->value.i[i] != 0;
    662    case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
    663    case GLSL_TYPE_BOOL:  return this->value.b[i];
    664    default:              assert(!"Should not get here."); break;
    665    }
    666 
    667    /* Must return something to make the compiler happy.  This is clearly an
    668     * error case.
    669     */
    670    return false;
    671 }
    672 
    673 float
    674 ir_constant::get_float_component(unsigned i) const
    675 {
    676    switch (this->type->base_type) {
    677    case GLSL_TYPE_UINT:  return (float) this->value.u[i];
    678    case GLSL_TYPE_INT:   return (float) this->value.i[i];
    679    case GLSL_TYPE_FLOAT: return this->value.f[i];
    680    case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1.0 : 0.0;
    681    default:              assert(!"Should not get here."); break;
    682    }
    683 
    684    /* Must return something to make the compiler happy.  This is clearly an
    685     * error case.
    686     */
    687    return 0.0;
    688 }
    689 
    690 int
    691 ir_constant::get_int_component(unsigned i) const
    692 {
    693    switch (this->type->base_type) {
    694    case GLSL_TYPE_UINT:  return this->value.u[i];
    695    case GLSL_TYPE_INT:   return this->value.i[i];
    696    case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
    697    case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1 : 0;
    698    default:              assert(!"Should not get here."); break;
    699    }
    700 
    701    /* Must return something to make the compiler happy.  This is clearly an
    702     * error case.
    703     */
    704    return 0;
    705 }
    706 
    707 unsigned
    708 ir_constant::get_uint_component(unsigned i) const
    709 {
    710    switch (this->type->base_type) {
    711    case GLSL_TYPE_UINT:  return this->value.u[i];
    712    case GLSL_TYPE_INT:   return this->value.i[i];
    713    case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
    714    case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1 : 0;
    715    default:              assert(!"Should not get here."); break;
    716    }
    717 
    718    /* Must return something to make the compiler happy.  This is clearly an
    719     * error case.
    720     */
    721    return 0;
    722 }
    723 
    724 ir_constant *
    725 ir_constant::get_array_element(unsigned i) const
    726 {
    727    assert(this->type->is_array());
    728 
    729    /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
    730     *
    731     *     "Behavior is undefined if a shader subscripts an array with an index
    732     *     less than 0 or greater than or equal to the size the array was
    733     *     declared with."
    734     *
    735     * Most out-of-bounds accesses are removed before things could get this far.
    736     * There are cases where non-constant array index values can get constant
    737     * folded.
    738     */
    739    if (int(i) < 0)
    740       i = 0;
    741    else if (i >= this->type->length)
    742       i = this->type->length - 1;
    743 
    744    return array_elements[i];
    745 }
    746 
    747 ir_constant *
    748 ir_constant::get_record_field(const char *name)
    749 {
    750    int idx = this->type->field_index(name);
    751 
    752    if (idx < 0)
    753       return NULL;
    754 
    755    if (this->components.is_empty())
    756       return NULL;
    757 
    758    exec_node *node = this->components.head;
    759    for (int i = 0; i < idx; i++) {
    760       node = node->next;
    761 
    762       /* If the end of the list is encountered before the element matching the
    763        * requested field is found, return NULL.
    764        */
    765       if (node->is_tail_sentinel())
    766 	 return NULL;
    767    }
    768 
    769    return (ir_constant *) node;
    770 }
    771 
    772 
    773 bool
    774 ir_constant::has_value(const ir_constant *c) const
    775 {
    776    if (this->type != c->type)
    777       return false;
    778 
    779    if (this->type->is_array()) {
    780       for (unsigned i = 0; i < this->type->length; i++) {
    781 	 if (!this->array_elements[i]->has_value(c->array_elements[i]))
    782 	    return false;
    783       }
    784       return true;
    785    }
    786 
    787    if (this->type->base_type == GLSL_TYPE_STRUCT) {
    788       const exec_node *a_node = this->components.head;
    789       const exec_node *b_node = c->components.head;
    790 
    791       while (!a_node->is_tail_sentinel()) {
    792 	 assert(!b_node->is_tail_sentinel());
    793 
    794 	 const ir_constant *const a_field = (ir_constant *) a_node;
    795 	 const ir_constant *const b_field = (ir_constant *) b_node;
    796 
    797 	 if (!a_field->has_value(b_field))
    798 	    return false;
    799 
    800 	 a_node = a_node->next;
    801 	 b_node = b_node->next;
    802       }
    803 
    804       return true;
    805    }
    806 
    807    for (unsigned i = 0; i < this->type->components(); i++) {
    808       switch (this->type->base_type) {
    809       case GLSL_TYPE_UINT:
    810 	 if (this->value.u[i] != c->value.u[i])
    811 	    return false;
    812 	 break;
    813       case GLSL_TYPE_INT:
    814 	 if (this->value.i[i] != c->value.i[i])
    815 	    return false;
    816 	 break;
    817       case GLSL_TYPE_FLOAT:
    818 	 if (this->value.f[i] != c->value.f[i])
    819 	    return false;
    820 	 break;
    821       case GLSL_TYPE_BOOL:
    822 	 if (this->value.b[i] != c->value.b[i])
    823 	    return false;
    824 	 break;
    825       default:
    826 	 assert(!"Should not get here.");
    827 	 return false;
    828       }
    829    }
    830 
    831    return true;
    832 }
    833 
    834 bool
    835 ir_constant::is_zero() const
    836 {
    837    if (!this->type->is_scalar() && !this->type->is_vector())
    838       return false;
    839 
    840    for (unsigned c = 0; c < this->type->vector_elements; c++) {
    841       switch (this->type->base_type) {
    842       case GLSL_TYPE_FLOAT:
    843 	 if (this->value.f[c] != 0.0)
    844 	    return false;
    845 	 break;
    846       case GLSL_TYPE_INT:
    847 	 if (this->value.i[c] != 0)
    848 	    return false;
    849 	 break;
    850       case GLSL_TYPE_UINT:
    851 	 if (this->value.u[c] != 0)
    852 	    return false;
    853 	 break;
    854       case GLSL_TYPE_BOOL:
    855 	 if (this->value.b[c] != false)
    856 	    return false;
    857 	 break;
    858       default:
    859 	 /* The only other base types are structures, arrays, and samplers.
    860 	  * Samplers cannot be constants, and the others should have been
    861 	  * filtered out above.
    862 	  */
    863 	 assert(!"Should not get here.");
    864 	 return false;
    865       }
    866    }
    867 
    868    return true;
    869 }
    870 
    871 bool
    872 ir_constant::is_one() const
    873 {
    874    if (!this->type->is_scalar() && !this->type->is_vector())
    875       return false;
    876 
    877    for (unsigned c = 0; c < this->type->vector_elements; c++) {
    878       switch (this->type->base_type) {
    879       case GLSL_TYPE_FLOAT:
    880 	 if (this->value.f[c] != 1.0)
    881 	    return false;
    882 	 break;
    883       case GLSL_TYPE_INT:
    884 	 if (this->value.i[c] != 1)
    885 	    return false;
    886 	 break;
    887       case GLSL_TYPE_UINT:
    888 	 if (this->value.u[c] != 1)
    889 	    return false;
    890 	 break;
    891       case GLSL_TYPE_BOOL:
    892 	 if (this->value.b[c] != true)
    893 	    return false;
    894 	 break;
    895       default:
    896 	 /* The only other base types are structures, arrays, and samplers.
    897 	  * Samplers cannot be constants, and the others should have been
    898 	  * filtered out above.
    899 	  */
    900 	 assert(!"Should not get here.");
    901 	 return false;
    902       }
    903    }
    904 
    905    return true;
    906 }
    907 
    908 bool
    909 ir_constant::is_negative_one() const
    910 {
    911    if (!this->type->is_scalar() && !this->type->is_vector())
    912       return false;
    913 
    914    if (this->type->is_boolean())
    915       return false;
    916 
    917    for (unsigned c = 0; c < this->type->vector_elements; c++) {
    918       switch (this->type->base_type) {
    919       case GLSL_TYPE_FLOAT:
    920 	 if (this->value.f[c] != -1.0)
    921 	    return false;
    922 	 break;
    923       case GLSL_TYPE_INT:
    924 	 if (this->value.i[c] != -1)
    925 	    return false;
    926 	 break;
    927       case GLSL_TYPE_UINT:
    928 	 if (int(this->value.u[c]) != -1)
    929 	    return false;
    930 	 break;
    931       default:
    932 	 /* The only other base types are structures, arrays, samplers, and
    933 	  * booleans.  Samplers cannot be constants, and the others should
    934 	  * have been filtered out above.
    935 	  */
    936 	 assert(!"Should not get here.");
    937 	 return false;
    938       }
    939    }
    940 
    941    return true;
    942 }
    943 
    944 ir_loop::ir_loop()
    945 {
    946    this->ir_type = ir_type_loop;
    947    this->cmp = ir_unop_neg;
    948    this->from = NULL;
    949    this->to = NULL;
    950    this->increment = NULL;
    951    this->counter = NULL;
    952 }
    953 
    954 
    955 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
    956 {
    957    this->ir_type = ir_type_dereference_variable;
    958    this->var = var;
    959    this->type = (var != NULL) ? var->type : glsl_type::error_type;
    960 }
    961 
    962 
    963 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
    964 					   ir_rvalue *array_index)
    965 {
    966    this->ir_type = ir_type_dereference_array;
    967    this->array_index = array_index;
    968    this->set_array(value);
    969 }
    970 
    971 
    972 ir_dereference_array::ir_dereference_array(ir_variable *var,
    973 					   ir_rvalue *array_index)
    974 {
    975    void *ctx = hieralloc_parent(var);
    976 
    977    this->ir_type = ir_type_dereference_array;
    978    this->array_index = array_index;
    979    this->set_array(new(ctx) ir_dereference_variable(var));
    980 }
    981 
    982 
    983 void
    984 ir_dereference_array::set_array(ir_rvalue *value)
    985 {
    986    this->array = value;
    987    this->type = glsl_type::error_type;
    988 
    989    if (this->array != NULL) {
    990       const glsl_type *const vt = this->array->type;
    991 
    992       if (vt->is_array()) {
    993 	 type = vt->element_type();
    994       } else if (vt->is_matrix()) {
    995 	 type = vt->column_type();
    996       } else if (vt->is_vector()) {
    997 	 type = vt->get_base_type();
    998       }
    999    }
   1000 }
   1001 
   1002 
   1003 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
   1004 					     const char *field)
   1005 {
   1006    this->ir_type = ir_type_dereference_record;
   1007    this->record = value;
   1008    this->field = hieralloc_strdup(this, field);
   1009    this->type = (this->record != NULL)
   1010       ? this->record->type->field_type(field) : glsl_type::error_type;
   1011 }
   1012 
   1013 
   1014 ir_dereference_record::ir_dereference_record(ir_variable *var,
   1015 					     const char *field)
   1016 {
   1017    void *ctx = hieralloc_parent(var);
   1018 
   1019    this->ir_type = ir_type_dereference_record;
   1020    this->record = new(ctx) ir_dereference_variable(var);
   1021    this->field = hieralloc_strdup(this, field);
   1022    this->type = (this->record != NULL)
   1023       ? this->record->type->field_type(field) : glsl_type::error_type;
   1024 }
   1025 
   1026 bool type_contains_sampler(const glsl_type *type)
   1027 {
   1028    if (type->is_array()) {
   1029       return type_contains_sampler(type->fields.array);
   1030    } else if (type->is_record()) {
   1031       for (unsigned int i = 0; i < type->length; i++) {
   1032 	 if (type_contains_sampler(type->fields.structure[i].type))
   1033 	    return true;
   1034       }
   1035       return false;
   1036    } else {
   1037       return type->is_sampler();
   1038    }
   1039 }
   1040 
   1041 bool
   1042 ir_dereference::is_lvalue()
   1043 {
   1044    ir_variable *var = this->variable_referenced();
   1045 
   1046    /* Every l-value derference chain eventually ends in a variable.
   1047     */
   1048    if ((var == NULL) || var->read_only)
   1049       return false;
   1050 
   1051    if (this->type->is_array() && !var->array_lvalue)
   1052       return false;
   1053 
   1054    /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
   1055     *
   1056     *    "Samplers cannot be treated as l-values; hence cannot be used
   1057     *     as out or inout function parameters, nor can they be
   1058     *     assigned into."
   1059     */
   1060    if (type_contains_sampler(this->type))
   1061       return false;
   1062 
   1063    return true;
   1064 }
   1065 
   1066 
   1067 const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf" };
   1068 
   1069 const char *ir_texture::opcode_string()
   1070 {
   1071    assert((unsigned int) op <=
   1072 	  sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
   1073    return tex_opcode_strs[op];
   1074 }
   1075 
   1076 ir_texture_opcode
   1077 ir_texture::get_opcode(const char *str)
   1078 {
   1079    const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
   1080    for (int op = 0; op < count; op++) {
   1081       if (strcmp(str, tex_opcode_strs[op]) == 0)
   1082 	 return (ir_texture_opcode) op;
   1083    }
   1084    return (ir_texture_opcode) -1;
   1085 }
   1086 
   1087 
   1088 void
   1089 ir_texture::set_sampler(ir_dereference *sampler)
   1090 {
   1091    assert(sampler != NULL);
   1092    this->sampler = sampler;
   1093 
   1094    switch (sampler->type->sampler_type) {
   1095    case GLSL_TYPE_FLOAT:
   1096       this->type = glsl_type::vec4_type;
   1097       break;
   1098    case GLSL_TYPE_INT:
   1099       this->type = glsl_type::ivec4_type;
   1100       break;
   1101    case GLSL_TYPE_UINT:
   1102       this->type = glsl_type::uvec4_type;
   1103       break;
   1104    }
   1105 }
   1106 
   1107 
   1108 void
   1109 ir_swizzle::init_mask(const unsigned *comp, unsigned count)
   1110 {
   1111    assert((count >= 1) && (count <= 4));
   1112 
   1113    memset(&this->mask, 0, sizeof(this->mask));
   1114    this->mask.num_components = count;
   1115 
   1116    unsigned dup_mask = 0;
   1117    switch (count) {
   1118    case 4:
   1119       assert(comp[3] <= 3);
   1120       dup_mask |= (1U << comp[3])
   1121 	 & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
   1122       this->mask.w = comp[3];
   1123 
   1124    case 3:
   1125       assert(comp[2] <= 3);
   1126       dup_mask |= (1U << comp[2])
   1127 	 & ((1U << comp[0]) | (1U << comp[1]));
   1128       this->mask.z = comp[2];
   1129 
   1130    case 2:
   1131       assert(comp[1] <= 3);
   1132       dup_mask |= (1U << comp[1])
   1133 	 & ((1U << comp[0]));
   1134       this->mask.y = comp[1];
   1135 
   1136    case 1:
   1137       assert(comp[0] <= 3);
   1138       this->mask.x = comp[0];
   1139    }
   1140 
   1141    this->mask.has_duplicates = dup_mask != 0;
   1142 
   1143    /* Based on the number of elements in the swizzle and the base type
   1144     * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
   1145     * generate the type of the resulting value.
   1146     */
   1147    type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
   1148 }
   1149 
   1150 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
   1151 		       unsigned w, unsigned count)
   1152    : val(val)
   1153 {
   1154    const unsigned components[4] = { x, y, z, w };
   1155    this->ir_type = ir_type_swizzle;
   1156    this->init_mask(components, count);
   1157 }
   1158 
   1159 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
   1160 		       unsigned count)
   1161    : val(val)
   1162 {
   1163    this->ir_type = ir_type_swizzle;
   1164    this->init_mask(comp, count);
   1165 }
   1166 
   1167 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
   1168 {
   1169    this->ir_type = ir_type_swizzle;
   1170    this->val = val;
   1171    this->mask = mask;
   1172    this->type = glsl_type::get_instance(val->type->base_type,
   1173 					mask.num_components, 1);
   1174 }
   1175 
   1176 #define X 1
   1177 #define R 5
   1178 #define S 9
   1179 #define I 13
   1180 
   1181 ir_swizzle *
   1182 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
   1183 {
   1184    void *ctx = hieralloc_parent(val);
   1185 
   1186    /* For each possible swizzle character, this table encodes the value in
   1187     * \c idx_map that represents the 0th element of the vector.  For invalid
   1188     * swizzle characters (e.g., 'k'), a special value is used that will allow
   1189     * detection of errors.
   1190     */
   1191    static const unsigned char base_idx[26] = {
   1192    /* a  b  c  d  e  f  g  h  i  j  k  l  m */
   1193       R, R, I, I, I, I, R, I, I, I, I, I, I,
   1194    /* n  o  p  q  r  s  t  u  v  w  x  y  z */
   1195       I, I, S, S, R, S, S, I, I, X, X, X, X
   1196    };
   1197 
   1198    /* Each valid swizzle character has an entry in the previous table.  This
   1199     * table encodes the base index encoded in the previous table plus the actual
   1200     * index of the swizzle character.  When processing swizzles, the first
   1201     * character in the string is indexed in the previous table.  Each character
   1202     * in the string is indexed in this table, and the value found there has the
   1203     * value form the first table subtracted.  The result must be on the range
   1204     * [0,3].
   1205     *
   1206     * For example, the string "wzyx" will get X from the first table.  Each of
   1207     * the charcaters will get X+3, X+2, X+1, and X+0 from this table.  After
   1208     * subtraction, the swizzle values are { 3, 2, 1, 0 }.
   1209     *
   1210     * The string "wzrg" will get X from the first table.  Each of the characters
   1211     * will get X+3, X+2, R+0, and R+1 from this table.  After subtraction, the
   1212     * swizzle values are { 3, 2, 4, 5 }.  Since 4 and 5 are outside the range
   1213     * [0,3], the error is detected.
   1214     */
   1215    static const unsigned char idx_map[26] = {
   1216    /* a    b    c    d    e    f    g    h    i    j    k    l    m */
   1217       R+3, R+2, 0,   0,   0,   0,   R+1, 0,   0,   0,   0,   0,   0,
   1218    /* n    o    p    q    r    s    t    u    v    w    x    y    z */
   1219       0,   0,   S+2, S+3, R+0, S+0, S+1, 0,   0,   X+3, X+0, X+1, X+2
   1220    };
   1221 
   1222    int swiz_idx[4] = { 0, 0, 0, 0 };
   1223    unsigned i;
   1224 
   1225 
   1226    /* Validate the first character in the swizzle string and look up the base
   1227     * index value as described above.
   1228     */
   1229    if ((str[0] < 'a') || (str[0] > 'z'))
   1230       return NULL;
   1231 
   1232    const unsigned base = base_idx[str[0] - 'a'];
   1233 
   1234 
   1235    for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
   1236       /* Validate the next character, and, as described above, convert it to a
   1237        * swizzle index.
   1238        */
   1239       if ((str[i] < 'a') || (str[i] > 'z'))
   1240 	 return NULL;
   1241 
   1242       swiz_idx[i] = idx_map[str[i] - 'a'] - base;
   1243       if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
   1244 	 return NULL;
   1245    }
   1246 
   1247    if (str[i] != '\0')
   1248 	 return NULL;
   1249 
   1250    return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
   1251 			      swiz_idx[3], i);
   1252 }
   1253 
   1254 #undef X
   1255 #undef R
   1256 #undef S
   1257 #undef I
   1258 
   1259 ir_variable *
   1260 ir_swizzle::variable_referenced()
   1261 {
   1262    return this->val->variable_referenced();
   1263 }
   1264 
   1265 
   1266 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
   1267 			 ir_variable_mode mode)
   1268    : max_array_access(0), read_only(false), centroid(false), invariant(false),
   1269      mode(mode), interpolation(ir_var_smooth), array_lvalue(false)
   1270 {
   1271    this->ir_type = ir_type_variable;
   1272    this->type = type;
   1273    this->name = hieralloc_strdup(this, name);
   1274    this->explicit_location = false;
   1275    this->location = -1;
   1276    this->warn_extension = NULL;
   1277    this->constant_value = NULL;
   1278    this->origin_upper_left = false;
   1279    this->pixel_center_integer = false;
   1280 
   1281    if (type && type->base_type == GLSL_TYPE_SAMPLER)
   1282       this->read_only = true;
   1283 }
   1284 
   1285 
   1286 const char *
   1287 ir_variable::interpolation_string() const
   1288 {
   1289    switch (this->interpolation) {
   1290    case ir_var_smooth:        return "smooth";
   1291    case ir_var_flat:          return "flat";
   1292    case ir_var_noperspective: return "noperspective";
   1293    }
   1294 
   1295    assert(!"Should not get here.");
   1296    return "";
   1297 }
   1298 
   1299 
   1300 unsigned
   1301 ir_variable::component_slots() const
   1302 {
   1303    /* FINISHME: Sparsely accessed arrays require fewer slots. */
   1304    return this->type->component_slots();
   1305 }
   1306 
   1307 
   1308 ir_function_signature::ir_function_signature(const glsl_type *return_type)
   1309    : return_type(return_type), is_defined(false), _function(NULL)
   1310 {
   1311    this->ir_type = ir_type_function_signature;
   1312    this->is_builtin = false;
   1313 }
   1314 
   1315 
   1316 const char *
   1317 ir_function_signature::qualifiers_match(exec_list *params)
   1318 {
   1319    exec_list_iterator iter_a = parameters.iterator();
   1320    exec_list_iterator iter_b = params->iterator();
   1321 
   1322    /* check that the qualifiers match. */
   1323    while (iter_a.has_next()) {
   1324       ir_variable *a = (ir_variable *)iter_a.get();
   1325       ir_variable *b = (ir_variable *)iter_b.get();
   1326 
   1327       if (a->read_only != b->read_only ||
   1328 	  a->mode != b->mode ||
   1329 	  a->interpolation != b->interpolation ||
   1330 	  a->centroid != b->centroid) {
   1331 
   1332 	 /* parameter a's qualifiers don't match */
   1333 	 return a->name;
   1334       }
   1335 
   1336       iter_a.next();
   1337       iter_b.next();
   1338    }
   1339    return NULL;
   1340 }
   1341 
   1342 
   1343 void
   1344 ir_function_signature::replace_parameters(exec_list *new_params)
   1345 {
   1346    /* Destroy all of the previous parameter information.  If the previous
   1347     * parameter information comes from the function prototype, it may either
   1348     * specify incorrect parameter names or not have names at all.
   1349     */
   1350    foreach_iter(exec_list_iterator, iter, parameters) {
   1351       assert(((ir_instruction *) iter.get())->as_variable() != NULL);
   1352 
   1353       iter.remove();
   1354    }
   1355 
   1356    new_params->move_nodes_to(&parameters);
   1357 }
   1358 
   1359 
   1360 ir_function::ir_function(const char *name)
   1361 {
   1362    this->ir_type = ir_type_function;
   1363    this->name = hieralloc_strdup(this, name);
   1364 }
   1365 
   1366 
   1367 bool
   1368 ir_function::has_user_signature()
   1369 {
   1370    foreach_list(n, &this->signatures) {
   1371       ir_function_signature *const sig = (ir_function_signature *) n;
   1372       if (!sig->is_builtin)
   1373 	 return true;
   1374    }
   1375    return false;
   1376 }
   1377 
   1378 
   1379 ir_call *
   1380 ir_call::get_error_instruction(void *ctx)
   1381 {
   1382    ir_call *call = new(ctx) ir_call;
   1383 
   1384    call->type = glsl_type::error_type;
   1385    return call;
   1386 }
   1387 
   1388 void
   1389 ir_call::set_callee(ir_function_signature *sig)
   1390 {
   1391    assert((this->type == NULL) || (this->type == sig->return_type));
   1392 
   1393    this->callee = sig;
   1394 }
   1395 
   1396 void
   1397 visit_exec_list(exec_list *list, ir_visitor *visitor)
   1398 {
   1399    foreach_iter(exec_list_iterator, iter, *list) {
   1400       ((ir_instruction *)iter.get())->accept(visitor);
   1401    }
   1402 }
   1403 
   1404 
   1405 static void
   1406 steal_memory(ir_instruction *ir, void *new_ctx)
   1407 {
   1408    ir_variable *var = ir->as_variable();
   1409    ir_constant *constant = ir->as_constant();
   1410    if (var != NULL && var->constant_value != NULL)
   1411       steal_memory(var->constant_value, ir);
   1412 
   1413    /* The components of aggregate constants are not visited by the normal
   1414     * visitor, so steal their values by hand.
   1415     */
   1416    if (constant != NULL) {
   1417       if (constant->type->is_record()) {
   1418 	 foreach_iter(exec_list_iterator, iter, constant->components) {
   1419 	    ir_constant *field = (ir_constant *)iter.get();
   1420 	    steal_memory(field, ir);
   1421 	 }
   1422       } else if (constant->type->is_array()) {
   1423 	 for (unsigned int i = 0; i < constant->type->length; i++) {
   1424 	    steal_memory(constant->array_elements[i], ir);
   1425 	 }
   1426       }
   1427    }
   1428 
   1429    hieralloc_steal(new_ctx, ir);
   1430 }
   1431 
   1432 
   1433 void
   1434 reparent_ir(exec_list *list, void *mem_ctx)
   1435 {
   1436    foreach_list(node, list) {
   1437       visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
   1438    }
   1439 }
   1440 
   1441 
   1442 static ir_rvalue *
   1443 try_min_one(ir_rvalue *ir)
   1444 {
   1445    ir_expression *expr = ir->as_expression();
   1446 
   1447    if (!expr || expr->operation != ir_binop_min)
   1448       return NULL;
   1449 
   1450    if (expr->operands[0]->is_one())
   1451       return expr->operands[1];
   1452 
   1453    if (expr->operands[1]->is_one())
   1454       return expr->operands[0];
   1455 
   1456    return NULL;
   1457 }
   1458 
   1459 static ir_rvalue *
   1460 try_max_zero(ir_rvalue *ir)
   1461 {
   1462    ir_expression *expr = ir->as_expression();
   1463 
   1464    if (!expr || expr->operation != ir_binop_max)
   1465       return NULL;
   1466 
   1467    if (expr->operands[0]->is_zero())
   1468       return expr->operands[1];
   1469 
   1470    if (expr->operands[1]->is_zero())
   1471       return expr->operands[0];
   1472 
   1473    return NULL;
   1474 }
   1475 
   1476 ir_rvalue *
   1477 ir_rvalue::as_rvalue_to_saturate()
   1478 {
   1479    ir_expression *expr = this->as_expression();
   1480 
   1481    if (!expr)
   1482       return NULL;
   1483 
   1484    ir_rvalue *max_zero = try_max_zero(expr);
   1485    if (max_zero) {
   1486       return try_min_one(max_zero);
   1487    } else {
   1488       ir_rvalue *min_one = try_min_one(expr);
   1489       if (min_one) {
   1490 	 return try_max_zero(min_one);
   1491       }
   1492    }
   1493 
   1494    return NULL;
   1495 }
   1496