Skip to content

Commit 6fa126e

Browse files
committed
MAY_BE_INDIRECT inference
1 parent 3a9a8df commit 6fa126e

File tree

4 files changed

+40
-18
lines changed

4 files changed

+40
-18
lines changed

Zend/zend_type_info.h

+1
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,6 @@
6161
#define MAY_BE_ARRAY_KEY_ANY (MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_KEY_STRING)
6262

6363
#define MAY_BE_CLASS (1<<23)
64+
#define MAY_BE_INDIRECT (1<<24)
6465

6566
#endif /* ZEND_TYPE_INFO_H */

ext/opcache/Optimizer/zend_inference.c

+25-2
Original file line numberDiff line numberDiff line change
@@ -1983,6 +1983,9 @@ uint32_t zend_array_element_type(uint32_t t1, int write, int insert)
19831983
tmp |= MAY_BE_RC1 | MAY_BE_RCN;
19841984
}
19851985
}
1986+
if (write) {
1987+
tmp |= MAY_BE_INDIRECT;
1988+
}
19861989
}
19871990
if (t1 & MAY_BE_STRING) {
19881991
tmp |= MAY_BE_STRING | MAY_BE_RC1;
@@ -3398,7 +3401,7 @@ static zend_always_inline int _zend_update_type_info(
33983401
tmp = zend_fetch_prop_type(script,
33993402
zend_fetch_prop_info(op_array, ssa, opline, ssa_op), &ce);
34003403
if (opline->result_type != IS_TMP_VAR) {
3401-
tmp |= MAY_BE_REF;
3404+
tmp |= MAY_BE_REF | MAY_BE_INDIRECT;
34023405
}
34033406
UPDATE_SSA_TYPE(tmp, ssa_op->result_def);
34043407
if (ce) {
@@ -3415,7 +3418,7 @@ static zend_always_inline int _zend_update_type_info(
34153418
tmp = zend_fetch_prop_type(script,
34163419
zend_fetch_static_prop_info(script, op_array, ssa, opline), &ce);
34173420
if (opline->result_type != IS_TMP_VAR) {
3418-
tmp |= MAY_BE_REF;
3421+
tmp |= MAY_BE_REF | MAY_BE_INDIRECT;
34193422
}
34203423
UPDATE_SSA_TYPE(tmp, ssa_op->result_def);
34213424
if (ce) {
@@ -3524,6 +3527,26 @@ static zend_always_inline int _zend_update_type_info(
35243527
tmp |= MAY_BE_RC1 | MAY_BE_RCN;
35253528
} else {
35263529
tmp |= MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN;
3530+
switch (opline->opcode) {
3531+
case ZEND_FETCH_W:
3532+
case ZEND_FETCH_RW:
3533+
case ZEND_FETCH_FUNC_ARG:
3534+
case ZEND_FETCH_UNSET:
3535+
case ZEND_FETCH_DIM_W:
3536+
case ZEND_FETCH_DIM_RW:
3537+
case ZEND_FETCH_DIM_FUNC_ARG:
3538+
case ZEND_FETCH_DIM_UNSET:
3539+
case ZEND_FETCH_OBJ_W:
3540+
case ZEND_FETCH_OBJ_RW:
3541+
case ZEND_FETCH_OBJ_FUNC_ARG:
3542+
case ZEND_FETCH_OBJ_UNSET:
3543+
case ZEND_FETCH_STATIC_PROP_W:
3544+
case ZEND_FETCH_STATIC_PROP_RW:
3545+
case ZEND_FETCH_STATIC_PROP_FUNC_ARG:
3546+
case ZEND_FETCH_STATIC_PROP_UNSET:
3547+
tmp |= MAY_BE_INDIRECT;
3548+
break;
3549+
}
35273550
}
35283551
UPDATE_SSA_TYPE(tmp, ssa_op->result_def);
35293552
}

ext/opcache/Optimizer/zend_inference.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ static zend_always_inline uint32_t get_ssa_var_info(const zend_ssa *ssa, int ssa
195195
if (ssa->var_info && ssa_var_num >= 0) {
196196
return ssa->var_info[ssa_var_num].type;
197197
} else {
198-
return MAY_BE_UNDEF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
198+
return MAY_BE_UNDEF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_INDIRECT | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
199199
}
200200
}
201201

ext/opcache/jit/zend_jit_x86.dasc

+13-15
Original file line numberDiff line numberDiff line change
@@ -1323,7 +1323,7 @@ static void* dasm_labels[zend_lb_MAX];
13231323
// zval should be in FCARG1a
13241324
|.macro ZVAL_DTOR_FUNC, var_info, opline // arg1 must be in FCARG1a
13251325
|| do {
1326-
|| if (has_concrete_type((var_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
1326+
|| if (has_concrete_type((var_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_INDIRECT))) {
13271327
|| zend_uchar type = concrete_type((var_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE));
13281328
|| if (type == IS_STRING && !ZEND_DEBUG) {
13291329
| EXT_CALL _efree, r0
@@ -1355,7 +1355,7 @@ static void* dasm_labels[zend_lb_MAX];
13551355

13561356
|.macro ZVAL_PTR_DTOR, addr, op_info, gc, cold, opline
13571357
|| if ((op_info) & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) {
1358-
|| if ((op_info) & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
1358+
|| if ((op_info) & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_INDIRECT)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
13591359
| // if (Z_REFCOUNTED_P(cv)) {
13601360
|| if (cold) {
13611361
| IF_ZVAL_REFCOUNTED addr, >1
@@ -8916,12 +8916,15 @@ static int zend_jit_send_ref(dasm_State **Dst, const zend_op *opline, const zend
89168916
}
89178917

89188918
if (opline->op1_type == IS_VAR) {
8919-
| LOAD_ZVAL_ADDR r0, op1_addr
8920-
| // if (EXPECTED(Z_TYPE_P(ret) == IS_INDIRECT)) {
8921-
| IF_NOT_Z_TYPE r0, IS_INDIRECT, >1
8922-
| // ret = Z_INDIRECT_P(ret);
8923-
| GET_Z_PTR r0, r0
8924-
|1:
8919+
if (op1_info & MAY_BE_INDIRECT) {
8920+
| LOAD_ZVAL_ADDR r0, op1_addr
8921+
| // if (EXPECTED(Z_TYPE_P(ret) == IS_INDIRECT)) {
8922+
| IF_NOT_Z_TYPE r0, IS_INDIRECT, >1
8923+
| // ret = Z_INDIRECT_P(ret);
8924+
| GET_Z_PTR r0, r0
8925+
|1:
8926+
op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0);
8927+
}
89258928
} else if (opline->op1_type == IS_CV) {
89268929
if (op1_info & MAY_BE_UNDEF) {
89278930
if (op1_info & (MAY_BE_ANY|MAY_BE_REF)) {
@@ -8939,13 +8942,8 @@ static int zend_jit_send_ref(dasm_State **Dst, const zend_op *opline, const zend
89398942

89408943
if (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) {
89418944
if (op1_info & MAY_BE_REF) {
8942-
if (opline->op1_type == IS_VAR) {
8943-
| IF_NOT_Z_TYPE r0, IS_REFERENCE, >2
8944-
| GET_Z_PTR r1, r0
8945-
} else {
8946-
| IF_NOT_ZVAL_TYPE op1_addr, IS_REFERENCE, >2
8947-
| GET_ZVAL_PTR r1, op1_addr
8948-
}
8945+
| IF_NOT_ZVAL_TYPE op1_addr, IS_REFERENCE, >2
8946+
| GET_ZVAL_PTR r1, op1_addr
89498947
| GC_ADDREF r1
89508948
| SET_ZVAL_PTR arg_addr, r1
89518949
| SET_ZVAL_TYPE_INFO arg_addr, IS_REFERENCE_EX

0 commit comments

Comments
 (0)