]> granicus.if.org Git - php/commitdiff
Manual loop optimizaton.
authorDmitry Stogov <dmitry@zend.com>
Thu, 14 Dec 2017 00:39:22 +0000 (03:39 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 14 Dec 2017 00:39:22 +0000 (03:39 +0300)
Cost of the loops body is still the same, but the loop headers are improved.

Zend/zend_execute.c
Zend/zend_execute.h

index d2dad66ad8c65b08d4d84dfb20e51ca81d63f4a5..aaa45a8d4a621fae2850db3a0520f277810ae85f 100644 (file)
@@ -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);
        }
 }
 
index a8798aed5efd6e8f3beafbd6db7626bc4ff63355..77246981cac499eea3beb22dfd5438abfd60bd1e 100644 (file)
@@ -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);
        }
 }