diff options
| author | Dmitry Stogov <dmitry@zend.com> | 2021-03-25 23:48:08 +0300 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@zend.com> | 2021-03-25 23:48:08 +0300 |
| commit | 7b2b9b40797e3f071f653bd64706dfdcaf548f90 (patch) | |
| tree | d0b4f35780f80d08911d710745d34e3504f63c17 /ext/opcache/jit/zend_jit_trace.c | |
| parent | aa45eedef0ded065f2f6ec33250747ad50558527 (diff) | |
| download | php-git-7b2b9b40797e3f071f653bd64706dfdcaf548f90.tar.gz | |
Improved JIT for TYPE_CHECK opcode
Diffstat (limited to 'ext/opcache/jit/zend_jit_trace.c')
| -rw-r--r-- | ext/opcache/jit/zend_jit_trace.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index ff52edad49..009b33f627 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -1843,6 +1843,19 @@ propagate_arg: case ZEND_CHECK_UNDEF_ARGS: case ZEND_INCLUDE_OR_EVAL: max_used_stack = used_stack = -1; + break; + case ZEND_TYPE_CHECK: + if (opline->extended_value == MAY_BE_RESOURCE) { + // TODO: support for is_resource() ??? + break; + } + if (op1_type != IS_UNKNOWN + && (opline->extended_value == (1 << op1_type) + || opline->extended_value == MAY_BE_ANY - (1 << op1_type))) { + /* add guards only for exact checks, to avoid code duplication */ + ADD_OP1_TRACE_GUARD(); + } + break; default: break; } @@ -4900,6 +4913,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par break; } op1_info = OP1_INFO(); + CHECK_OP1_TRACE_TYPE(); if ((opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) { bool exit_if_true = 0; const zend_op *exit_opline = zend_jit_trace_get_exit_opline(p + 1, opline + 1, &exit_if_true); |
