Lines Matching refs:ssa

42 int zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx, zend_ssa *ssa, uint…  in zend_dfa_analyze_op_array()  argument
52 memset(ssa, 0, sizeof(zend_ssa)); in zend_dfa_analyze_op_array()
55 ZEND_CFG_NO_ENTRY_PREDECESSORS, &ssa->cfg, flags) != SUCCESS) { in zend_dfa_analyze_op_array()
64 if (zend_cfg_build_predecessors(&ctx->arena, &ssa->cfg) != SUCCESS) { in zend_dfa_analyze_op_array()
69 zend_dump_op_array(op_array, ZEND_DUMP_CFG, "dfa cfg", &ssa->cfg); in zend_dfa_analyze_op_array()
73 if (zend_cfg_compute_dominators_tree(op_array, &ssa->cfg) != SUCCESS) { in zend_dfa_analyze_op_array()
78 if (zend_cfg_identify_loops(op_array, &ssa->cfg, flags) != SUCCESS) { in zend_dfa_analyze_op_array()
83 zend_dump_dominators(op_array, &ssa->cfg); in zend_dfa_analyze_op_array()
93 if (zend_build_ssa(&ctx->arena, ctx->script, op_array, build_flags, ssa, flags) != SUCCESS) { in zend_dfa_analyze_op_array()
98 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "dfa ssa", ssa); in zend_dfa_analyze_op_array()
102 if (zend_ssa_compute_use_def_chains(&ctx->arena, op_array, ssa) != SUCCESS){ in zend_dfa_analyze_op_array()
106 if (zend_ssa_find_false_dependencies(op_array, ssa) != SUCCESS) { in zend_dfa_analyze_op_array()
110 if (zend_ssa_find_sccs(op_array, ssa) != SUCCESS){ in zend_dfa_analyze_op_array()
114 if (zend_ssa_inference(&ctx->arena, op_array, ctx->script, ssa) != SUCCESS) { in zend_dfa_analyze_op_array()
119 zend_dump_ssa_variables(op_array, ssa, 0); in zend_dfa_analyze_op_array()
125 static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa) in zend_ssa_remove_nops() argument
127 zend_basic_block *blocks = ssa->cfg.blocks; in zend_ssa_remove_nops()
128 zend_basic_block *end = blocks + ssa->cfg.blocks_count; in zend_ssa_remove_nops()
183 ssa->ops[target] = ssa->ops[i]; in zend_ssa_remove_nops()
184 ssa->cfg.map[target] = b - blocks; in zend_ssa_remove_nops()
219 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_remove_nops()
220 if (ssa->vars[j].definition >= 0) { in zend_ssa_remove_nops()
221 ssa->vars[j].definition -= shiftlist[ssa->vars[j].definition]; in zend_ssa_remove_nops()
223 if (ssa->vars[j].use_chain >= 0) { in zend_ssa_remove_nops()
224 ssa->vars[j].use_chain -= shiftlist[ssa->vars[j].use_chain]; in zend_ssa_remove_nops()
228 if (ssa->ops[i].op1_use_chain >= 0) { in zend_ssa_remove_nops()
229 ssa->ops[i].op1_use_chain -= shiftlist[ssa->ops[i].op1_use_chain]; in zend_ssa_remove_nops()
231 if (ssa->ops[i].op2_use_chain >= 0) { in zend_ssa_remove_nops()
232 ssa->ops[i].op2_use_chain -= shiftlist[ssa->ops[i].op2_use_chain]; in zend_ssa_remove_nops()
234 if (ssa->ops[i].res_use_chain >= 0) { in zend_ssa_remove_nops()
235 ssa->ops[i].res_use_chain -= shiftlist[ssa->ops[i].res_use_chain]; in zend_ssa_remove_nops()
291 zend_op_array *op_array, zend_ssa *ssa, zend_ssa_op *ssa_op) { in can_elide_return_type_check() argument
293 zend_ssa_var_info *use_info = &ssa->var_info[ssa_op->op1_use]; in can_elide_return_type_check()
294 zend_ssa_var_info *def_info = &ssa->var_info[ssa_op->op1_def]; in can_elide_return_type_check()
320 zend_ssa *ssa, zend_op *opline, int src_var, uint32_t cv_var) { in opline_supports_assign_contraction() argument
330 uint32_t type = ssa->var_info[src_var].type; in opline_supports_assign_contraction()
357 int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa) in zend_dfa_optimize_calls() argument
431 zend_ssa_op *ssa_op = ssa->ops + op_num; in zend_dfa_optimize_calls()
436 zend_ssa_var *var = ssa->vars + var_num; in zend_dfa_optimize_calls()
439 zend_ssa_unlink_use_chain(ssa, op_num, ssa_op->op1_use); in zend_dfa_optimize_calls()
443 ssa_op = ssa->ops + op_num; in zend_dfa_optimize_calls()
476 static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa) in zend_dfa_optimize_jmps() argument
481 while (block_num < ssa->cfg.blocks_count in zend_dfa_optimize_jmps()
482 && !(ssa->cfg.blocks[block_num].flags & ZEND_BB_REACHABLE)) { in zend_dfa_optimize_jmps()
485 while (block_num < ssa->cfg.blocks_count) { in zend_dfa_optimize_jmps()
487 zend_basic_block *block = &ssa->cfg.blocks[block_num]; in zend_dfa_optimize_jmps()
492 while (next_block_num < ssa->cfg.blocks_count in zend_dfa_optimize_jmps()
493 && !(ssa->cfg.blocks[next_block_num].flags & ZEND_BB_REACHABLE)) { in zend_dfa_optimize_jmps()
506 op = ssa->ops + op_num; in zend_dfa_optimize_jmps()
509 zend_ssa_remove_instr(ssa, opline, op); in zend_dfa_optimize_jmps()
511 zend_ssa_unlink_use_chain(ssa, op_num, op->op1_use); in zend_dfa_optimize_jmps()
524 zend_ssa_unlink_use_chain(ssa, op_num, op->op1_use); in zend_dfa_optimize_jmps()
554 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
557 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "before dfa pass", ssa); in zend_dfa_optimize_op_array()
560 if (ssa->var_info) { in zend_dfa_optimize_op_array()
568 if (sccp_optimize_op_array(ctx, op_array, ssa, call_map)) { in zend_dfa_optimize_op_array()
572 if (zend_dfa_optimize_jmps(op_array, ssa)) { in zend_dfa_optimize_op_array()
577 ssa_verify_integrity(op_array, ssa, "after sccp"); in zend_dfa_optimize_op_array()
580 if (zend_dfa_optimize_calls(op_array, ssa)) { in zend_dfa_optimize_op_array()
585 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after sccp pass", ssa); in zend_dfa_optimize_op_array()
588 ssa_verify_integrity(op_array, ssa, "after calls"); in zend_dfa_optimize_op_array()
593 if (dce_optimize_op_array(op_array, ssa, 0)) { in zend_dfa_optimize_op_array()
597 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after dce pass", ssa); in zend_dfa_optimize_op_array()
600 ssa_verify_integrity(op_array, ssa, "after dce"); in zend_dfa_optimize_op_array()
604 for (v = op_array->last_var; v < ssa->vars_count; v++) { in zend_dfa_optimize_op_array()
606 op_1 = ssa->vars[v].definition; in zend_dfa_optimize_op_array()
615 if (ssa->var_info[v].use_as_double) { in zend_dfa_optimize_op_array()
618 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
683 if (ssa->vars[v].var >= op_array->last_var) { in zend_dfa_optimize_op_array()
689 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
692 int orig_var = ssa->ops[op_1].op1_use; in zend_dfa_optimize_op_array()
695 …&& !(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()
698 int src_var = ssa->ops[op_1].op2_use; in zend_dfa_optimize_op_array()
702 && !(ssa->var_info[src_var].type & MAY_BE_REF) in zend_dfa_optimize_op_array()
703 && ssa->vars[src_var].definition >= 0 in zend_dfa_optimize_op_array()
704 && ssa->ops[ssa->vars[src_var].definition].result_def == src_var in zend_dfa_optimize_op_array()
705 && ssa->ops[ssa->vars[src_var].definition].result_use < 0 in zend_dfa_optimize_op_array()
706 && ssa->vars[src_var].use_chain == op_1 in zend_dfa_optimize_op_array()
707 && ssa->ops[op_1].op2_use_chain < 0 in zend_dfa_optimize_op_array()
708 && !ssa->vars[src_var].phi_use_chain in zend_dfa_optimize_op_array()
709 && !ssa->vars[src_var].sym_use_chain in zend_dfa_optimize_op_array()
711 ssa, &op_array->opcodes[ssa->vars[src_var].definition], in zend_dfa_optimize_op_array()
715 int op_2 = ssa->vars[src_var].definition; in zend_dfa_optimize_op_array()
720 if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) { in zend_dfa_optimize_op_array()
722 ssa->vars[v].definition = op_2; in zend_dfa_optimize_op_array()
723 ssa->ops[op_2].result_def = v; in zend_dfa_optimize_op_array()
725 ssa->vars[src_var].definition = -1; in zend_dfa_optimize_op_array()
726 ssa->vars[src_var].use_chain = -1; in zend_dfa_optimize_op_array()
728 ssa->ops[op_1].op1_use = -1; in zend_dfa_optimize_op_array()
729 ssa->ops[op_1].op2_use = -1; in zend_dfa_optimize_op_array()
730 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
731 ssa->ops[op_1].op1_use_chain = -1; in zend_dfa_optimize_op_array()
741 && ssa->ops[op_1].op2_use >= 0 in zend_dfa_optimize_op_array()
742 && ssa->ops[op_1].op2_def < 0) in zend_dfa_optimize_op_array()
747 if (ssa->ops[op_1].op1_use != ssa->ops[op_1].op2_use) { in zend_dfa_optimize_op_array()
748 zend_ssa_unlink_use_chain(ssa, op_1, orig_var); in zend_dfa_optimize_op_array()
750 ssa->ops[op_1].op2_use_chain = ssa->ops[op_1].op1_use_chain; in zend_dfa_optimize_op_array()
754 ssa->ops[op_1].result_def = v; in zend_dfa_optimize_op_array()
755 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
756 ssa->ops[op_1].op1_use = ssa->ops[op_1].op2_use; in zend_dfa_optimize_op_array()
757 ssa->ops[op_1].op1_use_chain = ssa->ops[op_1].op2_use_chain; in zend_dfa_optimize_op_array()
758 ssa->ops[op_1].op2_use = -1; in zend_dfa_optimize_op_array()
759 ssa->ops[op_1].op2_use_chain = -1; in zend_dfa_optimize_op_array()
774 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
778 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
779 …&& !(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()
788 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
792 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
793 …&& !(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()
801 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
802 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
803 && ssa->ops[op_1].op1_use_chain == -1 in zend_dfa_optimize_op_array()
804 && ssa->vars[v].use_chain >= 0 in zend_dfa_optimize_op_array()
805 && can_elide_return_type_check(op_array, ssa, &ssa->ops[op_1])) { in zend_dfa_optimize_op_array()
809 int orig_var = ssa->ops[op_1].op1_use; in zend_dfa_optimize_op_array()
810 if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) { in zend_dfa_optimize_op_array()
812 int ret = ssa->vars[v].use_chain; in zend_dfa_optimize_op_array()
814 ssa->ops[ret].op1_use = orig_var; in zend_dfa_optimize_op_array()
815 ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain; in zend_dfa_optimize_op_array()
816 ssa->vars[orig_var].use_chain = ret; in zend_dfa_optimize_op_array()
818 ssa->vars[v].definition = -1; in zend_dfa_optimize_op_array()
819 ssa->vars[v].use_chain = -1; in zend_dfa_optimize_op_array()
821 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
822 ssa->ops[op_1].op1_use = -1; in zend_dfa_optimize_op_array()
828 } else if (ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
830 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
831 …&& !(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()
847 ssa->ops[op_1].result_def = ssa->ops[op_1].op1_def; in zend_dfa_optimize_op_array()
848 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
859 ssa_verify_integrity(op_array, ssa, "after dfa"); in zend_dfa_optimize_op_array()
863 zend_ssa_remove_nops(op_array, ssa); in zend_dfa_optimize_op_array()
865 ssa_verify_integrity(op_array, ssa, "after nop"); in zend_dfa_optimize_op_array()
871 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after dfa pass", ssa); in zend_dfa_optimize_op_array()
879 zend_ssa ssa; in zend_optimize_dfa() local
881 if (zend_dfa_analyze_op_array(op_array, ctx, &ssa, &flags) != SUCCESS) { in zend_optimize_dfa()
886 zend_dfa_optimize_op_array(op_array, ctx, &ssa, NULL); in zend_optimize_dfa()