Skip to content

Commit a1ef3e4

Browse files
committed
Use arena in DCE
1 parent a4fa962 commit a1ef3e4

File tree

3 files changed

+10
-14
lines changed

3 files changed

+10
-14
lines changed

Zend/Optimizer/dce.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -523,34 +523,34 @@ static inline bool may_throw_dce_exception(const zend_op *opline) {
523523
return opline->opcode == ZEND_ADD_ARRAY_ELEMENT && opline->op2_type == IS_UNUSED;
524524
}
525525

526-
int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, bool reorder_dtor_effects) {
526+
int dce_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *optimizer_ctx, zend_ssa *ssa, bool reorder_dtor_effects) {
527527
int i;
528528
zend_ssa_phi *phi;
529529
int removed_ops = 0;
530530

531531
/* DCE of CV operations that changes arguments may affect vararg functions. */
532532
bool has_varargs = (ssa->cfg.flags & ZEND_FUNC_VARARG) != 0;
533-
ALLOCA_FLAG(use_heap);
534533

535534
context ctx;
536535
ctx.ssa = ssa;
537536
ctx.op_array = op_array;
538537
ctx.reorder_dtor_effects = reorder_dtor_effects;
539538

539+
void *checkpoint = zend_arena_checkpoint(optimizer_ctx->arena);
540540
/* We have no dedicated phi vector, so we use the whole ssa var vector instead */
541541
ctx.instr_worklist_len = zend_bitset_len(op_array->last);
542-
ctx.instr_worklist = do_alloca(sizeof(zend_ulong) * ctx.instr_worklist_len, use_heap);
542+
ctx.instr_worklist = zend_arena_calloc(&optimizer_ctx->arena, ctx.instr_worklist_len, sizeof(zend_ulong));
543543
memset(ctx.instr_worklist, 0, sizeof(zend_ulong) * ctx.instr_worklist_len);
544544
ctx.phi_worklist_len = zend_bitset_len(ssa->vars_count);
545-
ctx.phi_worklist = do_alloca(sizeof(zend_ulong) * ctx.phi_worklist_len, use_heap);
545+
ctx.phi_worklist = zend_arena_calloc(&optimizer_ctx->arena, ctx.phi_worklist_len, sizeof(zend_ulong));
546546
memset(ctx.phi_worklist, 0, sizeof(zend_ulong) * ctx.phi_worklist_len);
547-
ctx.phi_worklist_no_val = do_alloca(sizeof(zend_ulong) * ctx.phi_worklist_len, use_heap);
547+
ctx.phi_worklist_no_val = zend_arena_calloc(&optimizer_ctx->arena, ctx.phi_worklist_len, sizeof(zend_ulong));
548548
memset(ctx.phi_worklist_no_val, 0, sizeof(zend_ulong) * ctx.phi_worklist_len);
549549

550550
/* Optimistically assume all instructions and phis to be dead */
551-
ctx.instr_dead = do_alloca(sizeof(zend_ulong) * ctx.instr_worklist_len, use_heap);
551+
ctx.instr_dead = zend_arena_calloc(&optimizer_ctx->arena, ctx.instr_worklist_len, sizeof(zend_ulong));
552552
memset(ctx.instr_dead, 0, sizeof(zend_ulong) * ctx.instr_worklist_len);
553-
ctx.phi_dead = do_alloca(sizeof(zend_ulong) * ctx.phi_worklist_len, use_heap);
553+
ctx.phi_dead = zend_arena_calloc(&optimizer_ctx->arena, ctx.phi_worklist_len, sizeof(zend_ulong));
554554
memset(ctx.phi_dead, 0xff, sizeof(zend_ulong) * ctx.phi_worklist_len);
555555

556556
/* Mark non-CV phis as live. Even if the result is unused, we generally cannot remove one
@@ -665,11 +665,7 @@ int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, bool reorder_d
665665
}
666666
} FOREACH_PHI_END();
667667

668-
free_alloca(ctx.instr_worklist, use_heap);
669-
free_alloca(ctx.phi_worklist, use_heap);
670-
free_alloca(ctx.phi_worklist_no_val, use_heap);
671-
free_alloca(ctx.instr_dead, use_heap);
672-
free_alloca(ctx.phi_dead, use_heap);
668+
zend_arena_release(&optimizer_ctx->arena, checkpoint);
673669

674670
return removed_ops;
675671
}

Zend/Optimizer/dfa_pass.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1076,7 +1076,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
10761076
}
10771077

10781078
if (ZEND_OPTIMIZER_PASS_14 & ctx->optimization_level) {
1079-
if (dce_optimize_op_array(op_array, ssa, 0)) {
1079+
if (dce_optimize_op_array(op_array, ctx, ssa, 0)) {
10801080
remove_nops = 1;
10811081
}
10821082
if (zend_dfa_optimize_jmps(op_array, ssa)) {

Zend/Optimizer/zend_optimizer_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ uint32_t zend_optimizer_classify_function(zend_string *name, uint32_t num_args);
121121
void zend_optimizer_migrate_jump(zend_op_array *op_array, zend_op *new_opline, zend_op *opline);
122122
void zend_optimizer_shift_jump(zend_op_array *op_array, zend_op *opline, uint32_t *shiftlist);
123123
int sccp_optimize_op_array(zend_optimizer_ctx *ctx, zend_op_array *op_array, zend_ssa *ssa, zend_call_info **call_map);
124-
int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, bool reorder_dtor_effects);
124+
int dce_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *optimizer_ctx, zend_ssa *ssa, bool reorder_dtor_effects);
125125
zend_result zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa);
126126

127127
typedef void (*zend_op_array_func_t)(zend_op_array *, void *context);

0 commit comments

Comments
 (0)