@@ -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 :
757761optimize_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 ;
0 commit comments