Lines Matching refs:ssa

48 	zend_ssa *ssa;  member
60 static inline zend_bool is_bad_mod(const zend_ssa *ssa, int use, int def) { in is_bad_mod() argument
65 if (ssa->var_info[use].type & MAY_BE_REF) { in is_bad_mod()
73 zend_op_array *op_array, zend_ssa *ssa, in may_have_side_effects() argument
165 if (is_bad_mod(ssa, ssa_op->op1_use, ssa_op->op1_def)) { in may_have_side_effects()
194 return is_bad_mod(ssa, ssa_op->op1_use, ssa_op->op1_def); in may_have_side_effects()
211 return is_bad_mod(ssa, ssa_op->op1_use, ssa_op->op1_def); in may_have_side_effects()
219 zend_ssa_var *var = &ctx->ssa->vars[var_num]; in add_to_worklists()
232 zend_ssa_var *var = &ctx->ssa->vars[var_num]; in add_to_phi_worklist_no_val()
259 zend_ssa *ssa = ctx->ssa; in add_phi_sources_to_worklists() local
267 zend_ssa_var *var = &ctx->ssa->vars[var_num]; in is_var_dead()
285 zend_ssa_var *var = &ctx->ssa->vars[free_var]; in try_remove_var_def()
289 zend_ssa_op *def_op = &ctx->ssa->ops[def]; in try_remove_var_def()
342 zend_ssa *ssa = ctx->ssa; in dce_instr() local
352 …&& (ssa->var_info[ssa_op->op1_use].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURC… in dce_instr()
359 …if (ssa->var_info[ssa_op->op1_use].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURC… in dce_instr()
368 …if (ssa->var_info[ssa_op->op2_use].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURC… in dce_instr()
380 zend_ssa_rename_defs_of_instr(ctx->ssa, ssa_op); in dce_instr()
381 zend_ssa_remove_instr(ctx->ssa, opline, ssa_op); in dce_instr()
385 opline->op1.var = (uintptr_t) ZEND_CALL_VAR_NUM(NULL, ssa->vars[free_var].var); in dce_instr()
389 ssa_op->op1_use_chain = ssa->vars[free_var].use_chain; in dce_instr()
390 ssa->vars[free_var].use_chain = ssa_op - ssa->ops; in dce_instr()
397 static int simplify_jumps(zend_ssa *ssa, zend_op_array *op_array) { in simplify_jumps() argument
401 int block_num = block - ssa->cfg.blocks; in simplify_jumps()
403 zend_ssa_op *ssa_op = &ssa->ops[block->start + block->len - 1]; in simplify_jumps()
414 if (ssa->vars[ssa_op->result_def].use_chain < 0 in simplify_jumps()
415 && ssa->vars[ssa_op->result_def].phi_use_chain == NULL) { in simplify_jumps()
418 zend_ssa_remove_result_def(ssa, ssa_op); in simplify_jumps()
424 if (ssa->vars[ssa_op->result_def].use_chain < 0 in simplify_jumps()
425 && ssa->vars[ssa_op->result_def].phi_use_chain == NULL) { in simplify_jumps()
428 zend_ssa_remove_result_def(ssa, ssa_op); in simplify_jumps()
480 if (ssa->vars[ssa_op->result_def].use_chain >= 0 in simplify_jumps()
481 || ssa->vars[ssa_op->result_def].phi_use_chain != NULL) { in simplify_jumps()
485 zend_ssa_remove_result_def(ssa, ssa_op); in simplify_jumps()
502 static inline int get_common_phi_source(zend_ssa *ssa, zend_ssa_phi *phi) { in get_common_phi_source() argument
517 zend_ssa *ssa = ctx->ssa; in try_remove_trivial_phi() local
520 int common_source = get_common_phi_source(ssa, phi); in try_remove_trivial_phi()
522 zend_ssa_rename_var_uses(ssa, phi->ssa_var, common_source, 1); in try_remove_trivial_phi()
523 zend_ssa_remove_phi(ssa, phi); in try_remove_trivial_phi()
536 static inline zend_bool may_break_varargs(const zend_op_array *op_array, const zend_ssa *ssa, const… in may_break_varargs() argument
538 && ssa->vars[ssa_op->op1_def].var < op_array->num_args) { in may_break_varargs()
542 && ssa->vars[ssa_op->op2_def].var < op_array->num_args) { in may_break_varargs()
546 && ssa->vars[ssa_op->result_def].var < op_array->num_args) { in may_break_varargs()
552 static void dce_live_ranges(context *ctx, zend_op_array *op_array, zend_ssa *ssa) in dce_live_ranges() argument
592 ZEND_ASSERT(ssa->ops[def].result_def >= 0); in dce_live_ranges()
596 || ssa->ops[def].result_def < 0) { in dce_live_ranges()
605 var = ssa->ops[def].result_def; in dce_live_ranges()
607 …if ((ssa->var_info[var].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_RE… in dce_live_ranges()
626 int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reorder_dtor_effects) { in dce_optimize_op_array() argument
632 zend_bool has_varargs = ssa->cfg.vararg; in dce_optimize_op_array()
635 ctx.ssa = ssa; in dce_optimize_op_array()
643 ctx.phi_worklist_len = zend_bitset_len(ssa->vars_count); in dce_optimize_op_array()
656 int b = ssa->cfg.blocks_count; in dce_optimize_op_array()
659 zend_basic_block *block = &ssa->cfg.blocks[b]; in dce_optimize_op_array()
669 add_operands_to_worklists(&ctx, &op_array->opcodes[i], &ssa->ops[i], 0); in dce_optimize_op_array()
670 …} else if (may_have_side_effects(op_array, ssa, &op_array->opcodes[i], &ssa->ops[i], ctx.reorder_d… in dce_optimize_op_array()
671 || zend_may_throw(&op_array->opcodes[i], op_array, ssa) in dce_optimize_op_array()
672 || (has_varargs && may_break_varargs(op_array, ssa, &ssa->ops[i]))) { in dce_optimize_op_array()
673 add_operands_to_worklists(&ctx, &op_array->opcodes[i], &ssa->ops[i], 0); in dce_optimize_op_array()
686 add_operands_to_worklists(&ctx, &op_array->opcodes[i], &ssa->ops[i], 1); in dce_optimize_op_array()
691 add_phi_sources_to_worklists(&ctx, ssa->vars[i].definition_phi, 1); in dce_optimize_op_array()
696 dce_live_ranges(&ctx, op_array, ssa); in dce_optimize_op_array()
701 removed_ops += dce_instr(&ctx, &op_array->opcodes[i], &ssa->ops[i]); in dce_optimize_op_array()
709 zend_ssa_phi *phi = ssa->vars[i].definition_phi; in dce_optimize_op_array()
720 zend_ssa_remove_uses_of_var(ssa, phi->ssa_var); in dce_optimize_op_array()
721 zend_ssa_remove_phi(ssa, phi); in dce_optimize_op_array()
728 removed_ops += simplify_jumps(ssa, op_array); in dce_optimize_op_array()