@@ -1207,6 +1207,24 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
12071207 ssa -> ops [op_1 ].op2_use = -1 ;
12081208 ssa -> ops [op_1 ].op2_use_chain = -1 ;
12091209 }
1210+ } else if (opline -> opcode == ZEND_MUL
1211+ && (OP2_INFO () & ((MAY_BE_ANY |MAY_BE_UNDEF )- (MAY_BE_LONG |MAY_BE_DOUBLE ))) == 0 ) {
1212+ zv = CT_CONSTANT_EX (op_array , opline -> op1 .constant );
1213+
1214+ if ((Z_TYPE_INFO_P (zv ) == IS_LONG
1215+ && Z_LVAL_P (zv ) == 2 )
1216+ || (Z_TYPE_INFO_P (zv ) == IS_DOUBLE
1217+ && Z_DVAL_P (zv ) == 2.0
1218+ && !(OP2_INFO () & MAY_BE_LONG ))) {
1219+
1220+ // op_1: #v.? = MUL 2, #x.? [double,long] => #v.? = ADD #x.?, #x.?
1221+
1222+ opline -> opcode = ZEND_ADD ;
1223+ opline -> op1_type = opline -> op2_type ;
1224+ opline -> op1 .var = opline -> op2 .var ;
1225+ ssa -> ops [op_1 ].op1_use = ssa -> ops [op_1 ].op2_use ;
1226+ ssa -> ops [op_1 ].op1_use_chain = ssa -> ops [op_1 ].op2_use_chain ;
1227+ }
12101228 }
12111229 } else if (opline -> op1_type != IS_CONST && opline -> op2_type == IS_CONST ) {
12121230 zval * zv = CT_CONSTANT_EX (op_array , opline -> op2 .constant );
@@ -1234,6 +1252,24 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
12341252 opline -> op2_type = IS_UNUSED ;
12351253 opline -> op2 .num = 0 ;
12361254 }
1255+ } else if (opline -> opcode == ZEND_MUL
1256+ && (OP1_INFO () & ((MAY_BE_ANY |MAY_BE_UNDEF )- (MAY_BE_LONG |MAY_BE_DOUBLE ))) == 0 ) {
1257+ zv = CT_CONSTANT_EX (op_array , opline -> op2 .constant );
1258+
1259+ if ((Z_TYPE_INFO_P (zv ) == IS_LONG
1260+ && Z_LVAL_P (zv ) == 2 )
1261+ || (Z_TYPE_INFO_P (zv ) == IS_DOUBLE
1262+ && Z_DVAL_P (zv ) == 2.0
1263+ && !(OP1_INFO () & MAY_BE_LONG ))) {
1264+
1265+ // op_1: #v.? = MUL #x.? [double,long], 2 => #v.? = ADD #x.?, #x.?
1266+
1267+ opline -> opcode = ZEND_ADD ;
1268+ opline -> op2_type = opline -> op1_type ;
1269+ opline -> op2 .var = opline -> op1 .var ;
1270+ ssa -> ops [op_1 ].op2_use = ssa -> ops [op_1 ].op1_use ;
1271+ ssa -> ops [op_1 ].op2_use_chain = ssa -> ops [op_1 ].op1_use_chain ;
1272+ }
12371273 }
12381274 }
12391275 } else if (opline -> opcode == ZEND_CONCAT ) {
0 commit comments