@@ -5527,6 +5527,7 @@ static int zend_jit_assign_to_typed_ref(dasm_State **Dst,
55275527static int zend_jit_assign_to_variable(dasm_State **Dst,
55285528 const zend_op *opline,
55295529 const zend_op_array *op_array,
5530+ zend_jit_addr var_use_addr,
55305531 zend_jit_addr var_addr,
55315532 uint32_t var_info,
55325533 uint32_t var_def_info,
@@ -5540,11 +5541,10 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
55405541{
55415542 int done = 0;
55425543
5543- //ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL);
55445544 if (var_info & MAY_BE_REF) {
5545- if (Z_MODE(var_addr ) != IS_MEM_ZVAL || Z_REG(var_addr ) != ZREG_FCARG1a || Z_OFFSET(var_addr ) != 0) {
5546- | LOAD_ZVAL_ADDR FCARG1a, var_addr
5547- var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0);
5545+ if (Z_MODE(var_use_addr ) != IS_MEM_ZVAL || Z_REG(var_use_addr ) != ZREG_FCARG1a || Z_OFFSET(var_use_addr ) != 0) {
5546+ | LOAD_ZVAL_ADDR FCARG1a, var_use_addr
5547+ var_addr = var_use_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0);
55485548 }
55495549 | // if (Z_ISREF_P(variable_ptr)) {
55505550 | IF_NOT_Z_TYPE, FCARG1a, IS_REFERENCE, >1
@@ -5557,27 +5557,27 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
55575557 |1:
55585558 }
55595559 if (var_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
5560- ZEND_ASSERT(Z_REG(var_addr ) != ZREG_R0);
5560+ ZEND_ASSERT(Z_REG(var_use_addr ) != ZREG_R0);
55615561 if (RC_MAY_BE_1(var_info)) {
55625562 int in_cold = 0;
55635563
55645564 if (var_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
5565- | IF_ZVAL_REFCOUNTED var_addr , >1
5565+ | IF_ZVAL_REFCOUNTED var_use_addr , >1
55665566 |.cold_code
55675567 |1:
55685568 in_cold = 1;
55695569 }
5570- if (Z_REG(var_addr ) == ZREG_FCARG1a) {
5571- | GET_ZVAL_PTR r0, var_addr
5570+ if (Z_REG(var_use_addr ) == ZREG_FCARG1a) {
5571+ | GET_ZVAL_PTR r0, var_use_addr
55725572 | mov aword T1, r0 // save
55735573 if (!zend_jit_simple_assign(Dst, opline, op_array, var_addr, var_info, var_def_info, val_type, val, val_addr, val_info, res_addr, in_cold, 0)) {
55745574 return 0;
55755575 }
5576- if (Z_REG(var_addr ) == ZREG_FCARG1a) {
5576+ if (Z_REG(var_use_addr ) == ZREG_FCARG1a) {
55775577 | mov FCARG1a, aword T1 // restore
55785578 }
55795579 } else {
5580- | GET_ZVAL_PTR FCARG1a, var_addr
5580+ | GET_ZVAL_PTR FCARG1a, var_use_addr
55815581 if (!zend_jit_simple_assign(Dst, opline, op_array, var_addr, var_info, var_def_info, val_type, val, val_addr, val_info, res_addr, in_cold, 1)) {
55825582 return 0;
55835583 }
@@ -5613,27 +5613,27 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
56135613 }
56145614 } else /* if (RC_MAY_BE_N(var_info)) */ {
56155615 if (var_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
5616- | IF_NOT_ZVAL_REFCOUNTED var_addr , >5
5616+ | IF_NOT_ZVAL_REFCOUNTED var_use_addr , >5
56175617 }
5618- | GET_ZVAL_PTR r0, var_addr
5618+ | GET_ZVAL_PTR r0, var_use_addr
56195619 | GC_DELREF r0
56205620 if (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) {
5621- if (Z_REG(var_addr ) == ZREG_FP) {
5622- | GET_ZVAL_PTR FCARG1a, var_addr
5621+ if (Z_REG(var_use_addr ) == ZREG_FP) {
5622+ | GET_ZVAL_PTR FCARG1a, var_use_addr
56235623 | IF_GC_MAY_NOT_LEAK FCARG1a, >5
5624- } else if (Z_REG(var_addr ) != ZREG_FCARG1a) {
5625- | GET_ZVAL_PTR FCARG1a, var_addr
5624+ } else if (Z_REG(var_use_addr ) != ZREG_FCARG1a) {
5625+ | GET_ZVAL_PTR FCARG1a, var_use_addr
56265626 | IF_GC_MAY_NOT_LEAK FCARG1a, >5
5627- | mov T1, Ra(Z_REG(var_addr )) // save
5627+ | mov T1, Ra(Z_REG(var_use_addr )) // save
56285628 } else {
5629- | GET_ZVAL_PTR r0, var_addr
5629+ | GET_ZVAL_PTR r0, var_use_addr
56305630 | IF_GC_MAY_NOT_LEAK r0, >5
5631- | mov T1, Ra(Z_REG(var_addr )) // save
5632- | GET_ZVAL_PTR FCARG1a, var_addr
5631+ | mov T1, Ra(Z_REG(var_use_addr )) // save
5632+ | GET_ZVAL_PTR FCARG1a, var_use_addr
56335633 }
56345634 | EXT_CALL gc_possible_root, r0
5635- if (Z_REG(var_addr ) != ZREG_FP) {
5636- | mov Ra(Z_REG(var_addr )), T1 // restore
5635+ if (Z_REG(var_use_addr ) != ZREG_FP) {
5636+ | mov Ra(Z_REG(var_use_addr )), T1 // restore
56375637 }
56385638 }
56395639 |5:
@@ -5749,7 +5749,7 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, const ze
57495749 var_info |= MAY_BE_RC1;
57505750 }
57515751 | // value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE);
5752- if (!zend_jit_assign_to_variable(Dst, opline, op_array, var_addr, var_info, -1, (opline+1)->op1_type, (opline+1)->op1, op3_addr, val_info, res_addr, 0)) {
5752+ if (!zend_jit_assign_to_variable(Dst, opline, op_array, var_addr, var_addr, var_info, -1, (opline+1)->op1_type, (opline+1)->op1, op3_addr, val_info, res_addr, 0)) {
57535753 return 0;
57545754 }
57555755 }
@@ -8011,7 +8011,7 @@ static int zend_jit_assign(dasm_State **Dst, const zend_op *opline, const zend_o
80118011 /* Force type update */
80128012 op1_info |= MAY_BE_UNDEF;
80138013 }
8014- if (!zend_jit_assign_to_variable(Dst, opline, op_array, op1_addr, op1_info, op1_def_info, opline->op2_type, opline->op2, op2_addr, op2_info, res_addr,
8014+ if (!zend_jit_assign_to_variable(Dst, opline, op_array, op1_use_addr, op1_addr, op1_info, op1_def_info, opline->op2_type, opline->op2, op2_addr, op2_info, res_addr,
80158015 may_throw)) {
80168016 return 0;
80178017 }
0 commit comments