Skip to content

Commit b3e51b7

Browse files
committed
Allow keeping result of FETCH_DIM_R in CPU register
1 parent dc30e1d commit b3e51b7

File tree

3 files changed

+23
-10
lines changed

3 files changed

+23
-10
lines changed

ext/opcache/jit/zend_jit.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2732,7 +2732,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
27322732
break;
27332733
}
27342734
if (!zend_jit_fetch_dim_read(&dasm_state, opline, op_array, ssa, ssa_op,
2735-
OP1_INFO(), OP1_REG_ADDR(), OP2_INFO(), RES_INFO(),
2735+
OP1_INFO(), OP1_REG_ADDR(), OP2_INFO(), RES_INFO(), RES_REG_ADDR(),
27362736
zend_may_throw(opline, ssa_op, op_array, ssa))) {
27372737
goto jit_failure;
27382738
}

ext/opcache/jit/zend_jit_trace.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2067,7 +2067,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
20672067
zend_bool support_opline;
20682068

20692069
support_opline =
2070-
zend_jit_opline_supports_reg(op_array, ssa, opline, ssa_op);
2070+
zend_jit_opline_supports_reg(op_array, ssa, opline, ssa_op, p);
20712071
if (ssa_op->op1_use >= 0
20722072
&& start[ssa_op->op1_use] >= 0
20732073
&& !zend_ssa_is_no_val_use(opline, ssa_op, ssa_op->op1_use)) {
@@ -2131,7 +2131,8 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
21312131
|| opline->opcode == ZEND_POST_DEC
21322132
|| opline->opcode == ZEND_ADD
21332133
|| opline->opcode == ZEND_SUB
2134-
|| opline->opcode == ZEND_MUL) {
2134+
|| opline->opcode == ZEND_MUL
2135+
|| opline->opcode == ZEND_FETCH_DIM_R) {
21352136
if (!(ssa->var_info[ssa_op->result_def].type & MAY_BE_DOUBLE)
21362137
|| (opline->opcode != ZEND_PRE_INC && opline->opcode != ZEND_PRE_DEC)) {
21372138
start[ssa_op->result_def] = idx;
@@ -3850,7 +3851,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
38503851
CHECK_OP2_TRACE_TYPE();
38513852
res_info = RES_INFO();
38523853
if (!zend_jit_fetch_dim_read(&dasm_state, opline, op_array, ssa, ssa_op,
3853-
op1_info, op1_addr, op2_info, res_info,
3854+
op1_info, op1_addr, op2_info, res_info, RES_REG_ADDR(),
38543855
(
38553856
(op1_info & MAY_BE_ANY) != MAY_BE_ARRAY ||
38563857
(op2_info & (MAY_BE_ANY - (MAY_BE_LONG|MAY_BE_STRING))) != 0 ||

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10386,16 +10386,15 @@ static zend_bool zend_jit_may_avoid_refcounting(const zend_op *opline)
1038610386
return 0;
1038710387
}
1038810388

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)
1039010390
{
10391-
zend_jit_addr orig_op1_addr, op2_addr, res_addr;
10391+
zend_jit_addr orig_op1_addr, op2_addr;
1039210392
const void *exit_addr = NULL;
1039310393
const void *not_found_exit_addr = NULL;
1039410394
const void *res_exit_addr = NULL;
1039510395

1039610396
orig_op1_addr = OP1_ADDR();
1039710397
op2_addr = OP2_ADDR();
10398-
res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
1039910398

1040010399
if (opline->opcode != ZEND_FETCH_DIM_IS
1040110400
&& 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
1222112220
return 0;
1222212221
}
1222312222

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)
1222512224
{
1222612225
uint32_t op1_info, op2_info;
1222712226

@@ -12275,6 +12274,19 @@ static zend_bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zen
1227512274
case ZEND_JMPZ_EX:
1227612275
case ZEND_JMPNZ_EX:
1227712276
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))));
1227812290
}
1227912291
return 0;
1228012292
}
@@ -12321,7 +12333,7 @@ static zend_bool zend_jit_may_be_in_reg(const zend_op_array *op_array, zend_ssa
1232112333

1232212334
if (ssa->vars[var].definition >= 0) {
1232312335
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)) {
1232512337
return 0;
1232612338
}
1232712339
}
@@ -12331,7 +12343,7 @@ static zend_bool zend_jit_may_be_in_reg(const zend_op_array *op_array, zend_ssa
1233112343

1233212344
do {
1233312345
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)) {
1233512347
return 0;
1233612348
}
1233712349
use = zend_ssa_next_use(ssa->ops, var, use);

0 commit comments

Comments
 (0)