From: Dmitry Stogov Date: Thu, 4 Jun 2020 09:23:27 +0000 (+0300) Subject: Improved tracing JIT for FETCH_OBJ_R/IS X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=efde51e1976c8d3e8a2e6ce182f6a6b6b376f12f;p=php Improved tracing JIT for FETCH_OBJ_R/IS --- diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 6f144e3d1b..f7302d5e16 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -10773,7 +10773,17 @@ static int zend_jit_fetch_obj_read(dasm_State **Dst, const zend_op *opline, cons } else { prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, offset); | mov edx, dword [FCARG1a + offset + 8] - | IF_TYPE dl, IS_UNDEF, >5 + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + | IF_TYPE dl, IS_UNDEF, &exit_addr + } else { + | IF_TYPE dl, IS_UNDEF, >5 + } } | GET_ZVAL_PTR r0, prop_addr | IF_NOT_REFCOUNTED dh, >2 @@ -10791,26 +10801,29 @@ static int zend_jit_fetch_obj_read(dasm_State **Dst, const zend_op *opline, cons | SET_ZVAL_TYPE_INFO res_addr, edx |.cold_code - |5: - | LOAD_ADDR FCARG2a, member - |.if X64 - | LOAD_ZVAL_ADDR CARG3, res_addr - | mov CARG4, (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) - |.else - | sub r4, 8 - | push (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) - | PUSH_ZVAL_ADDR res_addr, r0 - |.endif - | SAVE_VALID_OPLINE opline, r0 - if (opline->opcode != ZEND_FETCH_OBJ_IS) { - | EXT_CALL zend_jit_fetch_obj_r_slow, r0 - } else { - | EXT_CALL zend_jit_fetch_obj_is_slow, r0 + + if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || offset == ZEND_WRONG_PROPERTY_OFFSET) { + |5: + | LOAD_ADDR FCARG2a, member + |.if X64 + | LOAD_ZVAL_ADDR CARG3, res_addr + | mov CARG4, (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) + |.else + | sub r4, 8 + | push (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) + | PUSH_ZVAL_ADDR res_addr, r0 + |.endif + | SAVE_VALID_OPLINE opline, r0 + if (opline->opcode != ZEND_FETCH_OBJ_IS) { + | EXT_CALL zend_jit_fetch_obj_r_slow, r0 + } else { + | EXT_CALL zend_jit_fetch_obj_is_slow, r0 + } + |.if not(X64) + | add r4, 8 + |.endif + | jmp >9 } - |.if not(X64) - | add r4, 8 - |.endif - | jmp >9 |6: if (offset == ZEND_WRONG_PROPERTY_OFFSET) { @@ -10822,7 +10835,7 @@ static int zend_jit_fetch_obj_read(dasm_State **Dst, const zend_op *opline, cons | EXT_CALL zend_jit_zval_copy_deref_helper, r0 | jmp >9 - if ((op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)- MAY_BE_OBJECT)) && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) { + if ((op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)- MAY_BE_OBJECT)) && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) { |7: if (opline->opcode != ZEND_FETCH_OBJ_IS) { | SAVE_VALID_OPLINE opline, r1 @@ -10875,6 +10888,13 @@ static int zend_jit_fetch_obj_read(dasm_State **Dst, const zend_op *opline, cons |9: // END | FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE + && offset != ZEND_WRONG_PROPERTY_OFFSET + && opline->op1_type != IS_VAR + && opline->op1_type != IS_TMP_VAR) { + may_throw = 0; + } + if (may_throw) { if (!zend_jit_check_exception(Dst)) { return 0;