]> granicus.if.org Git - php/commitdiff
Don't insert duplicate predecessors
authorNikita Popov <nikic@php.net>
Sat, 23 Jan 2016 15:27:19 +0000 (16:27 +0100)
committerNikita Popov <nikic@php.net>
Sun, 24 Jan 2016 22:03:57 +0000 (23:03 +0100)
Otherwise we'll get corrupt phis

ext/opcache/Optimizer/zend_cfg.c

index a7122319e773da2df612dc5daf205fdd72c23515..6df4d3c6b8c8522b1a8e238a2a051ea43361ca36 100644 (file)
@@ -535,7 +535,7 @@ int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* {{{ */
                        if (b->successors[0] >= 0) {
                                edges++;
                                blocks[b->successors[0]].predecessors_count++;
-                               if (b->successors[1] >= 0) {
+                               if (b->successors[1] >= 0 && b->successors[1] != b->successors[0]) {
                                        edges++;
                                        blocks[b->successors[1]].predecessors_count++;
                                }
@@ -564,7 +564,8 @@ int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* {{{ */
                                zend_basic_block *b = blocks + blocks[j].successors[0];
                                predecessors[b->predecessor_offset + b->predecessors_count] = j;
                                b->predecessors_count++;
-                               if (blocks[j].successors[1] >= 0) {
+                               if (blocks[j].successors[1] >= 0
+                                               && blocks[j].successors[1] != blocks[j].successors[0]) {
                                        zend_basic_block *b = blocks + blocks[j].successors[1];
                                        predecessors[b->predecessor_offset + b->predecessors_count] = j;
                                        b->predecessors_count++;