summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2017-04-17 12:17:32 +0200
committerNikita Popov <nikita.ppv@gmail.com>2017-04-17 12:17:32 +0200
commitabf16c18c77815b310af9528106d0c76eb8a81ab (patch)
tree2cfe4c577afa580cd622d5b2b3ee36d65e72b245
parentf69c1082498569dcab95706ce1f6b9c2ac07f367 (diff)
downloadphp-git-abf16c18c77815b310af9528106d0c76eb8a81ab.tar.gz
Fix loop identification
When assigning loop headers, we should treat already detected loops as collapsed to their loop header, instead of ignoring them. This fixes the loop header of BB2 in mandel2 if live-range CFG splitting is enabled.
-rw-r--r--ext/opcache/Optimizer/zend_cfg.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/ext/opcache/Optimizer/zend_cfg.c b/ext/opcache/Optimizer/zend_cfg.c
index 1e9bfe47bc..ec7116691e 100644
--- a/ext/opcache/Optimizer/zend_cfg.c
+++ b/ext/opcache/Optimizer/zend_cfg.c
@@ -855,7 +855,10 @@ int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg, uint32
}
while (zend_worklist_len(&work)) {
j = zend_worklist_pop(&work);
- if (blocks[j].loop_header < 0 && j != i) {
+ while (blocks[j].loop_header >= 0) {
+ j = blocks[j].loop_header;
+ }
+ if (j != i) {
blocks[j].loop_header = i;
for (k = 0; k < blocks[j].predecessors_count; k++) {
zend_worklist_push(&work, cfg->predecessors[blocks[j].predecessor_offset + k]);