@@ -10386,16 +10386,15 @@ static zend_bool zend_jit_may_avoid_refcounting(const zend_op *opline)
10386
10386
return 0;
10387
10387
}
10388
10388
10389
- static int zend_jit_fetch_dim_read(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_ssa *ssa, const zend_ssa_op *ssa_op, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t res_info, int may_throw)
10389
+ static int zend_jit_fetch_dim_read(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_ssa *ssa, const zend_ssa_op *ssa_op, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t res_info, zend_jit_addr res_addr, int may_throw)
10390
10390
{
10391
- zend_jit_addr orig_op1_addr, op2_addr, res_addr ;
10391
+ zend_jit_addr orig_op1_addr, op2_addr;
10392
10392
const void *exit_addr = NULL;
10393
10393
const void *not_found_exit_addr = NULL;
10394
10394
const void *res_exit_addr = NULL;
10395
10395
10396
10396
orig_op1_addr = OP1_ADDR();
10397
10397
op2_addr = OP2_ADDR();
10398
- res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
10399
10398
10400
10399
if (opline->opcode != ZEND_FETCH_DIM_IS
10401
10400
&& JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
@@ -12221,7 +12220,7 @@ static zend_bool zend_jit_may_reuse_reg(const zend_op *opline, const zend_ssa_op
12221
12220
return 0;
12222
12221
}
12223
12222
12224
- static zend_bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa *ssa, const zend_op *opline, const zend_ssa_op *ssa_op)
12223
+ static zend_bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa *ssa, const zend_op *opline, const zend_ssa_op *ssa_op, zend_jit_trace_rec *trace )
12225
12224
{
12226
12225
uint32_t op1_info, op2_info;
12227
12226
@@ -12275,6 +12274,19 @@ static zend_bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zen
12275
12274
case ZEND_JMPZ_EX:
12276
12275
case ZEND_JMPNZ_EX:
12277
12276
return 1;
12277
+ case ZEND_FETCH_DIM_R:
12278
+ op1_info = OP1_INFO();
12279
+ op2_info = OP2_INFO();
12280
+ if (trace
12281
+ && trace->op1_type != IS_UNKNOWN
12282
+ && (trace->op1_type & ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT)) == IS_ARRAY) {
12283
+ op1_info &= ~((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_ARRAY);
12284
+ }
12285
+ return ((op1_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_ARRAY) &&
12286
+ (!(opline->op1_type & (IS_TMP_VAR|IS_VAR)) || !(op1_info & MAY_BE_RC1)) &&
12287
+ (((op2_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_LONG) ||
12288
+ (((op2_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_STRING) &&
12289
+ (!(opline->op2_type & (IS_TMP_VAR|IS_VAR)) || !(op2_info & MAY_BE_RC1))));
12278
12290
}
12279
12291
return 0;
12280
12292
}
@@ -12321,7 +12333,7 @@ static zend_bool zend_jit_may_be_in_reg(const zend_op_array *op_array, zend_ssa
12321
12333
12322
12334
if (ssa->vars[var].definition >= 0) {
12323
12335
uint32_t def = ssa->vars[var].definition;
12324
- if (!zend_jit_opline_supports_reg(op_array, ssa, op_array->opcodes + def, ssa->ops + def)) {
12336
+ if (!zend_jit_opline_supports_reg(op_array, ssa, op_array->opcodes + def, ssa->ops + def, NULL )) {
12325
12337
return 0;
12326
12338
}
12327
12339
}
@@ -12331,7 +12343,7 @@ static zend_bool zend_jit_may_be_in_reg(const zend_op_array *op_array, zend_ssa
12331
12343
12332
12344
do {
12333
12345
if (!zend_ssa_is_no_val_use(op_array->opcodes + use, ssa->ops + use, var) &&
12334
- !zend_jit_opline_supports_reg(op_array, ssa, op_array->opcodes + use, ssa->ops + use)) {
12346
+ !zend_jit_opline_supports_reg(op_array, ssa, op_array->opcodes + use, ssa->ops + use, NULL )) {
12335
12347
return 0;
12336
12348
}
12337
12349
use = zend_ssa_next_use(ssa->ops, var, use);
0 commit comments