diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2017-04-17 12:17:32 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2017-04-17 12:17:32 +0200 |
commit | abf16c18c77815b310af9528106d0c76eb8a81ab (patch) | |
tree | 2cfe4c577afa580cd622d5b2b3ee36d65e72b245 | |
parent | f69c1082498569dcab95706ce1f6b9c2ac07f367 (diff) | |
download | php-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.c | 5 |
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]); |