From: Dmitry Stogov Date: Tue, 2 Jun 2020 21:49:10 +0000 (+0300) Subject: Avoid reference counting when RETURN CV X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d237989f33c3483dc824af695949bc37fb33c173;p=php Avoid reference counting when RETURN CV --- 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));