Skip to content

Commit bf4dab0

Browse files
committed
Make operator swapping depend on IGNORE_OVERLOADING flag
Add MUL back to the list and instead make the entire optimization depend on IGNORE_OVERLOADING, which is there exactly so we can make these kinds of assumptions.
1 parent 85f4403 commit bf4dab0

File tree

3 files changed

+10
-7
lines changed

3 files changed

+10
-7
lines changed

ext/opcache/Optimizer/pass3.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
} \
5151
jmp_hitlist[jmp_hitlist_count++] = ZEND_OP2_JMP_ADDR(target);
5252

53-
void zend_optimizer_pass3(zend_op_array *op_array)
53+
void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx)
5454
{
5555
zend_op *opline;
5656
zend_op *end = op_array->opcodes + op_array->last;
@@ -90,15 +90,17 @@ void zend_optimizer_pass3(zend_op_array *op_array)
9090
break;
9191
}
9292

93-
if ((opline->op2_type & (IS_VAR | IS_CV))
93+
/* change $i=expr+$i to $i=$i+expr so that the following optimization
94+
* works on it. Only do this if we are ignoring operator overloading,
95+
* as operand order might be significant otherwise. */
96+
if ((ctx->optimization_level & ZEND_OPTIMIZER_IGNORE_OVERLOADING)
97+
&& (opline->op2_type & (IS_VAR | IS_CV))
9498
&& opline->op2.var == next_opline->op1.var &&
9599
(opline->opcode == ZEND_ADD ||
100+
opline->opcode == ZEND_MUL ||
96101
opline->opcode == ZEND_BW_OR ||
97102
opline->opcode == ZEND_BW_AND ||
98103
opline->opcode == ZEND_BW_XOR)) {
99-
/* change $i=expr+$i to $i=$i+expr so that the next
100-
* optimization works on it
101-
*/
102104
zend_uchar tmp_type = opline->op1_type;
103105
znode_op tmp = opline->op1;
104106

@@ -110,6 +112,7 @@ void zend_optimizer_pass3(zend_op_array *op_array)
110112
COPY_NODE(opline->op2, tmp);
111113
}
112114
}
115+
113116
if ((opline->op1_type & (IS_VAR | IS_CV))
114117
&& opline->op1.var == next_opline->op1.var
115118
&& opline->op1_type == next_opline->op1_type) {

ext/opcache/Optimizer/zend_optimizer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1131,7 +1131,7 @@ static void zend_optimize(zend_op_array *op_array,
11311131
* - change $i++ to ++$i where possible
11321132
*/
11331133
if (ZEND_OPTIMIZER_PASS_3 & ctx->optimization_level) {
1134-
zend_optimizer_pass3(op_array);
1134+
zend_optimizer_pass3(op_array, ctx);
11351135
if (ctx->debug_level & ZEND_DUMP_AFTER_PASS_3) {
11361136
zend_dump_op_array(op_array, 0, "after pass 3", NULL);
11371137
}

ext/opcache/Optimizer/zend_optimizer_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ void zend_optimizer_remove_live_range(zend_op_array *op_array, uint32_t var);
9595
void zend_optimizer_remove_live_range_ex(zend_op_array *op_array, uint32_t var, uint32_t start);
9696
void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx);
9797
void zend_optimizer_pass2(zend_op_array *op_array);
98-
void zend_optimizer_pass3(zend_op_array *op_array);
98+
void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx);
9999
void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx);
100100
void zend_optimize_cfg(zend_op_array *op_array, zend_optimizer_ctx *ctx);
101101
void zend_optimize_dfa(zend_op_array *op_array, zend_optimizer_ctx *ctx);

0 commit comments

Comments
 (0)