Skip to content

Commit 14c103d

Browse files
committed
Optimize "$x * 2" into "$x + $x"
1 parent 858d0c0 commit 14c103d

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

Zend/Optimizer/dfa_pass.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)