From b8d6aac5ada998fd69c4387f784216babde8edfb Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 28 Dec 2018 15:34:33 +0300 Subject: [PATCH] Micro optimization --- Zend/zend_vm_def.h | 26 +++--- Zend/zend_vm_execute.h | 208 ++++++++++++++++++++++++----------------- 2 files changed, 135 insertions(+), 99 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 560ee34d38..b82982bd33 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -3834,21 +3834,25 @@ ZEND_VM_HOT_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY) } } } else if (OP1_TYPE == IS_CV) { - if (Z_OPT_REFCOUNTED_P(retval_ptr)) { - if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(return_value, retval_ptr); - if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { - ZVAL_NULL(retval_ptr); + do { + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { + if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { + ZVAL_COPY_VALUE(return_value, retval_ptr); + ZVAL_NULL(retval_ptr); + break; + } else { + Z_ADDREF_P(retval_ptr); + } } else { - Z_ADDREF_P(return_value); + retval_ptr = Z_REFVAL_P(retval_ptr); + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + Z_ADDREF_P(retval_ptr); + } } - } else { - retval_ptr = Z_REFVAL_P(retval_ptr); - ZVAL_COPY(return_value, retval_ptr); } - } else { ZVAL_COPY_VALUE(return_value, retval_ptr); - } + } while (0); } else /* if (OP1_TYPE == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(retval_ptr))) { zend_refcounted *ref = Z_COUNTED_P(retval_ptr); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index b4f63d12b8..73a47fbc4b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2662,21 +2662,25 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_ } } } else if (IS_CONST == IS_CV) { - if (Z_OPT_REFCOUNTED_P(retval_ptr)) { - if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(return_value, retval_ptr); - if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { - ZVAL_NULL(retval_ptr); + do { + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { + if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { + ZVAL_COPY_VALUE(return_value, retval_ptr); + ZVAL_NULL(retval_ptr); + break; + } else { + Z_ADDREF_P(retval_ptr); + } } else { - Z_ADDREF_P(return_value); + retval_ptr = Z_REFVAL_P(retval_ptr); + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + Z_ADDREF_P(retval_ptr); + } } - } else { - retval_ptr = Z_REFVAL_P(retval_ptr); - ZVAL_COPY(return_value, retval_ptr); } - } else { ZVAL_COPY_VALUE(return_value, retval_ptr); - } + } while (0); } else /* if (IS_CONST == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(retval_ptr))) { zend_refcounted *ref = Z_COUNTED_P(retval_ptr); @@ -17883,21 +17887,25 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA } } } else if (IS_TMP_VAR == IS_CV) { - if (Z_OPT_REFCOUNTED_P(retval_ptr)) { - if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(return_value, retval_ptr); - if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { - ZVAL_NULL(retval_ptr); + do { + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { + if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { + ZVAL_COPY_VALUE(return_value, retval_ptr); + ZVAL_NULL(retval_ptr); + break; + } else { + Z_ADDREF_P(retval_ptr); + } } else { - Z_ADDREF_P(return_value); + retval_ptr = Z_REFVAL_P(retval_ptr); + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + Z_ADDREF_P(retval_ptr); + } } - } else { - retval_ptr = Z_REFVAL_P(retval_ptr); - ZVAL_COPY(return_value, retval_ptr); } - } else { ZVAL_COPY_VALUE(return_value, retval_ptr); - } + } while (0); } else /* if (IS_TMP_VAR == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(retval_ptr))) { zend_refcounted *ref = Z_COUNTED_P(retval_ptr); @@ -20653,21 +20661,25 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA } } } else if (IS_VAR == IS_CV) { - if (Z_OPT_REFCOUNTED_P(retval_ptr)) { - if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(return_value, retval_ptr); - if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { - ZVAL_NULL(retval_ptr); + do { + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { + if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { + ZVAL_COPY_VALUE(return_value, retval_ptr); + ZVAL_NULL(retval_ptr); + break; + } else { + Z_ADDREF_P(retval_ptr); + } } else { - Z_ADDREF_P(return_value); + retval_ptr = Z_REFVAL_P(retval_ptr); + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + Z_ADDREF_P(retval_ptr); + } } - } else { - retval_ptr = Z_REFVAL_P(retval_ptr); - ZVAL_COPY(return_value, retval_ptr); } - } else { ZVAL_COPY_VALUE(return_value, retval_ptr); - } + } while (0); } else /* if (IS_VAR == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(retval_ptr))) { zend_refcounted *ref = Z_COUNTED_P(retval_ptr); @@ -36822,21 +36834,25 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN } } } else if (IS_CV == IS_CV) { - if (Z_OPT_REFCOUNTED_P(retval_ptr)) { - if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(return_value, retval_ptr); - if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { - ZVAL_NULL(retval_ptr); + do { + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { + if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { + ZVAL_COPY_VALUE(return_value, retval_ptr); + ZVAL_NULL(retval_ptr); + break; + } else { + Z_ADDREF_P(retval_ptr); + } } else { - Z_ADDREF_P(return_value); + retval_ptr = Z_REFVAL_P(retval_ptr); + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + Z_ADDREF_P(retval_ptr); + } } - } else { - retval_ptr = Z_REFVAL_P(retval_ptr); - ZVAL_COPY(return_value, retval_ptr); } - } else { ZVAL_COPY_VALUE(return_value, retval_ptr); - } + } while (0); } else /* if (IS_CV == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(retval_ptr))) { zend_refcounted *ref = Z_COUNTED_P(retval_ptr); @@ -55337,21 +55353,25 @@ zend_leave_helper_SPEC_LABEL: } } } else if (IS_CONST == IS_CV) { - if (Z_OPT_REFCOUNTED_P(retval_ptr)) { - if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(return_value, retval_ptr); - if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { - ZVAL_NULL(retval_ptr); + do { + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { + if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { + ZVAL_COPY_VALUE(return_value, retval_ptr); + ZVAL_NULL(retval_ptr); + break; + } else { + Z_ADDREF_P(retval_ptr); + } } else { - Z_ADDREF_P(return_value); + retval_ptr = Z_REFVAL_P(retval_ptr); + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + Z_ADDREF_P(retval_ptr); + } } - } else { - retval_ptr = Z_REFVAL_P(retval_ptr); - ZVAL_COPY(return_value, retval_ptr); } - } else { ZVAL_COPY_VALUE(return_value, retval_ptr); - } + } while (0); } else /* if (IS_CONST == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(retval_ptr))) { zend_refcounted *ref = Z_COUNTED_P(retval_ptr); @@ -57047,21 +57067,25 @@ zend_leave_helper_SPEC_LABEL: } } } else if (IS_TMP_VAR == IS_CV) { - if (Z_OPT_REFCOUNTED_P(retval_ptr)) { - if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(return_value, retval_ptr); - if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { - ZVAL_NULL(retval_ptr); + do { + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { + if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { + ZVAL_COPY_VALUE(return_value, retval_ptr); + ZVAL_NULL(retval_ptr); + break; + } else { + Z_ADDREF_P(retval_ptr); + } } else { - Z_ADDREF_P(return_value); + retval_ptr = Z_REFVAL_P(retval_ptr); + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + Z_ADDREF_P(retval_ptr); + } } - } else { - retval_ptr = Z_REFVAL_P(retval_ptr); - ZVAL_COPY(return_value, retval_ptr); } - } else { ZVAL_COPY_VALUE(return_value, retval_ptr); - } + } while (0); } else /* if (IS_TMP_VAR == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(retval_ptr))) { zend_refcounted *ref = Z_COUNTED_P(retval_ptr); @@ -57333,21 +57357,25 @@ zend_leave_helper_SPEC_LABEL: } } } else if (IS_VAR == IS_CV) { - if (Z_OPT_REFCOUNTED_P(retval_ptr)) { - if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(return_value, retval_ptr); - if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { - ZVAL_NULL(retval_ptr); + do { + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { + if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { + ZVAL_COPY_VALUE(return_value, retval_ptr); + ZVAL_NULL(retval_ptr); + break; + } else { + Z_ADDREF_P(retval_ptr); + } } else { - Z_ADDREF_P(return_value); + retval_ptr = Z_REFVAL_P(retval_ptr); + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + Z_ADDREF_P(retval_ptr); + } } - } else { - retval_ptr = Z_REFVAL_P(retval_ptr); - ZVAL_COPY(return_value, retval_ptr); } - } else { ZVAL_COPY_VALUE(return_value, retval_ptr); - } + } while (0); } else /* if (IS_VAR == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(retval_ptr))) { zend_refcounted *ref = Z_COUNTED_P(retval_ptr); @@ -58975,21 +59003,25 @@ zend_leave_helper_SPEC_LABEL: } } } else if (IS_CV == IS_CV) { - if (Z_OPT_REFCOUNTED_P(retval_ptr)) { - if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(return_value, retval_ptr); - if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { - ZVAL_NULL(retval_ptr); + do { + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) { + if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) { + ZVAL_COPY_VALUE(return_value, retval_ptr); + ZVAL_NULL(retval_ptr); + break; + } else { + Z_ADDREF_P(retval_ptr); + } } else { - Z_ADDREF_P(return_value); + retval_ptr = Z_REFVAL_P(retval_ptr); + if (Z_OPT_REFCOUNTED_P(retval_ptr)) { + Z_ADDREF_P(retval_ptr); + } } - } else { - retval_ptr = Z_REFVAL_P(retval_ptr); - ZVAL_COPY(return_value, retval_ptr); } - } else { ZVAL_COPY_VALUE(return_value, retval_ptr); - } + } while (0); } else /* if (IS_CV == IS_VAR) */ { if (UNEXPECTED(Z_ISREF_P(retval_ptr))) { zend_refcounted *ref = Z_COUNTED_P(retval_ptr); -- 2.50.1