Skip to content

Commit 1827d78

Browse files
committed
Remove unused BIND_STATIC insructions
1 parent 808eaa0 commit 1827d78

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

ext/opcache/Optimizer/dce.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ static inline zend_bool may_have_side_effects(
241241
return 1;
242242
}
243243
return 0;
244+
case ZEND_BIND_STATIC:
245+
return 0;
244246
default:
245247
/* For everything we didn't handle, assume a side-effect */
246248
return 1;
@@ -267,19 +269,23 @@ static inline void add_to_phi_worklist_no_val(context *ctx, int var_num) {
267269
}
268270
}
269271

270-
static zend_always_inline void add_operands_to_worklists(context *ctx, zend_op *opline, zend_ssa_op *ssa_op, int check) {
272+
static zend_always_inline void add_operands_to_worklists(context *ctx, zend_op *opline, zend_ssa_op *ssa_op, zend_ssa *ssa, int check) {
271273
if (ssa_op->result_use >= 0) {
272274
add_to_worklists(ctx, ssa_op->result_use, check);
273275
}
274276
if (ssa_op->op1_use >= 0) {
275-
if (!zend_ssa_is_no_val_use(opline, ssa_op, ssa_op->op1_use)) {
277+
if (!zend_ssa_is_no_val_use(opline, ssa_op, ssa_op->op1_use)
278+
|| (opline->opcode == ZEND_ASSIGN
279+
&& (ssa->var_info[ssa_op->op1_use].type & MAY_BE_REF) != 0)) {
276280
add_to_worklists(ctx, ssa_op->op1_use, check);
277281
} else {
278282
add_to_phi_worklist_no_val(ctx, ssa_op->op1_use);
279283
}
280284
}
281285
if (ssa_op->op2_use >= 0) {
282-
if (!zend_ssa_is_no_val_use(opline, ssa_op, ssa_op->op2_use)) {
286+
if (!zend_ssa_is_no_val_use(opline, ssa_op, ssa_op->op2_use)
287+
|| (opline->opcode == ZEND_FE_FETCH_R
288+
&& (ssa->var_info[ssa_op->op2_use].type & MAY_BE_REF) != 0)) {
283289
add_to_worklists(ctx, ssa_op->op2_use, check);
284290
} else {
285291
add_to_phi_worklist_no_val(ctx, ssa_op->op2_use);
@@ -528,9 +534,9 @@ int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reor
528534

529535
if (zend_bitset_in(ctx.instr_worklist, i)) {
530536
zend_bitset_excl(ctx.instr_worklist, i);
531-
add_operands_to_worklists(&ctx, &op_array->opcodes[i], &ssa->ops[i], 0);
537+
add_operands_to_worklists(&ctx, &op_array->opcodes[i], &ssa->ops[i], ssa, 0);
532538
if (op_data >= 0) {
533-
add_operands_to_worklists(&ctx, &op_array->opcodes[op_data], &ssa->ops[op_data], 0);
539+
add_operands_to_worklists(&ctx, &op_array->opcodes[op_data], &ssa->ops[op_data], ssa, 0);
534540
}
535541
} else if (may_have_side_effects(op_array, ssa, &op_array->opcodes[i], &ssa->ops[i], ctx.reorder_dtor_effects)
536542
|| zend_may_throw(&op_array->opcodes[i], op_array, ssa)
@@ -542,9 +548,9 @@ int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reor
542548
zend_bitset_incl(ctx.instr_dead, i);
543549
zend_bitset_incl(ctx.instr_dead, i+1);
544550
} else {
545-
add_operands_to_worklists(&ctx, &op_array->opcodes[i], &ssa->ops[i], 0);
551+
add_operands_to_worklists(&ctx, &op_array->opcodes[i], &ssa->ops[i], ssa, 0);
546552
if (op_data >= 0) {
547-
add_operands_to_worklists(&ctx, &op_array->opcodes[op_data], &ssa->ops[op_data], 0);
553+
add_operands_to_worklists(&ctx, &op_array->opcodes[op_data], &ssa->ops[op_data], ssa, 0);
548554
}
549555
}
550556
} else {
@@ -562,10 +568,10 @@ int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reor
562568
|| !zend_bitset_empty(ctx.phi_worklist, ctx.phi_worklist_len)) {
563569
while ((i = zend_bitset_pop_first(ctx.instr_worklist, ctx.instr_worklist_len)) >= 0) {
564570
zend_bitset_excl(ctx.instr_dead, i);
565-
add_operands_to_worklists(&ctx, &op_array->opcodes[i], &ssa->ops[i], 1);
571+
add_operands_to_worklists(&ctx, &op_array->opcodes[i], &ssa->ops[i], ssa, 1);
566572
if (i < op_array->last && op_array->opcodes[i+1].opcode == ZEND_OP_DATA) {
567573
zend_bitset_excl(ctx.instr_dead, i+1);
568-
add_operands_to_worklists(&ctx, &op_array->opcodes[i+1], &ssa->ops[i+1], 1);
574+
add_operands_to_worklists(&ctx, &op_array->opcodes[i+1], &ssa->ops[i+1], ssa, 1);
569575
}
570576
}
571577
while ((i = zend_bitset_pop_first(ctx.phi_worklist, ctx.phi_worklist_len)) >= 0) {

ext/opcache/Optimizer/zend_inference.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4382,6 +4382,7 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa
43824382
case ZEND_ASSIGN_DIM:
43834383
case ZEND_ASSIGN_REF:
43844384
case ZEND_BIND_GLOBAL:
4385+
case ZEND_BIND_STATIC:
43854386
case ZEND_FETCH_DIM_IS:
43864387
case ZEND_FETCH_OBJ_IS:
43874388
case ZEND_SEND_REF:
@@ -4605,6 +4606,7 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa
46054606
if (t1 & MAY_BE_REF) {
46064607
return 1;
46074608
}
4609+
case ZEND_BIND_STATIC:
46084610
case ZEND_UNSET_VAR:
46094611
return (t1 & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY));
46104612
case ZEND_ASSIGN_DIM:

0 commit comments

Comments
 (0)