Home | History | Annotate | Download | only in glsl
      1 /* -*- c++ -*- */
      2 /*
      3  * Copyright  2010 Intel Corporation
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the "Software"),
      7  * to deal in the Software without restriction, including without limitation
      8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      9  * and/or sell copies of the Software, and to permit persons to whom the
     10  * Software is furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice (including the next
     13  * paragraph) shall be included in all copies or substantial portions of the
     14  * Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     22  * DEALINGS IN THE SOFTWARE.
     23  */
     24 
     25 #pragma once
     26 #ifndef IR_H
     27 #define IR_H
     28 
     29 #include <cstdio>
     30 #include <cstdlib>
     31 
     32 extern "C" {
     33 #include <hieralloc.h>
     34 }
     35 
     36 #include "glsl_types.h"
     37 #include "list.h"
     38 #include "ir_visitor.h"
     39 #include "ir_hierarchical_visitor.h"
     40 
     41 /**
     42  * \defgroup IR Intermediate representation nodes
     43  *
     44  * @{
     45  */
     46 
     47 /**
     48  * Class tags
     49  *
     50  * Each concrete class derived from \c ir_instruction has a value in this
     51  * enumerant.  The value for the type is stored in \c ir_instruction::ir_type
     52  * by the constructor.  While using type tags is not very C++, it is extremely
     53  * convenient.  For example, during debugging you can simply inspect
     54  * \c ir_instruction::ir_type to find out the actual type of the object.
     55  *
     56  * In addition, it is possible to use a switch-statement based on \c
     57  * \c ir_instruction::ir_type to select different behavior for different object
     58  * types.  For functions that have only slight differences for several object
     59  * types, this allows writing very straightforward, readable code.
     60  */
     61 enum ir_node_type {
     62    /**
     63     * Zero is unused so that the IR validator can detect cases where
     64     * \c ir_instruction::ir_type has not been initialized.
     65     */
     66    ir_type_unset,
     67    ir_type_variable,
     68    ir_type_assignment,
     69    ir_type_call,
     70    ir_type_constant,
     71    ir_type_dereference_array,
     72    ir_type_dereference_record,
     73    ir_type_dereference_variable,
     74    ir_type_discard,
     75    ir_type_expression,
     76    ir_type_function,
     77    ir_type_function_signature,
     78    ir_type_if,
     79    ir_type_loop,
     80    ir_type_loop_jump,
     81    ir_type_return,
     82    ir_type_swizzle,
     83    ir_type_texture,
     84    ir_type_max /**< maximum ir_type enum number, for validation */
     85 };
     86 
     87 /**
     88  * Base class of all IR instructions
     89  */
     90 class ir_instruction : public exec_node {
     91 public:
     92    enum ir_node_type ir_type;
     93    const struct glsl_type *type;
     94 
     95    /** ir_print_visitor helper for debugging. */
     96    void print(void) const;
     97 
     98    virtual void accept(ir_visitor *) = 0;
     99    virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0;
    100    virtual ir_instruction *clone(void *mem_ctx,
    101 				 struct hash_table *ht) const = 0;
    102 
    103    /**
    104     * \name IR instruction downcast functions
    105     *
    106     * These functions either cast the object to a derived class or return
    107     * \c NULL if the object's type does not match the specified derived class.
    108     * Additional downcast functions will be added as needed.
    109     */
    110    /*@{*/
    111    virtual class ir_variable *          as_variable()         { return NULL; }
    112    virtual class ir_function *          as_function()         { return NULL; }
    113    virtual class ir_dereference *       as_dereference()      { return NULL; }
    114    virtual class ir_dereference_array *	as_dereference_array() { return NULL; }
    115    virtual class ir_dereference_variable *as_dereference_variable() { return NULL; }
    116    virtual class ir_expression *        as_expression()       { return NULL; }
    117    virtual class ir_rvalue *            as_rvalue()           { return NULL; }
    118    virtual class ir_loop *              as_loop()             { return NULL; }
    119    virtual class ir_assignment *        as_assignment()       { return NULL; }
    120    virtual class ir_call *              as_call()             { return NULL; }
    121    virtual class ir_return *            as_return()           { return NULL; }
    122    virtual class ir_if *                as_if()               { return NULL; }
    123    virtual class ir_swizzle *           as_swizzle()          { return NULL; }
    124    virtual class ir_constant *          as_constant()         { return NULL; }
    125    virtual class ir_discard *           as_discard()          { return NULL; }
    126    /*@}*/
    127 
    128 protected:
    129    ir_instruction()
    130    {
    131       ir_type = ir_type_unset;
    132       type = NULL;
    133    }
    134 
    135    virtual  ~ir_instruction() { } // GCC error about accessible nonvirtual dctor
    136 
    137 
    138 };
    139 
    140 
    141 class ir_rvalue : public ir_instruction {
    142 public:
    143    virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const = 0;
    144 
    145    virtual ir_constant *constant_expression_value() = 0;
    146 
    147    virtual ir_rvalue * as_rvalue()
    148    {
    149       return this;
    150    }
    151 
    152    ir_rvalue *as_rvalue_to_saturate();
    153 
    154    virtual bool is_lvalue()
    155    {
    156       return false;
    157    }
    158 
    159    /**
    160     * Get the variable that is ultimately referenced by an r-value
    161     */
    162    virtual ir_variable *variable_referenced()
    163    {
    164       return NULL;
    165    }
    166 
    167 
    168    /**
    169     * If an r-value is a reference to a whole variable, get that variable
    170     *
    171     * \return
    172     * Pointer to a variable that is completely dereferenced by the r-value.  If
    173     * the r-value is not a dereference or the dereference does not access the
    174     * entire variable (i.e., it's just one array element, struct field), \c NULL
    175     * is returned.
    176     */
    177    virtual ir_variable *whole_variable_referenced()
    178    {
    179       return NULL;
    180    }
    181 
    182    /**
    183     * Determine if an r-value has the value zero
    184     *
    185     * The base implementation of this function always returns \c false.  The
    186     * \c ir_constant class over-rides this function to return \c true \b only
    187     * for vector and scalar types that have all elements set to the value
    188     * zero (or \c false for booleans).
    189     *
    190     * \sa ir_constant::has_value, ir_rvalue::is_one, ir_rvalue::is_negative_one
    191     */
    192    virtual bool is_zero() const;
    193 
    194    /**
    195     * Determine if an r-value has the value one
    196     *
    197     * The base implementation of this function always returns \c false.  The
    198     * \c ir_constant class over-rides this function to return \c true \b only
    199     * for vector and scalar types that have all elements set to the value
    200     * one (or \c true for booleans).
    201     *
    202     * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_negative_one
    203     */
    204    virtual bool is_one() const;
    205 
    206    /**
    207     * Determine if an r-value has the value negative one
    208     *
    209     * The base implementation of this function always returns \c false.  The
    210     * \c ir_constant class over-rides this function to return \c true \b only
    211     * for vector and scalar types that have all elements set to the value
    212     * negative one.  For boolean times, the result is always \c false.
    213     *
    214     * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one
    215     */
    216    virtual bool is_negative_one() const;
    217 
    218 protected:
    219    ir_rvalue();
    220 };
    221 
    222 
    223 /**
    224  * Variable storage classes
    225  */
    226 enum ir_variable_mode {
    227    ir_var_auto = 0,     /**< Function local variables and globals. */
    228    ir_var_uniform,      /**< Variable declared as a uniform. */
    229    ir_var_in,
    230    ir_var_out,
    231    ir_var_inout,
    232    ir_var_temporary	/**< Temporary variable generated during compilation. */
    233 };
    234 
    235 enum ir_variable_interpolation {
    236    ir_var_smooth = 0,
    237    ir_var_flat,
    238    ir_var_noperspective
    239 };
    240 
    241 
    242 class ir_variable : public ir_instruction {
    243 public:
    244    ir_variable(const struct glsl_type *, const char *, ir_variable_mode);
    245 
    246    virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const;
    247 
    248    virtual ir_variable *as_variable()
    249    {
    250       return this;
    251    }
    252 
    253    virtual void accept(ir_visitor *v)
    254    {
    255       v->visit(this);
    256    }
    257 
    258    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
    259 
    260 
    261    /**
    262     * Get the string value for the interpolation qualifier
    263     *
    264     * \return The string that would be used in a shader to specify \c
    265     * mode will be returned.
    266     *
    267     * This function should only be used on a shader input or output variable.
    268     */
    269    const char *interpolation_string() const;
    270 
    271    /**
    272     * Calculate the number of slots required to hold this variable
    273     *
    274     * This is used to determine how many uniform or varying locations a variable
    275     * occupies.  The count is in units of floating point components.
    276     */
    277    unsigned component_slots() const;
    278 
    279    /**
    280     * Delcared name of the variable
    281     */
    282    const char *name;
    283 
    284    /**
    285     * Highest element accessed with a constant expression array index
    286     *
    287     * Not used for non-array variables.
    288     */
    289    unsigned max_array_access;
    290 
    291    /**
    292     * Is the variable read-only?
    293     *
    294     * This is set for variables declared as \c const, shader inputs,
    295     * and uniforms.
    296     */
    297    unsigned read_only:1;
    298    unsigned centroid:1;
    299    unsigned invariant:1;
    300 
    301    /**
    302     * Storage class of the variable.
    303     *
    304     * \sa ir_variable_mode
    305     */
    306    unsigned mode:3;
    307 
    308    /**
    309     * Interpolation mode for shader inputs / outputs
    310     *
    311     * \sa ir_variable_interpolation
    312     */
    313    unsigned interpolation:2;
    314 
    315    /**
    316     * Flag that the whole array is assignable
    317     *
    318     * In GLSL 1.20 and later whole arrays are assignable (and comparable for
    319     * equality).  This flag enables this behavior.
    320     */
    321    unsigned array_lvalue:1;
    322 
    323    /**
    324     * \name ARB_fragment_coord_conventions
    325     * @{
    326     */
    327    unsigned origin_upper_left:1;
    328    unsigned pixel_center_integer:1;
    329    /*@}*/
    330 
    331    /**
    332     * Was the location explicitly set in the shader?
    333     *
    334     * If the location is explicitly set in the shader, it \b cannot be changed
    335     * by the linker or by the API (e.g., calls to \c glBindAttribLocation have
    336     * no effect).
    337     */
    338    unsigned explicit_location:1;
    339 
    340    /**
    341     * Storage location of the base of this variable
    342     *
    343     * The precise meaning of this field depends on the nature of the variable.
    344     *
    345     *   - Vertex shader input: one of the values from \c gl_vert_attrib.
    346     *   - Vertex shader output: one of the values from \c gl_vert_result.
    347     *   - Fragment shader input: one of the values from \c gl_frag_attrib.
    348     *   - Fragment shader output: one of the values from \c gl_frag_result.
    349     *   - Uniforms: Per-stage uniform slot number.
    350     *   - Other: This field is not currently used.
    351     *
    352     * If the variable is a uniform, shader input, or shader output, and the
    353     * slot has not been assigned, the value will be -1.
    354     */
    355    int location;
    356 
    357    /**
    358     * Emit a warning if this variable is accessed.
    359     */
    360    const char *warn_extension;
    361 
    362    /**
    363     * Value assigned in the initializer of a variable declared "const"
    364     */
    365    ir_constant *constant_value;
    366 };
    367 
    368 
    369 /*@{*/
    370 /**
    371  * The representation of a function instance; may be the full definition or
    372  * simply a prototype.
    373  */
    374 class ir_function_signature : public ir_instruction {
    375    /* An ir_function_signature will be part of the list of signatures in
    376     * an ir_function.
    377     */
    378 public:
    379    ir_function_signature(const glsl_type *return_type);
    380 
    381    virtual ir_function_signature *clone(void *mem_ctx,
    382 					struct hash_table *ht) const;
    383    ir_function_signature *clone_prototype(void *mem_ctx,
    384 					  struct hash_table *ht) const;
    385 
    386    virtual void accept(ir_visitor *v)
    387    {
    388       v->visit(this);
    389    }
    390 
    391    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
    392 
    393    /**
    394     * Get the name of the function for which this is a signature
    395     */
    396    const char *function_name() const;
    397 
    398    /**
    399     * Get a handle to the function for which this is a signature
    400     *
    401     * There is no setter function, this function returns a \c const pointer,
    402     * and \c ir_function_signature::_function is private for a reason.  The
    403     * only way to make a connection between a function and function signature
    404     * is via \c ir_function::add_signature.  This helps ensure that certain
    405     * invariants (i.e., a function signature is in the list of signatures for
    406     * its \c _function) are met.
    407     *
    408     * \sa ir_function::add_signature
    409     */
    410    inline const class ir_function *function() const
    411    {
    412       return this->_function;
    413    }
    414 
    415    /**
    416     * Check whether the qualifiers match between this signature's parameters
    417     * and the supplied parameter list.  If not, returns the name of the first
    418     * parameter with mismatched qualifiers (for use in error messages).
    419     */
    420    const char *qualifiers_match(exec_list *params);
    421 
    422    /**
    423     * Replace the current parameter list with the given one.  This is useful
    424     * if the current information came from a prototype, and either has invalid
    425     * or missing parameter names.
    426     */
    427    void replace_parameters(exec_list *new_params);
    428 
    429    /**
    430     * Function return type.
    431     *
    432     * \note This discards the optional precision qualifier.
    433     */
    434    const struct glsl_type *return_type;
    435 
    436    /**
    437     * List of ir_variable of function parameters.
    438     *
    439     * This represents the storage.  The paramaters passed in a particular
    440     * call will be in ir_call::actual_paramaters.
    441     */
    442    struct exec_list parameters;
    443 
    444    /** Whether or not this function has a body (which may be empty). */
    445    unsigned is_defined:1;
    446 
    447    /** Whether or not this function signature is a built-in. */
    448    unsigned is_builtin:1;
    449 
    450    /** Body of instructions in the function. */
    451    struct exec_list body;
    452 
    453 private:
    454    /** Function of which this signature is one overload. */
    455    class ir_function *_function;
    456 
    457    friend class ir_function;
    458 };
    459 
    460 
    461 /**
    462  * Header for tracking multiple overloaded functions with the same name.
    463  * Contains a list of ir_function_signatures representing each of the
    464  * actual functions.
    465  */
    466 class ir_function : public ir_instruction {
    467 public:
    468    ir_function(const char *name);
    469 
    470    virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const;
    471 
    472    virtual ir_function *as_function()
    473    {
    474       return this;
    475    }
    476 
    477    virtual void accept(ir_visitor *v)
    478    {
    479       v->visit(this);
    480    }
    481 
    482    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
    483 
    484    void add_signature(ir_function_signature *sig)
    485    {
    486       sig->_function = this;
    487       this->signatures.push_tail(sig);
    488    }
    489 
    490    /**
    491     * Get an iterator for the set of function signatures
    492     */
    493    exec_list_iterator iterator()
    494    {
    495       return signatures.iterator();
    496    }
    497 
    498    /**
    499     * Find a signature that matches a set of actual parameters, taking implicit
    500     * conversions into account.
    501     */
    502    ir_function_signature *matching_signature(const exec_list *actual_param);
    503 
    504    /**
    505     * Find a signature that exactly matches a set of actual parameters without
    506     * any implicit type conversions.
    507     */
    508    ir_function_signature *exact_matching_signature(const exec_list *actual_ps);
    509 
    510    /**
    511     * Name of the function.
    512     */
    513    const char *name;
    514 
    515    /** Whether or not this function has a signature that isn't a built-in. */
    516    bool has_user_signature();
    517 
    518    /**
    519     * List of ir_function_signature for each overloaded function with this name.
    520     */
    521    struct exec_list signatures;
    522 };
    523 
    524 inline const char *ir_function_signature::function_name() const
    525 {
    526    return this->_function->name;
    527 }
    528 /*@}*/
    529 
    530 
    531 /**
    532  * IR instruction representing high-level if-statements
    533  */
    534 class ir_if : public ir_instruction {
    535 public:
    536    ir_if(ir_rvalue *condition)
    537       : condition(condition)
    538    {
    539       ir_type = ir_type_if;
    540    }
    541 
    542    virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const;
    543 
    544    virtual ir_if *as_if()
    545    {
    546       return this;
    547    }
    548 
    549    virtual void accept(ir_visitor *v)
    550    {
    551       v->visit(this);
    552    }
    553 
    554    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
    555 
    556    ir_rvalue *condition;
    557    /** List of ir_instruction for the body of the then branch */
    558    exec_list  then_instructions;
    559    /** List of ir_instruction for the body of the else branch */
    560    exec_list  else_instructions;
    561 };
    562 
    563 
    564 /**
    565  * IR instruction representing a high-level loop structure.
    566  */
    567 class ir_loop : public ir_instruction {
    568 public:
    569    ir_loop();
    570 
    571    virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const;
    572 
    573    virtual void accept(ir_visitor *v)
    574    {
    575       v->visit(this);
    576    }
    577 
    578    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
    579 
    580    virtual ir_loop *as_loop()
    581    {
    582       return this;
    583    }
    584 
    585    /**
    586     * Get an iterator for the instructions of the loop body
    587     */
    588    exec_list_iterator iterator()
    589    {
    590       return body_instructions.iterator();
    591    }
    592 
    593    /** List of ir_instruction that make up the body of the loop. */
    594    exec_list body_instructions;
    595 
    596    /**
    597     * \name Loop counter and controls
    598     *
    599     * Represents a loop like a FORTRAN \c do-loop.
    600     *
    601     * \note
    602     * If \c from and \c to are the same value, the loop will execute once.
    603     */
    604    /*@{*/
    605    ir_rvalue *from;             /** Value of the loop counter on the first
    606 				 * iteration of the loop.
    607 				 */
    608    ir_rvalue *to;               /** Value of the loop counter on the last
    609 				 * iteration of the loop.
    610 				 */
    611    ir_rvalue *increment;
    612    ir_variable *counter;
    613 
    614    /**
    615     * Comparison operation in the loop terminator.
    616     *
    617     * If any of the loop control fields are non-\c NULL, this field must be
    618     * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal,
    619     * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal.
    620     */
    621    int cmp;
    622    /*@}*/
    623 };
    624 
    625 
    626 class ir_assignment : public ir_instruction {
    627 public:
    628    ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
    629 
    630    /**
    631     * Construct an assignment with an explicit write mask
    632     *
    633     * \note
    634     * Since a write mask is supplied, the LHS must already be a bare
    635     * \c ir_dereference.  The cannot be any swizzles in the LHS.
    636     */
    637    ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition,
    638 		 unsigned write_mask);
    639 
    640    virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const;
    641 
    642    virtual ir_constant *constant_expression_value();
    643 
    644    virtual void accept(ir_visitor *v)
    645    {
    646       v->visit(this);
    647    }
    648 
    649    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
    650 
    651    virtual ir_assignment * as_assignment()
    652    {
    653       return this;
    654    }
    655 
    656    /**
    657     * Get a whole variable written by an assignment
    658     *
    659     * If the LHS of the assignment writes a whole variable, the variable is
    660     * returned.  Otherwise \c NULL is returned.  Examples of whole-variable
    661     * assignment are:
    662     *
    663     *  - Assigning to a scalar
    664     *  - Assigning to all components of a vector
    665     *  - Whole array (or matrix) assignment
    666     *  - Whole structure assignment
    667     */
    668    ir_variable *whole_variable_written();
    669 
    670    /**
    671     * Set the LHS of an assignment
    672     */
    673    void set_lhs(ir_rvalue *lhs);
    674 
    675    /**
    676     * Left-hand side of the assignment.
    677     *
    678     * This should be treated as read only.  If you need to set the LHS of an
    679     * assignment, use \c ir_assignment::set_lhs.
    680     */
    681    ir_dereference *lhs;
    682 
    683    /**
    684     * Value being assigned
    685     */
    686    ir_rvalue *rhs;
    687 
    688    /**
    689     * Optional condition for the assignment.
    690     */
    691    ir_rvalue *condition;
    692 
    693 
    694    /**
    695     * Component mask written
    696     *
    697     * For non-vector types in the LHS, this field will be zero.  For vector
    698     * types, a bit will be set for each component that is written.  Note that
    699     * for \c vec2 and \c vec3 types only the lower bits will ever be set.
    700     *
    701     * A partially-set write mask means that each enabled channel gets
    702     * the value from a consecutive channel of the rhs.  For example,
    703     * to write just .xyw of gl_FrontColor with color:
    704     *
    705     * (assign (constant bool (1)) (xyw)
    706     *     (var_ref gl_FragColor)
    707     *     (swiz xyw (var_ref color)))
    708     */
    709    unsigned write_mask:4;
    710 };
    711 
    712 /* Update ir_expression::num_operands() and operator_strs when
    713  * updating this list.
    714  */
    715 enum ir_expression_operation {
    716    ir_unop_bit_not,
    717    ir_unop_logic_not,
    718    ir_unop_neg,
    719    ir_unop_abs,
    720    ir_unop_sign,
    721    ir_unop_rcp,
    722    ir_unop_rsq,
    723    ir_unop_sqrt,
    724    ir_unop_exp,      /**< Log base e on gentype */
    725    ir_unop_log,	     /**< Natural log on gentype */
    726    ir_unop_exp2,
    727    ir_unop_log2,
    728    ir_unop_f2i,      /**< Float-to-integer conversion. */
    729    ir_unop_i2f,      /**< Integer-to-float conversion. */
    730    ir_unop_f2b,      /**< Float-to-boolean conversion */
    731    ir_unop_b2f,      /**< Boolean-to-float conversion */
    732    ir_unop_i2b,      /**< int-to-boolean conversion */
    733    ir_unop_b2i,      /**< Boolean-to-int conversion */
    734    ir_unop_u2f,      /**< Unsigned-to-float conversion. */
    735    ir_unop_any,
    736 
    737    /**
    738     * \name Unary floating-point rounding operations.
    739     */
    740    /*@{*/
    741    ir_unop_trunc,
    742    ir_unop_ceil,
    743    ir_unop_floor,
    744    ir_unop_fract,
    745    ir_unop_round_even,
    746    /*@}*/
    747 
    748    /**
    749     * \name Trigonometric operations.
    750     */
    751    /*@{*/
    752    ir_unop_sin,
    753    ir_unop_cos,
    754    ir_unop_sin_reduced,    /**< Reduced range sin. [-pi, pi] */
    755    ir_unop_cos_reduced,    /**< Reduced range cos. [-pi, pi] */
    756    /*@}*/
    757 
    758    /**
    759     * \name Partial derivatives.
    760     */
    761    /*@{*/
    762    ir_unop_dFdx,
    763    ir_unop_dFdy,
    764    /*@}*/
    765 
    766    ir_unop_noise,
    767 
    768    /**
    769     * A sentinel marking the last of the unary operations.
    770     */
    771    ir_last_unop = ir_unop_noise,
    772 
    773    ir_binop_add,
    774    ir_binop_sub,
    775    ir_binop_mul,
    776    ir_binop_div,
    777 
    778    /**
    779     * Takes one of two combinations of arguments:
    780     *
    781     * - mod(vecN, vecN)
    782     * - mod(vecN, float)
    783     *
    784     * Does not take integer types.
    785     */
    786    ir_binop_mod,
    787 
    788    /**
    789     * \name Binary comparison operators which return a boolean vector.
    790     * The type of both operands must be equal.
    791     */
    792    /*@{*/
    793    ir_binop_less,
    794    ir_binop_greater,
    795    ir_binop_lequal,
    796    ir_binop_gequal,
    797    ir_binop_equal,
    798    ir_binop_nequal,
    799    /**
    800     * Returns single boolean for whether all components of operands[0]
    801     * equal the components of operands[1].
    802     */
    803    ir_binop_all_equal,
    804    /**
    805     * Returns single boolean for whether any component of operands[0]
    806     * is not equal to the corresponding component of operands[1].
    807     */
    808    ir_binop_any_nequal,
    809    /*@}*/
    810 
    811    /**
    812     * \name Bit-wise binary operations.
    813     */
    814    /*@{*/
    815    ir_binop_lshift,
    816    ir_binop_rshift,
    817    ir_binop_bit_and,
    818    ir_binop_bit_xor,
    819    ir_binop_bit_or,
    820    /*@}*/
    821 
    822    ir_binop_logic_and,
    823    ir_binop_logic_xor,
    824    ir_binop_logic_or,
    825 
    826    ir_binop_dot,
    827    ir_binop_min,
    828    ir_binop_max,
    829 
    830    ir_binop_pow,
    831 
    832    /**
    833     * A sentinel marking the last of the binary operations.
    834     */
    835    ir_last_binop = ir_binop_pow,
    836 
    837    ir_quadop_vector,
    838 
    839    /**
    840     * A sentinel marking the last of all operations.
    841     */
    842    ir_last_opcode = ir_last_binop
    843 };
    844 
    845 class ir_expression : public ir_rvalue {
    846 public:
    847    /**
    848     * Constructor for unary operation expressions
    849     */
    850    ir_expression(int op, const struct glsl_type *type, ir_rvalue *);
    851    ir_expression(int op, ir_rvalue *);
    852 
    853    /**
    854     * Constructor for binary operation expressions
    855     */
    856    ir_expression(int op, const struct glsl_type *type,
    857 		 ir_rvalue *, ir_rvalue *);
    858    ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1);
    859 
    860    /**
    861     * Constructor for quad operator expressions
    862     */
    863    ir_expression(int op, const struct glsl_type *type,
    864 		 ir_rvalue *, ir_rvalue *, ir_rvalue *, ir_rvalue *);
    865 
    866    virtual ir_expression *as_expression()
    867    {
    868       return this;
    869    }
    870 
    871    virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const;
    872 
    873    /**
    874     * Attempt to constant-fold the expression
    875     *
    876     * If the expression cannot be constant folded, this method will return
    877     * \c NULL.
    878     */
    879    virtual ir_constant *constant_expression_value();
    880 
    881    /**
    882     * Determine the number of operands used by an expression
    883     */
    884    static unsigned int get_num_operands(ir_expression_operation);
    885 
    886    /**
    887     * Determine the number of operands used by an expression
    888     */
    889    unsigned int get_num_operands() const
    890    {
    891       return (this->operation == ir_quadop_vector)
    892 	 ? this->type->vector_elements : get_num_operands(operation);
    893    }
    894 
    895    /**
    896     * Return a string representing this expression's operator.
    897     */
    898    const char *operator_string();
    899 
    900    /**
    901     * Return a string representing this expression's operator.
    902     */
    903    static const char *operator_string(ir_expression_operation);
    904 
    905 
    906    /**
    907     * Do a reverse-lookup to translate the given string into an operator.
    908     */
    909    static ir_expression_operation get_operator(const char *);
    910 
    911    virtual void accept(ir_visitor *v)
    912    {
    913       v->visit(this);
    914    }
    915 
    916    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
    917 
    918    ir_expression_operation operation;
    919    ir_rvalue *operands[4];
    920 };
    921 
    922 
    923 /**
    924  * IR instruction representing a function call
    925  */
    926 class ir_call : public ir_rvalue {
    927 public:
    928    ir_call(ir_function_signature *callee, exec_list *actual_parameters)
    929       : callee(callee)
    930    {
    931       ir_type = ir_type_call;
    932       assert(callee->return_type != NULL);
    933       type = callee->return_type;
    934       actual_parameters->move_nodes_to(& this->actual_parameters);
    935    }
    936 
    937    virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const;
    938 
    939    virtual ir_constant *constant_expression_value();
    940 
    941    virtual ir_call *as_call()
    942    {
    943       return this;
    944    }
    945 
    946    virtual void accept(ir_visitor *v)
    947    {
    948       v->visit(this);
    949    }
    950 
    951    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
    952 
    953    /**
    954     * Get a generic ir_call object when an error occurs
    955     *
    956     * Any allocation will be performed with 'ctx' as hieralloc owner.
    957     */
    958    static ir_call *get_error_instruction(void *ctx);
    959 
    960    /**
    961     * Get an iterator for the set of acutal parameters
    962     */
    963    exec_list_iterator iterator()
    964    {
    965       return actual_parameters.iterator();
    966    }
    967 
    968    /**
    969     * Get the name of the function being called.
    970     */
    971    const char *callee_name() const
    972    {
    973       return callee->function_name();
    974    }
    975 
    976    /**
    977     * Get the function signature bound to this function call
    978     */
    979    ir_function_signature *get_callee()
    980    {
    981       return callee;
    982    }
    983 
    984    /**
    985     * Set the function call target
    986     */
    987    void set_callee(ir_function_signature *sig);
    988 
    989    /**
    990     * Generates an inline version of the function before @ir,
    991     * returning the return value of the function.
    992     */
    993    ir_rvalue *generate_inline(ir_instruction *ir);
    994 
    995    /* List of ir_rvalue of paramaters passed in this call. */
    996    exec_list actual_parameters;
    997 
    998 private:
    999    ir_call()
   1000       : callee(NULL)
   1001    {
   1002       this->ir_type = ir_type_call;
   1003    }
   1004 
   1005    ir_function_signature *callee;
   1006 };
   1007 
   1008 
   1009 /**
   1010  * \name Jump-like IR instructions.
   1011  *
   1012  * These include \c break, \c continue, \c return, and \c discard.
   1013  */
   1014 /*@{*/
   1015 class ir_jump : public ir_instruction {
   1016 protected:
   1017    ir_jump()
   1018    {
   1019       ir_type = ir_type_unset;
   1020    }
   1021 };
   1022 
   1023 class ir_return : public ir_jump {
   1024 public:
   1025    ir_return()
   1026       : value(NULL)
   1027    {
   1028       this->ir_type = ir_type_return;
   1029    }
   1030 
   1031    ir_return(ir_rvalue *value)
   1032       : value(value)
   1033    {
   1034       this->ir_type = ir_type_return;
   1035    }
   1036 
   1037    virtual ir_return *clone(void *mem_ctx, struct hash_table *) const;
   1038 
   1039    virtual ir_return *as_return()
   1040    {
   1041       return this;
   1042    }
   1043 
   1044    ir_rvalue *get_value() const
   1045    {
   1046       return value;
   1047    }
   1048 
   1049    virtual void accept(ir_visitor *v)
   1050    {
   1051       v->visit(this);
   1052    }
   1053 
   1054    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
   1055 
   1056    ir_rvalue *value;
   1057 };
   1058 
   1059 
   1060 /**
   1061  * Jump instructions used inside loops
   1062  *
   1063  * These include \c break and \c continue.  The \c break within a loop is
   1064  * different from the \c break within a switch-statement.
   1065  *
   1066  * \sa ir_switch_jump
   1067  */
   1068 class ir_loop_jump : public ir_jump {
   1069 public:
   1070    enum jump_mode {
   1071       jump_break,
   1072       jump_continue
   1073    };
   1074 
   1075    ir_loop_jump(jump_mode mode)
   1076    {
   1077       this->ir_type = ir_type_loop_jump;
   1078       this->mode = mode;
   1079       this->loop = loop;
   1080    }
   1081 
   1082    virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const;
   1083 
   1084    virtual void accept(ir_visitor *v)
   1085    {
   1086       v->visit(this);
   1087    }
   1088 
   1089    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
   1090 
   1091    bool is_break() const
   1092    {
   1093       return mode == jump_break;
   1094    }
   1095 
   1096    bool is_continue() const
   1097    {
   1098       return mode == jump_continue;
   1099    }
   1100 
   1101    /** Mode selector for the jump instruction. */
   1102    enum jump_mode mode;
   1103 private:
   1104    /** Loop containing this break instruction. */
   1105    ir_loop *loop;
   1106 };
   1107 
   1108 /**
   1109  * IR instruction representing discard statements.
   1110  */
   1111 class ir_discard : public ir_jump {
   1112 public:
   1113    ir_discard()
   1114    {
   1115       this->ir_type = ir_type_discard;
   1116       this->condition = NULL;
   1117    }
   1118 
   1119    ir_discard(ir_rvalue *cond)
   1120    {
   1121       this->ir_type = ir_type_discard;
   1122       this->condition = cond;
   1123    }
   1124 
   1125    virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const;
   1126 
   1127    virtual void accept(ir_visitor *v)
   1128    {
   1129       v->visit(this);
   1130    }
   1131 
   1132    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
   1133 
   1134    virtual ir_discard *as_discard()
   1135    {
   1136       return this;
   1137    }
   1138 
   1139    ir_rvalue *condition;
   1140 };
   1141 /*@}*/
   1142 
   1143 
   1144 /**
   1145  * Texture sampling opcodes used in ir_texture
   1146  */
   1147 enum ir_texture_opcode {
   1148    ir_tex,		/**< Regular texture look-up */
   1149    ir_txb,		/**< Texture look-up with LOD bias */
   1150    ir_txl,		/**< Texture look-up with explicit LOD */
   1151    ir_txd,		/**< Texture look-up with partial derivatvies */
   1152    ir_txf		/**< Texel fetch with explicit LOD */
   1153 };
   1154 
   1155 
   1156 /**
   1157  * IR instruction to sample a texture
   1158  *
   1159  * The specific form of the IR instruction depends on the \c mode value
   1160  * selected from \c ir_texture_opcodes.  In the printed IR, these will
   1161  * appear as:
   1162  *
   1163  *                              Texel offset
   1164  *                              |       Projection divisor
   1165  *                              |       |   Shadow comparitor
   1166  *                              |       |   |
   1167  *                              v       v   v
   1168  * (tex (sampler) (coordinate) (0 0 0) (1) ( ))
   1169  * (txb (sampler) (coordinate) (0 0 0) (1) ( ) (bias))
   1170  * (txl (sampler) (coordinate) (0 0 0) (1) ( ) (lod))
   1171  * (txd (sampler) (coordinate) (0 0 0) (1) ( ) (dPdx dPdy))
   1172  * (txf (sampler) (coordinate) (0 0 0)         (lod))
   1173  */
   1174 class ir_texture : public ir_rvalue {
   1175 public:
   1176    ir_texture(enum ir_texture_opcode op)
   1177       : op(op), projector(NULL), shadow_comparitor(NULL)
   1178    {
   1179       this->ir_type = ir_type_texture;
   1180    }
   1181 
   1182    virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const;
   1183 
   1184    virtual ir_constant *constant_expression_value();
   1185 
   1186    virtual void accept(ir_visitor *v)
   1187    {
   1188       v->visit(this);
   1189    }
   1190 
   1191    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
   1192 
   1193    /**
   1194     * Return a string representing the ir_texture_opcode.
   1195     */
   1196    const char *opcode_string();
   1197 
   1198    /** Set the sampler and infer the type. */
   1199    void set_sampler(ir_dereference *sampler);
   1200 
   1201    /**
   1202     * Do a reverse-lookup to translate a string into an ir_texture_opcode.
   1203     */
   1204    static ir_texture_opcode get_opcode(const char *);
   1205 
   1206    enum ir_texture_opcode op;
   1207 
   1208    /** Sampler to use for the texture access. */
   1209    ir_dereference *sampler;
   1210 
   1211    /** Texture coordinate to sample */
   1212    ir_rvalue *coordinate;
   1213 
   1214    /**
   1215     * Value used for projective divide.
   1216     *
   1217     * If there is no projective divide (the common case), this will be
   1218     * \c NULL.  Optimization passes should check for this to point to a constant
   1219     * of 1.0 and replace that with \c NULL.
   1220     */
   1221    ir_rvalue *projector;
   1222 
   1223    /**
   1224     * Coordinate used for comparison on shadow look-ups.
   1225     *
   1226     * If there is no shadow comparison, this will be \c NULL.  For the
   1227     * \c ir_txf opcode, this *must* be \c NULL.
   1228     */
   1229    ir_rvalue *shadow_comparitor;
   1230 
   1231    /** Explicit texel offsets. */
   1232    signed char offsets[3];
   1233 
   1234    union {
   1235       ir_rvalue *lod;		/**< Floating point LOD */
   1236       ir_rvalue *bias;		/**< Floating point LOD bias */
   1237       struct {
   1238 	 ir_rvalue *dPdx;	/**< Partial derivative of coordinate wrt X */
   1239 	 ir_rvalue *dPdy;	/**< Partial derivative of coordinate wrt Y */
   1240       } grad;
   1241    } lod_info;
   1242 };
   1243 
   1244 
   1245 struct ir_swizzle_mask {
   1246    unsigned x:2;
   1247    unsigned y:2;
   1248    unsigned z:2;
   1249    unsigned w:2;
   1250 
   1251    /**
   1252     * Number of components in the swizzle.
   1253     */
   1254    unsigned num_components:3;
   1255 
   1256    /**
   1257     * Does the swizzle contain duplicate components?
   1258     *
   1259     * L-value swizzles cannot contain duplicate components.
   1260     */
   1261    unsigned has_duplicates:1;
   1262 };
   1263 
   1264 
   1265 class ir_swizzle : public ir_rvalue {
   1266 public:
   1267    ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
   1268               unsigned count);
   1269 
   1270    ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count);
   1271 
   1272    ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
   1273 
   1274    virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const;
   1275 
   1276    virtual ir_constant *constant_expression_value();
   1277 
   1278    virtual ir_swizzle *as_swizzle()
   1279    {
   1280       return this;
   1281    }
   1282 
   1283    /**
   1284     * Construct an ir_swizzle from the textual representation.  Can fail.
   1285     */
   1286    static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
   1287 
   1288    virtual void accept(ir_visitor *v)
   1289    {
   1290       v->visit(this);
   1291    }
   1292 
   1293    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
   1294 
   1295    bool is_lvalue()
   1296    {
   1297       return val->is_lvalue() && !mask.has_duplicates;
   1298    }
   1299 
   1300    /**
   1301     * Get the variable that is ultimately referenced by an r-value
   1302     */
   1303    virtual ir_variable *variable_referenced();
   1304 
   1305    ir_rvalue *val;
   1306    ir_swizzle_mask mask;
   1307 
   1308 private:
   1309    /**
   1310     * Initialize the mask component of a swizzle
   1311     *
   1312     * This is used by the \c ir_swizzle constructors.
   1313     */
   1314    void init_mask(const unsigned *components, unsigned count);
   1315 };
   1316 
   1317 
   1318 class ir_dereference : public ir_rvalue {
   1319 public:
   1320    virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0;
   1321 
   1322    virtual ir_dereference *as_dereference()
   1323    {
   1324       return this;
   1325    }
   1326 
   1327    bool is_lvalue();
   1328 
   1329    /**
   1330     * Get the variable that is ultimately referenced by an r-value
   1331     */
   1332    virtual ir_variable *variable_referenced() = 0;
   1333 };
   1334 
   1335 
   1336 class ir_dereference_variable : public ir_dereference {
   1337 public:
   1338    ir_dereference_variable(ir_variable *var);
   1339 
   1340    virtual ir_dereference_variable *clone(void *mem_ctx,
   1341 					  struct hash_table *) const;
   1342 
   1343    virtual ir_constant *constant_expression_value();
   1344 
   1345    virtual ir_dereference_variable *as_dereference_variable()
   1346    {
   1347       return this;
   1348    }
   1349 
   1350    /**
   1351     * Get the variable that is ultimately referenced by an r-value
   1352     */
   1353    virtual ir_variable *variable_referenced()
   1354    {
   1355       return this->var;
   1356    }
   1357 
   1358    virtual ir_variable *whole_variable_referenced()
   1359    {
   1360       /* ir_dereference_variable objects always dereference the entire
   1361        * variable.  However, if this dereference is dereferenced by anything
   1362        * else, the complete deferefernce chain is not a whole-variable
   1363        * dereference.  This method should only be called on the top most
   1364        * ir_rvalue in a dereference chain.
   1365        */
   1366       return this->var;
   1367    }
   1368 
   1369    virtual void accept(ir_visitor *v)
   1370    {
   1371       v->visit(this);
   1372    }
   1373 
   1374    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
   1375 
   1376    /**
   1377     * Object being dereferenced.
   1378     */
   1379    ir_variable *var;
   1380 };
   1381 
   1382 
   1383 class ir_dereference_array : public ir_dereference {
   1384 public:
   1385    ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
   1386 
   1387    ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
   1388 
   1389    virtual ir_dereference_array *clone(void *mem_ctx,
   1390 				       struct hash_table *) const;
   1391 
   1392    virtual ir_constant *constant_expression_value();
   1393 
   1394    virtual ir_dereference_array *as_dereference_array()
   1395    {
   1396       return this;
   1397    }
   1398 
   1399    /**
   1400     * Get the variable that is ultimately referenced by an r-value
   1401     */
   1402    virtual ir_variable *variable_referenced()
   1403    {
   1404       return this->array->variable_referenced();
   1405    }
   1406 
   1407    virtual void accept(ir_visitor *v)
   1408    {
   1409       v->visit(this);
   1410    }
   1411 
   1412    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
   1413 
   1414    ir_rvalue *array;
   1415    ir_rvalue *array_index;
   1416 
   1417 private:
   1418    void set_array(ir_rvalue *value);
   1419 };
   1420 
   1421 
   1422 class ir_dereference_record : public ir_dereference {
   1423 public:
   1424    ir_dereference_record(ir_rvalue *value, const char *field);
   1425 
   1426    ir_dereference_record(ir_variable *var, const char *field);
   1427 
   1428    virtual ir_dereference_record *clone(void *mem_ctx,
   1429 					struct hash_table *) const;
   1430 
   1431    virtual ir_constant *constant_expression_value();
   1432 
   1433    /**
   1434     * Get the variable that is ultimately referenced by an r-value
   1435     */
   1436    virtual ir_variable *variable_referenced()
   1437    {
   1438       return this->record->variable_referenced();
   1439    }
   1440 
   1441    virtual void accept(ir_visitor *v)
   1442    {
   1443       v->visit(this);
   1444    }
   1445 
   1446    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
   1447 
   1448    ir_rvalue *record;
   1449    const char *field;
   1450 };
   1451 
   1452 
   1453 /**
   1454  * Data stored in an ir_constant
   1455  */
   1456 union ir_constant_data {
   1457       unsigned u[16];
   1458       int i[16];
   1459       float f[16];
   1460       bool b[16];
   1461 };
   1462 
   1463 
   1464 class ir_constant : public ir_rvalue {
   1465 public:
   1466    ir_constant(const struct glsl_type *type, const ir_constant_data *data);
   1467    ir_constant(bool b);
   1468    ir_constant(unsigned int u);
   1469    ir_constant(int i);
   1470    ir_constant(float f);
   1471 
   1472    /**
   1473     * Construct an ir_constant from a list of ir_constant values
   1474     */
   1475    ir_constant(const struct glsl_type *type, exec_list *values);
   1476 
   1477    /**
   1478     * Construct an ir_constant from a scalar component of another ir_constant
   1479     *
   1480     * The new \c ir_constant inherits the type of the component from the
   1481     * source constant.
   1482     *
   1483     * \note
   1484     * In the case of a matrix constant, the new constant is a scalar, \b not
   1485     * a vector.
   1486     */
   1487    ir_constant(const ir_constant *c, unsigned i);
   1488 
   1489    /**
   1490     * Return a new ir_constant of the specified type containing all zeros.
   1491     */
   1492    static ir_constant *zero(void *mem_ctx, const glsl_type *type);
   1493 
   1494    virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const;
   1495 
   1496    virtual ir_constant *constant_expression_value();
   1497 
   1498    virtual ir_constant *as_constant()
   1499    {
   1500       return this;
   1501    }
   1502 
   1503    virtual void accept(ir_visitor *v)
   1504    {
   1505       v->visit(this);
   1506    }
   1507 
   1508    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
   1509 
   1510    /**
   1511     * Get a particular component of a constant as a specific type
   1512     *
   1513     * This is useful, for example, to get a value from an integer constant
   1514     * as a float or bool.  This appears frequently when constructors are
   1515     * called with all constant parameters.
   1516     */
   1517    /*@{*/
   1518    bool get_bool_component(unsigned i) const;
   1519    float get_float_component(unsigned i) const;
   1520    int get_int_component(unsigned i) const;
   1521    unsigned get_uint_component(unsigned i) const;
   1522    /*@}*/
   1523 
   1524    ir_constant *get_array_element(unsigned i) const;
   1525 
   1526    ir_constant *get_record_field(const char *name);
   1527 
   1528    /**
   1529     * Determine whether a constant has the same value as another constant
   1530     *
   1531     * \sa ir_constant::is_zero, ir_constant::is_one,
   1532     * ir_constant::is_negative_one
   1533     */
   1534    bool has_value(const ir_constant *) const;
   1535 
   1536    virtual bool is_zero() const;
   1537    virtual bool is_one() const;
   1538    virtual bool is_negative_one() const;
   1539 
   1540    /**
   1541     * Value of the constant.
   1542     *
   1543     * The field used to back the values supplied by the constant is determined
   1544     * by the type associated with the \c ir_instruction.  Constants may be
   1545     * scalars, vectors, or matrices.
   1546     */
   1547    union ir_constant_data value;
   1548 
   1549    /* Array elements */
   1550    ir_constant **array_elements;
   1551 
   1552    /* Structure fields */
   1553    exec_list components;
   1554 
   1555 private:
   1556    /**
   1557     * Parameterless constructor only used by the clone method
   1558     */
   1559    ir_constant(void);
   1560 };
   1561 
   1562 /*@}*/
   1563 
   1564 /**
   1565  * Apply a visitor to each IR node in a list
   1566  */
   1567 void
   1568 visit_exec_list(exec_list *list, ir_visitor *visitor);
   1569 
   1570 /**
   1571  * Validate invariants on each IR node in a list
   1572  */
   1573 void validate_ir_tree(exec_list *instructions);
   1574 
   1575 /**
   1576  * Make a clone of each IR instruction in a list
   1577  *
   1578  * \param in   List of IR instructions that are to be cloned
   1579  * \param out  List to hold the cloned instructions
   1580  */
   1581 void
   1582 clone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in);
   1583 
   1584 extern void
   1585 _mesa_glsl_initialize_variables(exec_list *instructions,
   1586 				struct _mesa_glsl_parse_state *state);
   1587 
   1588 extern void
   1589 _mesa_glsl_initialize_functions(exec_list *instructions,
   1590 				struct _mesa_glsl_parse_state *state);
   1591 
   1592 extern void
   1593 _mesa_glsl_release_functions(void);
   1594 
   1595 extern void
   1596 reparent_ir(exec_list *list, void *mem_ctx);
   1597 
   1598 struct glsl_symbol_table;
   1599 
   1600 extern void
   1601 import_prototypes(const exec_list *source, exec_list *dest,
   1602 		  struct glsl_symbol_table *symbols, void *mem_ctx);
   1603 
   1604 extern bool
   1605 ir_has_call(ir_instruction *ir);
   1606 
   1607 extern void
   1608 do_set_program_inouts(exec_list *instructions, struct gl_program *prog);
   1609 
   1610 #endif /* IR_H */
   1611