Skip to content

Commit b3e1232

Browse files
committed
Fixed JIT when result of ASSIGN is in register, but the original variable might need to be destroyed
1 parent 8c4f7d6 commit b3e1232

File tree

1 file changed

+24
-24
lines changed

1 file changed

+24
-24
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5527,6 +5527,7 @@ static int zend_jit_assign_to_typed_ref(dasm_State **Dst,
55275527
static 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

Comments
 (0)