Lines Matching refs:ssa

42 int zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx, zend_ssa *ssa)  in zend_dfa_analyze_op_array()  argument
52 memset(ssa, 0, sizeof(zend_ssa)); in zend_dfa_analyze_op_array()
54 if (zend_build_cfg(&ctx->arena, op_array, ZEND_CFG_NO_ENTRY_PREDECESSORS, &ssa->cfg) != SUCCESS) { in zend_dfa_analyze_op_array()
58 if ((ssa->cfg.flags & ZEND_FUNC_INDIRECT_VAR_ACCESS)) { in zend_dfa_analyze_op_array()
63 if (zend_cfg_build_predecessors(&ctx->arena, &ssa->cfg) != SUCCESS) { in zend_dfa_analyze_op_array()
68 zend_dump_op_array(op_array, ZEND_DUMP_CFG, "dfa cfg", &ssa->cfg); in zend_dfa_analyze_op_array()
72 if (zend_cfg_compute_dominators_tree(op_array, &ssa->cfg) != SUCCESS) { in zend_dfa_analyze_op_array()
77 if (zend_cfg_identify_loops(op_array, &ssa->cfg) != SUCCESS) { in zend_dfa_analyze_op_array()
82 zend_dump_dominators(op_array, &ssa->cfg); in zend_dfa_analyze_op_array()
92 if (zend_build_ssa(&ctx->arena, ctx->script, op_array, build_flags, ssa) != SUCCESS) { in zend_dfa_analyze_op_array()
97 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "dfa ssa", ssa); in zend_dfa_analyze_op_array()
101 if (zend_ssa_compute_use_def_chains(&ctx->arena, op_array, ssa) != SUCCESS){ in zend_dfa_analyze_op_array()
105 if (zend_ssa_find_false_dependencies(op_array, ssa) != SUCCESS) { in zend_dfa_analyze_op_array()
109 if (zend_ssa_find_sccs(op_array, ssa) != SUCCESS){ in zend_dfa_analyze_op_array()
113 …if (zend_ssa_inference(&ctx->arena, op_array, ctx->script, ssa, ctx->optimization_level) != SUCCES… in zend_dfa_analyze_op_array()
117 if (zend_ssa_escape_analysis(ctx->script, op_array, ssa) != SUCCESS) { in zend_dfa_analyze_op_array()
122 zend_dump_ssa_variables(op_array, ssa, 0); in zend_dfa_analyze_op_array()
155 static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa, zend_optimizer_ctx *ctx) in zend_ssa_remove_nops() argument
157 zend_basic_block *blocks = ssa->cfg.blocks; in zend_ssa_remove_nops()
158 zend_basic_block *blocks_end = blocks + ssa->cfg.blocks_count; in zend_ssa_remove_nops()
206 ssa->ops[target] = ssa->ops[i]; in zend_ssa_remove_nops()
207 ssa->cfg.map[target] = b - blocks; in zend_ssa_remove_nops()
243 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_remove_nops()
244 if (ssa->vars[j].definition >= 0) { in zend_ssa_remove_nops()
245 ssa->vars[j].definition -= shiftlist[ssa->vars[j].definition]; in zend_ssa_remove_nops()
247 if (ssa->vars[j].use_chain >= 0) { in zend_ssa_remove_nops()
248 ssa->vars[j].use_chain -= shiftlist[ssa->vars[j].use_chain]; in zend_ssa_remove_nops()
252 if (ssa->ops[i].op1_use_chain >= 0) { in zend_ssa_remove_nops()
253 ssa->ops[i].op1_use_chain -= shiftlist[ssa->ops[i].op1_use_chain]; in zend_ssa_remove_nops()
255 if (ssa->ops[i].op2_use_chain >= 0) { in zend_ssa_remove_nops()
256 ssa->ops[i].op2_use_chain -= shiftlist[ssa->ops[i].op2_use_chain]; in zend_ssa_remove_nops()
258 if (ssa->ops[i].res_use_chain >= 0) { in zend_ssa_remove_nops()
259 ssa->ops[i].res_use_chain -= shiftlist[ssa->ops[i].res_use_chain]; in zend_ssa_remove_nops()
323 zend_op_array *op_array, zend_ssa *ssa, zend_ssa_op *ssa_op) { in can_elide_return_type_check() argument
325 zend_ssa_var_info *use_info = &ssa->var_info[ssa_op->op1_use]; in can_elide_return_type_check()
326 zend_ssa_var_info *def_info = &ssa->var_info[ssa_op->op1_def]; in can_elide_return_type_check()
352 zend_ssa *ssa, zend_op *opline, int src_var, uint32_t cv_var) { in opline_supports_assign_contraction() argument
362 uint32_t type = ssa->var_info[src_var].type; in opline_supports_assign_contraction()
389 int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa) in zend_dfa_optimize_calls() argument
463 zend_ssa_op *ssa_op = ssa->ops + op_num; in zend_dfa_optimize_calls()
468 zend_ssa_var *var = ssa->vars + var_num; in zend_dfa_optimize_calls()
471 zend_ssa_unlink_use_chain(ssa, op_num, ssa_op->op1_use); in zend_dfa_optimize_calls()
475 ssa_op = ssa->ops + op_num; in zend_dfa_optimize_calls()
508 static zend_always_inline void take_successor_0(zend_ssa *ssa, int block_num, zend_basic_block *blo… in take_successor_0() argument
512 zend_ssa_remove_predecessor(ssa, block_num, block->successors[1]); in take_successor_0()
518 static zend_always_inline void take_successor_1(zend_ssa *ssa, int block_num, zend_basic_block *blo… in take_successor_1() argument
522 zend_ssa_remove_predecessor(ssa, block_num, block->successors[0]); in take_successor_1()
529 static zend_always_inline void take_successor_ex(zend_ssa *ssa, int block_num, zend_basic_block *bl… in take_successor_ex() argument
535 zend_ssa_remove_predecessor(ssa, block_num, block->successors[i]); in take_successor_ex()
556 static void replace_predecessor(zend_ssa *ssa, int block_id, int old_pred, int new_pred) { in replace_predecessor() argument
557 zend_basic_block *block = &ssa->cfg.blocks[block_id]; in replace_predecessor()
558 int *predecessors = &ssa->cfg.predecessors[block->predecessor_offset]; in replace_predecessor()
587 for (phi = ssa->blocks[block_id].phis; phi; phi = phi->next) { in replace_predecessor()
599 static void zend_ssa_replace_control_link(zend_op_array *op_array, zend_ssa *ssa, int from, int to,… in zend_ssa_replace_control_link() argument
601 zend_basic_block *src = &ssa->cfg.blocks[from]; in zend_ssa_replace_control_link()
602 zend_basic_block *old = &ssa->cfg.blocks[to]; in zend_ssa_replace_control_link()
603 zend_basic_block *dst = &ssa->cfg.blocks[new_to]; in zend_ssa_replace_control_link()
670 replace_predecessor(ssa, new_to, to, from); in zend_ssa_replace_control_link()
673 static void zend_ssa_unlink_block(zend_op_array *op_array, zend_ssa *ssa, zend_basic_block *block, … in zend_ssa_unlink_block() argument
675 if (block->predecessors_count == 1 && ssa->blocks[block_num].phis == NULL) { in zend_ssa_unlink_block()
679 predecessors = &ssa->cfg.predecessors[block->predecessor_offset]; in zend_ssa_unlink_block()
681 zend_ssa_replace_control_link(op_array, ssa, predecessors[i], block_num, block->successors[0]); in zend_ssa_unlink_block()
683 zend_ssa_remove_block(op_array, ssa, block_num); in zend_ssa_unlink_block()
687 static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa) in zend_dfa_optimize_jmps() argument
692 for (block_num = 1; block_num < ssa->cfg.blocks_count; block_num++) { in zend_dfa_optimize_jmps()
693 zend_basic_block *block = &ssa->cfg.blocks[block_num]; in zend_dfa_optimize_jmps()
700 zend_ssa_unlink_block(op_array, ssa, block, block_num); in zend_dfa_optimize_jmps()
705 while (block_num < ssa->cfg.blocks_count in zend_dfa_optimize_jmps()
706 && !(ssa->cfg.blocks[block_num].flags & ZEND_BB_REACHABLE)) { in zend_dfa_optimize_jmps()
709 while (block_num < ssa->cfg.blocks_count) { in zend_dfa_optimize_jmps()
711 zend_basic_block *block = &ssa->cfg.blocks[block_num]; in zend_dfa_optimize_jmps()
716 while (next_block_num < ssa->cfg.blocks_count in zend_dfa_optimize_jmps()
717 && !(ssa->cfg.blocks[next_block_num].flags & ZEND_BB_REACHABLE)) { in zend_dfa_optimize_jmps()
724 ssa_op = ssa->ops + op_num; in zend_dfa_optimize_jmps()
741 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
746 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
751 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
756 zend_ssa_remove_instr(ssa, opline, ssa_op); in zend_dfa_optimize_jmps()
772 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
777 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
782 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
787 zend_ssa_remove_instr(ssa, opline, ssa_op); in zend_dfa_optimize_jmps()
802 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
806 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
814 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
820 zend_ssa_remove_instr(ssa, opline, ssa_op); in zend_dfa_optimize_jmps()
829 zend_ssa_unlink_use_chain(ssa, op_num, ssa_op->op1_use); in zend_dfa_optimize_jmps()
841 if (ssa->vars[ssa_op->result_def].use_chain < 0 in zend_dfa_optimize_jmps()
842 && ssa->vars[ssa_op->result_def].phi_use_chain == NULL) { in zend_dfa_optimize_jmps()
845 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
850 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
855 if (ssa->vars[ssa_op->result_def].use_chain < 0 in zend_dfa_optimize_jmps()
856 && ssa->vars[ssa_op->result_def].phi_use_chain == NULL) { in zend_dfa_optimize_jmps()
859 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
864 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
869 if (ssa->vars[ssa_op->result_def].use_chain < 0 in zend_dfa_optimize_jmps()
870 && ssa->vars[ssa_op->result_def].phi_use_chain == NULL) { in zend_dfa_optimize_jmps()
873 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
879 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
880 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
887 zend_ssa_var *var = &ssa->vars[ssa_op->result_def]; in zend_dfa_optimize_jmps()
891 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
894 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
899 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
901 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
914 take_successor_ex(ssa, block_num, block, block->successors[0]); in zend_dfa_optimize_jmps()
931 take_successor_ex(ssa, block_num, block, ssa->cfg.map[target]); in zend_dfa_optimize_jmps()
943 take_successor_ex(ssa, block_num, block, block->successors[0]); in zend_dfa_optimize_jmps()
960 take_successor_ex(ssa, block_num, block, ssa->cfg.map[target]); in zend_dfa_optimize_jmps()
970 zend_ssa_unlink_block(op_array, ssa, block, block_num); in zend_dfa_optimize_jmps()
975 && !(ssa->cfg.blocks[block_num].flags & ZEND_BB_REACHABLE)); in zend_dfa_optimize_jmps()
993 void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx, zend_ssa *ssa, ze… in zend_dfa_optimize_op_array() argument
996 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "before dfa pass", ssa); in zend_dfa_optimize_op_array()
999 if (ssa->var_info) { in zend_dfa_optimize_op_array()
1007 ssa_verify_integrity(op_array, ssa, "before dfa"); in zend_dfa_optimize_op_array()
1011 if (sccp_optimize_op_array(ctx, op_array, ssa, call_map)) { in zend_dfa_optimize_op_array()
1015 if (zend_dfa_optimize_jmps(op_array, ssa)) { in zend_dfa_optimize_op_array()
1020 ssa_verify_integrity(op_array, ssa, "after sccp"); in zend_dfa_optimize_op_array()
1023 if (zend_dfa_optimize_calls(op_array, ssa)) { in zend_dfa_optimize_op_array()
1028 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after sccp pass", ssa); in zend_dfa_optimize_op_array()
1031 ssa_verify_integrity(op_array, ssa, "after calls"); in zend_dfa_optimize_op_array()
1036 if (dce_optimize_op_array(op_array, ssa, 0)) { in zend_dfa_optimize_op_array()
1039 if (zend_dfa_optimize_jmps(op_array, ssa)) { in zend_dfa_optimize_op_array()
1043 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after dce pass", ssa); in zend_dfa_optimize_op_array()
1046 ssa_verify_integrity(op_array, ssa, "after dce"); in zend_dfa_optimize_op_array()
1050 for (v = op_array->last_var; v < ssa->vars_count; v++) { in zend_dfa_optimize_op_array()
1052 op_1 = ssa->vars[v].definition; in zend_dfa_optimize_op_array()
1061 if (ssa->var_info[v].use_as_double) { in zend_dfa_optimize_op_array()
1064 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1128 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1129 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
1130 && ssa->ops[op_1].op1_use_chain == -1 in zend_dfa_optimize_op_array()
1131 && ssa->vars[v].use_chain >= 0 in zend_dfa_optimize_op_array()
1132 && can_elide_return_type_check(op_array, ssa, &ssa->ops[op_1])) { in zend_dfa_optimize_op_array()
1136 int orig_var = ssa->ops[op_1].op1_use; in zend_dfa_optimize_op_array()
1137 if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) { in zend_dfa_optimize_op_array()
1139 int ret = ssa->vars[v].use_chain; in zend_dfa_optimize_op_array()
1141 ssa->ops[ret].op1_use = orig_var; in zend_dfa_optimize_op_array()
1142 ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain; in zend_dfa_optimize_op_array()
1143 ssa->vars[orig_var].use_chain = ret; in zend_dfa_optimize_op_array()
1145 ssa->vars[v].definition = -1; in zend_dfa_optimize_op_array()
1146 ssa->vars[v].use_chain = -1; in zend_dfa_optimize_op_array()
1148 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
1149 ssa->ops[op_1].op1_use = -1; in zend_dfa_optimize_op_array()
1157 if (ssa->vars[v].var >= op_array->last_var) { in zend_dfa_optimize_op_array()
1163 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1166 int orig_var = ssa->ops[op_1].op1_use; in zend_dfa_optimize_op_array()
1169 …&& !(ssa->var_info[orig_var].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_… in zend_dfa_optimize_op_array()
1172 int src_var = ssa->ops[op_1].op2_use; in zend_dfa_optimize_op_array()
1176 && !(ssa->var_info[src_var].type & MAY_BE_REF) in zend_dfa_optimize_op_array()
1177 && ssa->vars[src_var].definition >= 0 in zend_dfa_optimize_op_array()
1178 && ssa->ops[ssa->vars[src_var].definition].result_def == src_var in zend_dfa_optimize_op_array()
1179 && ssa->ops[ssa->vars[src_var].definition].result_use < 0 in zend_dfa_optimize_op_array()
1180 && ssa->vars[src_var].use_chain == op_1 in zend_dfa_optimize_op_array()
1181 && ssa->ops[op_1].op2_use_chain < 0 in zend_dfa_optimize_op_array()
1182 && !ssa->vars[src_var].phi_use_chain in zend_dfa_optimize_op_array()
1183 && !ssa->vars[src_var].sym_use_chain in zend_dfa_optimize_op_array()
1185 ssa, &op_array->opcodes[ssa->vars[src_var].definition], in zend_dfa_optimize_op_array()
1189 int op_2 = ssa->vars[src_var].definition; in zend_dfa_optimize_op_array()
1194 if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) { in zend_dfa_optimize_op_array()
1196 ssa->vars[v].definition = op_2; in zend_dfa_optimize_op_array()
1197 ssa->ops[op_2].result_def = v; in zend_dfa_optimize_op_array()
1199 ssa->vars[src_var].definition = -1; in zend_dfa_optimize_op_array()
1200 ssa->vars[src_var].use_chain = -1; in zend_dfa_optimize_op_array()
1202 ssa->ops[op_1].op1_use = -1; in zend_dfa_optimize_op_array()
1203 ssa->ops[op_1].op2_use = -1; in zend_dfa_optimize_op_array()
1204 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
1205 ssa->ops[op_1].op1_use_chain = -1; in zend_dfa_optimize_op_array()
1215 && ssa->ops[op_1].op2_use >= 0 in zend_dfa_optimize_op_array()
1216 && ssa->ops[op_1].op2_def < 0) in zend_dfa_optimize_op_array()
1221 if (ssa->ops[op_1].op1_use != ssa->ops[op_1].op2_use) { in zend_dfa_optimize_op_array()
1222 zend_ssa_unlink_use_chain(ssa, op_1, orig_var); in zend_dfa_optimize_op_array()
1224 ssa->ops[op_1].op2_use_chain = ssa->ops[op_1].op1_use_chain; in zend_dfa_optimize_op_array()
1228 ssa->ops[op_1].result_def = v; in zend_dfa_optimize_op_array()
1229 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
1230 ssa->ops[op_1].op1_use = ssa->ops[op_1].op2_use; in zend_dfa_optimize_op_array()
1231 ssa->ops[op_1].op1_use_chain = ssa->ops[op_1].op2_use_chain; in zend_dfa_optimize_op_array()
1232 ssa->ops[op_1].op2_use = -1; in zend_dfa_optimize_op_array()
1233 ssa->ops[op_1].op2_use_chain = -1; in zend_dfa_optimize_op_array()
1248 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1252 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
1253 …&& !(ssa->var_info[ssa->ops[op_1].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_A… in zend_dfa_optimize_op_array()
1263 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1267 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
1268 …&& !(ssa->var_info[ssa->ops[op_1].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_A… in zend_dfa_optimize_op_array()
1276 } else if (ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1278 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
1279 …&& !(ssa->var_info[ssa->ops[op_1].op1_use].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE… in zend_dfa_optimize_op_array()
1286 ssa->ops[op_1].result_def = ssa->ops[op_1].op1_def; in zend_dfa_optimize_op_array()
1287 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
1299 ssa_verify_integrity(op_array, ssa, "after dfa"); in zend_dfa_optimize_op_array()
1303 zend_ssa_remove_nops(op_array, ssa, ctx); in zend_dfa_optimize_op_array()
1305 ssa_verify_integrity(op_array, ssa, "after nop"); in zend_dfa_optimize_op_array()
1311 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after dfa pass", ssa); in zend_dfa_optimize_op_array()
1318 zend_ssa ssa; in zend_optimize_dfa() local
1320 if (zend_dfa_analyze_op_array(op_array, ctx, &ssa) != SUCCESS) { in zend_optimize_dfa()
1325 zend_dfa_optimize_op_array(op_array, ctx, &ssa, NULL); in zend_optimize_dfa()