@@ -716,9 +716,13 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
716
716
uint32_t op_num ;
717
717
zend_op * opline ;
718
718
zend_ssa_op * ssa_op ;
719
+ bool can_follow = 1 ;
719
720
720
721
while (next_block_num < ssa -> cfg .blocks_count
721
722
&& !(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
+ }
722
726
next_block_num ++ ;
723
727
}
724
728
@@ -730,7 +734,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
730
734
switch (opline -> opcode ) {
731
735
case ZEND_JMP :
732
736
optimize_jmp :
733
- if (block -> successors [0 ] == next_block_num ) {
737
+ if (block -> successors [0 ] == next_block_num && can_follow ) {
734
738
MAKE_NOP (opline );
735
739
removed_ops ++ ;
736
740
goto optimize_nop ;
@@ -751,7 +755,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
751
755
goto optimize_jmp ;
752
756
}
753
757
} else {
754
- if (block -> successors [0 ] == next_block_num ) {
758
+ if (block -> successors [0 ] == next_block_num && can_follow ) {
755
759
take_successor_0 (ssa , block_num , block );
756
760
if (opline -> op1_type == IS_CV && (OP1_INFO () & MAY_BE_UNDEF )) {
757
761
opline -> opcode = ZEND_CHECK_VAR ;
@@ -782,7 +786,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
782
786
goto optimize_nop ;
783
787
}
784
788
} else if (block -> successors_count == 2 ) {
785
- if (block -> successors [0 ] == next_block_num ) {
789
+ if (block -> successors [0 ] == next_block_num && can_follow ) {
786
790
take_successor_0 (ssa , block_num , block );
787
791
if (opline -> op1_type == IS_CV && (OP1_INFO () & MAY_BE_UNDEF )) {
788
792
opline -> opcode = ZEND_CHECK_VAR ;
@@ -816,7 +820,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
816
820
} else if (block -> successors_count == 2 ) {
817
821
if (block -> successors [0 ] == block -> successors [1 ]) {
818
822
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 ) {
820
824
if (opline -> op1_type == IS_CV && (OP1_INFO () & MAY_BE_UNDEF )) {
821
825
opline -> opcode = ZEND_CHECK_VAR ;
822
826
opline -> op2 .num = 0 ;
0 commit comments