Skip to content

Commit 4b19b85

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: Fix SSA reconstruction when body of "foreach" loop is removed
2 parents 565a416 + af1a7b7 commit 4b19b85

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

Zend/Optimizer/dfa_pass.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,13 +710,32 @@ static void zend_ssa_unlink_block(zend_op_array *op_array, zend_ssa *ssa, zend_b
710710
{
711711
if (block->predecessors_count == 1 && ssa->blocks[block_num].phis == NULL) {
712712
int *predecessors, i;
713+
zend_basic_block *fe_fetch_block = NULL;
713714

714715
ZEND_ASSERT(block->successors_count == 1);
715716
predecessors = &ssa->cfg.predecessors[block->predecessor_offset];
717+
if (block->predecessors_count == 1 && (block->flags & ZEND_BB_FOLLOW)) {
718+
zend_basic_block *pred_block = &ssa->cfg.blocks[predecessors[0]];
719+
720+
if (pred_block->len > 0 && (pred_block->flags & ZEND_BB_REACHABLE)) {
721+
if ((op_array->opcodes[pred_block->start + pred_block->len - 1].opcode == ZEND_FE_FETCH_R
722+
|| op_array->opcodes[pred_block->start + pred_block->len - 1].opcode == ZEND_FE_FETCH_RW)
723+
&& op_array->opcodes[pred_block->start + pred_block->len - 1].op2_type == IS_CV) {
724+
fe_fetch_block = pred_block;
725+
}
726+
}
727+
}
716728
for (i = 0; i < block->predecessors_count; i++) {
717729
zend_ssa_replace_control_link(op_array, ssa, predecessors[i], block_num, block->successors[0]);
718730
}
719731
zend_ssa_remove_block(op_array, ssa, block_num);
732+
if (fe_fetch_block && fe_fetch_block->successors[0] == fe_fetch_block->successors[1]) {
733+
/* The body of "foreach" loop was removed */
734+
int ssa_var = ssa->ops[fe_fetch_block->start + fe_fetch_block->len - 1].op2_def;
735+
if (ssa_var >= 0) {
736+
zend_ssa_remove_uses_of_var(ssa, ssa_var);
737+
}
738+
}
720739
}
721740
}
722741

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
FE_FETCH 001: SSA reconstruction when body of "foreach" loop is removed
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.optimization_level=-1
7+
--FILE--
8+
<?php
9+
function test() {
10+
$j = 0;
11+
for ($i = 0; $i < 77; $i++) {
12+
for ($i = 5; $i <= 1; $i++)
13+
$obj = (object)$arr;
14+
foreach ($obj as $val)
15+
if ($j < 14) break;
16+
}
17+
}
18+
?>
19+
DONE
20+
--EXPECT--
21+
DONE

0 commit comments

Comments
 (0)