]> granicus.if.org Git - php/commitdiff
Fixed CFG/SSA construction (avoid multiple identical predecessors)
authorDmitry Stogov <dmitry@zend.com>
Mon, 17 Jul 2017 10:35:47 +0000 (13:35 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 17 Jul 2017 10:35:47 +0000 (13:35 +0300)
ext/opcache/Optimizer/zend_cfg.c

index 9a7529aeee8398cfad39d8f4c956a1032db313cb..25d0acb6ce7e57e2dd8a66884774de0742aca810 100644 (file)
@@ -649,9 +649,18 @@ int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* {{{ */
 
        for (j = 0; j < cfg->blocks_count; j++) {
                if (blocks[j].flags & ZEND_BB_REACHABLE) {
+                       /* SWITCH_STRING/LONG may have few identical successors */
                        for (s = 0; s < blocks[j].successors_count; s++) {
-                               /* SWITCH_STRING/LONG may have few following identical successors */
-                               if (s == 0 || blocks[j].successors[s-1] != blocks[j].successors[s]) {
+                               int duplicate = 0;
+                               int p;
+
+                               for (p = 0; p < s; p++) {
+                                       if (blocks[j].successors[p] == blocks[j].successors[s]) {
+                                               duplicate = 1;
+                                               break;
+                                       }
+                               }
+                               if (!duplicate) {
                                        zend_basic_block *b = blocks + blocks[j].successors[s];
 
                                        predecessors[b->predecessor_offset + b->predecessors_count] = j;