Skip to content

Commit d26ff1b

Browse files
committed
Don't create identical predecessors
1 parent 0625fbe commit d26ff1b

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

ext/opcache/Optimizer/zend_cfg.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -646,9 +646,13 @@ int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* {{{ */
646646
for (j = 0; j < cfg->blocks_count; j++) {
647647
if (blocks[j].flags & ZEND_BB_REACHABLE) {
648648
for (s = 0; s < blocks[j].successors_count; s++) {
649-
zend_basic_block *b = blocks + blocks[j].successors[s];
650-
predecessors[b->predecessor_offset + b->predecessors_count] = j;
651-
b->predecessors_count++;
649+
/* SWITCH_STRING/LONG may have few following identical successors */
650+
if (s == 0 || blocks[j].successors[s-1] != blocks[j].successors[s]) {
651+
zend_basic_block *b = blocks + blocks[j].successors[s];
652+
653+
predecessors[b->predecessor_offset + b->predecessors_count] = j;
654+
b->predecessors_count++;
655+
}
652656
}
653657
}
654658
}

ext/opcache/tests/ssa_bug_007.phpt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
Incorrect CFG/SSA construction for SWITCH with few identical successors
3+
--FILE--
4+
<?php
5+
function render($properties) {
6+
foreach ($properties as $key => $value) {
7+
switch ($key) {
8+
case 'Trapped':
9+
if ($value == null) {
10+
$docInfo->$key = 1;
11+
}
12+
case 'CreationDate':
13+
case 'ModDate':
14+
$docInfo->$key = 2;
15+
break;
16+
}
17+
}
18+
}
19+
?>
20+
OK
21+
--EXPECT--
22+
OK
23+

0 commit comments

Comments
 (0)