]> granicus.if.org Git - php/commitdiff
Avoid reference counting when RETURN CV
authorDmitry Stogov <dmitry@zend.com>
Tue, 2 Jun 2020 21:49:10 +0000 (00:49 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 2 Jun 2020 21:49:10 +0000 (00:49 +0300)
ext/opcache/jit/zend_jit_trace.c
ext/opcache/jit/zend_jit_x86.dasc

index 81297a4052296fd35d529480bed48ac44b7df633..2da2fb4b31b89d75a6a5728515fd5f7a2154b8d7 100644 (file)
@@ -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);
index 31f982bbe2a21badb7c11853eabb16dbcc2109fb..cf0e66aa5e0c8698720273be7f48c121a62bdf3b 100644 (file)
@@ -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));