@@ -523,34 +523,34 @@ static inline bool may_throw_dce_exception(const zend_op *opline) {
523
523
return opline -> opcode == ZEND_ADD_ARRAY_ELEMENT && opline -> op2_type == IS_UNUSED ;
524
524
}
525
525
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 ) {
527
527
int i ;
528
528
zend_ssa_phi * phi ;
529
529
int removed_ops = 0 ;
530
530
531
531
/* DCE of CV operations that changes arguments may affect vararg functions. */
532
532
bool has_varargs = (ssa -> cfg .flags & ZEND_FUNC_VARARG ) != 0 ;
533
- ALLOCA_FLAG (use_heap );
534
533
535
534
context ctx ;
536
535
ctx .ssa = ssa ;
537
536
ctx .op_array = op_array ;
538
537
ctx .reorder_dtor_effects = reorder_dtor_effects ;
539
538
539
+ void * checkpoint = zend_arena_checkpoint (optimizer_ctx -> arena );
540
540
/* We have no dedicated phi vector, so we use the whole ssa var vector instead */
541
541
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 ) );
543
543
memset (ctx .instr_worklist , 0 , sizeof (zend_ulong ) * ctx .instr_worklist_len );
544
544
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 ) );
546
546
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 ) );
548
548
memset (ctx .phi_worklist_no_val , 0 , sizeof (zend_ulong ) * ctx .phi_worklist_len );
549
549
550
550
/* 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 ) );
552
552
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 ) );
554
554
memset (ctx .phi_dead , 0xff , sizeof (zend_ulong ) * ctx .phi_worklist_len );
555
555
556
556
/* 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
665
665
}
666
666
} FOREACH_PHI_END ();
667
667
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 );
673
669
674
670
return removed_ops ;
675
671
}
0 commit comments