Lines Matching refs:ref

18 #define IR_MAKE_TOP(ref)        do {IR_ASSERT(ref > 0); _values[ref].optx = IR_TOP;} while (0)  argument
19 #define IR_MAKE_BOTTOM(ref) do {IR_ASSERT(ref > 0); _values[ref].optx = IR_BOTTOM;} while (0) argument
21 #define IR_IS_TOP(ref) (ref >= 0 && _values[ref].optx == IR_TOP) argument
22 #define IR_IS_BOTTOM(ref) (ref >= 0 && _values[ref].optx == IR_BOTTOM) argument
23 #define IR_IS_FEASIBLE(ref) (ref >= 0 && _values[ref].optx != IR_TOP) argument
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()
324 static void ir_sccp_make_nop(ir_ctx *ctx, ir_ref ref) in ir_sccp_make_nop() argument
329 CLEAR_USES(ref); in ir_sccp_make_nop()
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
343 CLEAR_USES(ref); in ir_sccp_remove_insn()
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()
360 static void ir_sccp_remove_insn2(ir_ctx *ctx, ir_ref ref, ir_bitqueue *worklist) in ir_sccp_remove_insn2() argument
365 CLEAR_USES(ref); in ir_sccp_remove_insn2()
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()
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
391 IR_ASSERT(ref != new_ref); in ir_sccp_replace_insn()
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()
410 use_list = &ctx->use_lists[ref]; in ir_sccp_replace_insn()
418 if (ir_insn_op(insn, k) == ref) { in ir_sccp_replace_insn()
426 use_list = &ctx->use_lists[ref]; in ir_sccp_replace_insn()
439 CLEAR_USES(ref); 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
448 IR_ASSERT(ref != new_ref); in ir_sccp_replace_insn2()
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()
468 use_list = &ctx->use_lists[ref]; in ir_sccp_replace_insn2()
475 if (ir_insn_op(insn, k) == ref) { in ir_sccp_replace_insn2()
483 use_list = &ctx->use_lists[ref]; in ir_sccp_replace_insn2()
493 CLEAR_USES(ref); 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()
521 insn = &ctx->ir_base[ref]; in ir_sccp_fold2()
535 ir_use_list_remove_one(ctx, insn->op1, ref); in ir_sccp_fold2()
538 ir_use_list_add(ctx, ctx->fold_insn.op1, ref); in ir_sccp_fold2()
543 ir_use_list_remove_one(ctx, insn->op2, ref); in ir_sccp_fold2()
546 ir_use_list_add(ctx, ctx->fold_insn.op2, ref); in ir_sccp_fold2()
551 ir_use_list_remove_one(ctx, insn->op3, ref); in ir_sccp_fold2()
554 ir_use_list_add(ctx, ctx->fold_insn.op3, ref); in ir_sccp_fold2()
561 use_list = &ctx->use_lists[ref]; in ir_sccp_fold2()
571 ir_sccp_replace_insn2(ctx, ref, op1, worklist); 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()
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()
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()
626 if (input < ref) { in ir_sccp_remove_unfeasible_merge_inputs()
631 use_list = &ctx->use_lists[ref]; in ir_sccp_remove_unfeasible_merge_inputs()
645 IR_ASSERT(use_insn->op1 == ref); in ir_sccp_remove_unfeasible_merge_inputs()
657 ir_sccp_make_nop(ctx, ref); in ir_sccp_remove_unfeasible_merge_inputs()
701 use_list = &ctx->use_lists[ref]; 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()
738 if (IR_IS_CONST_REF(ref)) { in ir_may_promote_d2f()
748 return ctx->use_lists[ref].count == 1 && in ir_may_promote_d2f()
756 return ctx->use_lists[ref].count == 1 && 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()
771 if (IR_IS_CONST_REF(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()
789 return ctx->use_lists[ref].count == 1 && 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()
805 if (IR_IS_CONST_REF(ref)) { 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()
819 ref = insn->op1; in ir_promote_d2f()
821 return ref; in ir_promote_d2f()
824 count -= ctx->use_lists[ref].count; in ir_promote_d2f()
837 insn->op1 = ir_promote_d2f(ctx, insn->op1, ref); in ir_promote_d2f()
839 return 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()
853 return ref; in ir_promote_d2f()
859 return 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()
869 if (IR_IS_CONST_REF(ref)) { 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()
883 ref = insn->op1; in ir_promote_f2d()
885 return ref; in ir_promote_f2d()
888 count -= ctx->use_lists[ref].count; 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()
901 CLEAR_USES(ref); in ir_promote_f2d()
907 return ref; in ir_promote_f2d()
910 insn->op1 = ir_promote_f2d(ctx, insn->op1, ref); in ir_promote_f2d()
912 return 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()
926 return ref; in ir_promote_f2d()
932 return 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()
939 if (IR_IS_CONST_REF(ref)) { in ir_may_promote_i2i()
949 return ctx->use_lists[ref].count == 1 && in ir_may_promote_i2i()
960 return ctx->use_lists[ref].count == 1 && 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()
975 if (IR_IS_CONST_REF(ref)) { 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()
990 ref = insn->op1; in ir_promote_i2i()
992 return ref; in ir_promote_i2i()
995 count -= ctx->use_lists[ref].count; in ir_promote_i2i()
1006 insn->op1 = ir_promote_i2i(ctx, type, insn->op1, ref); in ir_promote_i2i()
1008 return 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()
1025 return ref; in ir_promote_i2i()
1031 return ref; in ir_promote_i2i()
1073 ir_ref ref; in ir_ext_ref() local
1076 ref = ir_find1(ctx, optx, src_ref); in ir_ext_ref()
1077 if (ref) { in ir_ext_ref()
1078 ir_use_list_add(ctx, ref, var_ref); in ir_ext_ref()
1082 return ref; in ir_ext_ref()
1086 ref = ir_emit1(ctx, optx, src_ref); 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()
1094 return ref; in ir_ext_ref()
1101 ir_ref ref = insn->op1; in ir_try_promote_ext() local
1102 ir_insn *phi_insn = &ctx->ir_base[ref]; in ir_try_promote_ext()
1117 || (op_insn->op1 != ref && op_insn->op2 != ref) in ir_try_promote_ext()
1123 use_list = &ctx->use_lists[ref]; in ir_try_promote_ext()
1133 && (use_insn->op1 == ref || use_insn->op2 == ref)) { 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()
1159 && (use_insn->op1 == ref || use_insn->op2 == ref)); in ir_try_promote_ext()
1160 if (use_insn->op1 != ref) { in ir_try_promote_ext()
1169 if (use_insn->op2 != ref) { 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()
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()
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
1288 ir_ref next_ref = ctx->use_edges[ctx->use_lists[ref].refs]; in ir_try_remove_empty_diamond()
1308 MAKE_NOP(insn); CLEAR_USES(ref); 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()
1371 MAKE_NOP(insn); CLEAR_USES(ref); in ir_try_remove_empty_diamond()
1381 static bool ir_is_zero(ir_ctx *ctx, ir_ref ref) in ir_is_zero() argument
1383 return IR_IS_CONST_REF(ref) in ir_is_zero()
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
1451 if (next_ref == ref) { in ir_optimize_phi()
1537 if (next_ref == ref) { in ir_optimize_phi()
1602 if (next_ref == ref) { in ir_optimize_phi()
1618 ir_use_list_replace_one(ctx, cond_ref, root_ref, ref); 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
1764 ir_get_true_false_refs(ctx, ref, &if_true_ref, &if_false_ref); in ir_try_split_if()
1805 MAKE_NOP(insn); CLEAR_USES(ref); in ir_try_split_if()
1841 MAKE_NOP(insn); CLEAR_USES(ref); in ir_try_split_if()
1877 ir_use_list_remove_all(ctx, ref, if_true_ref); in ir_try_split_if()
1902 if_false->op2 = ref; 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
1948 ir_get_true_false_refs(ctx, ref, &if_true_ref, &if_false_ref); in ir_try_split_if_cmp()
1993 MAKE_NOP(insn); CLEAR_USES(ref); in ir_try_split_if_cmp()
2033 MAKE_NOP(insn); CLEAR_USES(ref); in ir_try_split_if_cmp()
2071 ir_use_list_remove_all(ctx, ref, if_true_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()
2098 if_false->op2 = ref; in ir_try_split_if_cmp()
2497 ir_ref ref = ir_promote_d2f(ctx, insn->op1, i); in ir_sccp() local
2498 insn->op1 = ref; in ir_sccp()
2499 ir_sccp_replace_insn2(ctx, i, ref, &worklist2); in ir_sccp()
2504 ir_ref ref = ir_promote_f2d(ctx, insn->op1, i); in ir_sccp() local
2505 insn->op1 = ref; in ir_sccp()
2506 ir_sccp_replace_insn2(ctx, i, ref, &worklist2); in ir_sccp()
2524 ir_ref ref = ir_promote_i2i(ctx, insn->type, insn->op1, i); in ir_sccp() local
2525 insn->op1 = ref; in ir_sccp()
2526 ir_sccp_replace_insn2(ctx, i, ref, &worklist2); in ir_sccp()