Lines Matching refs:ssa

41 …d_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx, zend_ssa *ssa)  in zend_dfa_analyze_op_array()  argument
51 memset(ssa, 0, sizeof(zend_ssa)); in zend_dfa_analyze_op_array()
53 zend_build_cfg(&ctx->arena, op_array, ZEND_CFG_NO_ENTRY_PREDECESSORS, &ssa->cfg); in zend_dfa_analyze_op_array()
55 if ((ssa->cfg.flags & ZEND_FUNC_INDIRECT_VAR_ACCESS)) { in zend_dfa_analyze_op_array()
60 zend_cfg_build_predecessors(&ctx->arena, &ssa->cfg); in zend_dfa_analyze_op_array()
63 zend_dump_op_array(op_array, ZEND_DUMP_CFG, "dfa cfg", &ssa->cfg); in zend_dfa_analyze_op_array()
67 zend_cfg_compute_dominators_tree(op_array, &ssa->cfg); in zend_dfa_analyze_op_array()
70 zend_cfg_identify_loops(op_array, &ssa->cfg); in zend_dfa_analyze_op_array()
73 zend_dump_dominators(op_array, &ssa->cfg); in zend_dfa_analyze_op_array()
83 if (zend_build_ssa(&ctx->arena, ctx->script, op_array, build_flags, ssa) == FAILURE) { in zend_dfa_analyze_op_array()
88 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "dfa ssa", ssa); in zend_dfa_analyze_op_array()
92 zend_ssa_compute_use_def_chains(&ctx->arena, op_array, ssa); in zend_dfa_analyze_op_array()
94 zend_ssa_find_false_dependencies(op_array, ssa); in zend_dfa_analyze_op_array()
96 zend_ssa_find_sccs(op_array, ssa); in zend_dfa_analyze_op_array()
98 …if (zend_ssa_inference(&ctx->arena, op_array, ctx->script, ssa, ctx->optimization_level) == FAILUR… in zend_dfa_analyze_op_array()
102 if (zend_ssa_escape_analysis(ctx->script, op_array, ssa) == FAILURE) { in zend_dfa_analyze_op_array()
107 zend_dump_ssa_variables(op_array, ssa, 0); in zend_dfa_analyze_op_array()
113 static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa, zend_optimizer_ctx *ctx) in zend_ssa_remove_nops() argument
115 zend_basic_block *blocks = ssa->cfg.blocks; in zend_ssa_remove_nops()
116 zend_basic_block *blocks_end = blocks + ssa->cfg.blocks_count; in zend_ssa_remove_nops()
163 ssa->ops[target] = ssa->ops[i]; in zend_ssa_remove_nops()
164 ssa->cfg.map[target] = b - blocks; in zend_ssa_remove_nops()
200 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_remove_nops()
201 if (ssa->vars[j].definition >= 0) { in zend_ssa_remove_nops()
202 ssa->vars[j].definition -= shiftlist[ssa->vars[j].definition]; in zend_ssa_remove_nops()
204 if (ssa->vars[j].use_chain >= 0) { in zend_ssa_remove_nops()
205 ssa->vars[j].use_chain -= shiftlist[ssa->vars[j].use_chain]; in zend_ssa_remove_nops()
209 if (ssa->ops[i].op1_use_chain >= 0) { in zend_ssa_remove_nops()
210 ssa->ops[i].op1_use_chain -= shiftlist[ssa->ops[i].op1_use_chain]; in zend_ssa_remove_nops()
212 if (ssa->ops[i].op2_use_chain >= 0) { in zend_ssa_remove_nops()
213 ssa->ops[i].op2_use_chain -= shiftlist[ssa->ops[i].op2_use_chain]; in zend_ssa_remove_nops()
215 if (ssa->ops[i].res_use_chain >= 0) { in zend_ssa_remove_nops()
216 ssa->ops[i].res_use_chain -= shiftlist[ssa->ops[i].res_use_chain]; in zend_ssa_remove_nops()
295 const zend_script *script, zend_op_array *op_array, zend_ssa *ssa, zend_ssa_op *ssa_op) { in can_elide_return_type_check() argument
297 zend_ssa_var_info *use_info = &ssa->var_info[ssa_op->op1_use]; in can_elide_return_type_check()
322 zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int src_var, uint32_t cv_var) { in opline_supports_assign_contraction() argument
332 uint32_t type = ssa->var_info[src_var].type; in opline_supports_assign_contraction()
363 && zend_may_throw(opline, &ssa->ops[ssa->vars[src_var].definition], op_array, ssa)) { in opline_supports_assign_contraction()
370 static bool variable_defined_or_used_in_range(zend_ssa *ssa, int var, int start, int end) in variable_defined_or_used_in_range() argument
373 const zend_ssa_op *ssa_op = &ssa->ops[start]; in variable_defined_or_used_in_range()
374 if ((ssa_op->op1_def >= 0 && ssa->vars[ssa_op->op1_def].var == var) || in variable_defined_or_used_in_range()
375 (ssa_op->op2_def >= 0 && ssa->vars[ssa_op->op2_def].var == var) || in variable_defined_or_used_in_range()
376 (ssa_op->result_def >= 0 && ssa->vars[ssa_op->result_def].var == var) || in variable_defined_or_used_in_range()
377 (ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].var == var) || in variable_defined_or_used_in_range()
378 (ssa_op->op2_use >= 0 && ssa->vars[ssa_op->op2_use].var == var) || in variable_defined_or_used_in_range()
379 (ssa_op->result_use >= 0 && ssa->vars[ssa_op->result_use].var == var) in variable_defined_or_used_in_range()
388 int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa) in zend_dfa_optimize_calls() argument
462 zend_ssa_op *ssa_op = ssa->ops + op_num; in zend_dfa_optimize_calls()
467 zend_ssa_var *var = ssa->vars + var_num; in zend_dfa_optimize_calls()
470 zend_ssa_unlink_use_chain(ssa, op_num, ssa_op->op1_use); in zend_dfa_optimize_calls()
474 ssa_op = ssa->ops + op_num; in zend_dfa_optimize_calls()
498 ssa_op = ssa->ops + op_num; in zend_dfa_optimize_calls()
501 int use = ssa->vars[var].use_chain; in zend_dfa_optimize_calls()
506 if (ssa->vars[var].phi_use_chain == NULL in zend_dfa_optimize_calls()
507 && ssa->ops[use].op1_use == var in zend_dfa_optimize_calls()
508 && ssa->ops[use].op1_use_chain == -1 in zend_dfa_optimize_calls()
525 static zend_always_inline void take_successor_0(zend_ssa *ssa, int block_num, zend_basic_block *blo… in take_successor_0() argument
529 zend_ssa_remove_predecessor(ssa, block_num, block->successors[1]); in take_successor_0()
535 static zend_always_inline void take_successor_1(zend_ssa *ssa, int block_num, zend_basic_block *blo… in take_successor_1() argument
539 zend_ssa_remove_predecessor(ssa, block_num, block->successors[0]); in take_successor_1()
546 static zend_always_inline void take_successor_ex(zend_ssa *ssa, int block_num, zend_basic_block *bl… in take_successor_ex() argument
552 zend_ssa_remove_predecessor(ssa, block_num, block->successors[i]); in take_successor_ex()
572 static void replace_predecessor(zend_ssa *ssa, int block_id, int old_pred, int new_pred) { in replace_predecessor() argument
573 zend_basic_block *block = &ssa->cfg.blocks[block_id]; in replace_predecessor()
574 int *predecessors = &ssa->cfg.predecessors[block->predecessor_offset]; in replace_predecessor()
603 for (phi = ssa->blocks[block_id].phis; phi; phi = phi->next) { in replace_predecessor()
607 ssa, phi->ssa_var, phi->sources[0], /* update_types */ 0); in replace_predecessor()
608 zend_ssa_remove_phi(ssa, phi); in replace_predecessor()
623 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
625 zend_basic_block *src = &ssa->cfg.blocks[from]; in zend_ssa_replace_control_link()
626 zend_basic_block *old = &ssa->cfg.blocks[to]; in zend_ssa_replace_control_link()
627 zend_basic_block *dst = &ssa->cfg.blocks[new_to]; in zend_ssa_replace_control_link()
692 replace_predecessor(ssa, new_to, to, from); in zend_ssa_replace_control_link()
695 static void zend_ssa_unlink_block(zend_op_array *op_array, zend_ssa *ssa, zend_basic_block *block, … in zend_ssa_unlink_block() argument
697 if (block->predecessors_count == 1 && ssa->blocks[block_num].phis == NULL) { in zend_ssa_unlink_block()
702 predecessors = &ssa->cfg.predecessors[block->predecessor_offset]; in zend_ssa_unlink_block()
704 zend_basic_block *pred_block = &ssa->cfg.blocks[predecessors[0]]; in zend_ssa_unlink_block()
715 zend_ssa_replace_control_link(op_array, ssa, predecessors[i], block_num, block->successors[0]); in zend_ssa_unlink_block()
717 zend_ssa_remove_block(op_array, ssa, block_num); in zend_ssa_unlink_block()
720 int ssa_var = ssa->ops[fe_fetch_block->start + fe_fetch_block->len - 1].op2_def; in zend_ssa_unlink_block()
722 zend_ssa_remove_uses_of_var(ssa, ssa_var); in zend_ssa_unlink_block()
728 static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa) in zend_dfa_optimize_jmps() argument
733 for (block_num = 1; block_num < ssa->cfg.blocks_count; block_num++) { in zend_dfa_optimize_jmps()
734 zend_basic_block *block = &ssa->cfg.blocks[block_num]; in zend_dfa_optimize_jmps()
741 zend_ssa_unlink_block(op_array, ssa, block, block_num); in zend_dfa_optimize_jmps()
746 while (block_num < ssa->cfg.blocks_count in zend_dfa_optimize_jmps()
747 && !(ssa->cfg.blocks[block_num].flags & ZEND_BB_REACHABLE)) { in zend_dfa_optimize_jmps()
750 while (block_num < ssa->cfg.blocks_count) { in zend_dfa_optimize_jmps()
752 zend_basic_block *block = &ssa->cfg.blocks[block_num]; in zend_dfa_optimize_jmps()
758 while (next_block_num < ssa->cfg.blocks_count in zend_dfa_optimize_jmps()
759 && !(ssa->cfg.blocks[next_block_num].flags & ZEND_BB_REACHABLE)) { in zend_dfa_optimize_jmps()
760 if (ssa->cfg.blocks[next_block_num].flags & ZEND_BB_UNREACHABLE_FREE) { in zend_dfa_optimize_jmps()
769 ssa_op = ssa->ops + op_num; in zend_dfa_optimize_jmps()
786 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
791 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
796 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
801 zend_ssa_remove_instr(ssa, opline, ssa_op); in zend_dfa_optimize_jmps()
817 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
822 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
827 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
832 zend_ssa_remove_instr(ssa, opline, ssa_op); in zend_dfa_optimize_jmps()
843 if (ssa->vars[ssa_op->result_def].use_chain < 0 in zend_dfa_optimize_jmps()
844 && ssa->vars[ssa_op->result_def].phi_use_chain == NULL) { in zend_dfa_optimize_jmps()
847 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
852 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
857 if (ssa->vars[ssa_op->result_def].use_chain < 0 in zend_dfa_optimize_jmps()
858 && ssa->vars[ssa_op->result_def].phi_use_chain == NULL) { in zend_dfa_optimize_jmps()
861 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
866 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
871 if (ssa->vars[ssa_op->result_def].use_chain < 0 in zend_dfa_optimize_jmps()
872 && ssa->vars[ssa_op->result_def].phi_use_chain == NULL) { in zend_dfa_optimize_jmps()
875 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
881 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
882 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
889 zend_ssa_var *var = &ssa->vars[ssa_op->result_def]; in zend_dfa_optimize_jmps()
893 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
896 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
901 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
903 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
911 zend_ssa_var *var = &ssa->vars[ssa_op->result_def]; in zend_dfa_optimize_jmps()
917 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
919 take_successor_0(ssa, block_num, block); in zend_dfa_optimize_jmps()
922 zend_ssa_remove_result_def(ssa, ssa_op); in zend_dfa_optimize_jmps()
925 take_successor_1(ssa, block_num, block); in zend_dfa_optimize_jmps()
950 take_successor_ex(ssa, block_num, block, block->successors[block->successors_count - 1]); in zend_dfa_optimize_jmps()
975 take_successor_ex(ssa, block_num, block, ssa->cfg.map[target]); in zend_dfa_optimize_jmps()
984 zend_ssa_unlink_block(op_array, ssa, block, block_num); in zend_dfa_optimize_jmps()
989 && !(ssa->cfg.blocks[block_num].flags & ZEND_BB_REACHABLE)); in zend_dfa_optimize_jmps()
1007 static bool zend_dfa_try_to_replace_result(zend_op_array *op_array, zend_ssa *ssa, int def, int cv_… in zend_dfa_try_to_replace_result() argument
1009 int result_var = ssa->ops[def].result_def; in zend_dfa_try_to_replace_result()
1010 int cv = EX_NUM_TO_VAR(ssa->vars[cv_var].var); in zend_dfa_try_to_replace_result()
1013 && !(ssa->var_info[cv_var].type & MAY_BE_REF) in zend_dfa_try_to_replace_result()
1014 && ssa->vars[cv_var].alias == NO_ALIAS in zend_dfa_try_to_replace_result()
1015 && ssa->vars[result_var].phi_use_chain == NULL in zend_dfa_try_to_replace_result()
1016 && ssa->vars[result_var].sym_use_chain == NULL) { in zend_dfa_try_to_replace_result()
1017 int use = ssa->vars[result_var].use_chain; in zend_dfa_try_to_replace_result()
1020 && zend_ssa_next_use(ssa->ops, result_var, use) < 0 in zend_dfa_try_to_replace_result()
1041 ssa->vars[result_var].definition = -1; in zend_dfa_try_to_replace_result()
1042 ssa->vars[result_var].use_chain = -1; in zend_dfa_try_to_replace_result()
1043 ssa->ops[def].result_def = -1; in zend_dfa_try_to_replace_result()
1048 if (ssa->ops[use].op1_use == result_var) { in zend_dfa_try_to_replace_result()
1049 ssa->ops[use].op1_use = cv_var; in zend_dfa_try_to_replace_result()
1050 ssa->ops[use].op1_use_chain = ssa->vars[cv_var].use_chain; in zend_dfa_try_to_replace_result()
1051 ssa->vars[cv_var].use_chain = use; in zend_dfa_try_to_replace_result()
1055 } else if (ssa->ops[use].op2_use == result_var) { in zend_dfa_try_to_replace_result()
1056 ssa->ops[use].op2_use = cv_var; in zend_dfa_try_to_replace_result()
1057 ssa->ops[use].op2_use_chain = ssa->vars[cv_var].use_chain; in zend_dfa_try_to_replace_result()
1058 ssa->vars[cv_var].use_chain = use; in zend_dfa_try_to_replace_result()
1062 } else if (ssa->ops[use].result_use == result_var) { in zend_dfa_try_to_replace_result()
1063 ssa->ops[use].result_use = cv_var; in zend_dfa_try_to_replace_result()
1064 ssa->ops[use].res_use_chain = ssa->vars[cv_var].use_chain; in zend_dfa_try_to_replace_result()
1065 ssa->vars[cv_var].use_chain = use; in zend_dfa_try_to_replace_result()
1079 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
1082 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "before dfa pass", ssa); in zend_dfa_optimize_op_array()
1085 if (ssa->var_info) { in zend_dfa_optimize_op_array()
1094 ssa_verify_integrity(op_array, ssa, "before dfa"); in zend_dfa_optimize_op_array()
1098 if (sccp_optimize_op_array(ctx, op_array, ssa, call_map)) { in zend_dfa_optimize_op_array()
1102 if (zend_dfa_optimize_jmps(op_array, ssa)) { in zend_dfa_optimize_op_array()
1107 ssa_verify_integrity(op_array, ssa, "after sccp"); in zend_dfa_optimize_op_array()
1110 if (zend_dfa_optimize_calls(op_array, ssa)) { in zend_dfa_optimize_op_array()
1115 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after sccp pass", ssa); in zend_dfa_optimize_op_array()
1118 ssa_verify_integrity(op_array, ssa, "after calls"); in zend_dfa_optimize_op_array()
1123 if (dce_optimize_op_array(op_array, ctx, ssa, 0)) { in zend_dfa_optimize_op_array()
1126 if (zend_dfa_optimize_jmps(op_array, ssa)) { in zend_dfa_optimize_op_array()
1130 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after dce pass", ssa); in zend_dfa_optimize_op_array()
1133 ssa_verify_integrity(op_array, ssa, "after dce"); in zend_dfa_optimize_op_array()
1137 for (v = op_array->last_var; v < ssa->vars_count; v++) { in zend_dfa_optimize_op_array()
1139 op_1 = ssa->vars[v].definition; in zend_dfa_optimize_op_array()
1146 ssa_op = &ssa->ops[op_1]; in zend_dfa_optimize_op_array()
1149 if (ssa->var_info[v].use_as_double) { in zend_dfa_optimize_op_array()
1152 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1214 ssa->ops[op_1].op1_use = ssa->ops[op_1].op2_use; in zend_dfa_optimize_op_array()
1215 ssa->ops[op_1].op1_use_chain = ssa->ops[op_1].op2_use_chain; in zend_dfa_optimize_op_array()
1216 ssa->ops[op_1].op2_use = -1; in zend_dfa_optimize_op_array()
1217 ssa->ops[op_1].op2_use_chain = -1; in zend_dfa_optimize_op_array()
1234 ssa->ops[op_1].op1_use = ssa->ops[op_1].op2_use; in zend_dfa_optimize_op_array()
1235 ssa->ops[op_1].op1_use_chain = ssa->ops[op_1].op2_use_chain; in zend_dfa_optimize_op_array()
1279 ssa->ops[op_1].op2_use = ssa->ops[op_1].op1_use; in zend_dfa_optimize_op_array()
1280 ssa->ops[op_1].op2_use_chain = ssa->ops[op_1].op1_use_chain; in zend_dfa_optimize_op_array()
1291 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1292 && ssa->ops[op_1].op1_use >= 0) { in zend_dfa_optimize_op_array()
1293 int orig_var = ssa->ops[op_1].op1_use; in zend_dfa_optimize_op_array()
1294 int ret = ssa->vars[v].use_chain; in zend_dfa_optimize_op_array()
1296 if (ssa->ops[op_1].op1_use_chain == -1 in zend_dfa_optimize_op_array()
1297 && can_elide_return_type_check(ctx->script, op_array, ssa, &ssa->ops[op_1])) { in zend_dfa_optimize_op_array()
1301 zend_ssa_unlink_use_chain(ssa, op_1, orig_var); in zend_dfa_optimize_op_array()
1304 ssa->ops[ret].op1_use = orig_var; in zend_dfa_optimize_op_array()
1305 ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain; in zend_dfa_optimize_op_array()
1306 ssa->vars[orig_var].use_chain = ret; in zend_dfa_optimize_op_array()
1309 ssa->vars[v].definition = -1; in zend_dfa_optimize_op_array()
1310 ssa->vars[v].use_chain = -1; in zend_dfa_optimize_op_array()
1312 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
1313 ssa->ops[op_1].op1_use = -1; in zend_dfa_optimize_op_array()
1318 && ssa->ops[ret].op1_use == v in zend_dfa_optimize_op_array()
1319 && ssa->ops[ret].op1_use_chain == -1 in zend_dfa_optimize_op_array()
1320 && can_elide_return_type_check(ctx->script, op_array, ssa, &ssa->ops[op_1])) { in zend_dfa_optimize_op_array()
1324 zend_ssa_replace_use_chain(ssa, op_1, ret, orig_var); in zend_dfa_optimize_op_array()
1326 ssa->ops[ret].op1_use = orig_var; in zend_dfa_optimize_op_array()
1327 ssa->ops[ret].op1_use_chain = ssa->ops[op_1].op1_use_chain; in zend_dfa_optimize_op_array()
1329 ssa->vars[v].definition = -1; in zend_dfa_optimize_op_array()
1330 ssa->vars[v].use_chain = -1; in zend_dfa_optimize_op_array()
1332 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
1333 ssa->ops[op_1].op1_use = -1; in zend_dfa_optimize_op_array()
1342 && ssa->ops[op_1].result_def == v in zend_dfa_optimize_op_array()
1344 …&& !(ssa->var_info[v].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) in zend_dfa_optimize_op_array()
1347 int src_var = ssa->ops[op_1].op1_use; in zend_dfa_optimize_op_array()
1350 && !(ssa->var_info[src_var].type & MAY_BE_REF) in zend_dfa_optimize_op_array()
1351 && (ssa->var_info[src_var].type & (MAY_BE_UNDEF|MAY_BE_ANY)) in zend_dfa_optimize_op_array()
1352 && ssa->vars[src_var].definition >= 0 in zend_dfa_optimize_op_array()
1353 && ssa->ops[ssa->vars[src_var].definition].result_def == src_var in zend_dfa_optimize_op_array()
1354 && ssa->ops[ssa->vars[src_var].definition].result_use < 0 in zend_dfa_optimize_op_array()
1355 && ssa->vars[src_var].use_chain == op_1 in zend_dfa_optimize_op_array()
1356 && ssa->ops[op_1].op1_use_chain < 0 in zend_dfa_optimize_op_array()
1357 && !ssa->vars[src_var].phi_use_chain in zend_dfa_optimize_op_array()
1358 && !ssa->vars[src_var].sym_use_chain in zend_dfa_optimize_op_array()
1360 op_array, ssa, &op_array->opcodes[ssa->vars[src_var].definition], in zend_dfa_optimize_op_array()
1362 && !variable_defined_or_used_in_range(ssa, EX_VAR_TO_NUM(opline->result.var), in zend_dfa_optimize_op_array()
1363 ssa->vars[src_var].definition+1, op_1) in zend_dfa_optimize_op_array()
1366 int orig_var = ssa->ops[op_1].result_use; in zend_dfa_optimize_op_array()
1367 int op_2 = ssa->vars[src_var].definition; in zend_dfa_optimize_op_array()
1373 zend_ssa_unlink_use_chain(ssa, op_1, orig_var); in zend_dfa_optimize_op_array()
1377 ssa->vars[v].definition = op_2; in zend_dfa_optimize_op_array()
1378 ssa->ops[op_2].result_def = v; in zend_dfa_optimize_op_array()
1380 ssa->vars[src_var].definition = -1; in zend_dfa_optimize_op_array()
1381 ssa->vars[src_var].use_chain = -1; in zend_dfa_optimize_op_array()
1383 ssa->ops[op_1].op1_use = -1; in zend_dfa_optimize_op_array()
1384 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
1385 ssa->ops[op_1].op1_use_chain = -1; in zend_dfa_optimize_op_array()
1386 ssa->ops[op_1].result_use = -1; in zend_dfa_optimize_op_array()
1387 ssa->ops[op_1].result_def = -1; in zend_dfa_optimize_op_array()
1388 ssa->ops[op_1].res_use_chain = -1; in zend_dfa_optimize_op_array()
1403 && ssa->ops[op_2].op1_use >= 0 in zend_dfa_optimize_op_array()
1404 …&& !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_A… in zend_dfa_optimize_op_array()
1410 ssa->ops[op_2].result_def = -1; in zend_dfa_optimize_op_array()
1411 ssa->ops[op_2].op1_def = v; in zend_dfa_optimize_op_array()
1419 && ssa->ops[op_2].op1_use >= 0 in zend_dfa_optimize_op_array()
1420 …&& !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_A… in zend_dfa_optimize_op_array()
1426 ssa->ops[op_2].result_def = -1; in zend_dfa_optimize_op_array()
1427 ssa->ops[op_2].op1_def = v; in zend_dfa_optimize_op_array()
1435 && ssa->ops[op_2].op2_use >= 0 in zend_dfa_optimize_op_array()
1436 …&& !(ssa->var_info[ssa->ops[op_2].op2_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_A… in zend_dfa_optimize_op_array()
1444 ssa->ops[op_2].result_def = -1; in zend_dfa_optimize_op_array()
1445 ssa->ops[op_2].op1_def = v; in zend_dfa_optimize_op_array()
1446 ssa->ops[op_2].op1_use = ssa->ops[op_2].op2_use; in zend_dfa_optimize_op_array()
1447 ssa->ops[op_2].op1_use_chain = ssa->ops[op_2].op2_use_chain; in zend_dfa_optimize_op_array()
1448 ssa->ops[op_2].op2_use = -1; in zend_dfa_optimize_op_array()
1449 ssa->ops[op_2].op2_use_chain = -1; in zend_dfa_optimize_op_array()
1454 if (ssa->vars[v].var >= op_array->last_var) { in zend_dfa_optimize_op_array()
1459 if (ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1465 zend_dfa_try_to_replace_result(op_array, ssa, op_1, v); in zend_dfa_optimize_op_array()
1467 int result_var = ssa->ops[op_1].result_def; in zend_dfa_optimize_op_array()
1470 …&& (ssa->var_info[result_var].type & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_D… in zend_dfa_optimize_op_array()
1471 int use = ssa->vars[result_var].use_chain; in zend_dfa_optimize_op_array()
1474 && ssa->ops[use].op1_use == result_var in zend_dfa_optimize_op_array()
1475 && zend_dfa_try_to_replace_result(op_array, ssa, op_1, v)) { in zend_dfa_optimize_op_array()
1481 int result_var = ssa->ops[op_1].result_def; in zend_dfa_optimize_op_array()
1484 …&& (ssa->var_info[result_var].type & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_D… in zend_dfa_optimize_op_array()
1485 int use = ssa->vars[result_var].use_chain; in zend_dfa_optimize_op_array()
1488 && ssa->ops[use].op2_use == result_var in zend_dfa_optimize_op_array()
1489 && zend_dfa_try_to_replace_result(op_array, ssa, op_1, v)) { in zend_dfa_optimize_op_array()
1498 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1501 int orig_var = ssa->ops[op_1].op1_use; in zend_dfa_optimize_op_array()
1504 …&& !(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()
1506 int src_var = ssa->ops[op_1].op2_use; in zend_dfa_optimize_op_array()
1510 && !(ssa->var_info[src_var].type & MAY_BE_REF) in zend_dfa_optimize_op_array()
1511 && (ssa->var_info[src_var].type & (MAY_BE_UNDEF|MAY_BE_ANY)) in zend_dfa_optimize_op_array()
1512 && ssa->vars[src_var].definition >= 0 in zend_dfa_optimize_op_array()
1513 && ssa->ops[ssa->vars[src_var].definition].result_def == src_var in zend_dfa_optimize_op_array()
1514 && ssa->ops[ssa->vars[src_var].definition].result_use < 0 in zend_dfa_optimize_op_array()
1515 && ssa->vars[src_var].use_chain == op_1 in zend_dfa_optimize_op_array()
1516 && ssa->ops[op_1].op2_use_chain < 0 in zend_dfa_optimize_op_array()
1517 && !ssa->vars[src_var].phi_use_chain in zend_dfa_optimize_op_array()
1518 && !ssa->vars[src_var].sym_use_chain in zend_dfa_optimize_op_array()
1520 op_array, ssa, &op_array->opcodes[ssa->vars[src_var].definition], in zend_dfa_optimize_op_array()
1522 && !variable_defined_or_used_in_range(ssa, EX_VAR_TO_NUM(opline->op1.var), in zend_dfa_optimize_op_array()
1523 ssa->vars[src_var].definition+1, op_1) in zend_dfa_optimize_op_array()
1526 int op_2 = ssa->vars[src_var].definition; in zend_dfa_optimize_op_array()
1531 zend_ssa_unlink_use_chain(ssa, op_1, orig_var); in zend_dfa_optimize_op_array()
1533 ssa->vars[v].definition = op_2; in zend_dfa_optimize_op_array()
1534 ssa->ops[op_2].result_def = v; in zend_dfa_optimize_op_array()
1536 ssa->vars[src_var].definition = -1; in zend_dfa_optimize_op_array()
1537 ssa->vars[src_var].use_chain = -1; in zend_dfa_optimize_op_array()
1539 ssa->ops[op_1].op1_use = -1; in zend_dfa_optimize_op_array()
1540 ssa->ops[op_1].op2_use = -1; in zend_dfa_optimize_op_array()
1541 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
1542 ssa->ops[op_1].op1_use_chain = -1; in zend_dfa_optimize_op_array()
1557 && ssa->ops[op_2].op1_use >= 0 in zend_dfa_optimize_op_array()
1558 …&& !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_A… in zend_dfa_optimize_op_array()
1564 ssa->ops[op_2].result_def = -1; in zend_dfa_optimize_op_array()
1565 ssa->ops[op_2].op1_def = v; in zend_dfa_optimize_op_array()
1573 && ssa->ops[op_2].op1_use >= 0 in zend_dfa_optimize_op_array()
1574 …&& !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_A… in zend_dfa_optimize_op_array()
1580 ssa->ops[op_2].result_def = -1; in zend_dfa_optimize_op_array()
1581 ssa->ops[op_2].op1_def = v; in zend_dfa_optimize_op_array()
1589 && ssa->ops[op_2].op2_use >= 0 in zend_dfa_optimize_op_array()
1590 …&& !(ssa->var_info[ssa->ops[op_2].op2_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_A… in zend_dfa_optimize_op_array()
1598 ssa->ops[op_2].result_def = -1; in zend_dfa_optimize_op_array()
1599 ssa->ops[op_2].op1_def = v; in zend_dfa_optimize_op_array()
1600 ssa->ops[op_2].op1_use = ssa->ops[op_2].op2_use; in zend_dfa_optimize_op_array()
1601 ssa->ops[op_2].op1_use_chain = ssa->ops[op_2].op2_use_chain; in zend_dfa_optimize_op_array()
1602 ssa->ops[op_2].op2_use = -1; in zend_dfa_optimize_op_array()
1603 ssa->ops[op_2].op2_use_chain = -1; in zend_dfa_optimize_op_array()
1607 && ssa->ops[op_1].op2_use >= 0 in zend_dfa_optimize_op_array()
1608 && ssa->ops[op_1].op2_def < 0) in zend_dfa_optimize_op_array()
1613 if (ssa->ops[op_1].op1_use != ssa->ops[op_1].op2_use) { in zend_dfa_optimize_op_array()
1614 zend_ssa_unlink_use_chain(ssa, op_1, orig_var); in zend_dfa_optimize_op_array()
1616 ssa->ops[op_1].op2_use_chain = ssa->ops[op_1].op1_use_chain; in zend_dfa_optimize_op_array()
1620 ssa->ops[op_1].result_def = v; in zend_dfa_optimize_op_array()
1621 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
1622 ssa->ops[op_1].op1_use = ssa->ops[op_1].op2_use; in zend_dfa_optimize_op_array()
1623 ssa->ops[op_1].op1_use_chain = ssa->ops[op_1].op2_use_chain; in zend_dfa_optimize_op_array()
1624 ssa->ops[op_1].op2_use = -1; in zend_dfa_optimize_op_array()
1625 ssa->ops[op_1].op2_use_chain = -1; in zend_dfa_optimize_op_array()
1640 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1644 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
1645 …&& !(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()
1655 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1659 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
1660 …&& !(ssa->var_info[ssa->ops[op_1].op1_use].type & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TR… in zend_dfa_optimize_op_array()
1668 } else if (ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
1670 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
1671 …&& !(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()
1678 ssa->ops[op_1].result_def = ssa->ops[op_1].op1_def; in zend_dfa_optimize_op_array()
1679 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
1691 ssa_verify_integrity(op_array, ssa, "after dfa"); in zend_dfa_optimize_op_array()
1695 zend_ssa_remove_nops(op_array, ssa, ctx); in zend_dfa_optimize_op_array()
1697 ssa_verify_integrity(op_array, ssa, "after nop"); in zend_dfa_optimize_op_array()
1703 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after dfa pass", ssa); in zend_dfa_optimize_op_array()
1710 zend_ssa ssa; in zend_optimize_dfa() local
1712 if (zend_dfa_analyze_op_array(op_array, ctx, &ssa) == FAILURE) { in zend_optimize_dfa()
1717 zend_dfa_optimize_op_array(op_array, ctx, &ssa, NULL); in zend_optimize_dfa()