Lines Matching defs:instr
53 match_expression(const nir_algebraic_table *table, const nir_search_expression *expr, nir_alu_instr *instr,
57 nir_algebraic_automaton(nir_instr *instr, struct util_dynarray *states,
257 const nir_search_value *value, nir_alu_instr *instr, unsigned src,
270 assert(instr->src[src].src.is_ssa);
275 if (nir_op_infos[instr->op].input_sizes[src] != 0) {
276 num_components = nir_op_infos[instr->op].input_sizes[src];
281 new_swizzle[i] = instr->src[src].swizzle[swizzle[i]];
285 nir_src_bit_size(instr->src[src].src) != value->bit_size)
290 if (instr->src[src].src.ssa->parent_instr->type != nir_instr_type_alu)
294 nir_instr_as_alu(instr->src[src].src.ssa->parent_instr),
302 if (state->variables[var->variable].src.ssa != instr->src[src].src.ssa)
305 assert(!instr->src[src].abs && !instr->src[src].negate);
315 instr->src[src].src.ssa->parent_instr->type != nir_instr_type_load_const)
318 if (var->cond_index != -1 && !table->variable_cond[var->cond_index](state->range_ht, instr,
323 !src_is_type(instr->src[src].src, var->type))
327 state->variables[var->variable].src = instr->src[src].src;
345 if (!nir_src_is_const(instr->src[src].src))
351 nir_instr_as_load_const(instr->src[src].src.ssa->parent_instr);
361 double val = nir_src_comp_as_float(instr->src[src].src,
372 unsigned bit_size = nir_src_bit_size(instr->src[src].src);
375 uint64_t val = nir_src_comp_as_uint(instr->src[src].src,
394 match_expression(const nir_algebraic_table *table, const nir_search_expression *expr, nir_alu_instr *instr,
398 if (expr->cond_index != -1 && !table->expression_cond[expr->cond_index](instr))
401 if (!nir_op_matches_search_op(instr->op, expr->opcode))
404 assert(instr->dest.dest.is_ssa);
407 instr->dest.dest.ssa.bit_size != expr->value.bit_size)
411 state->has_exact_alu = (instr->exact && !expr->ignore_exact) || state->has_exact_alu;
415 assert(!instr->dest.saturate);
416 assert(nir_op_infos[instr->op].num_inputs > 0);
424 if (nir_op_infos[instr->op].output_size != 0) {
441 for (unsigned i = 0; i < nir_op_infos[instr->op].num_inputs; i++) {
445 if (!match_value(table, &state->table->values[expr->srcs[i]].value, instr,
472 nir_instr *instr)
484 nir_ssa_dest_init(&alu->instr, &alu->dest.dest, num_components,
505 state, instr);
508 nir_builder_instr_insert(build, &alu->instr);
513 nir_algebraic_automaton(&alu->instr, state->states, state->pass_op_table);
652 add_uses_to_worklist(nir_instr *instr,
657 nir_ssa_def *def = nir_instr_ssa_def(instr);
679 nir_instr *instr;
680 while ((instr = nir_instr_worklist_pop_head(automaton_worklist))) {
681 nir_instr_worklist_push_tail(algebraic_worklist, instr);
682 add_uses_to_worklist(instr, automaton_worklist, states, pass_op_table);
689 nir_replace_instr(nir_builder *build, nir_alu_instr *instr,
699 for (unsigned i = 0; i < instr->dest.dest.ssa.num_components; ++i)
702 assert(instr->dest.dest.is_ssa);
724 if (match_expression(table, search, instr,
725 instr->dest.dest.ssa.num_components,
739 fprintf(stderr, " ssa_%d\n", instr->dest.dest.ssa.index);
759 nir_alu_instr *const src_instr = nir_src_as_alu_instr(instr->src[0].src);
761 (instr->op == nir_op_fneg || instr->op == nir_op_fabs ||
762 instr->op == nir_op_ineg || instr->op == nir_op_iabs ||
763 instr->op == nir_op_inot)) {
773 build->cursor = nir_after_instr(&src_instr->instr);
775 build->cursor = nir_before_instr(&instr->instr);
781 instr->dest.dest.ssa.num_components,
782 instr->dest.dest.ssa.bit_size,
783 &state, &instr->instr);
789 nir_mov_alu(build, val, instr->dest.dest.ssa.num_components);
798 nir_ssa_def_rewrite_uses(&instr->dest.dest.ssa, ssa_val);
802 /* Nothing uses the instr any more, so drop it out of the program. Note
803 * that the instr may be in the worklist still, so we can't free it
806 nir_instr_remove(&instr->instr);
812 nir_algebraic_automaton(nir_instr *instr, struct util_dynarray *states,
815 switch (instr->type) {
817 nir_alu_instr *alu = nir_instr_as_alu(instr);
847 nir_load_const_instr *load_const = nir_instr_as_load_const(instr);
863 nir_algebraic_instr(nir_builder *build, nir_instr *instr,
871 if (instr->type != nir_instr_type_alu)
874 nir_alu_instr *alu = nir_instr_as_alu(instr);
930 nir_foreach_instr(instr, block) {
931 nir_algebraic_automaton(instr, &states, table->pass_op_table);
935 /* Put our instrs in the worklist such that we're popping the last instr
940 nir_foreach_instr_reverse(instr, block) {
941 if (instr->type == nir_instr_type_alu)
942 nir_instr_worklist_push_tail(worklist, instr);
946 nir_instr *instr;
947 while ((instr = nir_instr_worklist_pop_head(worklist))) {
948 /* The worklist can have an instr pushed to it multiple times if it was
950 * we don't try to re-optimize an instr we already handled.
952 if (exec_node_is_tail_sentinel(&instr->node))
955 progress |= nir_algebraic_instr(&build, instr,