From 44b3971b85e31327930cc7c6e47a07614c240f8d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 16 Mar 2020 12:23:55 +0100 Subject: [PATCH] Merge zend_may_throw(_ex) Explicitly pass ssa_op in the places that don't do so yet. --- ext/opcache/Optimizer/dce.c | 2 +- ext/opcache/Optimizer/sccp.c | 2 +- ext/opcache/Optimizer/zend_inference.c | 9 ++---- ext/opcache/Optimizer/zend_inference.h | 3 +- ext/opcache/jit/zend_jit.c | 45 ++++++++++++++------------ ext/opcache/jit/zend_jit_trace.c | 40 +++++++++++------------ ext/opcache/jit/zend_jit_x86.dasc | 10 +++--- 7 files changed, 56 insertions(+), 55 deletions(-) diff --git a/ext/opcache/Optimizer/dce.c b/ext/opcache/Optimizer/dce.c index d5a7f5a192..43f2ef71a2 100644 --- a/ext/opcache/Optimizer/dce.c +++ b/ext/opcache/Optimizer/dce.c @@ -532,7 +532,7 @@ int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reor add_operands_to_worklists(&ctx, &op_array->opcodes[op_data], &ssa->ops[op_data], ssa, 0); } } else if (may_have_side_effects(op_array, ssa, &op_array->opcodes[i], &ssa->ops[i], ctx.reorder_dtor_effects) - || zend_may_throw(&op_array->opcodes[i], op_array, ssa) + || zend_may_throw(&op_array->opcodes[i], &ssa->ops[i], op_array, ssa) || (has_varargs && may_break_varargs(op_array, ssa, &ssa->ops[i]))) { if (op_array->opcodes[i].opcode == ZEND_NEW && op_array->opcodes[i+1].opcode == ZEND_DO_FCALL diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index 0c62e1bd0d..e72a38f43f 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -2335,7 +2335,7 @@ static int try_remove_definition(sccp_ctx *ctx, int var_num, zend_ssa_var *var, } break; default: - if (zend_may_throw(opline, op_array, ssa)) { + if (zend_may_throw(opline, ssa_op, op_array, ssa)) { return 0; } break; diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 0dc6ab477d..6cbd553165 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -4254,7 +4254,7 @@ void zend_inference_check_recursive_dependencies(zend_op_array *op_array) free_alloca(worklist, use_heap); } -int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa) +int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa) { uint32_t t1 = OP1_INFO_EX(); uint32_t t2 = OP2_INFO_EX(); @@ -4365,7 +4365,7 @@ int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const ze return 0; case ZEND_BIND_GLOBAL: if ((opline+1)->opcode == ZEND_BIND_GLOBAL) { - return zend_may_throw_ex(opline + 1, ssa_op + 1, op_array, ssa); + return zend_may_throw(opline + 1, ssa_op + 1, op_array, ssa); } return 0; case ZEND_ADD: @@ -4589,8 +4589,3 @@ int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const ze return 1; } } - -int zend_may_throw(const zend_op *opline, const zend_op_array *op_array, zend_ssa *ssa) -{ - return zend_may_throw_ex(opline, &ssa->ops[opline - op_array->opcodes], op_array, ssa); -} diff --git a/ext/opcache/Optimizer/zend_inference.h b/ext/opcache/Optimizer/zend_inference.h index c5db1feede..3fb3b4f001 100644 --- a/ext/opcache/Optimizer/zend_inference.h +++ b/ext/opcache/Optimizer/zend_inference.h @@ -320,8 +320,7 @@ void zend_func_return_info(const zend_op_array *op_array, int widening, zend_ssa_var_info *ret); -int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa); -int zend_may_throw(const zend_op *opline, const zend_op_array *op_array, zend_ssa *ssa); +int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa); int zend_update_type_info(const zend_op_array *op_array, zend_ssa *ssa, diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 7b13d3ce54..a265cf4806 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -2149,6 +2149,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op } end = ssa->cfg.blocks[b].start + ssa->cfg.blocks[b].len - 1; for (i = ssa->cfg.blocks[b].start; i <= end; i++) { + zend_ssa_op *ssa_op = &ssa->ops[i]; opline = op_array->opcodes + i; switch (opline->opcode) { case ZEND_INIT_FCALL: @@ -2231,7 +2232,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op op2_info, OP2_RANGE(), OP2_REG_ADDR(), res_use_info, RES_INFO(), res_addr, send_result, - zend_may_throw(opline, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2272,7 +2273,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op res_use_info, res_info, res_addr, send_result, (res_info & MAY_BE_LONG) && (res_info & MAY_BE_DOUBLE) && zend_may_overflow(opline, op_array, ssa), - zend_may_throw(opline, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2302,7 +2303,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op } if (!zend_jit_concat(&dasm_state, opline, op_array, op1_info, op2_info, RES_INFO(), send_result, - zend_may_throw(opline, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2352,7 +2353,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op op1_info, op1_def_info, OP1_RANGE(), op2_info, OP2_RANGE(), (op1_def_info & MAY_BE_LONG) && (op1_def_info & MAY_BE_DOUBLE) && zend_may_overflow(opline, op_array, ssa), - zend_may_throw(opline, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2371,7 +2372,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op if (!zend_jit_assign_dim_op(&dasm_state, opline, op_array, OP1_INFO(), OP1_DEF_INFO(), OP2_INFO(), OP1_DATA_INFO(), OP1_DATA_RANGE(), - zend_may_throw(opline, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2384,7 +2385,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op } if (!zend_jit_assign_dim(&dasm_state, opline, op_array, OP1_INFO(), OP2_INFO(), OP1_DATA_INFO(), - zend_may_throw(opline, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2415,7 +2416,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op OP1_DEF_INFO(), OP1_DEF_REG_ADDR(), OP2_INFO(), op2_addr, op2_def_addr, res_info, res_addr, - zend_may_throw(opline, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2521,7 +2522,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op OP1_INFO(), OP1_REG_ADDR(), OP2_INFO(), OP2_REG_ADDR(), res_addr, - zend_may_throw(opline, op_array, ssa), + zend_may_throw(opline, ssa_op, op_array, ssa), smart_branch_opcode, target_label, target_label2, NULL)) { goto jit_failure; @@ -2549,7 +2550,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op OP1_INFO(), OP1_REG_ADDR(), OP2_INFO(), OP2_REG_ADDR(), RES_REG_ADDR(), - zend_may_throw(opline, op_array, ssa), + zend_may_throw(opline, ssa_op, op_array, ssa), smart_branch_opcode, target_label, target_label2, NULL)) { goto jit_failure; @@ -2649,7 +2650,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op if (!zend_jit_bool_jmpznz(&dasm_state, opline, op_array, OP1_INFO(), OP1_REG_ADDR(), RES_REG_ADDR(), -1, -1, - zend_may_throw(opline, op_array, ssa), + zend_may_throw(opline, ssa_op, op_array, ssa), opline->opcode, NULL)) { goto jit_failure; } @@ -2676,7 +2677,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op if (!zend_jit_bool_jmpznz(&dasm_state, opline, op_array, OP1_INFO(), OP1_REG_ADDR(), res_addr, ssa->cfg.blocks[b].successors[0], ssa->cfg.blocks[b].successors[1], - zend_may_throw(opline, op_array, ssa), + zend_may_throw(opline, ssa_op, op_array, ssa), opline->opcode, NULL)) { goto jit_failure; } @@ -2688,7 +2689,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op } if (!zend_jit_fetch_dim_read(&dasm_state, opline, op_array, OP1_INFO(), OP2_INFO(), RES_INFO(), - zend_may_throw(opline, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2717,7 +2718,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op } if (!zend_jit_isset_isempty_dim(&dasm_state, opline, op_array, OP1_INFO(), OP2_INFO(), - zend_may_throw(opline, op_array, ssa), + zend_may_throw(opline, ssa_op, op_array, ssa), smart_branch_opcode, target_label, target_label2, NULL)) { goto jit_failure; @@ -2751,7 +2752,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op } if (!zend_jit_fetch_obj_read(&dasm_state, opline, op_array, op1_info, ce, - zend_may_throw(opline, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2773,14 +2774,14 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op case ZEND_RECV_INIT: if (!zend_jit_recv_init(&dasm_state, opline, op_array, (opline + 1)->opcode != ZEND_RECV_INIT, - zend_may_throw(opline, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; case ZEND_FREE: case ZEND_FE_FREE: if (!zend_jit_free(&dasm_state, opline, op_array, OP1_INFO(), - zend_may_throw(opline, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2831,7 +2832,8 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op if (opline == op_array->opcodes || opline->opcode != op_array->opcodes[i-1].opcode) { /* repeatable opcodes */ - if (!zend_jit_handler(&dasm_state, opline, zend_may_throw(opline, op_array, ssa))) { + if (!zend_jit_handler(&dasm_state, opline, + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } } @@ -2882,7 +2884,8 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op is_terminated = 1; break; case ZEND_JMPZNZ: - if (!zend_jit_handler(&dasm_state, opline, zend_may_throw(opline, op_array, ssa)) || + if (!zend_jit_handler(&dasm_state, opline, + zend_may_throw(opline, ssa_op, op_array, ssa)) || !zend_jit_cond_jmp(&dasm_state, OP_JMP_ADDR(opline, opline->op2), ssa->cfg.blocks[b].successors[1]) || !zend_jit_jmp(&dasm_state, ssa->cfg.blocks[b].successors[0])) { goto jit_failure; @@ -2909,7 +2912,8 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op case ZEND_ASSERT_CHECK: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: - if (!zend_jit_handler(&dasm_state, opline, zend_may_throw(opline, op_array, ssa)) || + if (!zend_jit_handler(&dasm_state, opline, + zend_may_throw(opline, ssa_op, op_array, ssa)) || !zend_jit_cond_jmp(&dasm_state, opline + 1, ssa->cfg.blocks[b].successors[0])) { goto jit_failure; } @@ -2954,7 +2958,8 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op } break; default: - if (!zend_jit_handler(&dasm_state, opline, zend_may_throw(opline, op_array, ssa))) { + if (!zend_jit_handler(&dasm_state, opline, + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } } diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index ec20e148e9..54f8d3e5b3 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -1903,7 +1903,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par op2_info, OP2_RANGE_EX(), OP2_REG_ADDR(), res_use_info, res_info, res_addr, send_result, - zend_may_throw_ex(opline, ssa_op, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -1959,7 +1959,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par res_use_info, res_info, res_addr, send_result, (res_info & MAY_BE_LONG) && (res_info & (MAY_BE_DOUBLE|MAY_BE_GUARD)) && zend_may_overflow_ex(opline, ssa_op, op_array, ssa), - zend_may_throw_ex(opline, ssa_op, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } if ((res_info & (MAY_BE_ANY|MAY_BE_GUARD)) == (MAY_BE_LONG|MAY_BE_GUARD)) { @@ -2007,7 +2007,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par res_info = RES_INFO_EX(); if (!zend_jit_concat(&dasm_state, opline, op_array, op1_info, op2_info, res_info, send_result, - zend_may_throw_ex(opline, ssa_op, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2056,7 +2056,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par op1_info, op1_def_info, OP1_RANGE_EX(), op2_info, OP2_RANGE_EX(), (op1_def_info & MAY_BE_LONG) && (op1_def_info & (MAY_BE_DOUBLE|MAY_BE_GUARD)) && zend_may_overflow_ex(opline, ssa_op, op_array, ssa), - zend_may_throw_ex(opline, ssa_op, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } if ((op1_def_info & (MAY_BE_ANY|MAY_BE_GUARD)) == (MAY_BE_LONG|MAY_BE_GUARD)) { @@ -2085,7 +2085,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par if (!zend_jit_assign_dim_op(&dasm_state, opline, op_array, op1_info, op1_def_info, op2_info, op1_data_info, OP1_DATA_RANGE(), - zend_may_throw_ex(opline, ssa_op, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2101,7 +2101,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par CHECK_OP1_DATA_TRACE_TYPE(); if (!zend_jit_assign_dim(&dasm_state, opline, op_array, op1_info, op2_info, op1_data_info, - zend_may_throw_ex(opline, ssa_op, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2134,7 +2134,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par op1_def_info, OP1_DEF_REG_ADDR(), op2_info, op2_addr, op2_def_addr, res_info, res_addr, - zend_may_throw_ex(opline, ssa_op, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2261,7 +2261,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par op1_info, OP1_REG_ADDR(), op2_info, OP2_REG_ADDR(), RES_REG_ADDR(), - zend_may_throw_ex(opline, ssa_op, op_array, ssa), + zend_may_throw(opline, ssa_op, op_array, ssa), smart_branch_opcode, -1, -1, exit_addr)) { goto jit_failure; } @@ -2293,7 +2293,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par op1_info, OP1_REG_ADDR(), op2_info, OP2_REG_ADDR(), RES_REG_ADDR(), - zend_may_throw_ex(opline, ssa_op, op_array, ssa), + zend_may_throw(opline, ssa_op, op_array, ssa), smart_branch_opcode, -1, -1, exit_addr)) { goto jit_failure; } @@ -2392,7 +2392,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par if (!zend_jit_bool_jmpznz(&dasm_state, opline, op_array, op1_info, OP1_REG_ADDR(), RES_REG_ADDR(), -1, -1, - zend_may_throw_ex(opline, ssa_op, op_array, ssa), + zend_may_throw(opline, ssa_op, op_array, ssa), opline->opcode, NULL)) { goto jit_failure; } @@ -2456,7 +2456,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par if (!zend_jit_bool_jmpznz(&dasm_state, opline, op_array, op1_info, OP1_REG_ADDR(), res_addr, -1, -1, - zend_may_throw_ex(opline, ssa_op, op_array, ssa), + zend_may_throw(opline, ssa_op, op_array, ssa), smart_branch_opcode, exit_addr)) { goto jit_failure; } @@ -2509,7 +2509,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } if (!zend_jit_isset_isempty_dim(&dasm_state, opline, op_array, op1_info, op2_info, - zend_may_throw_ex(opline, ssa_op, op_array, ssa), + zend_may_throw(opline, ssa_op, op_array, ssa), smart_branch_opcode, -1, -1, exit_addr)) { goto jit_failure; @@ -2542,7 +2542,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } if (!zend_jit_fetch_obj_read(&dasm_state, opline, op_array, op1_info, ce, - zend_may_throw_ex(opline, ssa_op, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2579,7 +2579,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par while (1) { if (!zend_jit_recv_init(&dasm_state, opline, op_array, (opline + 1)->opcode != ZEND_RECV_INIT, - zend_may_throw_ex(opline, ssa_op, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } if ((opline+1)->opcode == ZEND_RECV_INIT) { @@ -2597,7 +2597,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par op1_info = OP1_INFO_EX(); USE_OP1_TRACE_TYPE(); if (!zend_jit_free(&dasm_state, opline, op_array, op1_info, - zend_may_throw_ex(opline, ssa_op, op_array, ssa))) { + zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } goto done; @@ -2622,7 +2622,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par // TODO: we may need a guard after INIT_NS_FCALL??? case ZEND_INIT_METHOD_CALL: case ZEND_INIT_DYNAMIC_CALL: - if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw_ex(opline, ssa_op, op_array, ssa), p + 1)) { + if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array, ssa), p + 1)) { goto jit_failure; } if ((p+1)->op == ZEND_JIT_TRACE_INIT_CALL) { @@ -2632,7 +2632,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } goto done; case ZEND_INIT_STATIC_METHOD_CALL: - if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw_ex(opline, ssa_op, op_array, ssa), p + 1)) { + if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array, ssa), p + 1)) { goto jit_failure; } if ((opline->op1_type != IS_CONST @@ -2644,7 +2644,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } goto done; case ZEND_INIT_USER_CALL: - if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw_ex(opline, ssa_op, op_array, ssa), p + 1)) { + if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array, ssa), p + 1)) { goto jit_failure; } if (opline->op2_type != IS_CONST @@ -2655,7 +2655,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } goto done; case ZEND_NEW: - if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw_ex(opline, ssa_op, op_array, ssa), p + 1)) { + if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array, ssa), p + 1)) { goto jit_failure; } if (opline->op1_type != IS_CONST @@ -2671,7 +2671,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } if (opline->opcode != ZEND_NOP && opline->opcode != ZEND_JMP) { - if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw_ex(opline, ssa_op, op_array, ssa), p + 1)) { + if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array, ssa), p + 1)) { goto jit_failure; } } diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index de5138d00a..5285a6a46d 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -7523,7 +7523,8 @@ static int zend_jit_needs_call_chain(zend_call_info *call_info, uint32_t b, cons skip = 1; while (opline != end) { if (!skip) { - if (zend_may_throw(opline, op_array, ssa)) { + zend_ssa_op *ssa_op = &ssa->ops[opline - op_array->opcodes]; + if (zend_may_throw(opline, ssa_op, op_array, ssa)) { return 1; } } @@ -7610,7 +7611,8 @@ static int zend_jit_needs_call_chain(zend_call_info *call_info, uint32_t b, cons return 1; } } else { - if (zend_may_throw(opline, op_array, ssa)) { + zend_ssa_op *ssa_op = &ssa->ops[opline - op_array->opcodes]; + if (zend_may_throw(opline, ssa_op, op_array, ssa)) { return 1; } } @@ -8363,14 +8365,14 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend fallback: /* fallback to subroutine threading */ if (trace) { - return zend_jit_trace_handler(Dst, op_array, opline, zend_may_throw(opline, op_array, ssa), trace); + return zend_jit_trace_handler(Dst, op_array, opline, /* may_throw */ 1, trace); } if (opline->opcode == ZEND_DO_FCALL || opline->opcode == ZEND_DO_UCALL || opline->opcode == ZEND_DO_FCALL_BY_NAME ){ return zend_jit_call(Dst, opline, next_block); } else { - return zend_jit_handler(Dst, opline, zend_may_throw(opline, op_array, ssa)); + return zend_jit_handler(Dst, opline, /* may_throw */ 1); } #endif } -- 2.40.0