]> granicus.if.org Git - php/commitdiff
Fix loop identification
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 17 Apr 2017 10:17:32 +0000 (12:17 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 17 Apr 2017 10:17:32 +0000 (12:17 +0200)
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.

ext/opcache/Optimizer/zend_cfg.c

index 1e9bfe47bc159d2efbd177ef0c17d089a2f108a5..ec7116691e7c116b51f91bb4970fa678ecbd6710 100644 (file)
@@ -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]);