Lines Matching refs:ssa

397 …alias_kind zend_jit_var_may_alias(const zend_op_array *op_array, const zend_ssa *ssa, uint32_t var)  in zend_jit_var_may_alias()  argument
401 } else if ((!op_array->function_name || (ssa->cfg.flags & ZEND_FUNC_INDIRECT_VAR_ACCESS))) { in zend_jit_var_may_alias()
403 } else if (ssa->vars) { in zend_jit_var_may_alias()
404 return ssa->vars[var].alias; in zend_jit_var_may_alias()
438 if (ssa->vars[_ssa_var].alias != NO_ALIAS) { \
444 ssa->var_info[_ssa_var].type &= op_info; \
558 zend_ssa *ssa; in zend_jit_trace_build_ssa() local
567 memset(&jit_extension->func_info.ssa, 0, sizeof(zend_func_info) - offsetof(zend_func_info, ssa)); in zend_jit_trace_build_ssa()
568 ssa = &jit_extension->func_info.ssa; in zend_jit_trace_build_ssa()
572 if (zend_jit_op_array_analyze1(op_array, script, ssa) != SUCCESS) { in zend_jit_trace_build_ssa()
584 if (zend_jit_op_array_analyze2(op_array, script, ssa, 0) != SUCCESS) { in zend_jit_trace_build_ssa()
589 …mp_op_array(op_array, ZEND_DUMP_HIDE_UNREACHABLE|ZEND_DUMP_RC_INFERENCE|ZEND_DUMP_SSA, "JIT", ssa); in zend_jit_trace_build_ssa()
591 return ssa; in zend_jit_trace_build_ssa()
595 memset(ssa, 0, sizeof(zend_ssa)); in zend_jit_trace_build_ssa()
596 ssa->cfg.blocks_count = 1; in zend_jit_trace_build_ssa()
603 ssa->cfg.flags = cfg.flags; in zend_jit_trace_build_ssa()
605 ssa->cfg.flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS; in zend_jit_trace_build_ssa()
610 ssa->cfg.flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS; in zend_jit_trace_build_ssa()
616 return ssa; in zend_jit_trace_build_ssa()
822 static int zend_jit_trace_copy_ssa_var_info(const zend_op_array *op_array, const zend_ssa *ssa, con… in zend_jit_trace_copy_ssa_var_info() argument
839 op = ssa->ops + (tssa_opcodes[use] - op_array->opcodes); in zend_jit_trace_copy_ssa_var_info()
841 no_val = ssa->vars[op->op1_use].no_val; in zend_jit_trace_copy_ssa_var_info()
842 alias = ssa->vars[op->op1_use].alias; in zend_jit_trace_copy_ssa_var_info()
843 info = ssa->var_info + op->op1_use; in zend_jit_trace_copy_ssa_var_info()
845 no_val = ssa->vars[op->op2_use].no_val; in zend_jit_trace_copy_ssa_var_info()
846 alias = ssa->vars[op->op2_use].alias; in zend_jit_trace_copy_ssa_var_info()
847 info = ssa->var_info + op->op2_use; in zend_jit_trace_copy_ssa_var_info()
849 no_val = ssa->vars[op->result_use].no_val; in zend_jit_trace_copy_ssa_var_info()
850 alias = ssa->vars[op->result_use].alias; in zend_jit_trace_copy_ssa_var_info()
851 info = ssa->var_info + op->result_use; in zend_jit_trace_copy_ssa_var_info()
879 static void zend_jit_trace_copy_ssa_var_range(const zend_op_array *op_array, const zend_ssa *ssa, c… in zend_jit_trace_copy_ssa_var_range() argument
890 op = ssa->ops + (tssa_opcodes[def] - op_array->opcodes); in zend_jit_trace_copy_ssa_var_range()
892 no_val = ssa->vars[op->op1_def].no_val; in zend_jit_trace_copy_ssa_var_range()
893 alias = ssa->vars[op->op1_def].alias; in zend_jit_trace_copy_ssa_var_range()
894 info = ssa->var_info + op->op1_def; in zend_jit_trace_copy_ssa_var_range()
896 no_val = ssa->vars[op->op2_def].no_val; in zend_jit_trace_copy_ssa_var_range()
897 alias = ssa->vars[op->op2_def].alias; in zend_jit_trace_copy_ssa_var_range()
898 info = ssa->var_info + op->op2_def; in zend_jit_trace_copy_ssa_var_range()
900 no_val = ssa->vars[op->result_def].no_val; in zend_jit_trace_copy_ssa_var_range()
901 alias = ssa->vars[op->result_def].alias; in zend_jit_trace_copy_ssa_var_range()
902 info = ssa->var_info + op->result_def; in zend_jit_trace_copy_ssa_var_range()
929 static int zend_jit_trace_restrict_ssa_var_info(const zend_op_array *op_array, const zend_ssa *ssa,… in zend_jit_trace_restrict_ssa_var_info() argument
938 op = ssa->ops + (tssa_opcodes[def] - op_array->opcodes); in zend_jit_trace_restrict_ssa_var_info()
940 info = ssa->var_info + op->op1_def; in zend_jit_trace_restrict_ssa_var_info()
942 info = ssa->var_info + op->op2_def; in zend_jit_trace_restrict_ssa_var_info()
944 info = ssa->var_info + op->result_def; in zend_jit_trace_restrict_ssa_var_info()
1175 zend_ssa ssa; member
1199 zend_ssa *ssa; in zend_jit_trace_build_tssa() local
1218 ssa = zend_jit_trace_build_ssa(op_array, script); in zend_jit_trace_build_tssa()
1226 ssa->cfg.flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS; in zend_jit_trace_build_tssa()
1237 ssa->cfg.flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS; in zend_jit_trace_build_tssa()
1240 ssa->cfg.flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS; in zend_jit_trace_build_tssa()
1259 ssa->cfg.flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS; in zend_jit_trace_build_tssa()
1284 ssa = &jit_extension->func_info.ssa; in zend_jit_trace_build_tssa()
1285 if (ssa->cfg.blocks_count) { in zend_jit_trace_build_tssa()
1295 ssa = zend_jit_trace_build_ssa(op_array, script); in zend_jit_trace_build_tssa()
1302 ssa = &jit_extension->func_info.ssa; in zend_jit_trace_build_tssa()
1303 if (ssa->cfg.blocks_count) { in zend_jit_trace_build_tssa()
1313 ssa = zend_jit_trace_build_ssa(op_array, script); in zend_jit_trace_build_tssa()
1525 ssa = &jit_extension->func_info.ssa; in zend_jit_trace_build_tssa()
1533 if (ssa->var_info in zend_jit_trace_build_tssa()
1534 && zend_jit_trace_copy_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, i)) { in zend_jit_trace_build_tssa()
1537 if (ssa->vars) { in zend_jit_trace_build_tssa()
1538 ssa_vars[i].no_val = ssa->vars[i].no_val; in zend_jit_trace_build_tssa()
1539 ssa_vars[i].alias = ssa->vars[i].alias; in zend_jit_trace_build_tssa()
1541 ssa_vars[i].alias = zend_jit_var_may_alias(op_array, ssa, i); in zend_jit_trace_build_tssa()
1559 if (ssa->vars) { in zend_jit_trace_build_tssa()
1560 ssa_vars[i].no_val = ssa->vars[i].no_val; in zend_jit_trace_build_tssa()
1561 ssa_vars[i].alias = ssa->vars[i].alias; in zend_jit_trace_build_tssa()
1563 ssa_vars[i].alias = zend_jit_var_may_alias(op_array, ssa, i); in zend_jit_trace_build_tssa()
1588 if (!ssa->var_info in zend_jit_trace_build_tssa()
1589 || !zend_jit_trace_copy_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, i)) { in zend_jit_trace_build_tssa()
1590 if (ssa->vars && i < ssa->vars_count) { in zend_jit_trace_build_tssa()
1591 ssa_vars[i].alias = ssa->vars[i].alias; in zend_jit_trace_build_tssa()
1593 ssa_vars[i].alias = zend_jit_var_may_alias(op_array, ssa, i); in zend_jit_trace_build_tssa()
1626 if (!ssa->var_info in zend_jit_trace_build_tssa()
1627 || !zend_jit_trace_copy_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, phi->ssa_var)) { in zend_jit_trace_build_tssa()
2136 if (ssa->var_info) { in zend_jit_trace_build_tssa()
2139 zend_jit_trace_copy_ssa_var_range(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].op1_def); in zend_jit_trace_build_tssa()
2142 zend_jit_trace_copy_ssa_var_range(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].op2_def); in zend_jit_trace_build_tssa()
2145 zend_jit_trace_copy_ssa_var_range(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].result_def); in zend_jit_trace_build_tssa()
2149 zend_jit_trace_copy_ssa_var_range(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx+1].op1_def); in zend_jit_trace_build_tssa()
2152 zend_jit_trace_copy_ssa_var_range(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx+1].op2_def); in zend_jit_trace_build_tssa()
2155 … zend_jit_trace_copy_ssa_var_range(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx+1].result_def); in zend_jit_trace_build_tssa()
2160 …ssa_vars[ssa_ops[idx].op1_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(opline-… in zend_jit_trace_build_tssa()
2166 …ssa_vars[ssa_ops[idx].op2_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(opline-… in zend_jit_trace_build_tssa()
2172 …ssa_vars[ssa_ops[idx].result_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(opli… in zend_jit_trace_build_tssa()
2179 …ssa_vars[ssa_ops[idx+1].op1_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM((opli… in zend_jit_trace_build_tssa()
2185 …ssa_vars[ssa_ops[idx+1].op2_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM((opli… in zend_jit_trace_build_tssa()
2191 …ssa_vars[ssa_ops[idx+1].result_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM((o… in zend_jit_trace_build_tssa()
2227 if (ssa->var_info) { in zend_jit_trace_build_tssa()
2241 zend_jit_trace_restrict_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].op1_def); in zend_jit_trace_build_tssa()
2247 zend_jit_trace_restrict_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].op2_def); in zend_jit_trace_build_tssa()
2251 … zend_jit_trace_restrict_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].result_def); in zend_jit_trace_build_tssa()
2258 if (ssa->var_info) { in zend_jit_trace_build_tssa()
2261 zend_jit_trace_copy_ssa_var_range(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].op1_def); in zend_jit_trace_build_tssa()
2264 zend_jit_trace_copy_ssa_var_range(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].op2_def); in zend_jit_trace_build_tssa()
2267 zend_jit_trace_copy_ssa_var_range(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].result_def); in zend_jit_trace_build_tssa()
2271 …ssa_vars[ssa_ops[idx].op1_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(opline-… in zend_jit_trace_build_tssa()
2277 …ssa_vars[ssa_ops[idx].op2_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(opline-… in zend_jit_trace_build_tssa()
2283 …ssa_vars[ssa_ops[idx].result_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(opli… in zend_jit_trace_build_tssa()
2300 if (ssa->var_info) { in zend_jit_trace_build_tssa()
2303 zend_jit_trace_restrict_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].op1_def); in zend_jit_trace_build_tssa()
2306 zend_jit_trace_restrict_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].op2_def); in zend_jit_trace_build_tssa()
2309 … zend_jit_trace_restrict_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].result_def); in zend_jit_trace_build_tssa()
2320 ssa = &jit_extension->func_info.ssa; in zend_jit_trace_build_tssa()
2346 if (ssa->var_info in zend_jit_trace_build_tssa()
2347 && zend_jit_trace_copy_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, v)) { in zend_jit_trace_build_tssa()
2350 ssa_vars[v].alias = zend_jit_var_may_alias(op_array, ssa, i); in zend_jit_trace_build_tssa()
2367 if (ssa->vars) { in zend_jit_trace_build_tssa()
2368 ssa_vars[v].no_val = ssa->vars[i].no_val; in zend_jit_trace_build_tssa()
2369 ssa_vars[v].alias = ssa->vars[i].alias; in zend_jit_trace_build_tssa()
2371 ssa_vars[v].alias = zend_jit_var_may_alias(op_array, ssa, i); in zend_jit_trace_build_tssa()
2391 ssa = &jit_extension->func_info.ssa; in zend_jit_trace_build_tssa()
2397 if (!ssa->var_info in zend_jit_trace_build_tssa()
2398 || !zend_jit_trace_copy_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, v)) { in zend_jit_trace_build_tssa()
2406 if (!ssa->var_info in zend_jit_trace_build_tssa()
2407 || !zend_jit_trace_copy_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, v)) { in zend_jit_trace_build_tssa()
2543 ssa = &jit_extension->func_info.ssa; in zend_jit_trace_build_tssa()
2675 … def, int use_chain, int *start, int *end, uint8_t *flags, const zend_ssa *ssa, const zend_op **ss… in zend_jit_trace_use_var() argument
2684 …} else if (use_chain >= 0 && !zend_ssa_is_no_val_use(ssa_opcodes[use_chain], ssa->ops + use_chain,… in zend_jit_trace_use_var()
2689 if (ssa->ops[line].op1_use == var) { in zend_jit_trace_use_var()
2693 } else if (ssa->ops[line].op2_use == var) { in zend_jit_trace_use_var()
2697 } else if (ssa->ops[line].result_use == var) { in zend_jit_trace_use_var()
2705 …d_jit_trace_allocate_registers(zend_jit_trace_rec *trace_buffer, zend_ssa *ssa, uint32_t parent_tr… in zend_jit_trace_allocate_registers() argument
2707 const zend_op **ssa_opcodes = ((zend_tssa*)ssa)->tssa_opcodes; in zend_jit_trace_allocate_registers()
2729 ZEND_ASSERT(ssa->var_info != NULL); in zend_jit_trace_allocate_registers()
2731 start = do_alloca(sizeof(int) * ssa->vars_count * 2 + in zend_jit_trace_allocate_registers()
2732 ZEND_MM_ALIGNED_SIZE(sizeof(uint8_t) * ssa->vars_count), in zend_jit_trace_allocate_registers()
2737 end = start + ssa->vars_count; in zend_jit_trace_allocate_registers()
2738 flags = (uint8_t*)(end + ssa->vars_count); in zend_jit_trace_allocate_registers()
2740 vars_op_array = zend_arena_calloc(&CG(arena), ssa->vars_count, sizeof(zend_op_array*)); in zend_jit_trace_allocate_registers()
2742 memset(start, -1, sizeof(int) * ssa->vars_count * 2); in zend_jit_trace_allocate_registers()
2743 memset(flags, 0, sizeof(uint8_t) * ssa->vars_count); in zend_jit_trace_allocate_registers()
2744 memset(ZEND_VOIDP(vars_op_array), 0, sizeof(zend_op_array*) * ssa->vars_count); in zend_jit_trace_allocate_registers()
2749 op_array_ssa = &jit_extension->func_info.ssa; in zend_jit_trace_allocate_registers()
2766 if ((ssa->vars[i].use_chain >= 0 /*|| ssa->vars[i].phi_use_chain*/) in zend_jit_trace_allocate_registers()
2767 …&& !zend_ssa_is_no_val_use(ssa_opcodes[ssa->vars[i].use_chain], ssa->ops + ssa->vars[i].use_chain,… in zend_jit_trace_allocate_registers()
2768 && ssa->vars[i].alias == NO_ALIAS in zend_jit_trace_allocate_registers()
2769 && zend_jit_var_supports_reg(ssa, i)) { in zend_jit_trace_allocate_registers()
2796 zend_ssa_phi *phi = ssa->blocks[1].phis; in zend_jit_trace_allocate_registers()
2801 if (ssa->vars[phi->ssa_var].use_chain >= 0 in zend_jit_trace_allocate_registers()
2802 && ssa->vars[phi->ssa_var].alias == NO_ALIAS in zend_jit_trace_allocate_registers()
2803 && zend_jit_var_supports_reg(ssa, phi->ssa_var)) { in zend_jit_trace_allocate_registers()
2813 ssa_op = ssa->ops; in zend_jit_trace_allocate_registers()
2822 zend_jit_opline_supports_reg(op_array, ssa, opline, ssa_op, p); in zend_jit_trace_allocate_registers()
2828 && ssa->vars[ssa_op->op1_def].alias != NO_ALIAS) { in zend_jit_trace_allocate_registers()
2837 …sa_op->op1_use, ssa_op->op1_def, ssa_op->op1_use_chain, start, end, flags, ssa, ssa_opcodes, op_ar… in zend_jit_trace_allocate_registers()
2869 …sa_op->op2_use, ssa_op->op2_def, ssa_op->op2_use_chain, start, end, flags, ssa, ssa_opcodes, op_ar… in zend_jit_trace_allocate_registers()
2885 …>result_use, ssa_op->result_def, ssa_op->res_use_chain, start, end, flags, ssa, ssa_opcodes, op_ar… in zend_jit_trace_allocate_registers()
2908 && (ssa->vars[ssa_op->result_def].use_chain >= 0 in zend_jit_trace_allocate_registers()
2909 || ssa->vars[ssa_op->result_def].phi_use_chain) in zend_jit_trace_allocate_registers()
2910 && ssa->vars[ssa_op->result_def].alias == NO_ALIAS in zend_jit_trace_allocate_registers()
2911 && zend_jit_var_supports_reg(ssa, ssa_op->result_def)) { in zend_jit_trace_allocate_registers()
2912 if (!(ssa->var_info[ssa_op->result_def].type & MAY_BE_GUARD) in zend_jit_trace_allocate_registers()
2922 if (!(ssa->var_info[ssa_op->result_def].type & MAY_BE_DOUBLE) in zend_jit_trace_allocate_registers()
2931 && (ssa->vars[ssa_op->op1_def].use_chain >= 0 in zend_jit_trace_allocate_registers()
2932 || ssa->vars[ssa_op->op1_def].phi_use_chain) in zend_jit_trace_allocate_registers()
2933 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS in zend_jit_trace_allocate_registers()
2934 && zend_jit_var_supports_reg(ssa, ssa_op->op1_def)) { in zend_jit_trace_allocate_registers()
2940 && (ssa->vars[ssa_op->op2_def].use_chain >= 0 in zend_jit_trace_allocate_registers()
2941 || ssa->vars[ssa_op->op2_def].phi_use_chain) in zend_jit_trace_allocate_registers()
2942 && ssa->vars[ssa_op->op2_def].alias == NO_ALIAS in zend_jit_trace_allocate_registers()
2943 && zend_jit_var_supports_reg(ssa, ssa_op->op2_def)) { in zend_jit_trace_allocate_registers()
2967 …sa_op->op1_use, ssa_op->op1_def, ssa_op->op1_use_chain, start, end, flags, ssa, ssa_opcodes, op_ar… in zend_jit_trace_allocate_registers()
2981 && (ssa->vars[ssa_op->op1_def].use_chain >= 0 in zend_jit_trace_allocate_registers()
2982 || ssa->vars[ssa_op->op1_def].phi_use_chain) in zend_jit_trace_allocate_registers()
2983 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS in zend_jit_trace_allocate_registers()
2984 && zend_jit_var_supports_reg(ssa, ssa_op->op1_def)) { in zend_jit_trace_allocate_registers()
3040 op_array_ssa = &jit_extension->func_info.ssa; in zend_jit_trace_allocate_registers()
3045 if (ssa->vars[j].use_chain >= 0 in zend_jit_trace_allocate_registers()
3046 && ssa->vars[j].alias == NO_ALIAS in zend_jit_trace_allocate_registers()
3047 && zend_jit_var_supports_reg(ssa, j)) { in zend_jit_trace_allocate_registers()
3066 op_array_ssa = &jit_extension->func_info.ssa; in zend_jit_trace_allocate_registers()
3077 if (ssa->vars[j].use_chain >= 0 in zend_jit_trace_allocate_registers()
3078 && ssa->vars[j].alias == NO_ALIAS in zend_jit_trace_allocate_registers()
3079 && zend_jit_var_supports_reg(ssa, j)) { in zend_jit_trace_allocate_registers()
3097 zend_ssa_phi *phi = ssa->blocks[1].phis; in zend_jit_trace_allocate_registers()
3101 if (start[i] >= 0 && !ssa->vars[phi->ssa_var].no_val) { in zend_jit_trace_allocate_registers()
3110 if (start[i] >= 0 && !ssa->vars[i].phi_use_chain) { in zend_jit_trace_allocate_registers()
3139 intervals = zend_arena_calloc(&CG(arena), ssa->vars_count, sizeof(zend_lifetime_interval)); in zend_jit_trace_allocate_registers()
3140 memset(intervals, 0, sizeof(zend_lifetime_interval*) * ssa->vars_count); in zend_jit_trace_allocate_registers()
3143 for (i = 0; i < ssa->vars_count; i++) { in zend_jit_trace_allocate_registers()
3148 end[i] == ssa->vars[i].use_chain) { in zend_jit_trace_allocate_registers()
3206 zend_ssa_phi *phi = ssa->blocks[1].phis; in zend_jit_trace_allocate_registers()
3211 && (ssa->var_info[phi->sources[1]].type & MAY_BE_ANY) == in zend_jit_trace_allocate_registers()
3212 (ssa->var_info[phi->ssa_var].type & MAY_BE_ANY)) { in zend_jit_trace_allocate_registers()
3220 for (i = 0; i < ssa->vars_count; i++) { in zend_jit_trace_allocate_registers()
3223 if (ssa->vars[i].definition >= 0) { in zend_jit_trace_allocate_registers()
3224 uint32_t line = ssa->vars[i].definition; in zend_jit_trace_allocate_registers()
3231 if (ssa->ops[line].op1_use >= 0 && in zend_jit_trace_allocate_registers()
3232 intervals[ssa->ops[line].op1_use] && in zend_jit_trace_allocate_registers()
3233 (i == ssa->ops[line].op1_def || in zend_jit_trace_allocate_registers()
3234 (i == ssa->ops[line].result_def && in zend_jit_trace_allocate_registers()
3235 (ssa->ops[line].op1_def < 0 || in zend_jit_trace_allocate_registers()
3236 !intervals[ssa->ops[line].op1_def])))) { in zend_jit_trace_allocate_registers()
3237 zend_jit_add_hint(intervals, i, ssa->ops[line].op1_use); in zend_jit_trace_allocate_registers()
3247 if (i == ssa->ops[line].op1_def && in zend_jit_trace_allocate_registers()
3248 ssa->ops[line].op1_use >= 0 && in zend_jit_trace_allocate_registers()
3249 intervals[ssa->ops[line].op1_use]) { in zend_jit_trace_allocate_registers()
3250 zend_jit_add_hint(intervals, i, ssa->ops[line].op1_use); in zend_jit_trace_allocate_registers()
3254 if (ssa->ops[line].op2_use >= 0 && in zend_jit_trace_allocate_registers()
3255 intervals[ssa->ops[line].op2_use] && in zend_jit_trace_allocate_registers()
3256 (i == ssa->ops[line].op2_def || in zend_jit_trace_allocate_registers()
3257 (i == ssa->ops[line].op1_def && in zend_jit_trace_allocate_registers()
3258 (ssa->ops[line].op2_def < 0 || in zend_jit_trace_allocate_registers()
3259 !intervals[ssa->ops[line].op2_def])) || in zend_jit_trace_allocate_registers()
3260 (i == ssa->ops[line].result_def && in zend_jit_trace_allocate_registers()
3261 (ssa->ops[line].op2_def < 0 || in zend_jit_trace_allocate_registers()
3262 !intervals[ssa->ops[line].op2_def]) && in zend_jit_trace_allocate_registers()
3263 (ssa->ops[line].op1_def < 0 || in zend_jit_trace_allocate_registers()
3264 !intervals[ssa->ops[line].op1_def])))) { in zend_jit_trace_allocate_registers()
3265 zend_jit_add_hint(intervals, i, ssa->ops[line].op2_use); in zend_jit_trace_allocate_registers()
3274 if (i == ssa->ops[line].result_def) { in zend_jit_trace_allocate_registers()
3275 if (ssa->ops[line].op1_use >= 0 && in zend_jit_trace_allocate_registers()
3276 intervals[ssa->ops[line].op1_use] && in zend_jit_trace_allocate_registers()
3277 ssa->ops[line].op1_use_chain < 0 && in zend_jit_trace_allocate_registers()
3278 !ssa->vars[ssa->ops[line].op1_use].phi_use_chain && in zend_jit_trace_allocate_registers()
3279 (ssa->var_info[i].type & MAY_BE_ANY) == in zend_jit_trace_allocate_registers()
3280 (ssa->var_info[ssa->ops[line].op1_use].type & MAY_BE_ANY)) { in zend_jit_trace_allocate_registers()
3282 zend_ssa_phi *phi = ssa->vars[ssa->ops[line].op1_use].definition_phi; in zend_jit_trace_allocate_registers()
3285 intervals[phi->sources[1]]->hint == intervals[ssa->ops[line].op1_use]) { in zend_jit_trace_allocate_registers()
3288 zend_jit_add_hint(intervals, i, ssa->ops[line].op1_use); in zend_jit_trace_allocate_registers()
3290 ssa->ops[line].op2_use >= 0 && in zend_jit_trace_allocate_registers()
3291 intervals[ssa->ops[line].op2_use] && in zend_jit_trace_allocate_registers()
3292 ssa->ops[line].op2_use_chain < 0 && in zend_jit_trace_allocate_registers()
3293 !ssa->vars[ssa->ops[line].op2_use].phi_use_chain && in zend_jit_trace_allocate_registers()
3294 (ssa->var_info[i].type & MAY_BE_ANY) == in zend_jit_trace_allocate_registers()
3295 (ssa->var_info[ssa->ops[line].op2_use].type & MAY_BE_ANY)) { in zend_jit_trace_allocate_registers()
3297 zend_ssa_phi *phi = ssa->vars[ssa->ops[line].op2_use].definition_phi; in zend_jit_trace_allocate_registers()
3300 intervals[phi->sources[1]]->hint == intervals[ssa->ops[line].op2_use]) { in zend_jit_trace_allocate_registers()
3303 zend_jit_add_hint(intervals, i, ssa->ops[line].op2_use); in zend_jit_trace_allocate_registers()
3312 list = zend_jit_sort_intervals(intervals, ssa->vars_count); in zend_jit_trace_allocate_registers()
3329 zend_jit_dump_lifetime_interval(vars_op_array[ival->ssa_var], ssa, ival); in zend_jit_trace_allocate_registers()
3336 list = zend_jit_linear_scan(&dummy_op_array, ssa_opcodes, ssa, list); in zend_jit_trace_allocate_registers()
3341 memset(intervals, 0, ssa->vars_count * sizeof(zend_lifetime_interval*)); in zend_jit_trace_allocate_registers()
3379 zend_ssa_phi *phi = ssa->blocks[1].phis; in zend_jit_trace_allocate_registers()
3389 && ssa->vars[def].use_chain >= 0 in zend_jit_trace_allocate_registers()
3390 && ssa->vars[def].use_chain == intervals[def]->range.end) { in zend_jit_trace_allocate_registers()
3397 if (ssa->vars[use].use_chain >= 0) { in zend_jit_trace_allocate_registers()
3418 && (!ssa->vars[def].no_val in zend_jit_trace_allocate_registers()
3419 || ssa->var_info[def].type != ssa->var_info[use].type)) { in zend_jit_trace_allocate_registers()
3420 if (ssa->vars[use].use_chain >= 0) { in zend_jit_trace_allocate_registers()
3430 for (i = 0; i < ssa->vars_count; i++) { in zend_jit_trace_allocate_registers()
3446 for (i = 0; i < ssa->vars_count; i++) { in zend_jit_trace_allocate_registers()
3449 zend_jit_dump_lifetime_interval(vars_op_array[ival->ssa_var], ssa, ival); in zend_jit_trace_allocate_registers()
3462 … *stack, const zend_op *opline, const zend_ssa_op *ssa_op, const zend_ssa *ssa, zend_lifetime_inte… in zend_jit_trace_clenup_stack() argument
3464 uint32_t line = ssa_op - ssa->ops; in zend_jit_trace_clenup_stack()
3499 static bool zend_jit_may_delay_fetch_this(const zend_op_array *op_array, zend_ssa *ssa, const zend_… in zend_jit_may_delay_fetch_this() argument
3503 int use = ssa->vars[var].use_chain; in zend_jit_may_delay_fetch_this()
3507 || ssa->vars[var].phi_use_chain in zend_jit_may_delay_fetch_this()
3508 || ssa->ops[use].op1_use != var in zend_jit_may_delay_fetch_this()
3509 || ssa->ops[use].op1_use_chain != -1) { in zend_jit_may_delay_fetch_this()
3555 for (i = ssa->vars[var].definition; i < use; i++) { in zend_jit_may_delay_fetch_this()
3601 zend_ssa *ssa, in zend_jit_trace_deoptimization() argument
3616 if (ssa && ssa->vars[i].no_val) { in zend_jit_trace_deoptimization()
3651 if (ssa && ssa->vars[i].no_val) { in zend_jit_trace_deoptimization()
3679 ssa->var_info[i].delayed_fetch_this = 1; in zend_jit_trace_deoptimization()
3745 …opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, bool exit_if_true) in zend_jit_trace_update_condition_ranges() argument
3769 &ssa->var_info[ssa_op->op1_use], in zend_jit_trace_update_condition_ranges()
3775 &ssa->var_info[ssa_op->op2_use], in zend_jit_trace_update_condition_ranges()
3786 &ssa->var_info[ssa_op->op1_use], in zend_jit_trace_update_condition_ranges()
3792 &ssa->var_info[ssa_op->op2_use], in zend_jit_trace_update_condition_ranges()
3803 &ssa->var_info[ssa_op->op1_use], in zend_jit_trace_update_condition_ranges()
3809 &ssa->var_info[ssa_op->op2_use], in zend_jit_trace_update_condition_ranges()
3817 &ssa->var_info[ssa_op->op1_use], in zend_jit_trace_update_condition_ranges()
3823 &ssa->var_info[ssa_op->op2_use], in zend_jit_trace_update_condition_ranges()
3834 &ssa->var_info[ssa_op->op1_use], in zend_jit_trace_update_condition_ranges()
3840 &ssa->var_info[ssa_op->op2_use], in zend_jit_trace_update_condition_ranges()
3848 &ssa->var_info[ssa_op->op1_use], in zend_jit_trace_update_condition_ranges()
3854 &ssa->var_info[ssa_op->op2_use], in zend_jit_trace_update_condition_ranges()
3863 …mparison(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_ssa *ssa, const zend_op **ss… in zend_jit_may_skip_comparison() argument
3873 opline = ssa_opcodes[ssa_op - ssa->ops]; in zend_jit_may_skip_comparison()
3883 opline = ssa_opcodes[ssa_op - ssa->ops]; in zend_jit_may_skip_comparison()
3898 opline = ssa_opcodes[ssa_op - ssa->ops]; in zend_jit_may_skip_comparison()
3908 opline = ssa_opcodes[ssa_op - ssa->ops]; in zend_jit_may_skip_comparison()
3919 prev_opcode = ssa_opcodes[prev_ssa_op - ssa->ops]->opcode; in zend_jit_may_skip_comparison()
3922 && prev_ssa_op != ssa->ops in zend_jit_may_skip_comparison()
3926 prev_opcode = ssa_opcodes[prev_ssa_op - ssa->ops]->opcode; in zend_jit_may_skip_comparison()
3940 … opline->op1) != RT_CONSTANT(&ssa_opcodes[prev_ssa_op - ssa->ops], ssa_opcodes[prev_ssa_op - ssa->… in zend_jit_may_skip_comparison()
3945 … opline->op2) != RT_CONSTANT(&ssa_opcodes[prev_ssa_op - ssa->ops], ssa_opcodes[prev_ssa_op - ssa->… in zend_jit_may_skip_comparison()
3994 zend_ssa *ssa, *op_array_ssa; in zend_jit_trace() local
4029ssa = zend_jit_trace_build_tssa(trace_buffer, parent_trace, exit_num, script, op_arrays, &num_op_a… in zend_jit_trace()
4031 if (!ssa) { in zend_jit_trace()
4035 ssa_opcodes = ((zend_tssa*)ssa)->tssa_opcodes; in zend_jit_trace()
4040 ra = zend_jit_trace_allocate_registers(trace_buffer, ssa, parent_trace, exit_num); in zend_jit_trace()
4065 op_array_ssa = &jit_extension->func_info.ssa; in zend_jit_trace()
4092 int used_stack = ((zend_tssa*)ssa)->used_stack; in zend_jit_trace()
4117 uint32_t info = ssa->var_info[i].type; in zend_jit_trace()
4133 } else if (ssa->vars[i].alias != NO_ALIAS) { in zend_jit_trace()
4146 && (ssa->vars[i].use_chain != -1 in zend_jit_trace()
4147 || (ssa->vars[i].phi_use_chain in zend_jit_trace()
4148 && !(ssa->var_info[ssa->vars[i].phi_use_chain->ssa_var].type & MAY_BE_GUARD)))) { in zend_jit_trace()
4154 ssa->var_info[i].type = info; in zend_jit_trace()
4168 && (ssa->vars[i].use_chain != -1 in zend_jit_trace()
4169 || (ssa->vars[i].phi_use_chain in zend_jit_trace()
4170 && !(ssa->var_info[ssa->vars[i].phi_use_chain->ssa_var].type & MAY_BE_PACKED_GUARD)))) { in zend_jit_trace()
4175 ssa->var_info[i].type = info; in zend_jit_trace()
4184 parent_stack, parent_vars_count, ssa, stack, ra, in zend_jit_trace()
4198 if ((ssa->var_info[i].type & MAY_BE_GUARD) != 0) { in zend_jit_trace()
4201 ssa->var_info[i].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4202 op_type = concrete_type(ssa->var_info[i].type); in zend_jit_trace()
4210 if (!zend_jit_load_var(&dasm_state, ssa->var_info[i].type, i, ra[i]->reg)) { in zend_jit_trace()
4225 zend_ssa_phi *phi = ssa->blocks[1].phis; in zend_jit_trace()
4232 uint32_t info = ssa->var_info[phi->ssa_var].type; in zend_jit_trace()
4240 ssa->var_info[phi->ssa_var].type = info; in zend_jit_trace()
4244 …if (!zend_jit_load_var(&dasm_state, ssa->var_info[phi->ssa_var].type, ssa->vars[phi->ssa_var].var,… in zend_jit_trace()
4251 …if (!zend_jit_store_var(&dasm_state, ssa->var_info[phi->ssa_var].type, ssa->vars[phi->ssa_var].var… in zend_jit_trace()
4252 STACK_MEM_TYPE(stack, phi->var) != ssa->var_info[phi->ssa_var].type)) { in zend_jit_trace()
4284 if (!zend_jit_load_var(&dasm_state, ssa->var_info[i].type, i, ra[i]->reg)) { in zend_jit_trace()
4292 ssa_op = (JIT_G(opt_level) >= ZEND_JIT_LEVEL_INLINE) ? ssa->ops : NULL; in zend_jit_trace()
4383 … (op1_def_info & (MAY_BE_DOUBLE|MAY_BE_GUARD)) && zend_may_overflow(opline, ssa_op, op_array, ssa), in zend_jit_trace()
4384 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
4389 ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4391 ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4397 ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4436 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
4454 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
4457 if (ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
4458 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
4469 !ssa->var_info[ssa_op->op2_use].guarded_reference, 1)) { in zend_jit_trace()
4472 if (ssa->vars[ssa_op->op2_use].alias == NO_ALIAS) { in zend_jit_trace()
4473 ssa->var_info[ssa_op->op2_use].guarded_reference = 1; in zend_jit_trace()
4515 …) && (res_info & (MAY_BE_DOUBLE|MAY_BE_GUARD)) && zend_may_overflow(opline, ssa_op, op_array, ssa), in zend_jit_trace()
4516 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
4523 ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4550 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
4574 … (op1_def_info & (MAY_BE_DOUBLE|MAY_BE_GUARD)) && zend_may_overflow(opline, ssa_op, op_array, ssa), in zend_jit_trace()
4575 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
4581 ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4583 ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
4607 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
4617 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
4621 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4622 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
4635 zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) { in zend_jit_trace()
4660 delayed_fetch_this = ssa->var_info[ssa_op->op1_use].delayed_fetch_this; in zend_jit_trace()
4672 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
4680 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
4684 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4685 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
4693 if (ssa->var_info && ssa->ops) { in zend_jit_trace()
4695 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit_trace()
4704 } else if (ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].definition >= 0) { in zend_jit_trace()
4705 on_this = ssa_opcodes[ssa->vars[ssa_op->op1_use].definition]->opcode == ZEND_FETCH_THIS; in zend_jit_trace()
4713 if (!zend_jit_incdec_obj(&dasm_state, opline, op_array, ssa, ssa_op, in zend_jit_trace()
4751 delayed_fetch_this = ssa->var_info[ssa_op->op1_use].delayed_fetch_this; in zend_jit_trace()
4763 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
4771 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
4775 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4776 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
4784 if (ssa->var_info && ssa->ops) { in zend_jit_trace()
4786 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit_trace()
4795 } else if (ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].definition >= 0) { in zend_jit_trace()
4796 on_this = ssa_opcodes[ssa->vars[ssa_op->op1_use].definition]->opcode == ZEND_FETCH_THIS; in zend_jit_trace()
4806 if (!zend_jit_assign_obj_op(&dasm_state, opline, op_array, ssa, ssa_op, in zend_jit_trace()
4831 delayed_fetch_this = ssa->var_info[ssa_op->op1_use].delayed_fetch_this; in zend_jit_trace()
4843 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
4851 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
4855 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4856 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
4864 if (ssa->var_info && ssa->ops) { in zend_jit_trace()
4866 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit_trace()
4875 } else if (ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].definition >= 0) { in zend_jit_trace()
4876 on_this = ssa_opcodes[ssa->vars[ssa_op->op1_use].definition]->opcode == ZEND_FETCH_THIS; in zend_jit_trace()
4886 if (!zend_jit_assign_obj(&dasm_state, opline, op_array, ssa, ssa_op, in zend_jit_trace()
4890 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
4895 && ssa->vars[(ssa_op+1)->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4896ssa->var_info[(ssa_op+1)->op1_def].guarded_reference = ssa->var_info[(ssa_op+1)->op1_use].guarded_… in zend_jit_trace()
4913 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
4923 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
4927 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4928 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
4939 zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) { in zend_jit_trace()
4944 && ssa->vars[(ssa_op+1)->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4945ssa->var_info[(ssa_op+1)->op1_def].guarded_reference = ssa->var_info[(ssa_op+1)->op1_use].guarded_… in zend_jit_trace()
4955 … if (ssa_op->op2_def < 0 || (Z_MODE(op2_addr) == IS_REG && ssa->vars[ssa_op->op2_def].no_val)) { in zend_jit_trace()
4985 !ssa->var_info[ssa_op->op1_use].guarded_reference, 0)) { in zend_jit_trace()
4989 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
4990 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
5038 zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) { in zend_jit_trace()
5043 && ssa->vars[ssa_op->op2_def].no_val) { in zend_jit_trace()
5048 && ssa->vars[ssa_op->op2_def].use_chain < 0 in zend_jit_trace()
5049 && !ssa->vars[ssa_op->op2_def].phi_use_chain) { in zend_jit_trace()
5058 && ssa->vars[ssa_op->op2_def].alias == NO_ALIAS) { in zend_jit_trace()
5059ssa->var_info[ssa_op->op2_def].guarded_reference = ssa->var_info[ssa_op->op2_use].guarded_referenc… in zend_jit_trace()
5069 … if (ssa_op->op1_def < 0 || (Z_MODE(op1_addr) == IS_REG && ssa->vars[ssa_op->op1_def].no_val)) { in zend_jit_trace()
5093 && ssa->vars[ssa_op->op1_def].no_val) { in zend_jit_trace()
5098 && ssa->vars[ssa_op->op1_def].use_chain < 0 in zend_jit_trace()
5099 && !ssa->vars[ssa_op->op1_def].phi_use_chain) { in zend_jit_trace()
5108 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
5109ssa->var_info[ssa_op->op1_def].guarded_reference = ssa->var_info[ssa_op->op1_use].guarded_referenc… in zend_jit_trace()
5116 …fg.map ? op_array_ssa->cfg.map[opline - op_array->opcodes] : -1, op_array, ssa, ssa_op, frame->cal… in zend_jit_trace()
5158 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
5159 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
5177 … if (ssa_op->op1_def < 0 || (Z_MODE(op1_addr) == IS_REG && ssa->vars[ssa_op->op1_def].no_val)) { in zend_jit_trace()
5190 && ssa->vars[ssa_op->op1_def].no_val) { in zend_jit_trace()
5195 && ssa->vars[ssa_op->op1_def].use_chain < 0 in zend_jit_trace()
5196 && !ssa->vars[ssa_op->op1_def].phi_use_chain) { in zend_jit_trace()
5205 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
5206ssa->var_info[ssa_op->op1_def].guarded_reference = ssa->var_info[ssa_op->op1_use].guarded_referenc… in zend_jit_trace()
5263 ssa_op != ssa->ops && in zend_jit_trace()
5266 zend_jit_may_skip_comparison(opline, ssa_op, ssa, ssa_opcodes, op_array); in zend_jit_trace()
5275 zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra); in zend_jit_trace()
5287 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit_trace()
5291 zend_jit_trace_update_condition_ranges(opline, ssa_op, op_array, ssa, exit_if_true); in zend_jit_trace()
5299 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit_trace()
5311 ssa_op != ssa->ops && in zend_jit_trace()
5314 zend_jit_may_skip_comparison(opline, ssa_op, ssa, ssa_opcodes, op_array); in zend_jit_trace()
5323 zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra); in zend_jit_trace()
5338 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit_trace()
5342 zend_jit_trace_update_condition_ranges(opline, ssa_op, op_array, ssa, exit_if_true); in zend_jit_trace()
5350 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit_trace()
5388 zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra); in zend_jit_trace()
5417 …ace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array, ssa), p + 1)) { in zend_jit_trace()
5486 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit_trace()
5521 zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra); in zend_jit_trace()
5557 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit_trace()
5572 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
5576 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
5577 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
5648 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
5652 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
5653 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
5655 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
5666 ssa->var_info[ssa_op->op1_use].avoid_refcounting; in zend_jit_trace()
5668 ssa->var_info[ssa_op->op1_use].type &= ~MAY_BE_PACKED_GUARD; in zend_jit_trace()
5678ssa->var_info[ssa_op->op1_use].type &= ~(MAY_BE_ARRAY_NUMERIC_HASH|MAY_BE_ARRAY_STRING_HASH); in zend_jit_trace()
5683 ssa->var_info[ssa_op->op1_use].type &= ~MAY_BE_ARRAY_PACKED; in zend_jit_trace()
5687 if (!zend_jit_fetch_dim_read(&dasm_state, opline, ssa, ssa_op, in zend_jit_trace()
5693 ssa->var_info[ssa_op->op1_def].type = ssa->var_info[ssa_op->op1_use].type; in zend_jit_trace()
5711 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
5721 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
5725 && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
5726 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
5742 ssa->var_info[ssa_op->result_def].indirect_reference = 1; in zend_jit_trace()
5755 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
5759 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
5760 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
5773 zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra); in zend_jit_trace()
5776 && ssa->var_info[ssa_op->op1_use].avoid_refcounting) { in zend_jit_trace()
5798 ssa->var_info[ssa_op->op1_use].avoid_refcounting; in zend_jit_trace()
5800 ssa->var_info[ssa_op->op1_use].type &= ~MAY_BE_PACKED_GUARD; in zend_jit_trace()
5816 zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info), in zend_jit_trace()
5861 &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) { in zend_jit_trace()
5869 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
5873 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
5874ssa->var_info[ssa_op->op1_def >= 0 ? ssa_op->op1_def : ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
5882 if (ssa->var_info && ssa->ops) { in zend_jit_trace()
5884 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit_trace()
5892 delayed_fetch_this = ssa->var_info[ssa_op->op1_use].delayed_fetch_this; in zend_jit_trace()
5893 avoid_refcounting = ssa->var_info[ssa_op->op1_use].avoid_refcounting; in zend_jit_trace()
5897 } else if (ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].definition >= 0) { in zend_jit_trace()
5898 on_this = ssa_opcodes[ssa->vars[ssa_op->op1_use].definition]->opcode == ZEND_FETCH_THIS; in zend_jit_trace()
5906 if (!zend_jit_fetch_obj(&dasm_state, opline, op_array, ssa, ssa_op, in zend_jit_trace()
5909 zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, MAY_BE_STRING))) { in zend_jit_trace()
5917 if (!ssa->ops || !ssa->var_info) { in zend_jit_trace()
5922 if (ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { in zend_jit_trace()
5923 ssa->var_info[ssa_op->op1_def].guarded_reference = 1; in zend_jit_trace()
5949 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
5966 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
5985 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
5989 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
5990 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
6007 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
6011 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
6012 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
6020 …tate, opline, op1_info, op1_addr, RES_REG_ADDR(), zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit_trace()
6027 if (zend_jit_may_delay_fetch_this(op_array, ssa, ssa_opcodes, ssa_op)) { in zend_jit_trace()
6028 ssa->var_info[ssa_op->result_def].delayed_fetch_this = 1; in zend_jit_trace()
6110 if (!zend_jit_fetch_constant(&dasm_state, opline, op_array, ssa, ssa_op, RES_REG_ADDR())) { in zend_jit_trace()
6137 !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { in zend_jit_trace()
6141 && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { in zend_jit_trace()
6142 ssa->var_info[ssa_op->op1_use].guarded_reference = 1; in zend_jit_trace()
6147 if (ssa->var_info && ssa->ops) { in zend_jit_trace()
6149 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit_trace()
6157 delayed_fetch_this = ssa->var_info[ssa_op->op1_use].delayed_fetch_this; in zend_jit_trace()
6161 } else if (ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].definition >= 0) { in zend_jit_trace()
6162 on_this = ssa_opcodes[ssa->vars[ssa_op->op1_use].definition]->opcode == ZEND_FETCH_THIS; in zend_jit_trace()
6173 op_array, ssa, ssa_op, frame->call_level, in zend_jit_trace()
6186 …fg.map ? op_array_ssa->cfg.map[opline - op_array->opcodes] : -1, op_array, ssa, ssa_op, frame->cal… in zend_jit_trace()
6225 zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info), p + 1)) { in zend_jit_trace()
6253 zend_jit_trace_clenup_stack(stack, opline, ssa_op, ssa, ra); in zend_jit_trace()
6285 } else if (!(ssa->var_info[ssa_op->result_def].type & MAY_BE_GUARD) in zend_jit_trace()
6286 && has_concrete_type(ssa->var_info[ssa_op->result_def].type)) { in zend_jit_trace()
6287 type = concrete_type(ssa->var_info[ssa_op->result_def].type); in zend_jit_trace()
6297 && (ssa->var_info[ssa_op->op1_use].type & MAY_BE_REF) == 0) { in zend_jit_trace()
6317 if (ssa->var_info[ssa_op->result_def].type & MAY_BE_INDIRECT) { in zend_jit_trace()
6321 ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
6325 } else if (ssa->var_info[ssa_op->result_def].avoid_refcounting) { in zend_jit_trace()
6335 && zend_inference_propagate_range(op_array, ssa, opline, ssa_op, ssa_op->result_def, &tmp)) { in zend_jit_trace()
6336 ssa->var_info[ssa_op->result_def].range.min = tmp.min; in zend_jit_trace()
6337 ssa->var_info[ssa_op->result_def].range.max = tmp.max; in zend_jit_trace()
6338 ssa->var_info[ssa_op->result_def].range.underflow = 0; in zend_jit_trace()
6339 ssa->var_info[ssa_op->result_def].range.overflow = 0; in zend_jit_trace()
6340 ssa->var_info[ssa_op->result_def].has_range = 1; in zend_jit_trace()
6349 if (!(ssa->var_info[ssa_op->op1_def].type & MAY_BE_GUARD) in zend_jit_trace()
6350 && has_concrete_type(ssa->var_info[ssa_op->op1_def].type)) { in zend_jit_trace()
6351 type = concrete_type(ssa->var_info[ssa_op->op1_def].type); in zend_jit_trace()
6373 !(ssa->vars[ssa_op->op1_def].no_val && in zend_jit_trace()
6382 ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
6403 && zend_inference_propagate_range(op_array, ssa, opline, ssa_op, ssa_op->op1_def, &tmp)) { in zend_jit_trace()
6404 ssa->var_info[ssa_op->op1_def].range.min = tmp.min; in zend_jit_trace()
6405 ssa->var_info[ssa_op->op1_def].range.max = tmp.max; in zend_jit_trace()
6406 ssa->var_info[ssa_op->op1_def].range.underflow = 0; in zend_jit_trace()
6407 ssa->var_info[ssa_op->op1_def].range.overflow = 0; in zend_jit_trace()
6408 ssa->var_info[ssa_op->op1_def].has_range = 1; in zend_jit_trace()
6417 if (!(ssa->var_info[ssa_op->op2_def].type & MAY_BE_GUARD) in zend_jit_trace()
6418 && has_concrete_type(ssa->var_info[ssa_op->op2_def].type)) { in zend_jit_trace()
6419 type = concrete_type(ssa->var_info[ssa_op->op2_def].type); in zend_jit_trace()
6427 !(ssa->vars[ssa_op->op2_def].no_val && in zend_jit_trace()
6431 ssa->var_info[ssa_op->op2_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
6447 && zend_inference_propagate_range(op_array, ssa, opline, ssa_op, ssa_op->op2_def, &tmp)) { in zend_jit_trace()
6448 ssa->var_info[ssa_op->op2_def].range.min = tmp.min; in zend_jit_trace()
6449 ssa->var_info[ssa_op->op2_def].range.max = tmp.max; in zend_jit_trace()
6450 ssa->var_info[ssa_op->op2_def].range.underflow = 0; in zend_jit_trace()
6451 ssa->var_info[ssa_op->op2_def].range.overflow = 0; in zend_jit_trace()
6452 ssa->var_info[ssa_op->op2_def].has_range = 1; in zend_jit_trace()
6471 if (!(ssa->var_info[ssa_op->op1_def].type & MAY_BE_GUARD) in zend_jit_trace()
6472 && has_concrete_type(ssa->var_info[ssa_op->op1_def].type)) { in zend_jit_trace()
6473 type = concrete_type(ssa->var_info[ssa_op->op1_def].type); in zend_jit_trace()
6483 ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD; in zend_jit_trace()
6490 && zend_inference_propagate_range(op_array, ssa, opline, ssa_op, ssa_op->op1_def, &tmp)) { in zend_jit_trace()
6491 ssa->var_info[ssa_op->op1_def].range.min = tmp.min; in zend_jit_trace()
6492 ssa->var_info[ssa_op->op1_def].range.max = tmp.max; in zend_jit_trace()
6493 ssa->var_info[ssa_op->op1_def].range.underflow = 0; in zend_jit_trace()
6494 ssa->var_info[ssa_op->op1_def].range.overflow = 0; in zend_jit_trace()
6495 ssa->var_info[ssa_op->op1_def].has_range = 1; in zend_jit_trace()
6507 if (!(ssa->var_info[ssa_op->result_def].type & MAY_BE_GUARD) in zend_jit_trace()
6508 && has_concrete_type(ssa->var_info[ssa_op->result_def].type)) { in zend_jit_trace()
6509 type = concrete_type(ssa->var_info[ssa_op->result_def].type); in zend_jit_trace()
6529 if (!(ssa->var_info[ssa_op->op1_def].type & MAY_BE_GUARD) in zend_jit_trace()
6530 && has_concrete_type(ssa->var_info[ssa_op->op1_def].type)) { in zend_jit_trace()
6531 type = concrete_type(ssa->var_info[ssa_op->op1_def].type); in zend_jit_trace()
6606 op_array_ssa = &jit_extension->func_info.ssa; in zend_jit_trace()
6621 if ((ssa->var_info[j].type & MAY_BE_GUARD) != 0) { in zend_jit_trace()
6624 ssa->var_info[j].type &= ~MAY_BE_GUARD; in zend_jit_trace()
6625 op_type = concrete_type(ssa->var_info[j].type); in zend_jit_trace()
6632 if (!zend_jit_load_var(&dasm_state, ssa->var_info[j].type, i, ra[j]->reg)) { in zend_jit_trace()
6642 op_array_ssa = &jit_extension->func_info.ssa; in zend_jit_trace()
6660 if (!(ssa->var_info[j].type & MAY_BE_GUARD) in zend_jit_trace()
6661 && has_concrete_type(ssa->var_info[j].type)) { in zend_jit_trace()
6662 SET_STACK_TYPE(stack, i, concrete_type(ssa->var_info[j].type), 1); in zend_jit_trace()
6672 if (!zend_jit_load_var(&dasm_state, ssa->var_info[j].type, i, ra[j]->reg)) { in zend_jit_trace()
6721 && ssa->var_info[(ssa_op-1)->op1_use].delayed_fetch_this)) in zend_jit_trace()
6752 && zend_jit_var_may_alias(p->op_array, &jit_extension->func_info.ssa, i) != NO_ALIAS) { in zend_jit_trace()
6873 zend_ssa_phi *phi = ssa->blocks[1].phis; in zend_jit_trace()
7081 memset(&jit_extension->func_info.ssa, 0, sizeof(zend_func_info) - offsetof(zend_func_info, ssa)); in zend_jit_trace()