Lines Matching refs:scdf

54 void scdf_mark_edge_feasible(scdf_ctx *scdf, int from, int to) {  in scdf_mark_edge_feasible()  argument
55 uint32_t edge = scdf_edge(&scdf->ssa->cfg, from, to); in scdf_mark_edge_feasible()
57 if (zend_bitset_in(scdf->feasible_edges, edge)) { in scdf_mark_edge_feasible()
63 zend_bitset_incl(scdf->feasible_edges, edge); in scdf_mark_edge_feasible()
65 if (!zend_bitset_in(scdf->executable_blocks, to)) { in scdf_mark_edge_feasible()
66 if (!zend_bitset_in(scdf->block_worklist, to)) { in scdf_mark_edge_feasible()
69 zend_bitset_incl(scdf->block_worklist, to); in scdf_mark_edge_feasible()
73 zend_ssa_block *ssa_block = &scdf->ssa->blocks[to]; in scdf_mark_edge_feasible()
76 zend_bitset_excl(scdf->phi_var_worklist, phi->ssa_var); in scdf_mark_edge_feasible()
77 scdf->handlers.visit_phi(scdf, phi); in scdf_mark_edge_feasible()
82 void scdf_init(zend_optimizer_ctx *ctx, scdf_ctx *scdf, zend_op_array *op_array, zend_ssa *ssa) { in scdf_init() argument
83 scdf->op_array = op_array; in scdf_init()
84 scdf->ssa = ssa; in scdf_init()
86 scdf->instr_worklist_len = zend_bitset_len(op_array->last); in scdf_init()
87 scdf->phi_var_worklist_len = zend_bitset_len(ssa->vars_count); in scdf_init()
88 scdf->block_worklist_len = zend_bitset_len(ssa->cfg.blocks_count); in scdf_init()
90 scdf->instr_worklist = zend_arena_calloc(&ctx->arena, in scdf_init()
91scdf->instr_worklist_len + scdf->phi_var_worklist_len + 2 * scdf->block_worklist_len + zend_bitset… in scdf_init()
94 scdf->phi_var_worklist = scdf->instr_worklist + scdf->instr_worklist_len; in scdf_init()
95 scdf->block_worklist = scdf->phi_var_worklist + scdf->phi_var_worklist_len; in scdf_init()
96 scdf->executable_blocks = scdf->block_worklist + scdf->block_worklist_len; in scdf_init()
97 scdf->feasible_edges = scdf->executable_blocks + scdf->block_worklist_len; in scdf_init()
99 zend_bitset_incl(scdf->block_worklist, 0); in scdf_init()
100 zend_bitset_incl(scdf->executable_blocks, 0); in scdf_init()
103 void scdf_solve(scdf_ctx *scdf, const char *name) { in scdf_solve() argument
104 zend_ssa *ssa = scdf->ssa; in scdf_solve()
106 while (!zend_bitset_empty(scdf->instr_worklist, scdf->instr_worklist_len) in scdf_solve()
107 || !zend_bitset_empty(scdf->phi_var_worklist, scdf->phi_var_worklist_len) in scdf_solve()
108 || !zend_bitset_empty(scdf->block_worklist, scdf->block_worklist_len) in scdf_solve()
111 while ((i = zend_bitset_pop_first(scdf->phi_var_worklist, scdf->phi_var_worklist_len)) >= 0) { in scdf_solve()
114 if (zend_bitset_in(scdf->executable_blocks, phi->block)) { in scdf_solve()
115 scdf->handlers.visit_phi(scdf, phi); in scdf_solve()
119 while ((i = zend_bitset_pop_first(scdf->instr_worklist, scdf->instr_worklist_len)) >= 0) { in scdf_solve()
121 if (zend_bitset_in(scdf->executable_blocks, block_num)) { in scdf_solve()
123 zend_op *opline = &scdf->op_array->opcodes[i]; in scdf_solve()
129 scdf->handlers.visit_instr(scdf, opline, ssa_op); in scdf_solve()
132 scdf_mark_edge_feasible(scdf, block_num, block->successors[0]); in scdf_solve()
134 scdf->handlers.mark_feasible_successors(scdf, block_num, block, opline, ssa_op); in scdf_solve()
140 while ((i = zend_bitset_pop_first(scdf->block_worklist, scdf->block_worklist_len)) >= 0) { in scdf_solve()
146 zend_bitset_incl(scdf->executable_blocks, i); in scdf_solve()
151 zend_bitset_excl(scdf->phi_var_worklist, phi->ssa_var); in scdf_solve()
152 scdf->handlers.visit_phi(scdf, phi); in scdf_solve()
158 scdf_mark_edge_feasible(scdf, i, block->successors[0]); in scdf_solve()
163 opline = &scdf->op_array->opcodes[j]; in scdf_solve()
164 zend_bitset_excl(scdf->instr_worklist, j); in scdf_solve()
166 scdf->handlers.visit_instr(scdf, opline, &ssa->ops[j]); in scdf_solve()
170 scdf_mark_edge_feasible(scdf, i, block->successors[0]); in scdf_solve()
177 scdf->handlers.mark_feasible_successors(scdf, i, block, opline, &ssa->ops[j-1]); in scdf_solve()
188 scdf_ctx *scdf, const zend_op *opline, const zend_ssa_op *ssa_op) { in is_live_loop_var_free() argument
198 zend_ssa_var *ssa_var = &scdf->ssa->vars[var]; in is_live_loop_var_free()
201 def_block = scdf->ssa->cfg.map[ssa_var->definition]; in is_live_loop_var_free()
205 return zend_bitset_in(scdf->executable_blocks, def_block); in is_live_loop_var_free()
208 static bool kept_alive_by_loop_var_free(scdf_ctx *scdf, const zend_basic_block *block) { in kept_alive_by_loop_var_free() argument
209 const zend_op_array *op_array = scdf->op_array; in kept_alive_by_loop_var_free()
210 const zend_cfg *cfg = &scdf->ssa->cfg; in kept_alive_by_loop_var_free()
216 if (is_live_loop_var_free(scdf, &op_array->opcodes[i], &scdf->ssa->ops[i])) { in kept_alive_by_loop_var_free()
223 static uint32_t cleanup_loop_var_free_block(scdf_ctx *scdf, zend_basic_block *block) { in cleanup_loop_var_free_block() argument
224 zend_ssa *ssa = scdf->ssa; in cleanup_loop_var_free_block()
225 const zend_op_array *op_array = scdf->op_array; in cleanup_loop_var_free_block()
238 zend_ssa_op *ssa_op = &scdf->ssa->ops[i]; in cleanup_loop_var_free_block()
240 || is_live_loop_var_free(scdf, opline, ssa_op)) { in cleanup_loop_var_free_block()
259 uint32_t scdf_remove_unreachable_blocks(scdf_ctx *scdf) { in scdf_remove_unreachable_blocks() argument
260 zend_ssa *ssa = scdf->ssa; in scdf_remove_unreachable_blocks()
265 if (!zend_bitset_in(scdf->executable_blocks, i) && (block->flags & ZEND_BB_REACHABLE)) { in scdf_remove_unreachable_blocks()
266 if (!kept_alive_by_loop_var_free(scdf, block)) { in scdf_remove_unreachable_blocks()
268 zend_ssa_remove_block(scdf->op_array, ssa, i); in scdf_remove_unreachable_blocks()
270 removed_ops += cleanup_loop_var_free_block(scdf, block); in scdf_remove_unreachable_blocks()