Skip to content

Commit 363434b

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: Fix incorrect JMP optimization
2 parents 7e08018 + 0ac3d78 commit 363434b

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

Zend/Optimizer/dfa_pass.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -741,9 +741,13 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
741741
uint32_t op_num;
742742
zend_op *opline;
743743
zend_ssa_op *ssa_op;
744+
bool can_follow = 1;
744745

745746
while (next_block_num < ssa->cfg.blocks_count
746747
&& !(ssa->cfg.blocks[next_block_num].flags & ZEND_BB_REACHABLE)) {
748+
if (ssa->cfg.blocks[next_block_num].flags & ZEND_BB_UNREACHABLE_FREE) {
749+
can_follow = 0;
750+
}
747751
next_block_num++;
748752
}
749753

@@ -755,7 +759,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
755759
switch (opline->opcode) {
756760
case ZEND_JMP:
757761
optimize_jmp:
758-
if (block->successors[0] == next_block_num) {
762+
if (block->successors[0] == next_block_num && can_follow) {
759763
MAKE_NOP(opline);
760764
removed_ops++;
761765
goto optimize_nop;
@@ -776,7 +780,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
776780
goto optimize_jmp;
777781
}
778782
} else {
779-
if (block->successors[0] == next_block_num) {
783+
if (block->successors[0] == next_block_num && can_follow) {
780784
take_successor_0(ssa, block_num, block);
781785
if (opline->op1_type == IS_CV && (OP1_INFO() & MAY_BE_UNDEF)) {
782786
opline->opcode = ZEND_CHECK_VAR;
@@ -807,7 +811,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
807811
goto optimize_nop;
808812
}
809813
} else if (block->successors_count == 2) {
810-
if (block->successors[0] == next_block_num) {
814+
if (block->successors[0] == next_block_num && can_follow) {
811815
take_successor_0(ssa, block_num, block);
812816
if (opline->op1_type == IS_CV && (OP1_INFO() & MAY_BE_UNDEF)) {
813817
opline->opcode = ZEND_CHECK_VAR;
@@ -841,7 +845,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
841845
} else if (block->successors_count == 2) {
842846
if (block->successors[0] == block->successors[1]) {
843847
take_successor_0(ssa, block_num, block);
844-
if (block->successors[0] == next_block_num) {
848+
if (block->successors[0] == next_block_num && can_follow) {
845849
if (opline->op1_type == IS_CV && (OP1_INFO() & MAY_BE_UNDEF)) {
846850
opline->opcode = ZEND_CHECK_VAR;
847851
opline->op2.num = 0;

ext/opcache/tests/opt/jmp_002.phpt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
--TEST--
2+
JMP 002: JMP around unreachable FREE
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.optimization_level=-1
7+
--FILE--
8+
<?php
9+
7??match(X){};
10+
?>
11+
DONE
12+
--EXPECT--
13+
DONE

0 commit comments

Comments
 (0)