Home | History | Annotate | Download | only in nir
      1 /*
      2  * Copyright  2014 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  * IN THE SOFTWARE.
     22  *
     23  * Authors:
     24  *    Connor Abbott (cwabbott0 (at) gmail.com)
     25  *
     26  */
     27 
     28 #include "nir.h"
     29 #include "nir_control_flow_private.h"
     30 #include <assert.h>
     31 
     32 nir_shader *
     33 nir_shader_create(void *mem_ctx,
     34                   gl_shader_stage stage,
     35                   const nir_shader_compiler_options *options,
     36                   shader_info *si)
     37 {
     38    nir_shader *shader = rzalloc(mem_ctx, nir_shader);
     39 
     40    exec_list_make_empty(&shader->uniforms);
     41    exec_list_make_empty(&shader->inputs);
     42    exec_list_make_empty(&shader->outputs);
     43    exec_list_make_empty(&shader->shared);
     44 
     45    shader->options = options;
     46 
     47    if (si) {
     48       assert(si->stage == stage);
     49       shader->info = *si;
     50    } else {
     51       shader->info.stage = stage;
     52    }
     53 
     54    exec_list_make_empty(&shader->functions);
     55    exec_list_make_empty(&shader->registers);
     56    exec_list_make_empty(&shader->globals);
     57    exec_list_make_empty(&shader->system_values);
     58    shader->reg_alloc = 0;
     59 
     60    shader->num_inputs = 0;
     61    shader->num_outputs = 0;
     62    shader->num_uniforms = 0;
     63    shader->num_shared = 0;
     64 
     65    return shader;
     66 }
     67 
     68 static nir_register *
     69 reg_create(void *mem_ctx, struct exec_list *list)
     70 {
     71    nir_register *reg = ralloc(mem_ctx, nir_register);
     72 
     73    list_inithead(&reg->uses);
     74    list_inithead(&reg->defs);
     75    list_inithead(&reg->if_uses);
     76 
     77    reg->num_components = 0;
     78    reg->bit_size = 32;
     79    reg->num_array_elems = 0;
     80    reg->is_packed = false;
     81    reg->name = NULL;
     82 
     83    exec_list_push_tail(list, &reg->node);
     84 
     85    return reg;
     86 }
     87 
     88 nir_register *
     89 nir_global_reg_create(nir_shader *shader)
     90 {
     91    nir_register *reg = reg_create(shader, &shader->registers);
     92    reg->index = shader->reg_alloc++;
     93    reg->is_global = true;
     94 
     95    return reg;
     96 }
     97 
     98 nir_register *
     99 nir_local_reg_create(nir_function_impl *impl)
    100 {
    101    nir_register *reg = reg_create(ralloc_parent(impl), &impl->registers);
    102    reg->index = impl->reg_alloc++;
    103    reg->is_global = false;
    104 
    105    return reg;
    106 }
    107 
    108 void
    109 nir_reg_remove(nir_register *reg)
    110 {
    111    exec_node_remove(&reg->node);
    112 }
    113 
    114 void
    115 nir_shader_add_variable(nir_shader *shader, nir_variable *var)
    116 {
    117    switch (var->data.mode) {
    118    case nir_var_all:
    119       assert(!"invalid mode");
    120       break;
    121 
    122    case nir_var_local:
    123       assert(!"nir_shader_add_variable cannot be used for local variables");
    124       break;
    125 
    126    case nir_var_param:
    127       assert(!"nir_shader_add_variable cannot be used for function parameters");
    128       break;
    129 
    130    case nir_var_global:
    131       exec_list_push_tail(&shader->globals, &var->node);
    132       break;
    133 
    134    case nir_var_shader_in:
    135       exec_list_push_tail(&shader->inputs, &var->node);
    136       break;
    137 
    138    case nir_var_shader_out:
    139       exec_list_push_tail(&shader->outputs, &var->node);
    140       break;
    141 
    142    case nir_var_uniform:
    143    case nir_var_shader_storage:
    144       exec_list_push_tail(&shader->uniforms, &var->node);
    145       break;
    146 
    147    case nir_var_shared:
    148       assert(shader->info.stage == MESA_SHADER_COMPUTE);
    149       exec_list_push_tail(&shader->shared, &var->node);
    150       break;
    151 
    152    case nir_var_system_value:
    153       exec_list_push_tail(&shader->system_values, &var->node);
    154       break;
    155    }
    156 }
    157 
    158 nir_variable *
    159 nir_variable_create(nir_shader *shader, nir_variable_mode mode,
    160                     const struct glsl_type *type, const char *name)
    161 {
    162    nir_variable *var = rzalloc(shader, nir_variable);
    163    var->name = ralloc_strdup(var, name);
    164    var->type = type;
    165    var->data.mode = mode;
    166 
    167    if ((mode == nir_var_shader_in &&
    168         shader->info.stage != MESA_SHADER_VERTEX) ||
    169        (mode == nir_var_shader_out &&
    170         shader->info.stage != MESA_SHADER_FRAGMENT))
    171       var->data.interpolation = INTERP_MODE_SMOOTH;
    172 
    173    if (mode == nir_var_shader_in || mode == nir_var_uniform)
    174       var->data.read_only = true;
    175 
    176    nir_shader_add_variable(shader, var);
    177 
    178    return var;
    179 }
    180 
    181 nir_variable *
    182 nir_local_variable_create(nir_function_impl *impl,
    183                           const struct glsl_type *type, const char *name)
    184 {
    185    nir_variable *var = rzalloc(impl->function->shader, nir_variable);
    186    var->name = ralloc_strdup(var, name);
    187    var->type = type;
    188    var->data.mode = nir_var_local;
    189 
    190    nir_function_impl_add_variable(impl, var);
    191 
    192    return var;
    193 }
    194 
    195 nir_function *
    196 nir_function_create(nir_shader *shader, const char *name)
    197 {
    198    nir_function *func = ralloc(shader, nir_function);
    199 
    200    exec_list_push_tail(&shader->functions, &func->node);
    201 
    202    func->name = ralloc_strdup(func, name);
    203    func->shader = shader;
    204    func->num_params = 0;
    205    func->params = NULL;
    206    func->return_type = glsl_void_type();
    207    func->impl = NULL;
    208 
    209    return func;
    210 }
    211 
    212 void nir_src_copy(nir_src *dest, const nir_src *src, void *mem_ctx)
    213 {
    214    dest->is_ssa = src->is_ssa;
    215    if (src->is_ssa) {
    216       dest->ssa = src->ssa;
    217    } else {
    218       dest->reg.base_offset = src->reg.base_offset;
    219       dest->reg.reg = src->reg.reg;
    220       if (src->reg.indirect) {
    221          dest->reg.indirect = ralloc(mem_ctx, nir_src);
    222          nir_src_copy(dest->reg.indirect, src->reg.indirect, mem_ctx);
    223       } else {
    224          dest->reg.indirect = NULL;
    225       }
    226    }
    227 }
    228 
    229 void nir_dest_copy(nir_dest *dest, const nir_dest *src, nir_instr *instr)
    230 {
    231    /* Copying an SSA definition makes no sense whatsoever. */
    232    assert(!src->is_ssa);
    233 
    234    dest->is_ssa = false;
    235 
    236    dest->reg.base_offset = src->reg.base_offset;
    237    dest->reg.reg = src->reg.reg;
    238    if (src->reg.indirect) {
    239       dest->reg.indirect = ralloc(instr, nir_src);
    240       nir_src_copy(dest->reg.indirect, src->reg.indirect, instr);
    241    } else {
    242       dest->reg.indirect = NULL;
    243    }
    244 }
    245 
    246 void
    247 nir_alu_src_copy(nir_alu_src *dest, const nir_alu_src *src,
    248                  nir_alu_instr *instr)
    249 {
    250    nir_src_copy(&dest->src, &src->src, &instr->instr);
    251    dest->abs = src->abs;
    252    dest->negate = src->negate;
    253    for (unsigned i = 0; i < 4; i++)
    254       dest->swizzle[i] = src->swizzle[i];
    255 }
    256 
    257 void
    258 nir_alu_dest_copy(nir_alu_dest *dest, const nir_alu_dest *src,
    259                   nir_alu_instr *instr)
    260 {
    261    nir_dest_copy(&dest->dest, &src->dest, &instr->instr);
    262    dest->write_mask = src->write_mask;
    263    dest->saturate = src->saturate;
    264 }
    265 
    266 
    267 static void
    268 cf_init(nir_cf_node *node, nir_cf_node_type type)
    269 {
    270    exec_node_init(&node->node);
    271    node->parent = NULL;
    272    node->type = type;
    273 }
    274 
    275 nir_function_impl *
    276 nir_function_impl_create_bare(nir_shader *shader)
    277 {
    278    nir_function_impl *impl = ralloc(shader, nir_function_impl);
    279 
    280    impl->function = NULL;
    281 
    282    cf_init(&impl->cf_node, nir_cf_node_function);
    283 
    284    exec_list_make_empty(&impl->body);
    285    exec_list_make_empty(&impl->registers);
    286    exec_list_make_empty(&impl->locals);
    287    impl->num_params = 0;
    288    impl->params = NULL;
    289    impl->return_var = NULL;
    290    impl->reg_alloc = 0;
    291    impl->ssa_alloc = 0;
    292    impl->valid_metadata = nir_metadata_none;
    293 
    294    /* create start & end blocks */
    295    nir_block *start_block = nir_block_create(shader);
    296    nir_block *end_block = nir_block_create(shader);
    297    start_block->cf_node.parent = &impl->cf_node;
    298    end_block->cf_node.parent = &impl->cf_node;
    299    impl->end_block = end_block;
    300 
    301    exec_list_push_tail(&impl->body, &start_block->cf_node.node);
    302 
    303    start_block->successors[0] = end_block;
    304    _mesa_set_add(end_block->predecessors, start_block);
    305    return impl;
    306 }
    307 
    308 nir_function_impl *
    309 nir_function_impl_create(nir_function *function)
    310 {
    311    assert(function->impl == NULL);
    312 
    313    nir_function_impl *impl = nir_function_impl_create_bare(function->shader);
    314 
    315    function->impl = impl;
    316    impl->function = function;
    317 
    318    impl->num_params = function->num_params;
    319    impl->params = ralloc_array(function->shader,
    320                                nir_variable *, impl->num_params);
    321 
    322    for (unsigned i = 0; i < impl->num_params; i++) {
    323       impl->params[i] = rzalloc(function->shader, nir_variable);
    324       impl->params[i]->type = function->params[i].type;
    325       impl->params[i]->data.mode = nir_var_param;
    326       impl->params[i]->data.location = i;
    327    }
    328 
    329    if (!glsl_type_is_void(function->return_type)) {
    330       impl->return_var = rzalloc(function->shader, nir_variable);
    331       impl->return_var->type = function->return_type;
    332       impl->return_var->data.mode = nir_var_param;
    333       impl->return_var->data.location = -1;
    334    } else {
    335       impl->return_var = NULL;
    336    }
    337 
    338    return impl;
    339 }
    340 
    341 nir_block *
    342 nir_block_create(nir_shader *shader)
    343 {
    344    nir_block *block = rzalloc(shader, nir_block);
    345 
    346    cf_init(&block->cf_node, nir_cf_node_block);
    347 
    348    block->successors[0] = block->successors[1] = NULL;
    349    block->predecessors = _mesa_set_create(block, _mesa_hash_pointer,
    350                                           _mesa_key_pointer_equal);
    351    block->imm_dom = NULL;
    352    /* XXX maybe it would be worth it to defer allocation?  This
    353     * way it doesn't get allocated for shader refs that never run
    354     * nir_calc_dominance?  For example, state-tracker creates an
    355     * initial IR, clones that, runs appropriate lowering pass, passes
    356     * to driver which does common lowering/opt, and then stores ref
    357     * which is later used to do state specific lowering and futher
    358     * opt.  Do any of the references not need dominance metadata?
    359     */
    360    block->dom_frontier = _mesa_set_create(block, _mesa_hash_pointer,
    361                                           _mesa_key_pointer_equal);
    362 
    363    exec_list_make_empty(&block->instr_list);
    364 
    365    return block;
    366 }
    367 
    368 static inline void
    369 src_init(nir_src *src)
    370 {
    371    src->is_ssa = false;
    372    src->reg.reg = NULL;
    373    src->reg.indirect = NULL;
    374    src->reg.base_offset = 0;
    375 }
    376 
    377 nir_if *
    378 nir_if_create(nir_shader *shader)
    379 {
    380    nir_if *if_stmt = ralloc(shader, nir_if);
    381 
    382    cf_init(&if_stmt->cf_node, nir_cf_node_if);
    383    src_init(&if_stmt->condition);
    384 
    385    nir_block *then = nir_block_create(shader);
    386    exec_list_make_empty(&if_stmt->then_list);
    387    exec_list_push_tail(&if_stmt->then_list, &then->cf_node.node);
    388    then->cf_node.parent = &if_stmt->cf_node;
    389 
    390    nir_block *else_stmt = nir_block_create(shader);
    391    exec_list_make_empty(&if_stmt->else_list);
    392    exec_list_push_tail(&if_stmt->else_list, &else_stmt->cf_node.node);
    393    else_stmt->cf_node.parent = &if_stmt->cf_node;
    394 
    395    return if_stmt;
    396 }
    397 
    398 nir_loop *
    399 nir_loop_create(nir_shader *shader)
    400 {
    401    nir_loop *loop = rzalloc(shader, nir_loop);
    402 
    403    cf_init(&loop->cf_node, nir_cf_node_loop);
    404 
    405    nir_block *body = nir_block_create(shader);
    406    exec_list_make_empty(&loop->body);
    407    exec_list_push_tail(&loop->body, &body->cf_node.node);
    408    body->cf_node.parent = &loop->cf_node;
    409 
    410    body->successors[0] = body;
    411    _mesa_set_add(body->predecessors, body);
    412 
    413    return loop;
    414 }
    415 
    416 static void
    417 instr_init(nir_instr *instr, nir_instr_type type)
    418 {
    419    instr->type = type;
    420    instr->block = NULL;
    421    exec_node_init(&instr->node);
    422 }
    423 
    424 static void
    425 dest_init(nir_dest *dest)
    426 {
    427    dest->is_ssa = false;
    428    dest->reg.reg = NULL;
    429    dest->reg.indirect = NULL;
    430    dest->reg.base_offset = 0;
    431 }
    432 
    433 static void
    434 alu_dest_init(nir_alu_dest *dest)
    435 {
    436    dest_init(&dest->dest);
    437    dest->saturate = false;
    438    dest->write_mask = 0xf;
    439 }
    440 
    441 static void
    442 alu_src_init(nir_alu_src *src)
    443 {
    444    src_init(&src->src);
    445    src->abs = src->negate = false;
    446    src->swizzle[0] = 0;
    447    src->swizzle[1] = 1;
    448    src->swizzle[2] = 2;
    449    src->swizzle[3] = 3;
    450 }
    451 
    452 nir_alu_instr *
    453 nir_alu_instr_create(nir_shader *shader, nir_op op)
    454 {
    455    unsigned num_srcs = nir_op_infos[op].num_inputs;
    456    /* TODO: don't use rzalloc */
    457    nir_alu_instr *instr =
    458       rzalloc_size(shader,
    459                    sizeof(nir_alu_instr) + num_srcs * sizeof(nir_alu_src));
    460 
    461    instr_init(&instr->instr, nir_instr_type_alu);
    462    instr->op = op;
    463    alu_dest_init(&instr->dest);
    464    for (unsigned i = 0; i < num_srcs; i++)
    465       alu_src_init(&instr->src[i]);
    466 
    467    return instr;
    468 }
    469 
    470 nir_jump_instr *
    471 nir_jump_instr_create(nir_shader *shader, nir_jump_type type)
    472 {
    473    nir_jump_instr *instr = ralloc(shader, nir_jump_instr);
    474    instr_init(&instr->instr, nir_instr_type_jump);
    475    instr->type = type;
    476    return instr;
    477 }
    478 
    479 nir_load_const_instr *
    480 nir_load_const_instr_create(nir_shader *shader, unsigned num_components,
    481                             unsigned bit_size)
    482 {
    483    nir_load_const_instr *instr = rzalloc(shader, nir_load_const_instr);
    484    instr_init(&instr->instr, nir_instr_type_load_const);
    485 
    486    nir_ssa_def_init(&instr->instr, &instr->def, num_components, bit_size, NULL);
    487 
    488    return instr;
    489 }
    490 
    491 nir_intrinsic_instr *
    492 nir_intrinsic_instr_create(nir_shader *shader, nir_intrinsic_op op)
    493 {
    494    unsigned num_srcs = nir_intrinsic_infos[op].num_srcs;
    495    /* TODO: don't use rzalloc */
    496    nir_intrinsic_instr *instr =
    497       rzalloc_size(shader,
    498                   sizeof(nir_intrinsic_instr) + num_srcs * sizeof(nir_src));
    499 
    500    instr_init(&instr->instr, nir_instr_type_intrinsic);
    501    instr->intrinsic = op;
    502 
    503    if (nir_intrinsic_infos[op].has_dest)
    504       dest_init(&instr->dest);
    505 
    506    for (unsigned i = 0; i < num_srcs; i++)
    507       src_init(&instr->src[i]);
    508 
    509    return instr;
    510 }
    511 
    512 nir_call_instr *
    513 nir_call_instr_create(nir_shader *shader, nir_function *callee)
    514 {
    515    nir_call_instr *instr = ralloc(shader, nir_call_instr);
    516    instr_init(&instr->instr, nir_instr_type_call);
    517 
    518    instr->callee = callee;
    519    instr->num_params = callee->num_params;
    520    instr->params = ralloc_array(instr, nir_deref_var *, instr->num_params);
    521    instr->return_deref = NULL;
    522 
    523    return instr;
    524 }
    525 
    526 nir_tex_instr *
    527 nir_tex_instr_create(nir_shader *shader, unsigned num_srcs)
    528 {
    529    nir_tex_instr *instr = rzalloc(shader, nir_tex_instr);
    530    instr_init(&instr->instr, nir_instr_type_tex);
    531 
    532    dest_init(&instr->dest);
    533 
    534    instr->num_srcs = num_srcs;
    535    instr->src = ralloc_array(instr, nir_tex_src, num_srcs);
    536    for (unsigned i = 0; i < num_srcs; i++)
    537       src_init(&instr->src[i].src);
    538 
    539    instr->texture_index = 0;
    540    instr->texture_array_size = 0;
    541    instr->texture = NULL;
    542    instr->sampler_index = 0;
    543    instr->sampler = NULL;
    544 
    545    return instr;
    546 }
    547 
    548 void
    549 nir_tex_instr_add_src(nir_tex_instr *tex,
    550                       nir_tex_src_type src_type,
    551                       nir_src src)
    552 {
    553    nir_tex_src *new_srcs = rzalloc_array(tex, nir_tex_src,
    554                                          tex->num_srcs + 1);
    555 
    556    for (unsigned i = 0; i < tex->num_srcs; i++) {
    557       new_srcs[i].src_type = tex->src[i].src_type;
    558       nir_instr_move_src(&tex->instr, &new_srcs[i].src,
    559                          &tex->src[i].src);
    560    }
    561 
    562    ralloc_free(tex->src);
    563    tex->src = new_srcs;
    564 
    565    tex->src[tex->num_srcs].src_type = src_type;
    566    nir_instr_rewrite_src(&tex->instr, &tex->src[tex->num_srcs].src, src);
    567    tex->num_srcs++;
    568 }
    569 
    570 void
    571 nir_tex_instr_remove_src(nir_tex_instr *tex, unsigned src_idx)
    572 {
    573    assert(src_idx < tex->num_srcs);
    574 
    575    /* First rewrite the source to NIR_SRC_INIT */
    576    nir_instr_rewrite_src(&tex->instr, &tex->src[src_idx].src, NIR_SRC_INIT);
    577 
    578    /* Now, move all of the other sources down */
    579    for (unsigned i = src_idx + 1; i < tex->num_srcs; i++) {
    580       tex->src[i-1].src_type = tex->src[i].src_type;
    581       nir_instr_move_src(&tex->instr, &tex->src[i-1].src, &tex->src[i].src);
    582    }
    583    tex->num_srcs--;
    584 }
    585 
    586 nir_phi_instr *
    587 nir_phi_instr_create(nir_shader *shader)
    588 {
    589    nir_phi_instr *instr = ralloc(shader, nir_phi_instr);
    590    instr_init(&instr->instr, nir_instr_type_phi);
    591 
    592    dest_init(&instr->dest);
    593    exec_list_make_empty(&instr->srcs);
    594    return instr;
    595 }
    596 
    597 nir_parallel_copy_instr *
    598 nir_parallel_copy_instr_create(nir_shader *shader)
    599 {
    600    nir_parallel_copy_instr *instr = ralloc(shader, nir_parallel_copy_instr);
    601    instr_init(&instr->instr, nir_instr_type_parallel_copy);
    602 
    603    exec_list_make_empty(&instr->entries);
    604 
    605    return instr;
    606 }
    607 
    608 nir_ssa_undef_instr *
    609 nir_ssa_undef_instr_create(nir_shader *shader,
    610                            unsigned num_components,
    611                            unsigned bit_size)
    612 {
    613    nir_ssa_undef_instr *instr = ralloc(shader, nir_ssa_undef_instr);
    614    instr_init(&instr->instr, nir_instr_type_ssa_undef);
    615 
    616    nir_ssa_def_init(&instr->instr, &instr->def, num_components, bit_size, NULL);
    617 
    618    return instr;
    619 }
    620 
    621 nir_deref_var *
    622 nir_deref_var_create(void *mem_ctx, nir_variable *var)
    623 {
    624    nir_deref_var *deref = ralloc(mem_ctx, nir_deref_var);
    625    deref->deref.deref_type = nir_deref_type_var;
    626    deref->deref.child = NULL;
    627    deref->deref.type = var->type;
    628    deref->var = var;
    629    return deref;
    630 }
    631 
    632 nir_deref_array *
    633 nir_deref_array_create(void *mem_ctx)
    634 {
    635    nir_deref_array *deref = ralloc(mem_ctx, nir_deref_array);
    636    deref->deref.deref_type = nir_deref_type_array;
    637    deref->deref.child = NULL;
    638    deref->deref_array_type = nir_deref_array_type_direct;
    639    src_init(&deref->indirect);
    640    deref->base_offset = 0;
    641    return deref;
    642 }
    643 
    644 nir_deref_struct *
    645 nir_deref_struct_create(void *mem_ctx, unsigned field_index)
    646 {
    647    nir_deref_struct *deref = ralloc(mem_ctx, nir_deref_struct);
    648    deref->deref.deref_type = nir_deref_type_struct;
    649    deref->deref.child = NULL;
    650    deref->index = field_index;
    651    return deref;
    652 }
    653 
    654 nir_deref_var *
    655 nir_deref_var_clone(const nir_deref_var *deref, void *mem_ctx)
    656 {
    657    if (deref == NULL)
    658       return NULL;
    659 
    660    nir_deref_var *ret = nir_deref_var_create(mem_ctx, deref->var);
    661    ret->deref.type = deref->deref.type;
    662    if (deref->deref.child)
    663       ret->deref.child = nir_deref_clone(deref->deref.child, ret);
    664    return ret;
    665 }
    666 
    667 static nir_deref_array *
    668 deref_array_clone(const nir_deref_array *deref, void *mem_ctx)
    669 {
    670    nir_deref_array *ret = nir_deref_array_create(mem_ctx);
    671    ret->base_offset = deref->base_offset;
    672    ret->deref_array_type = deref->deref_array_type;
    673    if (deref->deref_array_type == nir_deref_array_type_indirect) {
    674       nir_src_copy(&ret->indirect, &deref->indirect, mem_ctx);
    675    }
    676    ret->deref.type = deref->deref.type;
    677    if (deref->deref.child)
    678       ret->deref.child = nir_deref_clone(deref->deref.child, ret);
    679    return ret;
    680 }
    681 
    682 static nir_deref_struct *
    683 deref_struct_clone(const nir_deref_struct *deref, void *mem_ctx)
    684 {
    685    nir_deref_struct *ret = nir_deref_struct_create(mem_ctx, deref->index);
    686    ret->deref.type = deref->deref.type;
    687    if (deref->deref.child)
    688       ret->deref.child = nir_deref_clone(deref->deref.child, ret);
    689    return ret;
    690 }
    691 
    692 nir_deref *
    693 nir_deref_clone(const nir_deref *deref, void *mem_ctx)
    694 {
    695    if (deref == NULL)
    696       return NULL;
    697 
    698    switch (deref->deref_type) {
    699    case nir_deref_type_var:
    700       return &nir_deref_var_clone(nir_deref_as_var(deref), mem_ctx)->deref;
    701    case nir_deref_type_array:
    702       return &deref_array_clone(nir_deref_as_array(deref), mem_ctx)->deref;
    703    case nir_deref_type_struct:
    704       return &deref_struct_clone(nir_deref_as_struct(deref), mem_ctx)->deref;
    705    default:
    706       unreachable("Invalid dereference type");
    707    }
    708 
    709    return NULL;
    710 }
    711 
    712 /* This is the second step in the recursion.  We've found the tail and made a
    713  * copy.  Now we need to iterate over all possible leaves and call the
    714  * callback on each one.
    715  */
    716 static bool
    717 deref_foreach_leaf_build_recur(nir_deref_var *deref, nir_deref *tail,
    718                                nir_deref_foreach_leaf_cb cb, void *state)
    719 {
    720    unsigned length;
    721    union {
    722       nir_deref_array arr;
    723       nir_deref_struct str;
    724    } tmp;
    725 
    726    assert(tail->child == NULL);
    727    switch (glsl_get_base_type(tail->type)) {
    728    case GLSL_TYPE_UINT:
    729    case GLSL_TYPE_UINT16:
    730    case GLSL_TYPE_UINT64:
    731    case GLSL_TYPE_INT:
    732    case GLSL_TYPE_INT16:
    733    case GLSL_TYPE_INT64:
    734    case GLSL_TYPE_FLOAT:
    735    case GLSL_TYPE_FLOAT16:
    736    case GLSL_TYPE_DOUBLE:
    737    case GLSL_TYPE_BOOL:
    738       if (glsl_type_is_vector_or_scalar(tail->type))
    739          return cb(deref, state);
    740       /* Fall Through */
    741 
    742    case GLSL_TYPE_ARRAY:
    743       tmp.arr.deref.deref_type = nir_deref_type_array;
    744       tmp.arr.deref.type = glsl_get_array_element(tail->type);
    745       tmp.arr.deref_array_type = nir_deref_array_type_direct;
    746       tmp.arr.indirect = NIR_SRC_INIT;
    747       tail->child = &tmp.arr.deref;
    748 
    749       length = glsl_get_length(tail->type);
    750       for (unsigned i = 0; i < length; i++) {
    751          tmp.arr.deref.child = NULL;
    752          tmp.arr.base_offset = i;
    753          if (!deref_foreach_leaf_build_recur(deref, &tmp.arr.deref, cb, state))
    754             return false;
    755       }
    756       return true;
    757 
    758    case GLSL_TYPE_STRUCT:
    759       tmp.str.deref.deref_type = nir_deref_type_struct;
    760       tail->child = &tmp.str.deref;
    761 
    762       length = glsl_get_length(tail->type);
    763       for (unsigned i = 0; i < length; i++) {
    764          tmp.arr.deref.child = NULL;
    765          tmp.str.deref.type = glsl_get_struct_field(tail->type, i);
    766          tmp.str.index = i;
    767          if (!deref_foreach_leaf_build_recur(deref, &tmp.arr.deref, cb, state))
    768             return false;
    769       }
    770       return true;
    771 
    772    default:
    773       unreachable("Invalid type for dereference");
    774    }
    775 }
    776 
    777 /* This is the first step of the foreach_leaf recursion.  In this step we are
    778  * walking to the end of the deref chain and making a copy in the stack as we
    779  * go.  This is because we don't want to mutate the deref chain that was
    780  * passed in by the caller.  The downside is that this deref chain is on the
    781  * stack and , if the caller wants to do anything with it, they will have to
    782  * make their own copy because this one will go away.
    783  */
    784 static bool
    785 deref_foreach_leaf_copy_recur(nir_deref_var *deref, nir_deref *tail,
    786                               nir_deref_foreach_leaf_cb cb, void *state)
    787 {
    788    union {
    789       nir_deref_array arr;
    790       nir_deref_struct str;
    791    } c;
    792 
    793    if (tail->child) {
    794       switch (tail->child->deref_type) {
    795       case nir_deref_type_array:
    796          c.arr = *nir_deref_as_array(tail->child);
    797          tail->child = &c.arr.deref;
    798          return deref_foreach_leaf_copy_recur(deref, &c.arr.deref, cb, state);
    799 
    800       case nir_deref_type_struct:
    801          c.str = *nir_deref_as_struct(tail->child);
    802          tail->child = &c.str.deref;
    803          return deref_foreach_leaf_copy_recur(deref, &c.str.deref, cb, state);
    804 
    805       case nir_deref_type_var:
    806       default:
    807          unreachable("Invalid deref type for a child");
    808       }
    809    } else {
    810       /* We've gotten to the end of the original deref.  Time to start
    811        * building our own derefs.
    812        */
    813       return deref_foreach_leaf_build_recur(deref, tail, cb, state);
    814    }
    815 }
    816 
    817 /**
    818  * This function iterates over all of the possible derefs that can be created
    819  * with the given deref as the head.  It then calls the provided callback with
    820  * a full deref for each one.
    821  *
    822  * The deref passed to the callback will be allocated on the stack.  You will
    823  * need to make a copy if you want it to hang around.
    824  */
    825 bool
    826 nir_deref_foreach_leaf(nir_deref_var *deref,
    827                        nir_deref_foreach_leaf_cb cb, void *state)
    828 {
    829    nir_deref_var copy = *deref;
    830    return deref_foreach_leaf_copy_recur(&copy, &copy.deref, cb, state);
    831 }
    832 
    833 /* Returns a load_const instruction that represents the constant
    834  * initializer for the given deref chain.  The caller is responsible for
    835  * ensuring that there actually is a constant initializer.
    836  */
    837 nir_load_const_instr *
    838 nir_deref_get_const_initializer_load(nir_shader *shader, nir_deref_var *deref)
    839 {
    840    nir_constant *constant = deref->var->constant_initializer;
    841    assert(constant);
    842 
    843    const nir_deref *tail = &deref->deref;
    844    unsigned matrix_col = 0;
    845    while (tail->child) {
    846       switch (tail->child->deref_type) {
    847       case nir_deref_type_array: {
    848          nir_deref_array *arr = nir_deref_as_array(tail->child);
    849          assert(arr->deref_array_type == nir_deref_array_type_direct);
    850          if (glsl_type_is_matrix(tail->type)) {
    851             assert(arr->deref.child == NULL);
    852             matrix_col = arr->base_offset;
    853          } else {
    854             constant = constant->elements[arr->base_offset];
    855          }
    856          break;
    857       }
    858 
    859       case nir_deref_type_struct: {
    860          constant = constant->elements[nir_deref_as_struct(tail->child)->index];
    861          break;
    862       }
    863 
    864       default:
    865          unreachable("Invalid deref child type");
    866       }
    867 
    868       tail = tail->child;
    869    }
    870 
    871    unsigned bit_size = glsl_get_bit_size(tail->type);
    872    nir_load_const_instr *load =
    873       nir_load_const_instr_create(shader, glsl_get_vector_elements(tail->type),
    874                                   bit_size);
    875 
    876    switch (glsl_get_base_type(tail->type)) {
    877    case GLSL_TYPE_FLOAT:
    878    case GLSL_TYPE_INT:
    879    case GLSL_TYPE_UINT:
    880    case GLSL_TYPE_FLOAT16:
    881    case GLSL_TYPE_DOUBLE:
    882    case GLSL_TYPE_INT16:
    883    case GLSL_TYPE_UINT16:
    884    case GLSL_TYPE_UINT64:
    885    case GLSL_TYPE_INT64:
    886    case GLSL_TYPE_BOOL:
    887       load->value = constant->values[matrix_col];
    888       break;
    889    default:
    890       unreachable("Invalid immediate type");
    891    }
    892 
    893    return load;
    894 }
    895 
    896 nir_function_impl *
    897 nir_cf_node_get_function(nir_cf_node *node)
    898 {
    899    while (node->type != nir_cf_node_function) {
    900       node = node->parent;
    901    }
    902 
    903    return nir_cf_node_as_function(node);
    904 }
    905 
    906 /* Reduces a cursor by trying to convert everything to after and trying to
    907  * go up to block granularity when possible.
    908  */
    909 static nir_cursor
    910 reduce_cursor(nir_cursor cursor)
    911 {
    912    switch (cursor.option) {
    913    case nir_cursor_before_block:
    914       assert(nir_cf_node_prev(&cursor.block->cf_node) == NULL ||
    915              nir_cf_node_prev(&cursor.block->cf_node)->type != nir_cf_node_block);
    916       if (exec_list_is_empty(&cursor.block->instr_list)) {
    917          /* Empty block.  After is as good as before. */
    918          cursor.option = nir_cursor_after_block;
    919       }
    920       return cursor;
    921 
    922    case nir_cursor_after_block:
    923       return cursor;
    924 
    925    case nir_cursor_before_instr: {
    926       nir_instr *prev_instr = nir_instr_prev(cursor.instr);
    927       if (prev_instr) {
    928          /* Before this instruction is after the previous */
    929          cursor.instr = prev_instr;
    930          cursor.option = nir_cursor_after_instr;
    931       } else {
    932          /* No previous instruction.  Switch to before block */
    933          cursor.block = cursor.instr->block;
    934          cursor.option = nir_cursor_before_block;
    935       }
    936       return reduce_cursor(cursor);
    937    }
    938 
    939    case nir_cursor_after_instr:
    940       if (nir_instr_next(cursor.instr) == NULL) {
    941          /* This is the last instruction, switch to after block */
    942          cursor.option = nir_cursor_after_block;
    943          cursor.block = cursor.instr->block;
    944       }
    945       return cursor;
    946 
    947    default:
    948       unreachable("Inavlid cursor option");
    949    }
    950 }
    951 
    952 bool
    953 nir_cursors_equal(nir_cursor a, nir_cursor b)
    954 {
    955    /* Reduced cursors should be unique */
    956    a = reduce_cursor(a);
    957    b = reduce_cursor(b);
    958 
    959    return a.block == b.block && a.option == b.option;
    960 }
    961 
    962 static bool
    963 add_use_cb(nir_src *src, void *state)
    964 {
    965    nir_instr *instr = state;
    966 
    967    src->parent_instr = instr;
    968    list_addtail(&src->use_link,
    969                 src->is_ssa ? &src->ssa->uses : &src->reg.reg->uses);
    970 
    971    return true;
    972 }
    973 
    974 static bool
    975 add_ssa_def_cb(nir_ssa_def *def, void *state)
    976 {
    977    nir_instr *instr = state;
    978 
    979    if (instr->block && def->index == UINT_MAX) {
    980       nir_function_impl *impl =
    981          nir_cf_node_get_function(&instr->block->cf_node);
    982 
    983       def->index = impl->ssa_alloc++;
    984    }
    985 
    986    return true;
    987 }
    988 
    989 static bool
    990 add_reg_def_cb(nir_dest *dest, void *state)
    991 {
    992    nir_instr *instr = state;
    993 
    994    if (!dest->is_ssa) {
    995       dest->reg.parent_instr = instr;
    996       list_addtail(&dest->reg.def_link, &dest->reg.reg->defs);
    997    }
    998 
    999    return true;
   1000 }
   1001 
   1002 static void
   1003 add_defs_uses(nir_instr *instr)
   1004 {
   1005    nir_foreach_src(instr, add_use_cb, instr);
   1006    nir_foreach_dest(instr, add_reg_def_cb, instr);
   1007    nir_foreach_ssa_def(instr, add_ssa_def_cb, instr);
   1008 }
   1009 
   1010 void
   1011 nir_instr_insert(nir_cursor cursor, nir_instr *instr)
   1012 {
   1013    switch (cursor.option) {
   1014    case nir_cursor_before_block:
   1015       /* Only allow inserting jumps into empty blocks. */
   1016       if (instr->type == nir_instr_type_jump)
   1017          assert(exec_list_is_empty(&cursor.block->instr_list));
   1018 
   1019       instr->block = cursor.block;
   1020       add_defs_uses(instr);
   1021       exec_list_push_head(&cursor.block->instr_list, &instr->node);
   1022       break;
   1023    case nir_cursor_after_block: {
   1024       /* Inserting instructions after a jump is illegal. */
   1025       nir_instr *last = nir_block_last_instr(cursor.block);
   1026       assert(last == NULL || last->type != nir_instr_type_jump);
   1027       (void) last;
   1028 
   1029       instr->block = cursor.block;
   1030       add_defs_uses(instr);
   1031       exec_list_push_tail(&cursor.block->instr_list, &instr->node);
   1032       break;
   1033    }
   1034    case nir_cursor_before_instr:
   1035       assert(instr->type != nir_instr_type_jump);
   1036       instr->block = cursor.instr->block;
   1037       add_defs_uses(instr);
   1038       exec_node_insert_node_before(&cursor.instr->node, &instr->node);
   1039       break;
   1040    case nir_cursor_after_instr:
   1041       /* Inserting instructions after a jump is illegal. */
   1042       assert(cursor.instr->type != nir_instr_type_jump);
   1043 
   1044       /* Only allow inserting jumps at the end of the block. */
   1045       if (instr->type == nir_instr_type_jump)
   1046          assert(cursor.instr == nir_block_last_instr(cursor.instr->block));
   1047 
   1048       instr->block = cursor.instr->block;
   1049       add_defs_uses(instr);
   1050       exec_node_insert_after(&cursor.instr->node, &instr->node);
   1051       break;
   1052    }
   1053 
   1054    if (instr->type == nir_instr_type_jump)
   1055       nir_handle_add_jump(instr->block);
   1056 }
   1057 
   1058 static bool
   1059 src_is_valid(const nir_src *src)
   1060 {
   1061    return src->is_ssa ? (src->ssa != NULL) : (src->reg.reg != NULL);
   1062 }
   1063 
   1064 static bool
   1065 remove_use_cb(nir_src *src, void *state)
   1066 {
   1067    (void) state;
   1068 
   1069    if (src_is_valid(src))
   1070       list_del(&src->use_link);
   1071 
   1072    return true;
   1073 }
   1074 
   1075 static bool
   1076 remove_def_cb(nir_dest *dest, void *state)
   1077 {
   1078    (void) state;
   1079 
   1080    if (!dest->is_ssa)
   1081       list_del(&dest->reg.def_link);
   1082 
   1083    return true;
   1084 }
   1085 
   1086 static void
   1087 remove_defs_uses(nir_instr *instr)
   1088 {
   1089    nir_foreach_dest(instr, remove_def_cb, instr);
   1090    nir_foreach_src(instr, remove_use_cb, instr);
   1091 }
   1092 
   1093 void nir_instr_remove(nir_instr *instr)
   1094 {
   1095    remove_defs_uses(instr);
   1096    exec_node_remove(&instr->node);
   1097 
   1098    if (instr->type == nir_instr_type_jump) {
   1099       nir_jump_instr *jump_instr = nir_instr_as_jump(instr);
   1100       nir_handle_remove_jump(instr->block, jump_instr->type);
   1101    }
   1102 }
   1103 
   1104 /*@}*/
   1105 
   1106 void
   1107 nir_index_local_regs(nir_function_impl *impl)
   1108 {
   1109    unsigned index = 0;
   1110    foreach_list_typed(nir_register, reg, node, &impl->registers) {
   1111       reg->index = index++;
   1112    }
   1113    impl->reg_alloc = index;
   1114 }
   1115 
   1116 void
   1117 nir_index_global_regs(nir_shader *shader)
   1118 {
   1119    unsigned index = 0;
   1120    foreach_list_typed(nir_register, reg, node, &shader->registers) {
   1121       reg->index = index++;
   1122    }
   1123    shader->reg_alloc = index;
   1124 }
   1125 
   1126 static bool
   1127 visit_alu_dest(nir_alu_instr *instr, nir_foreach_dest_cb cb, void *state)
   1128 {
   1129    return cb(&instr->dest.dest, state);
   1130 }
   1131 
   1132 static bool
   1133 visit_intrinsic_dest(nir_intrinsic_instr *instr, nir_foreach_dest_cb cb,
   1134                      void *state)
   1135 {
   1136    if (nir_intrinsic_infos[instr->intrinsic].has_dest)
   1137       return cb(&instr->dest, state);
   1138 
   1139    return true;
   1140 }
   1141 
   1142 static bool
   1143 visit_texture_dest(nir_tex_instr *instr, nir_foreach_dest_cb cb,
   1144                    void *state)
   1145 {
   1146    return cb(&instr->dest, state);
   1147 }
   1148 
   1149 static bool
   1150 visit_phi_dest(nir_phi_instr *instr, nir_foreach_dest_cb cb, void *state)
   1151 {
   1152    return cb(&instr->dest, state);
   1153 }
   1154 
   1155 static bool
   1156 visit_parallel_copy_dest(nir_parallel_copy_instr *instr,
   1157                          nir_foreach_dest_cb cb, void *state)
   1158 {
   1159    nir_foreach_parallel_copy_entry(entry, instr) {
   1160       if (!cb(&entry->dest, state))
   1161          return false;
   1162    }
   1163 
   1164    return true;
   1165 }
   1166 
   1167 bool
   1168 nir_foreach_dest(nir_instr *instr, nir_foreach_dest_cb cb, void *state)
   1169 {
   1170    switch (instr->type) {
   1171    case nir_instr_type_alu:
   1172       return visit_alu_dest(nir_instr_as_alu(instr), cb, state);
   1173    case nir_instr_type_intrinsic:
   1174       return visit_intrinsic_dest(nir_instr_as_intrinsic(instr), cb, state);
   1175    case nir_instr_type_tex:
   1176       return visit_texture_dest(nir_instr_as_tex(instr), cb, state);
   1177    case nir_instr_type_phi:
   1178       return visit_phi_dest(nir_instr_as_phi(instr), cb, state);
   1179    case nir_instr_type_parallel_copy:
   1180       return visit_parallel_copy_dest(nir_instr_as_parallel_copy(instr),
   1181                                       cb, state);
   1182 
   1183    case nir_instr_type_load_const:
   1184    case nir_instr_type_ssa_undef:
   1185    case nir_instr_type_call:
   1186    case nir_instr_type_jump:
   1187       break;
   1188 
   1189    default:
   1190       unreachable("Invalid instruction type");
   1191       break;
   1192    }
   1193 
   1194    return true;
   1195 }
   1196 
   1197 struct foreach_ssa_def_state {
   1198    nir_foreach_ssa_def_cb cb;
   1199    void *client_state;
   1200 };
   1201 
   1202 static inline bool
   1203 nir_ssa_def_visitor(nir_dest *dest, void *void_state)
   1204 {
   1205    struct foreach_ssa_def_state *state = void_state;
   1206 
   1207    if (dest->is_ssa)
   1208       return state->cb(&dest->ssa, state->client_state);
   1209    else
   1210       return true;
   1211 }
   1212 
   1213 bool
   1214 nir_foreach_ssa_def(nir_instr *instr, nir_foreach_ssa_def_cb cb, void *state)
   1215 {
   1216    switch (instr->type) {
   1217    case nir_instr_type_alu:
   1218    case nir_instr_type_tex:
   1219    case nir_instr_type_intrinsic:
   1220    case nir_instr_type_phi:
   1221    case nir_instr_type_parallel_copy: {
   1222       struct foreach_ssa_def_state foreach_state = {cb, state};
   1223       return nir_foreach_dest(instr, nir_ssa_def_visitor, &foreach_state);
   1224    }
   1225 
   1226    case nir_instr_type_load_const:
   1227       return cb(&nir_instr_as_load_const(instr)->def, state);
   1228    case nir_instr_type_ssa_undef:
   1229       return cb(&nir_instr_as_ssa_undef(instr)->def, state);
   1230    case nir_instr_type_call:
   1231    case nir_instr_type_jump:
   1232       return true;
   1233    default:
   1234       unreachable("Invalid instruction type");
   1235    }
   1236 }
   1237 
   1238 static bool
   1239 visit_src(nir_src *src, nir_foreach_src_cb cb, void *state)
   1240 {
   1241    if (!cb(src, state))
   1242       return false;
   1243    if (!src->is_ssa && src->reg.indirect)
   1244       return cb(src->reg.indirect, state);
   1245    return true;
   1246 }
   1247 
   1248 static bool
   1249 visit_deref_array_src(nir_deref_array *deref, nir_foreach_src_cb cb,
   1250                       void *state)
   1251 {
   1252    if (deref->deref_array_type == nir_deref_array_type_indirect)
   1253       return visit_src(&deref->indirect, cb, state);
   1254    return true;
   1255 }
   1256 
   1257 static bool
   1258 visit_deref_src(nir_deref_var *deref, nir_foreach_src_cb cb, void *state)
   1259 {
   1260    nir_deref *cur = &deref->deref;
   1261    while (cur != NULL) {
   1262       if (cur->deref_type == nir_deref_type_array) {
   1263          if (!visit_deref_array_src(nir_deref_as_array(cur), cb, state))
   1264             return false;
   1265       }
   1266 
   1267       cur = cur->child;
   1268    }
   1269 
   1270    return true;
   1271 }
   1272 
   1273 static bool
   1274 visit_alu_src(nir_alu_instr *instr, nir_foreach_src_cb cb, void *state)
   1275 {
   1276    for (unsigned i = 0; i < nir_op_infos[instr->op].num_inputs; i++)
   1277       if (!visit_src(&instr->src[i].src, cb, state))
   1278          return false;
   1279 
   1280    return true;
   1281 }
   1282 
   1283 static bool
   1284 visit_tex_src(nir_tex_instr *instr, nir_foreach_src_cb cb, void *state)
   1285 {
   1286    for (unsigned i = 0; i < instr->num_srcs; i++) {
   1287       if (!visit_src(&instr->src[i].src, cb, state))
   1288          return false;
   1289    }
   1290 
   1291    if (instr->texture != NULL) {
   1292       if (!visit_deref_src(instr->texture, cb, state))
   1293          return false;
   1294    }
   1295 
   1296    if (instr->sampler != NULL) {
   1297       if (!visit_deref_src(instr->sampler, cb, state))
   1298          return false;
   1299    }
   1300 
   1301    return true;
   1302 }
   1303 
   1304 static bool
   1305 visit_intrinsic_src(nir_intrinsic_instr *instr, nir_foreach_src_cb cb,
   1306                     void *state)
   1307 {
   1308    unsigned num_srcs = nir_intrinsic_infos[instr->intrinsic].num_srcs;
   1309    for (unsigned i = 0; i < num_srcs; i++) {
   1310       if (!visit_src(&instr->src[i], cb, state))
   1311          return false;
   1312    }
   1313 
   1314    unsigned num_vars =
   1315       nir_intrinsic_infos[instr->intrinsic].num_variables;
   1316    for (unsigned i = 0; i < num_vars; i++) {
   1317       if (!visit_deref_src(instr->variables[i], cb, state))
   1318          return false;
   1319    }
   1320 
   1321    return true;
   1322 }
   1323 
   1324 static bool
   1325 visit_phi_src(nir_phi_instr *instr, nir_foreach_src_cb cb, void *state)
   1326 {
   1327    nir_foreach_phi_src(src, instr) {
   1328       if (!visit_src(&src->src, cb, state))
   1329          return false;
   1330    }
   1331 
   1332    return true;
   1333 }
   1334 
   1335 static bool
   1336 visit_parallel_copy_src(nir_parallel_copy_instr *instr,
   1337                         nir_foreach_src_cb cb, void *state)
   1338 {
   1339    nir_foreach_parallel_copy_entry(entry, instr) {
   1340       if (!visit_src(&entry->src, cb, state))
   1341          return false;
   1342    }
   1343 
   1344    return true;
   1345 }
   1346 
   1347 typedef struct {
   1348    void *state;
   1349    nir_foreach_src_cb cb;
   1350 } visit_dest_indirect_state;
   1351 
   1352 static bool
   1353 visit_dest_indirect(nir_dest *dest, void *_state)
   1354 {
   1355    visit_dest_indirect_state *state = (visit_dest_indirect_state *) _state;
   1356 
   1357    if (!dest->is_ssa && dest->reg.indirect)
   1358       return state->cb(dest->reg.indirect, state->state);
   1359 
   1360    return true;
   1361 }
   1362 
   1363 bool
   1364 nir_foreach_src(nir_instr *instr, nir_foreach_src_cb cb, void *state)
   1365 {
   1366    switch (instr->type) {
   1367    case nir_instr_type_alu:
   1368       if (!visit_alu_src(nir_instr_as_alu(instr), cb, state))
   1369          return false;
   1370       break;
   1371    case nir_instr_type_intrinsic:
   1372       if (!visit_intrinsic_src(nir_instr_as_intrinsic(instr), cb, state))
   1373          return false;
   1374       break;
   1375    case nir_instr_type_tex:
   1376       if (!visit_tex_src(nir_instr_as_tex(instr), cb, state))
   1377          return false;
   1378       break;
   1379    case nir_instr_type_call:
   1380       /* Call instructions have no regular sources */
   1381       break;
   1382    case nir_instr_type_load_const:
   1383       /* Constant load instructions have no regular sources */
   1384       break;
   1385    case nir_instr_type_phi:
   1386       if (!visit_phi_src(nir_instr_as_phi(instr), cb, state))
   1387          return false;
   1388       break;
   1389    case nir_instr_type_parallel_copy:
   1390       if (!visit_parallel_copy_src(nir_instr_as_parallel_copy(instr),
   1391                                    cb, state))
   1392          return false;
   1393       break;
   1394    case nir_instr_type_jump:
   1395    case nir_instr_type_ssa_undef:
   1396       return true;
   1397 
   1398    default:
   1399       unreachable("Invalid instruction type");
   1400       break;
   1401    }
   1402 
   1403    visit_dest_indirect_state dest_state;
   1404    dest_state.state = state;
   1405    dest_state.cb = cb;
   1406    return nir_foreach_dest(instr, visit_dest_indirect, &dest_state);
   1407 }
   1408 
   1409 nir_const_value *
   1410 nir_src_as_const_value(nir_src src)
   1411 {
   1412    if (!src.is_ssa)
   1413       return NULL;
   1414 
   1415    if (src.ssa->parent_instr->type != nir_instr_type_load_const)
   1416       return NULL;
   1417 
   1418    nir_load_const_instr *load = nir_instr_as_load_const(src.ssa->parent_instr);
   1419 
   1420    return &load->value;
   1421 }
   1422 
   1423 /**
   1424  * Returns true if the source is known to be dynamically uniform. Otherwise it
   1425  * returns false which means it may or may not be dynamically uniform but it
   1426  * can't be determined.
   1427  */
   1428 bool
   1429 nir_src_is_dynamically_uniform(nir_src src)
   1430 {
   1431    if (!src.is_ssa)
   1432       return false;
   1433 
   1434    /* Constants are trivially dynamically uniform */
   1435    if (src.ssa->parent_instr->type == nir_instr_type_load_const)
   1436       return true;
   1437 
   1438    /* As are uniform variables */
   1439    if (src.ssa->parent_instr->type == nir_instr_type_intrinsic) {
   1440       nir_intrinsic_instr *intr = nir_instr_as_intrinsic(src.ssa->parent_instr);
   1441 
   1442       if (intr->intrinsic == nir_intrinsic_load_uniform)
   1443          return true;
   1444    }
   1445 
   1446    /* XXX: this could have many more tests, such as when a sampler function is
   1447     * called with dynamically uniform arguments.
   1448     */
   1449    return false;
   1450 }
   1451 
   1452 static void
   1453 src_remove_all_uses(nir_src *src)
   1454 {
   1455    for (; src; src = src->is_ssa ? NULL : src->reg.indirect) {
   1456       if (!src_is_valid(src))
   1457          continue;
   1458 
   1459       list_del(&src->use_link);
   1460    }
   1461 }
   1462 
   1463 static void
   1464 src_add_all_uses(nir_src *src, nir_instr *parent_instr, nir_if *parent_if)
   1465 {
   1466    for (; src; src = src->is_ssa ? NULL : src->reg.indirect) {
   1467       if (!src_is_valid(src))
   1468          continue;
   1469 
   1470       if (parent_instr) {
   1471          src->parent_instr = parent_instr;
   1472          if (src->is_ssa)
   1473             list_addtail(&src->use_link, &src->ssa->uses);
   1474          else
   1475             list_addtail(&src->use_link, &src->reg.reg->uses);
   1476       } else {
   1477          assert(parent_if);
   1478          src->parent_if = parent_if;
   1479          if (src->is_ssa)
   1480             list_addtail(&src->use_link, &src->ssa->if_uses);
   1481          else
   1482             list_addtail(&src->use_link, &src->reg.reg->if_uses);
   1483       }
   1484    }
   1485 }
   1486 
   1487 void
   1488 nir_instr_rewrite_src(nir_instr *instr, nir_src *src, nir_src new_src)
   1489 {
   1490    assert(!src_is_valid(src) || src->parent_instr == instr);
   1491 
   1492    src_remove_all_uses(src);
   1493    *src = new_src;
   1494    src_add_all_uses(src, instr, NULL);
   1495 }
   1496 
   1497 void
   1498 nir_instr_move_src(nir_instr *dest_instr, nir_src *dest, nir_src *src)
   1499 {
   1500    assert(!src_is_valid(dest) || dest->parent_instr == dest_instr);
   1501 
   1502    src_remove_all_uses(dest);
   1503    src_remove_all_uses(src);
   1504    *dest = *src;
   1505    *src = NIR_SRC_INIT;
   1506    src_add_all_uses(dest, dest_instr, NULL);
   1507 }
   1508 
   1509 void
   1510 nir_if_rewrite_condition(nir_if *if_stmt, nir_src new_src)
   1511 {
   1512    nir_src *src = &if_stmt->condition;
   1513    assert(!src_is_valid(src) || src->parent_if == if_stmt);
   1514 
   1515    src_remove_all_uses(src);
   1516    *src = new_src;
   1517    src_add_all_uses(src, NULL, if_stmt);
   1518 }
   1519 
   1520 void
   1521 nir_instr_rewrite_dest(nir_instr *instr, nir_dest *dest, nir_dest new_dest)
   1522 {
   1523    if (dest->is_ssa) {
   1524       /* We can only overwrite an SSA destination if it has no uses. */
   1525       assert(list_empty(&dest->ssa.uses) && list_empty(&dest->ssa.if_uses));
   1526    } else {
   1527       list_del(&dest->reg.def_link);
   1528       if (dest->reg.indirect)
   1529          src_remove_all_uses(dest->reg.indirect);
   1530    }
   1531 
   1532    /* We can't re-write with an SSA def */
   1533    assert(!new_dest.is_ssa);
   1534 
   1535    nir_dest_copy(dest, &new_dest, instr);
   1536 
   1537    dest->reg.parent_instr = instr;
   1538    list_addtail(&dest->reg.def_link, &new_dest.reg.reg->defs);
   1539 
   1540    if (dest->reg.indirect)
   1541       src_add_all_uses(dest->reg.indirect, instr, NULL);
   1542 }
   1543 
   1544 void
   1545 nir_instr_rewrite_deref(nir_instr *instr, nir_deref_var **deref,
   1546                         nir_deref_var *new_deref)
   1547 {
   1548    if (*deref)
   1549       visit_deref_src(*deref, remove_use_cb, NULL);
   1550 
   1551    *deref = new_deref;
   1552 
   1553    if (*deref)
   1554       visit_deref_src(*deref, add_use_cb, instr);
   1555 }
   1556 
   1557 /* note: does *not* take ownership of 'name' */
   1558 void
   1559 nir_ssa_def_init(nir_instr *instr, nir_ssa_def *def,
   1560                  unsigned num_components,
   1561                  unsigned bit_size, const char *name)
   1562 {
   1563    def->name = ralloc_strdup(instr, name);
   1564    def->parent_instr = instr;
   1565    list_inithead(&def->uses);
   1566    list_inithead(&def->if_uses);
   1567    def->num_components = num_components;
   1568    def->bit_size = bit_size;
   1569 
   1570    if (instr->block) {
   1571       nir_function_impl *impl =
   1572          nir_cf_node_get_function(&instr->block->cf_node);
   1573 
   1574       def->index = impl->ssa_alloc++;
   1575    } else {
   1576       def->index = UINT_MAX;
   1577    }
   1578 }
   1579 
   1580 /* note: does *not* take ownership of 'name' */
   1581 void
   1582 nir_ssa_dest_init(nir_instr *instr, nir_dest *dest,
   1583                  unsigned num_components, unsigned bit_size,
   1584                  const char *name)
   1585 {
   1586    dest->is_ssa = true;
   1587    nir_ssa_def_init(instr, &dest->ssa, num_components, bit_size, name);
   1588 }
   1589 
   1590 void
   1591 nir_ssa_def_rewrite_uses(nir_ssa_def *def, nir_src new_src)
   1592 {
   1593    assert(!new_src.is_ssa || def != new_src.ssa);
   1594 
   1595    nir_foreach_use_safe(use_src, def)
   1596       nir_instr_rewrite_src(use_src->parent_instr, use_src, new_src);
   1597 
   1598    nir_foreach_if_use_safe(use_src, def)
   1599       nir_if_rewrite_condition(use_src->parent_if, new_src);
   1600 }
   1601 
   1602 static bool
   1603 is_instr_between(nir_instr *start, nir_instr *end, nir_instr *between)
   1604 {
   1605    assert(start->block == end->block);
   1606 
   1607    if (between->block != start->block)
   1608       return false;
   1609 
   1610    /* Search backwards looking for "between" */
   1611    while (start != end) {
   1612       if (between == end)
   1613          return true;
   1614 
   1615       end = nir_instr_prev(end);
   1616       assert(end);
   1617    }
   1618 
   1619    return false;
   1620 }
   1621 
   1622 /* Replaces all uses of the given SSA def with the given source but only if
   1623  * the use comes after the after_me instruction.  This can be useful if you
   1624  * are emitting code to fix up the result of some instruction: you can freely
   1625  * use the result in that code and then call rewrite_uses_after and pass the
   1626  * last fixup instruction as after_me and it will replace all of the uses you
   1627  * want without touching the fixup code.
   1628  *
   1629  * This function assumes that after_me is in the same block as
   1630  * def->parent_instr and that after_me comes after def->parent_instr.
   1631  */
   1632 void
   1633 nir_ssa_def_rewrite_uses_after(nir_ssa_def *def, nir_src new_src,
   1634                                nir_instr *after_me)
   1635 {
   1636    assert(!new_src.is_ssa || def != new_src.ssa);
   1637 
   1638    nir_foreach_use_safe(use_src, def) {
   1639       assert(use_src->parent_instr != def->parent_instr);
   1640       /* Since def already dominates all of its uses, the only way a use can
   1641        * not be dominated by after_me is if it is between def and after_me in
   1642        * the instruction list.
   1643        */
   1644       if (!is_instr_between(def->parent_instr, after_me, use_src->parent_instr))
   1645          nir_instr_rewrite_src(use_src->parent_instr, use_src, new_src);
   1646    }
   1647 
   1648    nir_foreach_if_use_safe(use_src, def)
   1649       nir_if_rewrite_condition(use_src->parent_if, new_src);
   1650 }
   1651 
   1652 uint8_t
   1653 nir_ssa_def_components_read(const nir_ssa_def *def)
   1654 {
   1655    uint8_t read_mask = 0;
   1656    nir_foreach_use(use, def) {
   1657       if (use->parent_instr->type == nir_instr_type_alu) {
   1658          nir_alu_instr *alu = nir_instr_as_alu(use->parent_instr);
   1659          nir_alu_src *alu_src = exec_node_data(nir_alu_src, use, src);
   1660          int src_idx = alu_src - &alu->src[0];
   1661          assert(src_idx >= 0 && src_idx < nir_op_infos[alu->op].num_inputs);
   1662 
   1663          for (unsigned c = 0; c < 4; c++) {
   1664             if (!nir_alu_instr_channel_used(alu, src_idx, c))
   1665                continue;
   1666 
   1667             read_mask |= (1 << alu_src->swizzle[c]);
   1668          }
   1669       } else {
   1670          return (1 << def->num_components) - 1;
   1671       }
   1672    }
   1673 
   1674    return read_mask;
   1675 }
   1676 
   1677 nir_block *
   1678 nir_block_cf_tree_next(nir_block *block)
   1679 {
   1680    if (block == NULL) {
   1681       /* nir_foreach_block_safe() will call this function on a NULL block
   1682        * after the last iteration, but it won't use the result so just return
   1683        * NULL here.
   1684        */
   1685       return NULL;
   1686    }
   1687 
   1688    nir_cf_node *cf_next = nir_cf_node_next(&block->cf_node);
   1689    if (cf_next)
   1690       return nir_cf_node_cf_tree_first(cf_next);
   1691 
   1692    nir_cf_node *parent = block->cf_node.parent;
   1693 
   1694    switch (parent->type) {
   1695    case nir_cf_node_if: {
   1696       /* Are we at the end of the if? Go to the beginning of the else */
   1697       nir_if *if_stmt = nir_cf_node_as_if(parent);
   1698       if (block == nir_if_last_then_block(if_stmt))
   1699          return nir_if_first_else_block(if_stmt);
   1700 
   1701       assert(block == nir_if_last_else_block(if_stmt));
   1702       /* fall through */
   1703    }
   1704 
   1705    case nir_cf_node_loop:
   1706       return nir_cf_node_as_block(nir_cf_node_next(parent));
   1707 
   1708    case nir_cf_node_function:
   1709       return NULL;
   1710 
   1711    default:
   1712       unreachable("unknown cf node type");
   1713    }
   1714 }
   1715 
   1716 nir_block *
   1717 nir_block_cf_tree_prev(nir_block *block)
   1718 {
   1719    if (block == NULL) {
   1720       /* do this for consistency with nir_block_cf_tree_next() */
   1721       return NULL;
   1722    }
   1723 
   1724    nir_cf_node *cf_prev = nir_cf_node_prev(&block->cf_node);
   1725    if (cf_prev)
   1726       return nir_cf_node_cf_tree_last(cf_prev);
   1727 
   1728    nir_cf_node *parent = block->cf_node.parent;
   1729 
   1730    switch (parent->type) {
   1731    case nir_cf_node_if: {
   1732       /* Are we at the beginning of the else? Go to the end of the if */
   1733       nir_if *if_stmt = nir_cf_node_as_if(parent);
   1734       if (block == nir_if_first_else_block(if_stmt))
   1735          return nir_if_last_then_block(if_stmt);
   1736 
   1737       assert(block == nir_if_first_then_block(if_stmt));
   1738       /* fall through */
   1739    }
   1740 
   1741    case nir_cf_node_loop:
   1742       return nir_cf_node_as_block(nir_cf_node_prev(parent));
   1743 
   1744    case nir_cf_node_function:
   1745       return NULL;
   1746 
   1747    default:
   1748       unreachable("unknown cf node type");
   1749    }
   1750 }
   1751 
   1752 nir_block *nir_cf_node_cf_tree_first(nir_cf_node *node)
   1753 {
   1754    switch (node->type) {
   1755    case nir_cf_node_function: {
   1756       nir_function_impl *impl = nir_cf_node_as_function(node);
   1757       return nir_start_block(impl);
   1758    }
   1759 
   1760    case nir_cf_node_if: {
   1761       nir_if *if_stmt = nir_cf_node_as_if(node);
   1762       return nir_if_first_then_block(if_stmt);
   1763    }
   1764 
   1765    case nir_cf_node_loop: {
   1766       nir_loop *loop = nir_cf_node_as_loop(node);
   1767       return nir_loop_first_block(loop);
   1768    }
   1769 
   1770    case nir_cf_node_block: {
   1771       return nir_cf_node_as_block(node);
   1772    }
   1773 
   1774    default:
   1775       unreachable("unknown node type");
   1776    }
   1777 }
   1778 
   1779 nir_block *nir_cf_node_cf_tree_last(nir_cf_node *node)
   1780 {
   1781    switch (node->type) {
   1782    case nir_cf_node_function: {
   1783       nir_function_impl *impl = nir_cf_node_as_function(node);
   1784       return nir_impl_last_block(impl);
   1785    }
   1786 
   1787    case nir_cf_node_if: {
   1788       nir_if *if_stmt = nir_cf_node_as_if(node);
   1789       return nir_if_last_else_block(if_stmt);
   1790    }
   1791 
   1792    case nir_cf_node_loop: {
   1793       nir_loop *loop = nir_cf_node_as_loop(node);
   1794       return nir_loop_last_block(loop);
   1795    }
   1796 
   1797    case nir_cf_node_block: {
   1798       return nir_cf_node_as_block(node);
   1799    }
   1800 
   1801    default:
   1802       unreachable("unknown node type");
   1803    }
   1804 }
   1805 
   1806 nir_block *nir_cf_node_cf_tree_next(nir_cf_node *node)
   1807 {
   1808    if (node->type == nir_cf_node_block)
   1809       return nir_block_cf_tree_next(nir_cf_node_as_block(node));
   1810    else if (node->type == nir_cf_node_function)
   1811       return NULL;
   1812    else
   1813       return nir_cf_node_as_block(nir_cf_node_next(node));
   1814 }
   1815 
   1816 nir_if *
   1817 nir_block_get_following_if(nir_block *block)
   1818 {
   1819    if (exec_node_is_tail_sentinel(&block->cf_node.node))
   1820       return NULL;
   1821 
   1822    if (nir_cf_node_is_last(&block->cf_node))
   1823       return NULL;
   1824 
   1825    nir_cf_node *next_node = nir_cf_node_next(&block->cf_node);
   1826 
   1827    if (next_node->type != nir_cf_node_if)
   1828       return NULL;
   1829 
   1830    return nir_cf_node_as_if(next_node);
   1831 }
   1832 
   1833 nir_loop *
   1834 nir_block_get_following_loop(nir_block *block)
   1835 {
   1836    if (exec_node_is_tail_sentinel(&block->cf_node.node))
   1837       return NULL;
   1838 
   1839    if (nir_cf_node_is_last(&block->cf_node))
   1840       return NULL;
   1841 
   1842    nir_cf_node *next_node = nir_cf_node_next(&block->cf_node);
   1843 
   1844    if (next_node->type != nir_cf_node_loop)
   1845       return NULL;
   1846 
   1847    return nir_cf_node_as_loop(next_node);
   1848 }
   1849 
   1850 void
   1851 nir_index_blocks(nir_function_impl *impl)
   1852 {
   1853    unsigned index = 0;
   1854 
   1855    if (impl->valid_metadata & nir_metadata_block_index)
   1856       return;
   1857 
   1858    nir_foreach_block(block, impl) {
   1859       block->index = index++;
   1860    }
   1861 
   1862    impl->num_blocks = index;
   1863 }
   1864 
   1865 static bool
   1866 index_ssa_def_cb(nir_ssa_def *def, void *state)
   1867 {
   1868    unsigned *index = (unsigned *) state;
   1869    def->index = (*index)++;
   1870 
   1871    return true;
   1872 }
   1873 
   1874 /**
   1875  * The indices are applied top-to-bottom which has the very nice property
   1876  * that, if A dominates B, then A->index <= B->index.
   1877  */
   1878 void
   1879 nir_index_ssa_defs(nir_function_impl *impl)
   1880 {
   1881    unsigned index = 0;
   1882 
   1883    nir_foreach_block(block, impl) {
   1884       nir_foreach_instr(instr, block)
   1885          nir_foreach_ssa_def(instr, index_ssa_def_cb, &index);
   1886    }
   1887 
   1888    impl->ssa_alloc = index;
   1889 }
   1890 
   1891 /**
   1892  * The indices are applied top-to-bottom which has the very nice property
   1893  * that, if A dominates B, then A->index <= B->index.
   1894  */
   1895 unsigned
   1896 nir_index_instrs(nir_function_impl *impl)
   1897 {
   1898    unsigned index = 0;
   1899 
   1900    nir_foreach_block(block, impl) {
   1901       nir_foreach_instr(instr, block)
   1902          instr->index = index++;
   1903    }
   1904 
   1905    return index;
   1906 }
   1907 
   1908 nir_intrinsic_op
   1909 nir_intrinsic_from_system_value(gl_system_value val)
   1910 {
   1911    switch (val) {
   1912    case SYSTEM_VALUE_VERTEX_ID:
   1913       return nir_intrinsic_load_vertex_id;
   1914    case SYSTEM_VALUE_INSTANCE_ID:
   1915       return nir_intrinsic_load_instance_id;
   1916    case SYSTEM_VALUE_DRAW_ID:
   1917       return nir_intrinsic_load_draw_id;
   1918    case SYSTEM_VALUE_BASE_INSTANCE:
   1919       return nir_intrinsic_load_base_instance;
   1920    case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:
   1921       return nir_intrinsic_load_vertex_id_zero_base;
   1922    case SYSTEM_VALUE_BASE_VERTEX:
   1923       return nir_intrinsic_load_base_vertex;
   1924    case SYSTEM_VALUE_INVOCATION_ID:
   1925       return nir_intrinsic_load_invocation_id;
   1926    case SYSTEM_VALUE_FRAG_COORD:
   1927       return nir_intrinsic_load_frag_coord;
   1928    case SYSTEM_VALUE_FRONT_FACE:
   1929       return nir_intrinsic_load_front_face;
   1930    case SYSTEM_VALUE_SAMPLE_ID:
   1931       return nir_intrinsic_load_sample_id;
   1932    case SYSTEM_VALUE_SAMPLE_POS:
   1933       return nir_intrinsic_load_sample_pos;
   1934    case SYSTEM_VALUE_SAMPLE_MASK_IN:
   1935       return nir_intrinsic_load_sample_mask_in;
   1936    case SYSTEM_VALUE_LOCAL_INVOCATION_ID:
   1937       return nir_intrinsic_load_local_invocation_id;
   1938    case SYSTEM_VALUE_LOCAL_INVOCATION_INDEX:
   1939       return nir_intrinsic_load_local_invocation_index;
   1940    case SYSTEM_VALUE_WORK_GROUP_ID:
   1941       return nir_intrinsic_load_work_group_id;
   1942    case SYSTEM_VALUE_NUM_WORK_GROUPS:
   1943       return nir_intrinsic_load_num_work_groups;
   1944    case SYSTEM_VALUE_PRIMITIVE_ID:
   1945       return nir_intrinsic_load_primitive_id;
   1946    case SYSTEM_VALUE_TESS_COORD:
   1947       return nir_intrinsic_load_tess_coord;
   1948    case SYSTEM_VALUE_TESS_LEVEL_OUTER:
   1949       return nir_intrinsic_load_tess_level_outer;
   1950    case SYSTEM_VALUE_TESS_LEVEL_INNER:
   1951       return nir_intrinsic_load_tess_level_inner;
   1952    case SYSTEM_VALUE_VERTICES_IN:
   1953       return nir_intrinsic_load_patch_vertices_in;
   1954    case SYSTEM_VALUE_HELPER_INVOCATION:
   1955       return nir_intrinsic_load_helper_invocation;
   1956    case SYSTEM_VALUE_VIEW_INDEX:
   1957       return nir_intrinsic_load_view_index;
   1958    case SYSTEM_VALUE_SUBGROUP_SIZE:
   1959       return nir_intrinsic_load_subgroup_size;
   1960    case SYSTEM_VALUE_SUBGROUP_INVOCATION:
   1961       return nir_intrinsic_load_subgroup_invocation;
   1962    case SYSTEM_VALUE_SUBGROUP_EQ_MASK:
   1963       return nir_intrinsic_load_subgroup_eq_mask;
   1964    case SYSTEM_VALUE_SUBGROUP_GE_MASK:
   1965       return nir_intrinsic_load_subgroup_ge_mask;
   1966    case SYSTEM_VALUE_SUBGROUP_GT_MASK:
   1967       return nir_intrinsic_load_subgroup_gt_mask;
   1968    case SYSTEM_VALUE_SUBGROUP_LE_MASK:
   1969       return nir_intrinsic_load_subgroup_le_mask;
   1970    case SYSTEM_VALUE_SUBGROUP_LT_MASK:
   1971       return nir_intrinsic_load_subgroup_lt_mask;
   1972    case SYSTEM_VALUE_LOCAL_GROUP_SIZE:
   1973       return nir_intrinsic_load_local_group_size;
   1974    default:
   1975       unreachable("system value does not directly correspond to intrinsic");
   1976    }
   1977 }
   1978 
   1979 gl_system_value
   1980 nir_system_value_from_intrinsic(nir_intrinsic_op intrin)
   1981 {
   1982    switch (intrin) {
   1983    case nir_intrinsic_load_vertex_id:
   1984       return SYSTEM_VALUE_VERTEX_ID;
   1985    case nir_intrinsic_load_instance_id:
   1986       return SYSTEM_VALUE_INSTANCE_ID;
   1987    case nir_intrinsic_load_draw_id:
   1988       return SYSTEM_VALUE_DRAW_ID;
   1989    case nir_intrinsic_load_base_instance:
   1990       return SYSTEM_VALUE_BASE_INSTANCE;
   1991    case nir_intrinsic_load_vertex_id_zero_base:
   1992       return SYSTEM_VALUE_VERTEX_ID_ZERO_BASE;
   1993    case nir_intrinsic_load_base_vertex:
   1994       return SYSTEM_VALUE_BASE_VERTEX;
   1995    case nir_intrinsic_load_invocation_id:
   1996       return SYSTEM_VALUE_INVOCATION_ID;
   1997    case nir_intrinsic_load_frag_coord:
   1998       return SYSTEM_VALUE_FRAG_COORD;
   1999    case nir_intrinsic_load_front_face:
   2000       return SYSTEM_VALUE_FRONT_FACE;
   2001    case nir_intrinsic_load_sample_id:
   2002       return SYSTEM_VALUE_SAMPLE_ID;
   2003    case nir_intrinsic_load_sample_pos:
   2004       return SYSTEM_VALUE_SAMPLE_POS;
   2005    case nir_intrinsic_load_sample_mask_in:
   2006       return SYSTEM_VALUE_SAMPLE_MASK_IN;
   2007    case nir_intrinsic_load_local_invocation_id:
   2008       return SYSTEM_VALUE_LOCAL_INVOCATION_ID;
   2009    case nir_intrinsic_load_local_invocation_index:
   2010       return SYSTEM_VALUE_LOCAL_INVOCATION_INDEX;
   2011    case nir_intrinsic_load_num_work_groups:
   2012       return SYSTEM_VALUE_NUM_WORK_GROUPS;
   2013    case nir_intrinsic_load_work_group_id:
   2014       return SYSTEM_VALUE_WORK_GROUP_ID;
   2015    case nir_intrinsic_load_primitive_id:
   2016       return SYSTEM_VALUE_PRIMITIVE_ID;
   2017    case nir_intrinsic_load_tess_coord:
   2018       return SYSTEM_VALUE_TESS_COORD;
   2019    case nir_intrinsic_load_tess_level_outer:
   2020       return SYSTEM_VALUE_TESS_LEVEL_OUTER;
   2021    case nir_intrinsic_load_tess_level_inner:
   2022       return SYSTEM_VALUE_TESS_LEVEL_INNER;
   2023    case nir_intrinsic_load_patch_vertices_in:
   2024       return SYSTEM_VALUE_VERTICES_IN;
   2025    case nir_intrinsic_load_helper_invocation:
   2026       return SYSTEM_VALUE_HELPER_INVOCATION;
   2027    case nir_intrinsic_load_view_index:
   2028       return SYSTEM_VALUE_VIEW_INDEX;
   2029    case nir_intrinsic_load_subgroup_size:
   2030       return SYSTEM_VALUE_SUBGROUP_SIZE;
   2031    case nir_intrinsic_load_subgroup_invocation:
   2032       return SYSTEM_VALUE_SUBGROUP_INVOCATION;
   2033    case nir_intrinsic_load_subgroup_eq_mask:
   2034       return SYSTEM_VALUE_SUBGROUP_EQ_MASK;
   2035    case nir_intrinsic_load_subgroup_ge_mask:
   2036       return SYSTEM_VALUE_SUBGROUP_GE_MASK;
   2037    case nir_intrinsic_load_subgroup_gt_mask:
   2038       return SYSTEM_VALUE_SUBGROUP_GT_MASK;
   2039    case nir_intrinsic_load_subgroup_le_mask:
   2040       return SYSTEM_VALUE_SUBGROUP_LE_MASK;
   2041    case nir_intrinsic_load_subgroup_lt_mask:
   2042       return SYSTEM_VALUE_SUBGROUP_LT_MASK;
   2043    case nir_intrinsic_load_local_group_size:
   2044       return SYSTEM_VALUE_LOCAL_GROUP_SIZE;
   2045    default:
   2046       unreachable("intrinsic doesn't produce a system value");
   2047    }
   2048 }
   2049