@@ -730,9 +730,13 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
730
730
uint32_t op_num ;
731
731
zend_op * opline ;
732
732
zend_ssa_op * ssa_op ;
733
+ zend_bool can_follow = 1 ;
733
734
734
735
while (next_block_num < ssa -> cfg .blocks_count
735
736
&& !(ssa -> cfg .blocks [next_block_num ].flags & ZEND_BB_REACHABLE )) {
737
+ if (ssa -> cfg .blocks [next_block_num ].flags & ZEND_BB_UNREACHABLE_FREE ) {
738
+ can_follow = 0 ;
739
+ }
736
740
next_block_num ++ ;
737
741
}
738
742
@@ -744,7 +748,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
744
748
switch (opline -> opcode ) {
745
749
case ZEND_JMP :
746
750
optimize_jmp :
747
- if (block -> successors [0 ] == next_block_num ) {
751
+ if (block -> successors [0 ] == next_block_num && can_follow ) {
748
752
MAKE_NOP (opline );
749
753
removed_ops ++ ;
750
754
goto optimize_nop ;
@@ -765,7 +769,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
765
769
goto optimize_jmp ;
766
770
}
767
771
} else {
768
- if (block -> successors [0 ] == next_block_num ) {
772
+ if (block -> successors [0 ] == next_block_num && can_follow ) {
769
773
take_successor_0 (ssa , block_num , block );
770
774
if (opline -> op1_type == IS_CV && (OP1_INFO () & MAY_BE_UNDEF )) {
771
775
opline -> opcode = ZEND_CHECK_VAR ;
@@ -796,7 +800,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
796
800
goto optimize_nop ;
797
801
}
798
802
} else if (block -> successors_count == 2 ) {
799
- if (block -> successors [0 ] == next_block_num ) {
803
+ if (block -> successors [0 ] == next_block_num && can_follow ) {
800
804
take_successor_0 (ssa , block_num , block );
801
805
if (opline -> op1_type == IS_CV && (OP1_INFO () & MAY_BE_UNDEF )) {
802
806
opline -> opcode = ZEND_CHECK_VAR ;
@@ -830,7 +834,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
830
834
} else if (block -> successors_count == 2 ) {
831
835
if (block -> successors [0 ] == block -> successors [1 ]) {
832
836
take_successor_0 (ssa , block_num , block );
833
- if (block -> successors [0 ] == next_block_num ) {
837
+ if (block -> successors [0 ] == next_block_num && can_follow ) {
834
838
if (opline -> op1_type == IS_CV && (OP1_INFO () & MAY_BE_UNDEF )) {
835
839
opline -> opcode = ZEND_CHECK_VAR ;
836
840
opline -> op2 .num = 0 ;
0 commit comments