Lines Matching refs:ctx

38 static ir_ref ir_sccp_fold(ir_ctx *ctx, ir_insn *_values, ir_ref res, uint32_t opt, ir_ref op1, ir_…  in ir_sccp_fold()  argument
49 op1_insn = (op1 > 0 && IR_IS_CONST_OP(_values[op1].op)) ? _values + op1 : ctx->ir_base + op1; in ir_sccp_fold()
50 op2_insn = (op2 > 0 && IR_IS_CONST_OP(_values[op2].op)) ? _values + op2 : ctx->ir_base + op2; in ir_sccp_fold()
51 op3_insn = (op3 > 0 && IR_IS_CONST_OP(_values[op3].op)) ? _values + op3 : ctx->ir_base + op3; in ir_sccp_fold()
53 switch (ir_folding(ctx, opt, op1, op2, op3, op1_insn, op2_insn, op3_insn)) { in ir_sccp_fold()
55 opt = ctx->fold_insn.optx; in ir_sccp_fold()
56 op1 = ctx->fold_insn.op1; in ir_sccp_fold()
57 op2 = ctx->fold_insn.op2; in ir_sccp_fold()
58 op3 = ctx->fold_insn.op3; in ir_sccp_fold()
64 op1 = ctx->fold_insn.op1; in ir_sccp_fold()
68 insn = (op1 > 0 && IR_IS_CONST_OP(_values[op1].op)) ? _values + op1 : ctx->ir_base + op1; in ir_sccp_fold()
92 insn = &ctx->fold_insn; in ir_sccp_fold()
110 static bool ir_sccp_meet_phi(ir_ctx *ctx, ir_insn *_values, ir_ref i, ir_insn *insn, ir_bitqueue *w… in ir_sccp_meet_phi() argument
129 merge_input = ctx->ir_base[insn->op1].ops + 1; in ir_sccp_meet_phi()
138 v = &ctx->ir_base[input]; in ir_sccp_meet_phi()
186 v = &ctx->ir_base[input]; in ir_sccp_meet_phi()
235 _values[i].optx = IR_OPT(IR_COPY, ctx->ir_base[new_copy].type); in ir_sccp_meet_phi()
254 static bool ir_is_dead_load_ex(ir_ctx *ctx, ir_ref ref, uint32_t flags, ir_insn *insn) in ir_is_dead_load_ex() argument
257 return ctx->use_lists[ref].count == 1; in ir_is_dead_load_ex()
259 return ctx->use_lists[ref].count == 1; in ir_is_dead_load_ex()
264 static bool ir_is_dead_load(ir_ctx *ctx, ir_ref ref) in ir_is_dead_load() argument
266 if (ctx->use_lists[ref].count == 1) { in ir_is_dead_load()
267 uint32_t flags = ir_op_flags[ctx->ir_base[ref].op]; in ir_is_dead_load()
271 } else if (ctx->ir_base[ref].op == IR_ALLOCA) { in ir_is_dead_load()
278 static bool ir_is_dead(ir_ctx *ctx, ir_ref ref) in ir_is_dead() argument
280 if (ctx->use_lists[ref].count == 0) { in ir_is_dead()
281 return IR_IS_FOLDABLE_OP(ctx->ir_base[ref].op); in ir_is_dead()
283 return ir_is_dead_load(ctx, ref); in ir_is_dead()
288 static ir_ref ir_find1(ir_ctx *ctx, uint32_t optx, ir_ref op1) in ir_find1() argument
292 ir_use_list *use_list = &ctx->use_lists[op1]; in ir_find1()
295 for (p = ctx->use_edges + use_list->refs; n > 0; p++, n--) { in ir_find1()
297 ir_insn *use_insn = &ctx->ir_base[use]; in ir_find1()
307 static bool ir_sccp_is_true(ir_ctx *ctx, ir_insn *_values, ir_ref a) in ir_sccp_is_true() argument
309 ir_insn *v = IR_IS_CONST_REF(a) ? &ctx->ir_base[a] : &_values[a]; in ir_sccp_is_true()
314 static bool ir_sccp_is_equal(ir_ctx *ctx, ir_insn *_values, ir_ref a, ir_ref b) in ir_sccp_is_equal() argument
316 ir_insn *v1 = IR_IS_CONST_REF(a) ? &ctx->ir_base[a] : &_values[a]; in ir_sccp_is_equal()
317 ir_insn *v2 = IR_IS_CONST_REF(b) ? &ctx->ir_base[b] : &_values[b]; in ir_sccp_is_equal()
324 static void ir_sccp_make_nop(ir_ctx *ctx, ir_ref ref) in ir_sccp_make_nop() argument
330 insn = &ctx->ir_base[ref]; in ir_sccp_make_nop()
338 static void ir_sccp_remove_insn(ir_ctx *ctx, ir_insn *_values, ir_ref ref, ir_bitqueue *worklist) in ir_sccp_remove_insn() argument
344 insn = &ctx->ir_base[ref]; in ir_sccp_remove_insn()
351 ir_use_list_remove_all(ctx, input, ref); in ir_sccp_remove_insn()
352 if (ir_is_dead(ctx, input)) { in ir_sccp_remove_insn()
360 static void ir_sccp_remove_insn2(ir_ctx *ctx, ir_ref ref, ir_bitqueue *worklist) in ir_sccp_remove_insn2() argument
366 insn = &ctx->ir_base[ref]; in ir_sccp_remove_insn2()
373 ir_use_list_remove_all(ctx, input, ref); in ir_sccp_remove_insn2()
374 if (ir_is_dead(ctx, input)) { in ir_sccp_remove_insn2()
377 } else if (ctx->ir_base[input].op == IR_PHI && ctx->use_lists[input].count == 1) { in ir_sccp_remove_insn2()
379 ir_bitqueue_add(worklist, ctx->ir_base[input].op1); in ir_sccp_remove_insn2()
385 static void ir_sccp_replace_insn(ir_ctx *ctx, ir_insn *_values, ir_ref ref, ir_ref new_ref, ir_bitq… in ir_sccp_replace_insn() argument
393 insn = &ctx->ir_base[ref]; in ir_sccp_replace_insn()
400 ir_use_list_remove_all(ctx, input, ref); in ir_sccp_replace_insn()
402 if (ir_is_dead(ctx, input)) { in ir_sccp_replace_insn()
410 use_list = &ctx->use_lists[ref]; in ir_sccp_replace_insn()
412 for (j = 0, p = &ctx->use_edges[use_list->refs]; j < n; j++, p++) { in ir_sccp_replace_insn()
415 insn = &ctx->ir_base[use]; in ir_sccp_replace_insn()
424 if (ir_use_list_add(ctx, new_ref, use)) { in ir_sccp_replace_insn()
426 use_list = &ctx->use_lists[ref]; in ir_sccp_replace_insn()
428 p = &ctx->use_edges[use_list->refs + j]; in ir_sccp_replace_insn()
442 static void ir_sccp_replace_insn2(ir_ctx *ctx, ir_ref ref, ir_ref new_ref, ir_bitqueue *worklist) in ir_sccp_replace_insn2() argument
450 insn = &ctx->ir_base[ref]; in ir_sccp_replace_insn2()
457 ir_use_list_remove_all(ctx, input, ref); in ir_sccp_replace_insn2()
458 if (ir_is_dead(ctx, input)) { in ir_sccp_replace_insn2()
461 } else if (ctx->ir_base[input].op == IR_PHI && ctx->use_lists[input].count == 1) { in ir_sccp_replace_insn2()
468 use_list = &ctx->use_lists[ref]; in ir_sccp_replace_insn2()
470 for (j = 0, p = &ctx->use_edges[use_list->refs]; j < n; j++, p++) { in ir_sccp_replace_insn2()
472 insn = &ctx->ir_base[use]; in ir_sccp_replace_insn2()
481 if (ir_use_list_add(ctx, new_ref, use)) { in ir_sccp_replace_insn2()
483 use_list = &ctx->use_lists[ref]; in ir_sccp_replace_insn2()
485 p = &ctx->use_edges[use_list->refs + j]; in ir_sccp_replace_insn2()
496 static void ir_sccp_fold2(ir_ctx *ctx, ir_ref ref, ir_bitqueue *worklist) in ir_sccp_fold2() argument
502 insn = &ctx->ir_base[ref]; in ir_sccp_fold2()
509 op1_insn = ctx->ir_base + op1; in ir_sccp_fold2()
510 op2_insn = ctx->ir_base + op2; in ir_sccp_fold2()
511 op3_insn = ctx->ir_base + op3; in ir_sccp_fold2()
513 switch (ir_folding(ctx, opt, op1, op2, op3, op1_insn, op2_insn, op3_insn)) { in ir_sccp_fold2()
515 opt = ctx->fold_insn.optx; in ir_sccp_fold2()
516 op1 = ctx->fold_insn.op1; in ir_sccp_fold2()
517 op2 = ctx->fold_insn.op2; in ir_sccp_fold2()
518 op3 = ctx->fold_insn.op3; in ir_sccp_fold2()
521 insn = &ctx->ir_base[ref]; in ir_sccp_fold2()
522 if (insn->opt != ctx->fold_insn.opt in ir_sccp_fold2()
523 || insn->op1 != ctx->fold_insn.op1 in ir_sccp_fold2()
524 || insn->op2 != ctx->fold_insn.op2 in ir_sccp_fold2()
525 || insn->op3 != ctx->fold_insn.op3) { in ir_sccp_fold2()
530 insn->optx = ctx->fold_insn.opt; in ir_sccp_fold2()
533 if (insn->op1 != ctx->fold_insn.op1) { in ir_sccp_fold2()
535 ir_use_list_remove_one(ctx, insn->op1, ref); in ir_sccp_fold2()
537 if (ctx->fold_insn.op1 > 0) { in ir_sccp_fold2()
538 ir_use_list_add(ctx, ctx->fold_insn.op1, ref); in ir_sccp_fold2()
541 if (insn->op2 != ctx->fold_insn.op2) { in ir_sccp_fold2()
543 ir_use_list_remove_one(ctx, insn->op2, ref); in ir_sccp_fold2()
545 if (ctx->fold_insn.op2 > 0) { in ir_sccp_fold2()
546 ir_use_list_add(ctx, ctx->fold_insn.op2, ref); in ir_sccp_fold2()
549 if (insn->op3 != ctx->fold_insn.op3) { in ir_sccp_fold2()
551 ir_use_list_remove_one(ctx, insn->op3, ref); in ir_sccp_fold2()
553 if (ctx->fold_insn.op3 > 0) { in ir_sccp_fold2()
554 ir_use_list_add(ctx, ctx->fold_insn.op3, ref); in ir_sccp_fold2()
557 insn->op1 = ctx->fold_insn.op1; in ir_sccp_fold2()
558 insn->op2 = ctx->fold_insn.op2; in ir_sccp_fold2()
559 insn->op3 = ctx->fold_insn.op3; in ir_sccp_fold2()
561 use_list = &ctx->use_lists[ref]; in ir_sccp_fold2()
563 for (j = 0, p = &ctx->use_edges[use_list->refs]; j < n; j++, p++) { in ir_sccp_fold2()
570 op1 = ctx->fold_insn.op1; in ir_sccp_fold2()
571 ir_sccp_replace_insn2(ctx, ref, op1, worklist); in ir_sccp_fold2()
574 op1 = ir_const(ctx, ctx->fold_insn.val, ctx->fold_insn.type); in ir_sccp_fold2()
575 ir_sccp_replace_insn2(ctx, ref, op1, worklist); in ir_sccp_fold2()
583 static void ir_sccp_remove_if(ir_ctx *ctx, ir_insn *_values, ir_ref ref, ir_ref dst) in ir_sccp_remove_if() argument
588 insn = &ctx->ir_base[ref]; in ir_sccp_remove_if()
589 if (ctx->use_lists[dst].count == 1) { in ir_sccp_remove_if()
590 next = ctx->use_edges[ctx->use_lists[dst].refs]; in ir_sccp_remove_if()
591 next_insn = &ctx->ir_base[next]; in ir_sccp_remove_if()
594 ir_use_list_replace_one(ctx, insn->op1, ref, next); in ir_sccp_remove_if()
596 ir_sccp_make_nop(ctx, ref); in ir_sccp_remove_if()
597 ir_sccp_make_nop(ctx, dst); in ir_sccp_remove_if()
601 next_insn = &ctx->ir_base[dst]; in ir_sccp_remove_if()
606 static void ir_sccp_remove_unfeasible_merge_inputs(ir_ctx *ctx, ir_insn *_values, ir_ref ref, ir_re… in ir_sccp_remove_unfeasible_merge_inputs() argument
613 insn = &ctx->ir_base[ref]; in ir_sccp_remove_unfeasible_merge_inputs()
621 ir_insn *input_insn = &ctx->ir_base[input]; in ir_sccp_remove_unfeasible_merge_inputs()
631 use_list = &ctx->use_lists[ref]; in ir_sccp_remove_unfeasible_merge_inputs()
633 next = ctx->use_edges[use_list->refs]; in ir_sccp_remove_unfeasible_merge_inputs()
634 next_insn = &ctx->ir_base[next]; in ir_sccp_remove_unfeasible_merge_inputs()
636 for (k = 0, p = &ctx->use_edges[use_list->refs]; k < use_list->count; k++, p++) { in ir_sccp_remove_unfeasible_merge_inputs()
638 use_insn = &ctx->ir_base[use]; in ir_sccp_remove_unfeasible_merge_inputs()
647 ir_use_list_add(ctx, prev, use); in ir_sccp_remove_unfeasible_merge_inputs()
648 p = &ctx->use_edges[use_list->refs + k]; in ir_sccp_remove_unfeasible_merge_inputs()
655 ir_use_list_replace_one(ctx, prev, input, next); in ir_sccp_remove_unfeasible_merge_inputs()
657 ir_sccp_make_nop(ctx, ref); in ir_sccp_remove_unfeasible_merge_inputs()
658 ir_sccp_make_nop(ctx, input); in ir_sccp_remove_unfeasible_merge_inputs()
701 use_list = &ctx->use_lists[ref]; in ir_sccp_remove_unfeasible_merge_inputs()
703 for (k = 0, p = &ctx->use_edges[use_list->refs]; k < use_list->count; k++, p++) { in ir_sccp_remove_unfeasible_merge_inputs()
705 use_insn = &ctx->ir_base[use]; in ir_sccp_remove_unfeasible_merge_inputs()
718 ir_use_list_remove_one(ctx, input, use); in ir_sccp_remove_unfeasible_merge_inputs()
733 static bool ir_may_promote_d2f(ir_ctx *ctx, ir_ref ref) in ir_may_promote_d2f() argument
735 ir_insn *insn = &ctx->ir_base[ref]; in ir_may_promote_d2f()
748 return ctx->use_lists[ref].count == 1 && in ir_may_promote_d2f()
749 ir_may_promote_d2f(ctx, insn->op1); in ir_may_promote_d2f()
756 return ctx->use_lists[ref].count == 1 && in ir_may_promote_d2f()
757 ir_may_promote_d2f(ctx, insn->op1) && in ir_may_promote_d2f()
758 ir_may_promote_d2f(ctx, insn->op2); in ir_may_promote_d2f()
766 static bool ir_may_promote_f2d(ir_ctx *ctx, ir_ref ref) in ir_may_promote_f2d() argument
768 ir_insn *insn = &ctx->ir_base[ref]; in ir_may_promote_f2d()
778 return ctx->use_lists[ref].count == 1; in ir_may_promote_f2d()
781 return ctx->use_lists[ref].count == 1 && in ir_may_promote_f2d()
782 ir_may_promote_f2d(ctx, insn->op1); in ir_may_promote_f2d()
789 return ctx->use_lists[ref].count == 1 && in ir_may_promote_f2d()
790 ir_may_promote_f2d(ctx, insn->op1) && in ir_may_promote_f2d()
791 ir_may_promote_f2d(ctx, insn->op2); in ir_may_promote_f2d()
799 static ir_ref ir_promote_d2f(ir_ctx *ctx, ir_ref ref, ir_ref use) in ir_promote_d2f() argument
801 ir_insn *insn = &ctx->ir_base[ref]; in ir_promote_d2f()
806 return ir_const_float(ctx, (float)insn->val.d); in ir_promote_d2f()
810 count = ctx->use_lists[ref].count; in ir_promote_d2f()
811 ir_use_list_remove_all(ctx, ref, use); in ir_promote_d2f()
812 if (ctx->use_lists[ref].count == 0) { in ir_promote_d2f()
813 ir_use_list_replace_one(ctx, insn->op1, ref, use); in ir_promote_d2f()
816 ir_use_list_add(ctx, insn->op1, use); in ir_promote_d2f()
823 ir_use_list_add(ctx, insn->op1, use); in ir_promote_d2f()
824 count -= ctx->use_lists[ref].count; in ir_promote_d2f()
827 ir_use_list_add(ctx, insn->op1, use); in ir_promote_d2f()
837 insn->op1 = ir_promote_d2f(ctx, insn->op1, ref); in ir_promote_d2f()
847 insn->op2 = insn->op1 = ir_promote_d2f(ctx, insn->op1, ref); in ir_promote_d2f()
849 insn->op1 = ir_promote_d2f(ctx, insn->op1, ref); in ir_promote_d2f()
850 insn->op2 = ir_promote_d2f(ctx, insn->op2, ref); in ir_promote_d2f()
862 static ir_ref ir_promote_f2d(ir_ctx *ctx, ir_ref ref, ir_ref use) in ir_promote_f2d() argument
864 ir_insn *insn = &ctx->ir_base[ref]; in ir_promote_f2d()
870 return ir_const_double(ctx, (double)insn->val.f); in ir_promote_f2d()
874 count = ctx->use_lists[ref].count; in ir_promote_f2d()
875 ir_use_list_remove_all(ctx, ref, use); in ir_promote_f2d()
876 if (ctx->use_lists[ref].count == 0) { in ir_promote_f2d()
877 ir_use_list_replace_one(ctx, insn->op1, ref, use); in ir_promote_f2d()
880 ir_use_list_add(ctx, insn->op1, use); in ir_promote_f2d()
887 ir_use_list_add(ctx, insn->op1, use); in ir_promote_f2d()
888 count -= ctx->use_lists[ref].count; in ir_promote_f2d()
891 ir_use_list_add(ctx, insn->op1, use); in ir_promote_f2d()
897 old_ref = ir_find1(ctx, IR_OPTX(IR_INT2FP, IR_DOUBLE, 1), insn->op1); in ir_promote_f2d()
899 IR_ASSERT(ctx->use_lists[ref].count == 1); in ir_promote_f2d()
900 ir_use_list_remove_one(ctx, insn->op1, ref); in ir_promote_f2d()
903 ir_use_list_add(ctx, old_ref, use); in ir_promote_f2d()
910 insn->op1 = ir_promote_f2d(ctx, insn->op1, ref); in ir_promote_f2d()
920 insn->op2 = insn->op1 = ir_promote_f2d(ctx, insn->op1, ref); in ir_promote_f2d()
922 insn->op1 = ir_promote_f2d(ctx, insn->op1, ref); in ir_promote_f2d()
923 insn->op2 = ir_promote_f2d(ctx, insn->op2, ref); in ir_promote_f2d()
935 static bool ir_may_promote_i2i(ir_ctx *ctx, ir_type type, ir_ref ref) in ir_may_promote_i2i() argument
937 ir_insn *insn = &ctx->ir_base[ref]; in ir_may_promote_i2i()
945 return ctx->ir_base[insn->op1].type == type; in ir_may_promote_i2i()
949 return ctx->use_lists[ref].count == 1 && in ir_may_promote_i2i()
950 ir_may_promote_i2i(ctx, type, insn->op1); in ir_may_promote_i2i()
960 return ctx->use_lists[ref].count == 1 && in ir_may_promote_i2i()
961 ir_may_promote_i2i(ctx, type, insn->op1) && in ir_may_promote_i2i()
962 ir_may_promote_i2i(ctx, type, insn->op2); in ir_may_promote_i2i()
970 static ir_ref ir_promote_i2i(ir_ctx *ctx, ir_type type, ir_ref ref, ir_ref use) in ir_promote_i2i() argument
972 ir_insn *insn = &ctx->ir_base[ref]; in ir_promote_i2i()
976 return ir_const(ctx, insn->val, type); in ir_promote_i2i()
981 count = ctx->use_lists[ref].count; in ir_promote_i2i()
982 ir_use_list_remove_all(ctx, ref, use); in ir_promote_i2i()
983 if (ctx->use_lists[ref].count == 0) { in ir_promote_i2i()
984 ir_use_list_replace_one(ctx, insn->op1, ref, use); in ir_promote_i2i()
987 ir_use_list_add(ctx, insn->op1, use); in ir_promote_i2i()
994 ir_use_list_add(ctx, insn->op1, use); in ir_promote_i2i()
995 count -= ctx->use_lists[ref].count; in ir_promote_i2i()
998 ir_use_list_add(ctx, insn->op1, use); in ir_promote_i2i()
1006 insn->op1 = ir_promote_i2i(ctx, type, insn->op1, ref); in ir_promote_i2i()
1019 insn->op2 = insn->op1 = ir_promote_i2i(ctx, type, insn->op1, ref); in ir_promote_i2i()
1021 insn->op1 = ir_promote_i2i(ctx, type, insn->op1, ref); in ir_promote_i2i()
1022 insn->op2 = ir_promote_i2i(ctx, type, insn->op2, ref); in ir_promote_i2i()
1034 static ir_ref ir_ext_const(ir_ctx *ctx, ir_insn *val_insn, ir_op op, ir_type type) in ir_ext_const() argument
1067 return ir_const(ctx, new_val, type); in ir_ext_const()
1070 static ir_ref ir_ext_ref(ir_ctx *ctx, ir_ref var_ref, ir_ref src_ref, ir_op op, ir_type type) in ir_ext_ref() argument
1076 ref = ir_find1(ctx, optx, src_ref); in ir_ext_ref()
1078 ir_use_list_add(ctx, ref, var_ref); in ir_ext_ref()
1080 ir_use_list_remove_one(ctx, src_ref, var_ref); in ir_ext_ref()
1086 ref = ir_emit1(ctx, optx, src_ref); in ir_ext_ref()
1087 ctx->use_lists = ir_mem_realloc(ctx->use_lists, ctx->insns_count * sizeof(ir_use_list)); in ir_ext_ref()
1088 ctx->use_lists[ref].count = 0; in ir_ext_ref()
1089 ctx->use_lists[ref].refs = IR_UNUSED; in ir_ext_ref()
1090 ir_use_list_add(ctx, ref, var_ref); in ir_ext_ref()
1092 ir_use_list_replace_one(ctx, src_ref, var_ref, ref); in ir_ext_ref()
1097 static bool ir_try_promote_ext(ir_ctx *ctx, ir_ref ext_ref, ir_insn *insn, ir_bitqueue *worklist) in ir_try_promote_ext() argument
1102 ir_insn *phi_insn = &ctx->ir_base[ref]; in ir_try_promote_ext()
1110 || ctx->ir_base[phi_insn->op1].op != IR_LOOP_BEGIN) { in ir_try_promote_ext()
1115 op_insn = &ctx->ir_base[op_ref]; in ir_try_promote_ext()
1118 || ctx->use_lists[op_ref].count != 1) { in ir_try_promote_ext()
1123 use_list = &ctx->use_lists[ref]; in ir_try_promote_ext()
1125 for (p = &ctx->use_edges[use_list->refs]; n > 0; p++, n--) { in ir_try_promote_ext()
1130 ir_insn *use_insn = &ctx->ir_base[use]; in ir_try_promote_ext()
1146 for (n = 0; n < ctx->use_lists[ref].count; n++) { in ir_try_promote_ext()
1148 use = ctx->use_edges[ctx->use_lists[ref].refs + n]; in ir_try_promote_ext()
1152 ir_insn *use_insn = &ctx->ir_base[use]; in ir_try_promote_ext()
1162 && !IR_IS_SYM_CONST(ctx->ir_base[use_insn->op1].op)) { in ir_try_promote_ext()
1163 ctx->ir_base[use].op1 = ir_ext_const(ctx, &ctx->ir_base[use_insn->op1], op, type); in ir_try_promote_ext()
1165 ctx->ir_base[use].op1 = ir_ext_ref(ctx, use, use_insn->op1, op, type); in ir_try_promote_ext()
1166 ir_bitqueue_add(worklist, ctx->ir_base[use].op1); in ir_try_promote_ext()
1171 && !IR_IS_SYM_CONST(ctx->ir_base[use_insn->op2].op)) { in ir_try_promote_ext()
1172 ctx->ir_base[use].op2 = ir_ext_const(ctx, &ctx->ir_base[use_insn->op2], op, type); in ir_try_promote_ext()
1174 ctx->ir_base[use].op2 = ir_ext_ref(ctx, use, use_insn->op2, op, type); in ir_try_promote_ext()
1175 ir_bitqueue_add(worklist, ctx->ir_base[use].op2); in ir_try_promote_ext()
1181 ir_sccp_replace_insn2(ctx, ext_ref, ref, worklist); in ir_try_promote_ext()
1183 phi_insn = &ctx->ir_base[ref]; in ir_try_promote_ext()
1185 && !IR_IS_SYM_CONST(ctx->ir_base[phi_insn->op2].op)) { in ir_try_promote_ext()
1186 ctx->ir_base[ref].op2 = ir_ext_const(ctx, &ctx->ir_base[phi_insn->op2], op, type); in ir_try_promote_ext()
1188 ctx->ir_base[ref].op2 = ir_ext_ref(ctx, ref, phi_insn->op2, op, type); in ir_try_promote_ext()
1189 ir_bitqueue_add(worklist, ctx->ir_base[ref].op2); in ir_try_promote_ext()
1195 static void ir_get_true_false_refs(const ir_ctx *ctx, ir_ref if_ref, ir_ref *if_true_ref, ir_ref *i… in ir_get_true_false_refs() argument
1197 ir_use_list *use_list = &ctx->use_lists[if_ref]; in ir_get_true_false_refs()
1198 ir_ref *p = &ctx->use_edges[use_list->refs]; in ir_get_true_false_refs()
1201 if (ctx->ir_base[*p].op == IR_IF_TRUE) { in ir_get_true_false_refs()
1202 IR_ASSERT(ctx->ir_base[*(p + 1)].op == IR_IF_FALSE); in ir_get_true_false_refs()
1206 IR_ASSERT(ctx->ir_base[*p].op == IR_IF_FALSE); in ir_get_true_false_refs()
1207 IR_ASSERT(ctx->ir_base[*(p + 1)].op == IR_IF_TRUE); in ir_get_true_false_refs()
1213 static void ir_merge_blocks(ir_ctx *ctx, ir_ref end, ir_ref begin, ir_bitqueue *worklist2) in ir_merge_blocks() argument
1218 IR_ASSERT(ctx->ir_base[begin].op == IR_BEGIN); in ir_merge_blocks()
1219 IR_ASSERT(ctx->ir_base[end].op == IR_END); in ir_merge_blocks()
1220 IR_ASSERT(ctx->ir_base[begin].op1 == end); in ir_merge_blocks()
1221 IR_ASSERT(ctx->use_lists[end].count == 1); in ir_merge_blocks()
1223 prev = ctx->ir_base[end].op1; in ir_merge_blocks()
1225 use_list = &ctx->use_lists[begin]; in ir_merge_blocks()
1227 next = ctx->use_edges[use_list->refs]; in ir_merge_blocks()
1230 MAKE_NOP(&ctx->ir_base[begin]); CLEAR_USES(begin); in ir_merge_blocks()
1231 MAKE_NOP(&ctx->ir_base[end]); CLEAR_USES(end); in ir_merge_blocks()
1234 ctx->ir_base[next].op1 = prev; in ir_merge_blocks()
1235 ir_use_list_replace_all(ctx, prev, end, next); in ir_merge_blocks()
1237 if (ctx->ir_base[prev].op == IR_BEGIN || ctx->ir_base[prev].op == IR_MERGE) { in ir_merge_blocks()
1242 static bool ir_try_remove_empty_diamond(ir_ctx *ctx, ir_ref ref, ir_insn *insn, ir_bitqueue *workli… in ir_try_remove_empty_diamond() argument
1246 ir_insn *end1 = &ctx->ir_base[end1_ref]; in ir_try_remove_empty_diamond()
1247 ir_insn *end2 = &ctx->ir_base[end2_ref]; in ir_try_remove_empty_diamond()
1254 ir_insn *start1 = &ctx->ir_base[start1_ref]; in ir_try_remove_empty_diamond()
1255 ir_insn *start2 = &ctx->ir_base[start2_ref]; in ir_try_remove_empty_diamond()
1262 ir_insn *root = &ctx->ir_base[root_ref]; in ir_try_remove_empty_diamond()
1265 && !(root->op == IR_SWITCH && ctx->use_lists[root_ref].count == 2)) { in ir_try_remove_empty_diamond()
1288 ir_ref next_ref = ctx->use_edges[ctx->use_lists[ref].refs]; in ir_try_remove_empty_diamond()
1289 ir_insn *next = &ctx->ir_base[next_ref]; in ir_try_remove_empty_diamond()
1291 IR_ASSERT(ctx->use_lists[start1_ref].count == 1); in ir_try_remove_empty_diamond()
1292 IR_ASSERT(ctx->use_lists[start2_ref].count == 1); in ir_try_remove_empty_diamond()
1295 ir_use_list_replace_one(ctx, root->op1, root_ref, next_ref); in ir_try_remove_empty_diamond()
1297 ir_use_list_remove_all(ctx, root->op2, root_ref); in ir_try_remove_empty_diamond()
1298 if (ir_is_dead(ctx, root->op2)) { in ir_try_remove_empty_diamond()
1310 if (ctx->ir_base[next->op1].op == IR_BEGIN || ctx->ir_base[next->op1].op == IR_MERGE) { in ir_try_remove_empty_diamond()
1324 end = &ctx->ir_base[end_ref]; in ir_try_remove_empty_diamond()
1329 start = &ctx->ir_base[start_ref]; in ir_try_remove_empty_diamond()
1333 IR_ASSERT(ctx->use_lists[start_ref].count == 1); in ir_try_remove_empty_diamond()
1336 if (ctx->use_lists[root_ref].count != count) { in ir_try_remove_empty_diamond()
1345 ir_ref next_ref = ctx->use_edges[ctx->use_lists[ref].refs]; in ir_try_remove_empty_diamond()
1346 ir_insn *next = &ctx->ir_base[next_ref]; in ir_try_remove_empty_diamond()
1347 ir_insn *root = &ctx->ir_base[root_ref]; in ir_try_remove_empty_diamond()
1350 ir_use_list_replace_one(ctx, root->op1, root_ref, next_ref); in ir_try_remove_empty_diamond()
1353 ir_use_list_remove_all(ctx, root->op2, root_ref); in ir_try_remove_empty_diamond()
1354 if (ir_is_dead(ctx, root->op2)) { in ir_try_remove_empty_diamond()
1363 ir_insn *end = &ctx->ir_base[end_ref]; in ir_try_remove_empty_diamond()
1365 ir_insn *start = &ctx->ir_base[start_ref]; in ir_try_remove_empty_diamond()
1373 if (ctx->ir_base[next->op1].op == IR_BEGIN || ctx->ir_base[next->op1].op == IR_MERGE) { in ir_try_remove_empty_diamond()
1381 static bool ir_is_zero(ir_ctx *ctx, ir_ref ref) in ir_is_zero() argument
1384 && !IR_IS_SYM_CONST(ctx->ir_base[ref].op) in ir_is_zero()
1385 && ctx->ir_base[ref].val.u32 == 0; in ir_is_zero()
1388 static bool ir_optimize_phi(ir_ctx *ctx, ir_ref merge_ref, ir_insn *merge, ir_ref ref, ir_insn *ins… in ir_optimize_phi() argument
1391 IR_ASSERT(ctx->use_lists[merge_ref].count == 2); in ir_optimize_phi()
1394 ir_insn *end1 = &ctx->ir_base[end1_ref]; in ir_optimize_phi()
1395 ir_insn *end2 = &ctx->ir_base[end2_ref]; in ir_optimize_phi()
1399 ir_insn *start1 = &ctx->ir_base[start1_ref]; in ir_optimize_phi()
1400 ir_insn *start2 = &ctx->ir_base[start2_ref]; in ir_optimize_phi()
1404 ir_insn *root = &ctx->ir_base[root_ref]; in ir_optimize_phi()
1406 if (root->op == IR_IF && ctx->use_lists[root->op2].count == 1) { in ir_optimize_phi()
1408 ir_insn *cond = &ctx->ir_base[cond_ref]; in ir_optimize_phi()
1448 ir_ref next_ref = ctx->use_edges[ctx->use_lists[merge_ref].refs]; in ir_optimize_phi()
1452 next_ref = ctx->use_edges[ctx->use_lists[merge_ref].refs + 1]; in ir_optimize_phi()
1454 next = &ctx->ir_base[next_ref]; in ir_optimize_phi()
1456 IR_ASSERT(ctx->use_lists[start1_ref].count == 1); in ir_optimize_phi()
1457 IR_ASSERT(ctx->use_lists[start2_ref].count == 1); in ir_optimize_phi()
1474 ir_use_list_replace_one(ctx, root->op1, root_ref, next_ref); in ir_optimize_phi()
1476 ir_use_list_remove_all(ctx, insn->op1, cond_ref); in ir_optimize_phi()
1479 ir_use_list_remove_all(ctx, insn->op2, cond_ref); in ir_optimize_phi()
1490 if (ctx->ir_base[next->op1].op == IR_BEGIN || ctx->ir_base[next->op1].op == IR_MERGE) { in ir_optimize_phi()
1496 && ((ctx->ir_base[insn->op2].op == IR_NEG in ir_optimize_phi()
1497 && ctx->use_lists[insn->op2].count == 1 in ir_optimize_phi()
1498 && ctx->ir_base[insn->op2].op1 == insn->op3 in ir_optimize_phi()
1500 && ir_is_zero(ctx, cond->op2) in ir_optimize_phi()
1503 && ir_is_zero(ctx, cond->op1) in ir_optimize_phi()
1505 || (ctx->ir_base[insn->op3].op == IR_NEG in ir_optimize_phi()
1506 && ctx->use_lists[insn->op3].count == 1 in ir_optimize_phi()
1507 && ctx->ir_base[insn->op3].op1 == insn->op2 in ir_optimize_phi()
1509 && ir_is_zero(ctx, cond->op2) in ir_optimize_phi()
1512 && ir_is_zero(ctx, cond->op1) in ir_optimize_phi()
1534 ir_ref next_ref = ctx->use_edges[ctx->use_lists[merge_ref].refs]; in ir_optimize_phi()
1538 next_ref = ctx->use_edges[ctx->use_lists[merge_ref].refs + 1]; in ir_optimize_phi()
1540 next = &ctx->ir_base[next_ref]; in ir_optimize_phi()
1542 IR_ASSERT(ctx->use_lists[start1_ref].count == 1); in ir_optimize_phi()
1543 IR_ASSERT(ctx->use_lists[start2_ref].count == 1); in ir_optimize_phi()
1547 if (ctx->ir_base[insn->op2].op == IR_NEG) { in ir_optimize_phi()
1558 ir_use_list_replace_one(ctx, root->op1, root_ref, next_ref); in ir_optimize_phi()
1559 ir_use_list_remove_one(ctx, insn->op1, neg_ref); in ir_optimize_phi()
1561 ir_use_list_remove_all(ctx, insn->op1, cond_ref); in ir_optimize_phi()
1571 MAKE_NOP(&ctx->ir_base[neg_ref]); CLEAR_USES(neg_ref); in ir_optimize_phi()
1573 if (ctx->ir_base[next->op1].op == IR_BEGIN || ctx->ir_base[next->op1].op == IR_MERGE) { in ir_optimize_phi()
1599 ir_ref next_ref = ctx->use_edges[ctx->use_lists[merge_ref].refs]; in ir_optimize_phi()
1603 next_ref = ctx->use_edges[ctx->use_lists[merge_ref].refs + 1]; in ir_optimize_phi()
1605 next = &ctx->ir_base[next_ref]; in ir_optimize_phi()
1607 IR_ASSERT(ctx->use_lists[start1_ref].count == 1); in ir_optimize_phi()
1608 IR_ASSERT(ctx->use_lists[start2_ref].count == 1); in ir_optimize_phi()
1618 ir_use_list_replace_one(ctx, cond_ref, root_ref, ref); in ir_optimize_phi()
1619 ir_use_list_replace_one(ctx, root->op1, root_ref, next_ref); in ir_optimize_phi()
1620 ir_use_list_remove_all(ctx, root->op2, root_ref); in ir_optimize_phi()
1629 if (ctx->ir_base[next->op1].op == IR_BEGIN || ctx->ir_base[next->op1].op == IR_MERGE) { in ir_optimize_phi()
1741 static bool ir_try_split_if(ir_ctx *ctx, ir_ref ref, ir_insn *insn, ir_bitqueue *worklist) in ir_try_split_if() argument
1744 ir_insn *cond = &ctx->ir_base[cond_ref]; in ir_try_split_if()
1749 && ((IR_IS_CONST_REF(cond->op2) && !IR_IS_SYM_CONST(ctx->ir_base[cond->op2].op)) in ir_try_split_if()
1750 || (IR_IS_CONST_REF(cond->op3) && !IR_IS_SYM_CONST(ctx->ir_base[cond->op3].op)))) { in ir_try_split_if()
1752 ir_insn *merge = &ctx->ir_base[merge_ref]; in ir_try_split_if()
1754 if (ctx->use_lists[merge_ref].count == 2) { in ir_try_split_if()
1756 ir_insn *end1 = &ctx->ir_base[end1_ref]; in ir_try_split_if()
1757 ir_insn *end2 = &ctx->ir_base[end2_ref]; in ir_try_split_if()
1764 ir_get_true_false_refs(ctx, ref, &if_true_ref, &if_false_ref); in ir_try_split_if()
1766 if (!IR_IS_CONST_REF(cond->op2) || IR_IS_SYM_CONST(ctx->ir_base[cond->op2].op)) { in ir_try_split_if()
1773 if (ir_const_is_true(&ctx->ir_base[cond->op2])) { in ir_try_split_if()
1777 if_true = &ctx->ir_base[if_true_ref]; in ir_try_split_if()
1778 if_false = &ctx->ir_base[if_false_ref]; in ir_try_split_if()
1780 if (IR_IS_CONST_REF(cond->op3) && !IR_IS_SYM_CONST(ctx->ir_base[cond->op3].op)) { in ir_try_split_if()
1781 if (ir_const_is_true(&ctx->ir_base[cond->op3]) ^ (op == IR_IF_TRUE)) { in ir_try_split_if()
1800 ir_use_list_replace_one(ctx, end1_ref, merge_ref, if_false_ref); in ir_try_split_if()
1801 ir_use_list_replace_one(ctx, end2_ref, merge_ref, if_true_ref); in ir_try_split_if()
1836 ir_use_list_replace_one(ctx, end1_ref, merge_ref, if_false_ref); in ir_try_split_if()
1837 ir_use_list_replace_one(ctx, end2_ref, merge_ref, if_false_ref); in ir_try_split_if()
1850 ctx->flags2 &= ~IR_CFG_REACHABLE; in ir_try_split_if()
1876 ir_use_list_remove_all(ctx, merge_ref, cond_ref); in ir_try_split_if()
1877 ir_use_list_remove_all(ctx, ref, if_true_ref); in ir_try_split_if()
1879 ir_use_list_replace_one(ctx, cond->op3, cond_ref, end2_ref); in ir_try_split_if()
1881 ir_use_list_replace_one(ctx, end1_ref, merge_ref, if_false_ref); in ir_try_split_if()
1882 ir_use_list_add(ctx, end2_ref, if_true_ref); in ir_try_split_if()
1905 if (ctx->ir_base[end2->op1].op == IR_BEGIN || ctx->ir_base[end2->op1].op == IR_MERGE) { in ir_try_split_if()
1917 static bool ir_try_split_if_cmp(ir_ctx *ctx, ir_ref ref, ir_insn *insn, ir_bitqueue *worklist) in ir_try_split_if_cmp() argument
1920 ir_insn *cond = &ctx->ir_base[cond_ref]; in ir_try_split_if_cmp()
1924 && !IR_IS_SYM_CONST(ctx->ir_base[cond->op2].op) in ir_try_split_if_cmp()
1925 && ctx->use_lists[insn->op2].count == 1) { in ir_try_split_if_cmp()
1927 ir_insn *phi = &ctx->ir_base[phi_ref]; in ir_try_split_if_cmp()
1932 && ctx->use_lists[phi_ref].count == 1 in ir_try_split_if_cmp()
1933 && ((IR_IS_CONST_REF(phi->op2) && !IR_IS_SYM_CONST(ctx->ir_base[phi->op2].op)) in ir_try_split_if_cmp()
1934 || (IR_IS_CONST_REF(phi->op3) && !IR_IS_SYM_CONST(ctx->ir_base[phi->op3].op)))) { in ir_try_split_if_cmp()
1936 ir_insn *merge = &ctx->ir_base[merge_ref]; in ir_try_split_if_cmp()
1938 if (ctx->use_lists[merge_ref].count == 2) { in ir_try_split_if_cmp()
1940 ir_insn *end1 = &ctx->ir_base[end1_ref]; in ir_try_split_if_cmp()
1941 ir_insn *end2 = &ctx->ir_base[end2_ref]; in ir_try_split_if_cmp()
1948 ir_get_true_false_refs(ctx, ref, &if_true_ref, &if_false_ref); in ir_try_split_if_cmp()
1950 if (!IR_IS_CONST_REF(phi->op2) || IR_IS_SYM_CONST(ctx->ir_base[phi->op2].op)) { in ir_try_split_if_cmp()
1957 if (ir_cmp_is_true(cond->op, &ctx->ir_base[phi->op2], &ctx->ir_base[cond->op2])) { in ir_try_split_if_cmp()
1961 if_true = &ctx->ir_base[if_true_ref]; in ir_try_split_if_cmp()
1962 if_false = &ctx->ir_base[if_false_ref]; in ir_try_split_if_cmp()
1964 if (IR_IS_CONST_REF(phi->op3) && !IR_IS_SYM_CONST(ctx->ir_base[phi->op3].op)) { in ir_try_split_if_cmp()
1965 …if (ir_cmp_is_true(cond->op, &ctx->ir_base[phi->op3], &ctx->ir_base[cond->op2]) ^ (op == IR_IF_TRU… in ir_try_split_if_cmp()
1987 ir_use_list_replace_one(ctx, end1_ref, merge_ref, if_false_ref); in ir_try_split_if_cmp()
1988 ir_use_list_replace_one(ctx, end2_ref, merge_ref, if_true_ref); in ir_try_split_if_cmp()
2027 ir_use_list_replace_one(ctx, end1_ref, merge_ref, if_false_ref); in ir_try_split_if_cmp()
2028 ir_use_list_replace_one(ctx, end2_ref, merge_ref, if_false_ref); in ir_try_split_if_cmp()
2042 ctx->flags2 &= ~IR_CFG_REACHABLE; in ir_try_split_if_cmp()
2070 ir_use_list_remove_all(ctx, merge_ref, phi_ref); in ir_try_split_if_cmp()
2071 ir_use_list_remove_all(ctx, ref, if_true_ref); in ir_try_split_if_cmp()
2073 ir_use_list_replace_one(ctx, phi->op3, phi_ref, insn->op2); in ir_try_split_if_cmp()
2075 ir_use_list_replace_one(ctx, end1_ref, merge_ref, if_false_ref); in ir_try_split_if_cmp()
2076 ir_use_list_replace_one(ctx, cond_ref, ref, end2_ref); in ir_try_split_if_cmp()
2077 ir_use_list_add(ctx, end2_ref, if_true_ref); in ir_try_split_if_cmp()
2101 if (ctx->ir_base[end2->op1].op == IR_BEGIN || ctx->ir_base[end2->op1].op == IR_MERGE) { in ir_try_split_if_cmp()
2115 static void ir_optimize_merge(ir_ctx *ctx, ir_ref merge_ref, ir_insn *merge, ir_bitqueue *worklist) in ir_optimize_merge() argument
2117 ir_use_list *use_list = &ctx->use_lists[merge_ref]; in ir_optimize_merge()
2120 ir_try_remove_empty_diamond(ctx, merge_ref, merge, worklist); in ir_optimize_merge()
2123 ir_ref phi_ref = ctx->use_edges[use_list->refs]; in ir_optimize_merge()
2124 ir_insn *phi = &ctx->ir_base[phi_ref]; in ir_optimize_merge()
2126 ir_ref next_ref = ctx->use_edges[use_list->refs + 1]; in ir_optimize_merge()
2127 ir_insn *next = &ctx->ir_base[next_ref]; in ir_optimize_merge()
2131 if (next->op == IR_IF && next->op1 == merge_ref && ctx->use_lists[phi_ref].count == 1) { in ir_optimize_merge()
2133 if (ir_try_split_if(ctx, next_ref, next, worklist)) { in ir_optimize_merge()
2137 ir_insn *cmp = &ctx->ir_base[next->op2]; in ir_optimize_merge()
2142 && !IR_IS_SYM_CONST(ctx->ir_base[cmp->op2].op) in ir_optimize_merge()
2143 && ctx->use_lists[next->op2].count == 1) { in ir_optimize_merge()
2144 if (ir_try_split_if_cmp(ctx, next_ref, next, worklist)) { in ir_optimize_merge()
2150 ir_optimize_phi(ctx, merge_ref, merge, phi_ref, phi, worklist); in ir_optimize_merge()
2156 int ir_sccp(ir_ctx *ctx) in ir_sccp() argument
2163 ir_insn *_values = ir_mem_calloc(ctx->insns_count, sizeof(ir_insn)); in ir_sccp()
2165 ctx->flags2 |= IR_OPT_IN_SCCP; in ir_sccp()
2168 ir_bitqueue_init(&worklist2, ctx->insns_count); in ir_sccp()
2169 ir_bitqueue_init(&worklist, ctx->insns_count); in ir_sccp()
2173 insn = &ctx->ir_base[i]; in ir_sccp()
2176 if (ctx->use_lists[i].count == 0) { in ir_sccp()
2180 if (!ir_sccp_meet_phi(ctx, _values, i, insn, &worklist)) { in ir_sccp()
2218 } else if (!ir_sccp_fold(ctx, _values, i, insn->opt, insn->op1, insn->op2, insn->op3)) { in ir_sccp()
2222 insn = &ctx->ir_base[i]; in ir_sccp()
2283 bool b = ir_sccp_is_true(ctx, _values, insn->op2); in ir_sccp()
2284 use_list = &ctx->use_lists[i]; in ir_sccp()
2286 p = &ctx->use_edges[use_list->refs]; in ir_sccp()
2288 use_insn = &ctx->ir_base[use]; in ir_sccp()
2292 IR_ASSERT(ctx->ir_base[use].op == IR_IF_TRUE || ctx->ir_base[use].op == IR_IF_FALSE); in ir_sccp()
2322 use_list = &ctx->use_lists[i]; in ir_sccp()
2324 for (j = 0, p = &ctx->use_edges[use_list->refs]; j < n; j++, p++) { in ir_sccp()
2327 use_insn = &ctx->ir_base[use]; in ir_sccp()
2329 if (ir_sccp_is_equal(ctx, _values, insn->op2, use_insn->op2)) { in ir_sccp()
2338 use_insn = &ctx->ir_base[use_case]; in ir_sccp()
2354 } else if (ir_is_dead_load_ex(ctx, i, flags, insn)) { in ir_sccp()
2390 use_list = &ctx->use_lists[i]; in ir_sccp()
2392 for (p = &ctx->use_edges[use_list->refs]; n > 0; p++, n--) { in ir_sccp()
2401 if (ctx->flags & IR_DEBUG_SCCP) { in ir_sccp()
2402 for (i = 1; i < ctx->insns_count; i++) { in ir_sccp()
2405 ir_print_const(ctx, &_values[i], stderr, true); in ir_sccp()
2424 for (i = 1, value = _values + i; i < ctx->insns_count; value++, i++) { in ir_sccp()
2429 j = ir_const(ctx, value->val, value->type); in ir_sccp()
2430 ir_sccp_replace_insn(ctx, _values, i, j, &worklist2); in ir_sccp()
2433 j = ir_const_ex(ctx, value->val, value->type, value->optx); in ir_sccp()
2434 ir_sccp_replace_insn(ctx, _values, i, j, &worklist2); in ir_sccp()
2437 ir_sccp_replace_insn(ctx, _values, i, value->op1, &worklist2); in ir_sccp()
2441 insn = &ctx->ir_base[i]; in ir_sccp()
2444 ir_sccp_remove_insn(ctx, _values, i, &worklist2); in ir_sccp()
2449 ir_ref prev = ctx->ir_base[1].op1; in ir_sccp()
2451 ctx->ir_base[1].op1 = insn->op3; in ir_sccp()
2454 if (ctx->ir_base[prev].op3 == i) { in ir_sccp()
2455 ctx->ir_base[prev].op3 = insn->op3; in ir_sccp()
2458 prev = ctx->ir_base[prev].op3; in ir_sccp()
2462 ir_sccp_replace_insn(ctx, _values, i, IR_UNUSED, &worklist2); in ir_sccp()
2466 ir_sccp_remove_if(ctx, _values, i, value->op1); in ir_sccp()
2478 ir_sccp_remove_unfeasible_merge_inputs(ctx, _values, i, _values[i].op1); in ir_sccp()
2481 ctx->flags2 |= IR_CFG_REACHABLE; in ir_sccp()
2484 insn = &ctx->ir_base[i]; in ir_sccp()
2486 if (ctx->use_lists[i].count == 0) { in ir_sccp()
2490 ir_sccp_remove_insn2(ctx, i, &worklist2); in ir_sccp()
2492 insn = &ctx->ir_base[i]; in ir_sccp()
2496 if (ir_may_promote_d2f(ctx, insn->op1)) { in ir_sccp()
2497 ir_ref ref = ir_promote_d2f(ctx, insn->op1, i); in ir_sccp()
2499 ir_sccp_replace_insn2(ctx, i, ref, &worklist2); in ir_sccp()
2503 if (ir_may_promote_f2d(ctx, insn->op1)) { in ir_sccp()
2504 ir_ref ref = ir_promote_f2d(ctx, insn->op1, i); in ir_sccp()
2506 ir_sccp_replace_insn2(ctx, i, ref, &worklist2); in ir_sccp()
2512 if (ctx->ir_base[insn->op1].type == IR_DOUBLE) { in ir_sccp()
2513 if (ir_may_promote_d2f(ctx, insn->op1)) { in ir_sccp()
2514 insn->op1 = ir_promote_d2f(ctx, insn->op1, i); in ir_sccp()
2517 if (ir_may_promote_f2d(ctx, insn->op1)) { in ir_sccp()
2518 insn->op1 = ir_promote_f2d(ctx, insn->op1, i); in ir_sccp()
2523 if (ir_may_promote_i2i(ctx, insn->type, insn->op1)) { in ir_sccp()
2524 ir_ref ref = ir_promote_i2i(ctx, insn->type, insn->op1, i); in ir_sccp()
2526 ir_sccp_replace_insn2(ctx, i, ref, &worklist2); in ir_sccp()
2532 if (ir_try_promote_ext(ctx, i, insn, &worklist2)) { in ir_sccp()
2540 ir_sccp_fold2(ctx, i, &worklist2); in ir_sccp()
2545 if (!(ctx->flags & IR_OPT_CFG)) { in ir_sccp()
2548 if (ctx->ir_base[insn->op1].op == IR_END in ir_sccp()
2549 && ctx->use_lists[i].count == 1) { in ir_sccp()
2550 ir_merge_blocks(ctx, insn->op1, i, &worklist2); in ir_sccp()
2553 ir_optimize_merge(ctx, i, insn, &worklist2); in ir_sccp()
2555 } else if (ir_is_dead_load(ctx, i)) { in ir_sccp()
2556 ir_ref next = ctx->use_edges[ctx->use_lists[i].refs]; in ir_sccp()
2559 ctx->ir_base[next].op1 = insn->op1; in ir_sccp()
2560 ir_use_list_replace_one(ctx, insn->op1, i, next); in ir_sccp()
2562 ir_sccp_remove_insn2(ctx, i, &worklist2); in ir_sccp()
2570 ctx->flags2 &= ~IR_OPT_IN_SCCP; in ir_sccp()
2571 ctx->flags2 |= IR_SCCP_DONE; in ir_sccp()