From fe9b5ce322cb9365f729ec96deabfabf8b096371 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 2 Jul 2020 14:43:17 +0300 Subject: [PATCH] Load constant value only if necessary --- ext/opcache/jit/zend_jit_x86.dasc | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 35c536454a..55b26df59d 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -4804,8 +4804,10 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o | // if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) | IF_NOT_ZVAL_TYPE op2_addr, IS_LONG, >3 } - | // hval = Z_LVAL_P(dim); - | GET_ZVAL_LVAL ZREG_FCARG2a, op2_addr + if (type == BP_VAR_W || type == BP_VAR_RW) { + | // hval = Z_LVAL_P(dim); + | GET_ZVAL_LVAL ZREG_FCARG2a, op2_addr + } if (op1_info & MAY_BE_ARRAY_KEY_LONG) { if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { zend_long val = Z_LVAL_P(Z_ZV(op2_addr)); @@ -4843,6 +4845,10 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o } } } else { + if (type != BP_VAR_W && type != BP_VAR_RW) { + | // hval = Z_LVAL_P(dim); + | GET_ZVAL_LVAL ZREG_FCARG2a, op2_addr + } | // ZEND_HASH_INDEX_FIND(ht, hval, retval, num_undef); | test dword [FCARG1a + offsetof(zend_array, u.flags)], HASH_FLAG_PACKED | jz >4 // HASH_FIND @@ -4880,6 +4886,10 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o if (op1_info & MAY_BE_ARRAY_KEY_LONG) { |4: } + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + | // hval = Z_LVAL_P(dim); + | GET_ZVAL_LVAL ZREG_FCARG2a, op2_addr + } | EXT_CALL _zend_hash_index_find, r0 | test r0, r0 | jz >9 // NOT_FOUND @@ -4907,6 +4917,10 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o } |4: } + if (Z_MODE(op2_addr) == IS_CONST_ZVAL) { + | // hval = Z_LVAL_P(dim); + | GET_ZVAL_LVAL ZREG_FCARG2a, op2_addr + } | EXT_CALL _zend_hash_index_find, r0 | test r0, r0 if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && type == BP_VAR_R) { -- 2.50.1