From 3565d02c6de5333c96f529cbafc488e612bf7f90 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 30 Aug 2021 12:26:37 +0300 Subject: [PATCH] JIT: Eliminate load of op_array->run_time_cache__ptr and use immediate value for immutable op_arrays if it's known at compile time --- ext/opcache/jit/zend_jit_arm64.dasc | 12 +++++++++--- ext/opcache/jit/zend_jit_x86.dasc | 11 ++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/ext/opcache/jit/zend_jit_arm64.dasc b/ext/opcache/jit/zend_jit_arm64.dasc index d36a43b1ff2..08dd092fdbb 100644 --- a/ext/opcache/jit/zend_jit_arm64.dasc +++ b/ext/opcache/jit/zend_jit_arm64.dasc @@ -9031,26 +9031,32 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend if (func) { | ldr REG0, EX:RX->func } - | ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)] // Always defined as ZEND_MAP_PTR_KIND_PTR_OR_OFFSET. See Zend/zend_map_ptr.h. #if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR + | ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)] | ldr REG2, [REG2] #elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET if (func && !(func->op_array.fn_flags & ZEND_ACC_CLOSURE)) { if (ZEND_MAP_PTR_IS_OFFSET(func->op_array.run_time_cache)) { - | MEM_LOAD_OP_ZTS add, ldr, REG2, compiler_globals, map_ptr_base, REG1, TMP1 + | MEM_LOAD_64_ZTS ldr, REG2, compiler_globals, map_ptr_base, TMP1 + | ADD_SUB_64_WITH_CONST add, REG2, REG2, (uintptr_t)ZEND_MAP_PTR(func->op_array.run_time_cache), TMP1 + | ldr REG2, [REG2] } else if ((func->op_array.fn_flags & ZEND_ACC_IMMUTABLE) && (!func->op_array.scope || (func->op_array.scope->ce_flags & ZEND_ACC_LINKED))) { + | ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)] | MEM_LOAD_OP_ZTS add, ldr, REG2, compiler_globals, map_ptr_base, REG1, TMP1 + | ldr REG2, [REG2] } else { /* the called op_array may be not persisted yet */ + | ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)] | TST_64_WITH_ONE REG2 | beq >1 | MEM_LOAD_OP_ZTS add, ldr, REG2, compiler_globals, map_ptr_base, REG1, TMP1 |1: + | ldr REG2, [REG2] } - | ldr REG2, [REG2] } else { + | ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)] | TST_64_WITH_ONE REG2 | beq >1 | MEM_LOAD_OP_ZTS add, ldr, REG2, compiler_globals, map_ptr_base, REG1, TMP1 diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index d01bff5633d..07d8828ae6c 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -9655,25 +9655,30 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend if (func) { | mov r0, EX:RX->func } - | mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)] #if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR + | mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)] | mov r2, aword [r2] #elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET if (func && !(func->op_array.fn_flags & ZEND_ACC_CLOSURE)) { if (ZEND_MAP_PTR_IS_OFFSET(func->op_array.run_time_cache)) { - | MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1 + | MEM_LOAD_ZTS r2, aword, compiler_globals, map_ptr_base, r1 + | mov r2, aword [r2 + (uintptr_t)ZEND_MAP_PTR(func->op_array.run_time_cache)] } else if ((func->op_array.fn_flags & ZEND_ACC_IMMUTABLE) && (!func->op_array.scope || (func->op_array.scope->ce_flags & ZEND_ACC_LINKED))) { + | mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)] | MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1 + | mov r2, aword [r2] } else { /* the called op_array may be not persisted yet */ + | mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)] | test r2, 1 | jz >1 | MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1 |1: + | mov r2, aword [r2] } - | mov r2, aword [r2] } else { + | mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)] | test r2, 1 | jz >1 | MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1