From: Dmitry Stogov Date: Thu, 14 Dec 2017 00:39:22 +0000 (+0300) Subject: Manual loop optimizaton. X-Git-Tag: php-7.3.0alpha1~812 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3aceab825a391b26c03525fef5ae9a54d0e64f57;p=php Manual loop optimizaton. Cost of the loops body is still the same, but the loop headers are improved. --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index d2dad66ad8..aaa45a8d4a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2103,8 +2103,8 @@ ZEND_API void zend_clean_and_cache_symbol_table(zend_array *symbol_table) /* {{{ static zend_always_inline void i_free_compiled_variables(zend_execute_data *execute_data) /* {{{ */ { zval *cv = EX_VAR_NUM(0); - zval *end = cv + EX(func)->op_array.last_var; - while (EXPECTED(cv != end)) { + int count = EX(func)->op_array.last_var; + while (EXPECTED(count != 0)) { if (Z_REFCOUNTED_P(cv)) { zend_refcounted *r = Z_COUNTED_P(cv); if (!GC_DELREF(r)) { @@ -2115,7 +2115,8 @@ static zend_always_inline void i_free_compiled_variables(zend_execute_data *exec } } cv++; - } + count--; + } } /* }}} */ @@ -2201,13 +2202,13 @@ static zend_never_inline void zend_copy_extra_args(EXECUTE_DATA_D) static zend_always_inline void zend_init_cvs(uint32_t first, uint32_t last EXECUTE_DATA_DC) { if (EXPECTED(first < last)) { + uint32_t count = last - first; zval *var = EX_VAR_NUM(first); - zval *end = EX_VAR_NUM(last); do { ZVAL_UNDEF(var); var++; - } while (var != end); + } while (--count); } } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index a8798aed5e..77246981ca 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -217,8 +217,8 @@ static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(uint3 static zend_always_inline void zend_vm_stack_free_extra_args_ex(uint32_t call_info, zend_execute_data *call) { if (UNEXPECTED(call_info & ZEND_CALL_FREE_EXTRA_ARGS)) { - zval *end = ZEND_CALL_VAR_NUM(call, call->func->op_array.last_var + call->func->op_array.T); - zval *p = end + (ZEND_CALL_NUM_ARGS(call) - call->func->op_array.num_args); + uint32_t count = ZEND_CALL_NUM_ARGS(call) - call->func->op_array.num_args; + zval *p = ZEND_CALL_VAR_NUM(call, call->func->op_array.last_var + call->func->op_array.T + count); do { p--; if (Z_REFCOUNTED_P(p)) { @@ -230,7 +230,7 @@ static zend_always_inline void zend_vm_stack_free_extra_args_ex(uint32_t call_in gc_check_possible_root(r); } } - } while (p != end); + } while (--count); } }