Browse Source

Fixed CFG/SSA construction (avoid multiple identical predecessors)

pull/2636/head
Dmitry Stogov 9 years ago
parent
commit
d9d3b2c206
  1. 13
      ext/opcache/Optimizer/zend_cfg.c

13
ext/opcache/Optimizer/zend_cfg.c

@ -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;

Loading…
Cancel
Save