summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2017-03-16 17:32:27 +0100
committerNikita Popov <nikita.ppv@gmail.com>2017-03-16 17:32:27 +0100
commite60515f3b84b9d24748cdd7aa9ccbfa3cfa23d62 (patch)
tree1393fff95684b354aaed6c86ebfa75ee834f3101
parentf1f68b60f5e6f75002560b44211f3449b25f918d (diff)
downloadphp-git-e60515f3b84b9d24748cdd7aa9ccbfa3cfa23d62.tar.gz
Slightly optimize worklist management
Avoid scanning the worklist twice on every iteration.
-rw-r--r--ext/opcache/Optimizer/zend_inference.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c
index 752108a7fd..986be72c46 100644
--- a/ext/opcache/Optimizer/zend_inference.c
+++ b/ext/opcache/Optimizer/zend_inference.c
@@ -269,8 +269,7 @@ int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ss
}
}
- while (!zend_bitset_empty(worklist, zend_bitset_len(ssa_vars_count))) {
- i = zend_bitset_first(worklist, zend_bitset_len(ssa_vars_count));
+ while ((i = zend_bitset_first(worklist, zend_bitset_len(ssa_vars_count))) >= 0) {
zend_bitset_excl(worklist, i);
if (ssa_vars[i].definition_phi) {
/* mark all possible sources as used */
@@ -1568,8 +1567,7 @@ static void zend_infer_ranges_warmup(const zend_op_array *op_array, zend_ssa *ss
memset(visited, 0, sizeof(zend_ulong) * worklist_len);
- while (!zend_bitset_empty(worklist, worklist_len)) {
- j = zend_bitset_first(worklist, worklist_len);
+ while ((j = zend_bitset_first(worklist, worklist_len)) >= 0) {
zend_bitset_excl(worklist, j);
if (zend_inference_calc_range(op_array, ssa, j, 0, 0, &tmp)) {
#ifdef NEG_RANGE
@@ -1688,8 +1686,7 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{
#endif
/* widening */
- while (!zend_bitset_empty(worklist, worklist_len)) {
- j = zend_bitset_first(worklist, worklist_len);
+ while ((j = zend_bitset_first(worklist, worklist_len)) >= 0) {
zend_bitset_excl(worklist, j);
if (zend_ssa_range_widening(op_array, ssa, j, scc)) {
FOR_EACH_VAR_USAGE(j, ADD_SCC_VAR);
@@ -1705,8 +1702,7 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{
}
/* narrowing */
- while (!zend_bitset_empty(worklist, worklist_len)) {
- j = zend_bitset_first(worklist, worklist_len);
+ while ((j = zend_bitset_first(worklist, worklist_len)) >= 0) {
zend_bitset_excl(worklist, j);
if (zend_ssa_range_narrowing(op_array, ssa, j, scc)) {
FOR_EACH_VAR_USAGE(j, ADD_SCC_VAR);
@@ -3268,8 +3264,7 @@ int zend_infer_types_ex(const zend_op_array *op_array, const zend_script *script
int i, j;
uint32_t tmp;
- while (!zend_bitset_empty(worklist, zend_bitset_len(ssa_vars_count))) {
- j = zend_bitset_first(worklist, zend_bitset_len(ssa_vars_count));
+ while ((j = zend_bitset_first(worklist, zend_bitset_len(ssa_vars_count))) >= 0) {
zend_bitset_excl(worklist, j);
if (ssa_vars[j].definition_phi) {
zend_ssa_phi *p = ssa_vars[j].definition_phi;
@@ -3882,7 +3877,7 @@ void zend_inference_check_recursive_dependencies(zend_op_array *op_array)
zend_func_info *info = ZEND_FUNC_INFO(op_array);
zend_call_info *call_info;
zend_bitset worklist;
- int worklist_len;
+ int worklist_len, i;
ALLOCA_FLAG(use_heap);
if (!info->ssa.var_info || !(info->flags & ZEND_FUNC_RECURSIVE)) {
@@ -3899,8 +3894,7 @@ void zend_inference_check_recursive_dependencies(zend_op_array *op_array)
}
call_info = call_info->next_callee;
}
- while (!zend_bitset_empty(worklist, worklist_len)) {
- int i = zend_bitset_first(worklist, worklist_len);
+ while ((i = zend_bitset_first(worklist, worklist_len)) >= 0) {
zend_bitset_excl(worklist, i);
if (!info->ssa.var_info[i].recursive) {
info->ssa.var_info[i].recursive = 1;