@@ -1001,11 +1001,23 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
1001
1001
|| (opline -> opcode == ZEND_MATCH && (type == IS_LONG || type == IS_STRING ));
1002
1002
1003
1003
if (!correct_type ) {
1004
- removed_ops ++ ;
1005
- MAKE_NOP (opline );
1006
- opline -> extended_value = 0 ;
1007
- take_successor_ex (ssa , block_num , block , block -> successors [block -> successors_count - 1 ]);
1008
- goto optimize_nop ;
1004
+ if (opline -> opcode != ZEND_MATCH ) {
1005
+ removed_ops ++ ;
1006
+ MAKE_NOP (opline );
1007
+ opline -> extended_value = 0 ;
1008
+ take_successor_ex (ssa , block_num , block , block -> successors [block -> successors_count - 1 ]);
1009
+ goto optimize_nop ;
1010
+ } else {
1011
+ /* Match doesn't have a fallback chain, so we need to we can jump directly to the default branch. */
1012
+ uint32_t target = ZEND_OFFSET_TO_OPLINE_NUM (op_array , opline , opline -> extended_value );
1013
+ opline -> opcode = ZEND_JMP ;
1014
+ opline -> extended_value = 0 ;
1015
+ SET_UNUSED (opline -> op1 );
1016
+ ZEND_SET_OP_JMP_ADDR (opline , opline -> op1 , op_array -> opcodes + target );
1017
+ SET_UNUSED (opline -> op2 );
1018
+ take_successor_ex (ssa , block_num , block , ssa -> cfg .map [target ]);
1019
+ goto optimize_jmp ;
1020
+ }
1009
1021
} else {
1010
1022
HashTable * jmptable = Z_ARRVAL_P (CT_CONSTANT_EX (op_array , opline -> op2 .constant ));
1011
1023
zval * jmp_zv = type == IS_LONG
0 commit comments