Skip to content

Commit abcf683

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: Fix incorrect JMP optimization
2 parents da68458 + 363434b commit abcf683

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
@@ -716,9 +716,13 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
716716
uint32_t op_num;
717717
zend_op *opline;
718718
zend_ssa_op *ssa_op;
719+
bool can_follow = 1;
719720

720721
while (next_block_num < ssa->cfg.blocks_count
721722
&& !(ssa->cfg.blocks[next_block_num].flags & ZEND_BB_REACHABLE)) {
723+
if (ssa->cfg.blocks[next_block_num].flags & ZEND_BB_UNREACHABLE_FREE) {
724+
can_follow = 0;
725+
}
722726
next_block_num++;
723727
}
724728

@@ -730,7 +734,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
730734
switch (opline->opcode) {
731735
case ZEND_JMP:
732736
optimize_jmp:
733-
if (block->successors[0] == next_block_num) {
737+
if (block->successors[0] == next_block_num && can_follow) {
734738
MAKE_NOP(opline);
735739
removed_ops++;
736740
goto optimize_nop;
@@ -751,7 +755,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
751755
goto optimize_jmp;
752756
}
753757
} else {
754-
if (block->successors[0] == next_block_num) {
758+
if (block->successors[0] == next_block_num && can_follow) {
755759
take_successor_0(ssa, block_num, block);
756760
if (opline->op1_type == IS_CV && (OP1_INFO() & MAY_BE_UNDEF)) {
757761
opline->opcode = ZEND_CHECK_VAR;
@@ -782,7 +786,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
782786
goto optimize_nop;
783787
}
784788
} else if (block->successors_count == 2) {
785-
if (block->successors[0] == next_block_num) {
789+
if (block->successors[0] == next_block_num && can_follow) {
786790
take_successor_0(ssa, block_num, block);
787791
if (opline->op1_type == IS_CV && (OP1_INFO() & MAY_BE_UNDEF)) {
788792
opline->opcode = ZEND_CHECK_VAR;
@@ -816,7 +820,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
816820
} else if (block->successors_count == 2) {
817821
if (block->successors[0] == block->successors[1]) {
818822
take_successor_0(ssa, block_num, block);
819-
if (block->successors[0] == next_block_num) {
823+
if (block->successors[0] == next_block_num && can_follow) {
820824
if (opline->op1_type == IS_CV && (OP1_INFO() & MAY_BE_UNDEF)) {
821825
opline->opcode = ZEND_CHECK_VAR;
822826
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)