Lines Matching refs:ssa

34 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
44 memset(ssa, 0, sizeof(zend_ssa)); in zend_dfa_analyze_op_array()
47 ZEND_CFG_NO_ENTRY_PREDECESSORS, &ssa->cfg, flags) != SUCCESS) { in zend_dfa_analyze_op_array()
56 if (zend_cfg_build_predecessors(&ctx->arena, &ssa->cfg) != SUCCESS) { in zend_dfa_analyze_op_array()
61 zend_dump_op_array(op_array, ZEND_DUMP_CFG, "dfa cfg", &ssa->cfg); in zend_dfa_analyze_op_array()
65 if (zend_cfg_compute_dominators_tree(op_array, &ssa->cfg) != SUCCESS) { in zend_dfa_analyze_op_array()
70 if (zend_cfg_identify_loops(op_array, &ssa->cfg, flags) != SUCCESS) { in zend_dfa_analyze_op_array()
75 zend_dump_dominators(op_array, &ssa->cfg); in zend_dfa_analyze_op_array()
85 if (zend_build_ssa(&ctx->arena, ctx->script, op_array, build_flags, ssa, flags) != SUCCESS) { in zend_dfa_analyze_op_array()
90 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "before dfa pass", ssa); in zend_dfa_analyze_op_array()
94 if (zend_ssa_compute_use_def_chains(&ctx->arena, op_array, ssa) != SUCCESS){ in zend_dfa_analyze_op_array()
98 if (zend_ssa_find_false_dependencies(op_array, ssa) != SUCCESS) { in zend_dfa_analyze_op_array()
102 if (zend_ssa_find_sccs(op_array, ssa) != SUCCESS){ in zend_dfa_analyze_op_array()
106 if (zend_ssa_inference(&ctx->arena, op_array, ctx->script, ssa) != SUCCESS) { in zend_dfa_analyze_op_array()
111 zend_dump_ssa_variables(op_array, ssa, 0); in zend_dfa_analyze_op_array()
117 static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa) in zend_ssa_remove_nops() argument
119 zend_basic_block *blocks = ssa->cfg.blocks; in zend_ssa_remove_nops()
120 zend_basic_block *end = blocks + ssa->cfg.blocks_count; in zend_ssa_remove_nops()
156 ssa->ops[target] = ssa->ops[i]; in zend_ssa_remove_nops()
215 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_remove_nops()
216 if (ssa->vars[j].definition >= 0) { in zend_ssa_remove_nops()
217 ssa->vars[j].definition -= shiftlist[ssa->vars[j].definition]; in zend_ssa_remove_nops()
219 if (ssa->vars[j].use_chain >= 0) { in zend_ssa_remove_nops()
220 ssa->vars[j].use_chain -= shiftlist[ssa->vars[j].use_chain]; in zend_ssa_remove_nops()
224 if (ssa->ops[i].op1_use_chain >= 0) { in zend_ssa_remove_nops()
225 ssa->ops[i].op1_use_chain -= shiftlist[ssa->ops[i].op1_use_chain]; in zend_ssa_remove_nops()
227 if (ssa->ops[i].op2_use_chain >= 0) { in zend_ssa_remove_nops()
228 ssa->ops[i].op2_use_chain -= shiftlist[ssa->ops[i].op2_use_chain]; in zend_ssa_remove_nops()
230 if (ssa->ops[i].res_use_chain >= 0) { in zend_ssa_remove_nops()
231 ssa->ops[i].res_use_chain -= shiftlist[ssa->ops[i].res_use_chain]; in zend_ssa_remove_nops()
315 zend_op_array *op_array, zend_ssa *ssa, zend_ssa_op *ssa_op) { in can_elide_return_type_check() argument
317 zend_ssa_var_info *use_info = &ssa->var_info[ssa_op->op1_use]; in can_elide_return_type_check()
318 zend_ssa_var_info *def_info = &ssa->var_info[ssa_op->op1_def]; in can_elide_return_type_check()
343 zend_ssa *ssa, zend_op *opline, int src_var, uint32_t cv_var) { in opline_supports_assign_contraction() argument
353 uint32_t type = ssa->var_info[src_var].type; in opline_supports_assign_contraction()
380 void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx, zend_ssa *ssa) in zend_dfa_optimize_op_array() argument
383 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "before dfa pass", ssa); in zend_dfa_optimize_op_array()
386 if (ssa->var_info) { in zend_dfa_optimize_op_array()
393 for (v = op_array->last_var; v < ssa->vars_count; v++) { in zend_dfa_optimize_op_array()
395 op_1 = ssa->vars[v].definition; in zend_dfa_optimize_op_array()
404 if (ssa->var_info[v].use_as_double) { in zend_dfa_optimize_op_array()
407 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
467 if (ssa->vars[v].var >= op_array->last_var) { in zend_dfa_optimize_op_array()
473 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
476 int orig_var = ssa->ops[op_1].op1_use; in zend_dfa_optimize_op_array()
479 …&& !(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()
482 int src_var = ssa->ops[op_1].op2_use; in zend_dfa_optimize_op_array()
486 && !(ssa->var_info[src_var].type & MAY_BE_REF) in zend_dfa_optimize_op_array()
487 && ssa->vars[src_var].definition >= 0 in zend_dfa_optimize_op_array()
488 && ssa->ops[ssa->vars[src_var].definition].result_def == src_var in zend_dfa_optimize_op_array()
489 && ssa->ops[ssa->vars[src_var].definition].result_use < 0 in zend_dfa_optimize_op_array()
490 && ssa->vars[src_var].use_chain == op_1 in zend_dfa_optimize_op_array()
491 && ssa->ops[op_1].op2_use_chain < 0 in zend_dfa_optimize_op_array()
492 && !ssa->vars[src_var].phi_use_chain in zend_dfa_optimize_op_array()
493 && !ssa->vars[src_var].sym_use_chain in zend_dfa_optimize_op_array()
495 ssa, &op_array->opcodes[ssa->vars[src_var].definition], in zend_dfa_optimize_op_array()
499 int op_2 = ssa->vars[src_var].definition; in zend_dfa_optimize_op_array()
504 if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) { in zend_dfa_optimize_op_array()
506 ssa->vars[v].definition = op_2; in zend_dfa_optimize_op_array()
507 ssa->ops[op_2].result_def = v; in zend_dfa_optimize_op_array()
509 ssa->vars[src_var].definition = -1; in zend_dfa_optimize_op_array()
510 ssa->vars[src_var].use_chain = -1; in zend_dfa_optimize_op_array()
512 ssa->ops[op_1].op1_use = -1; in zend_dfa_optimize_op_array()
513 ssa->ops[op_1].op2_use = -1; in zend_dfa_optimize_op_array()
514 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
515 ssa->ops[op_1].op1_use_chain = -1; in zend_dfa_optimize_op_array()
525 && ssa->ops[op_1].op2_use >= 0 in zend_dfa_optimize_op_array()
526 && ssa->ops[op_1].op2_def < 0) in zend_dfa_optimize_op_array()
531 if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) { in zend_dfa_optimize_op_array()
533 ssa->ops[op_1].result_def = v; in zend_dfa_optimize_op_array()
534 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
535 ssa->ops[op_1].op1_use = ssa->ops[op_1].op2_use; in zend_dfa_optimize_op_array()
536 ssa->ops[op_1].op1_use_chain = ssa->ops[op_1].op2_use_chain; in zend_dfa_optimize_op_array()
537 ssa->ops[op_1].op2_use = -1; in zend_dfa_optimize_op_array()
538 ssa->ops[op_1].op2_use_chain = -1; in zend_dfa_optimize_op_array()
554 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
558 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
559 …&& !(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()
568 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
572 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
573 …&& !(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()
581 && ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
582 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
583 && ssa->ops[op_1].op1_use_chain == -1 in zend_dfa_optimize_op_array()
584 && ssa->vars[v].use_chain >= 0 in zend_dfa_optimize_op_array()
585 && can_elide_return_type_check(op_array, ssa, &ssa->ops[op_1])) { in zend_dfa_optimize_op_array()
589 int orig_var = ssa->ops[op_1].op1_use; in zend_dfa_optimize_op_array()
590 if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) { in zend_dfa_optimize_op_array()
592 int ret = ssa->vars[v].use_chain; in zend_dfa_optimize_op_array()
594 ssa->ops[ret].op1_use = orig_var; in zend_dfa_optimize_op_array()
595 ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain; in zend_dfa_optimize_op_array()
596 ssa->vars[orig_var].use_chain = ret; in zend_dfa_optimize_op_array()
598 ssa->vars[v].definition = -1; in zend_dfa_optimize_op_array()
599 ssa->vars[v].use_chain = -1; in zend_dfa_optimize_op_array()
601 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
602 ssa->ops[op_1].op1_use = -1; in zend_dfa_optimize_op_array()
608 } else if (ssa->ops[op_1].op1_def == v in zend_dfa_optimize_op_array()
610 && ssa->ops[op_1].op1_use >= 0 in zend_dfa_optimize_op_array()
611 …&& !(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()
627 ssa->ops[op_1].result_def = ssa->ops[op_1].op1_def; in zend_dfa_optimize_op_array()
628 ssa->ops[op_1].op1_def = -1; in zend_dfa_optimize_op_array()
639 zend_ssa_remove_nops(op_array, ssa); in zend_dfa_optimize_op_array()
644 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after dfa pass", ssa); in zend_dfa_optimize_op_array()
652 zend_ssa ssa; in zend_optimize_dfa() local
654 if (zend_dfa_analyze_op_array(op_array, ctx, &ssa, &flags) != SUCCESS) { in zend_optimize_dfa()
659 zend_dfa_optimize_op_array(op_array, ctx, &ssa); in zend_optimize_dfa()