summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2020-06-03 00:49:10 +0300
committerDmitry Stogov <dmitry@zend.com>2020-06-03 00:49:10 +0300
commitd237989f33c3483dc824af695949bc37fb33c173 (patch)
treea7ec050cae88a9c730f4b774d6dcb75533dc921f
parent38f9d95ffadf061fbc9856ab57ec227e09051261 (diff)
downloadphp-git-d237989f33c3483dc824af695949bc37fb33c173.tar.gz
Avoid reference counting when RETURN CV
-rw-r--r--ext/opcache/jit/zend_jit_trace.c7
-rw-r--r--ext/opcache/jit/zend_jit_x86.dasc6
2 files changed, 11 insertions, 2 deletions
diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c
index 81297a4052..2da2fb4b31 100644
--- a/ext/opcache/jit/zend_jit_trace.c
+++ b/ext/opcache/jit/zend_jit_trace.c
@@ -3455,6 +3455,13 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
goto jit_failure;
}
for (j = 0 ; j < op_array->last_var; j++) {
+ if (opline->op1_type == IS_CV
+ && EX_VAR_TO_NUM(opline->op1.var) == j
+ && !(op1_info & MAY_BE_REF)
+ && JIT_G(current_frame)
+ && TRACE_FRAME_IS_RETURN_VALUE_USED(JIT_G(current_frame))) {
+ continue;
+ }
// TODO: get info from trace ???
uint32_t info = zend_ssa_cv_info(opline, op_array, op_array_ssa, j);
zend_uchar type = STACK_TYPE(stack, j);
diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc
index 31f982bbe2..cf0e66aa5e 100644
--- a/ext/opcache/jit/zend_jit_x86.dasc
+++ b/ext/opcache/jit/zend_jit_x86.dasc
@@ -9928,8 +9928,10 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0);
}
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_R0, ZREG_R2
- | // TODO: JIT: if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) ZVAL_NULL(retval_ptr); ???
- | TRY_ADDREF op1_info, ah, r2
+ if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || (op1_info & MAY_BE_REF) || (return_value_used != 1)) {
+ | // TODO: JIT: if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) ZVAL_NULL(retval_ptr); ???
+ | TRY_ADDREF op1_info, ah, r2
+ }
} else {
if (op1_info & MAY_BE_REF) {
zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, offsetof(zend_reference, val));