Lines Matching refs:op_array

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
46 if (op_array->last_try_catch) { 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()
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()
129 zend_op_array *op_array, uint32_t target, uint32_t current, in is_smart_branch_inhibiting_nop() argument
150 return (op_array->opcodes[next].opcode == ZEND_JMPZ || in is_smart_branch_inhibiting_nop()
151 op_array->opcodes[next].opcode == ZEND_JMPNZ) && in is_smart_branch_inhibiting_nop()
152 zend_is_smart_branch(op_array->opcodes + target - 1); in is_smart_branch_inhibiting_nop()
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
167 shiftlist = (uint32_t *)do_alloca(sizeof(uint32_t) * op_array->last, use_heap); in zend_ssa_remove_nops()
168 memset(shiftlist, 0, sizeof(uint32_t) * op_array->last); in zend_ssa_remove_nops()
170 func_info = ZEND_FUNC_INFO(op_array); in zend_ssa_remove_nops()
193 ZEND_ASSERT(op_array->opcodes[b->start].opcode == ZEND_FREE in zend_ssa_remove_nops()
194 || op_array->opcodes[b->start].opcode == ZEND_FE_FREE); in zend_ssa_remove_nops()
202 if (EXPECTED(op_array->opcodes[i].opcode != ZEND_NOP) || in zend_ssa_remove_nops()
203 is_smart_branch_inhibiting_nop(op_array, target, i, b, blocks_end)) { in zend_ssa_remove_nops()
205 op_array->opcodes[target] = op_array->opcodes[i]; in zend_ssa_remove_nops()
219 opline = op_array->opcodes + old_end - 1; in zend_ssa_remove_nops()
224 new_opline = op_array->opcodes + target - 1; in zend_ssa_remove_nops()
225 zend_optimizer_migrate_jump(op_array, new_opline, opline); in zend_ssa_remove_nops()
236 if (target != op_array->last) { in zend_ssa_remove_nops()
238 for (i = target; i < op_array->last; i++) { in zend_ssa_remove_nops()
239 MAKE_NOP(op_array->opcodes + i); in zend_ssa_remove_nops()
251 for (i = 0; i < op_array->last; i++) { in zend_ssa_remove_nops()
266 zend_op *opline = op_array->opcodes + b->start + b->len - 1; in zend_ssa_remove_nops()
267 zend_optimizer_shift_jump(op_array, opline, shiftlist); in zend_ssa_remove_nops()
272 for (j = 0; j < op_array->last_live_range; j++) { in zend_ssa_remove_nops()
273 op_array->live_range[j].start -= shiftlist[op_array->live_range[j].start]; in zend_ssa_remove_nops()
274 op_array->live_range[j].end -= shiftlist[op_array->live_range[j].end]; in zend_ssa_remove_nops()
278 for (j = 0; j < op_array->last_try_catch; j++) { in zend_ssa_remove_nops()
279 op_array->try_catch_array[j].try_op -= shiftlist[op_array->try_catch_array[j].try_op]; in zend_ssa_remove_nops()
280 op_array->try_catch_array[j].catch_op -= shiftlist[op_array->try_catch_array[j].catch_op]; in zend_ssa_remove_nops()
281 if (op_array->try_catch_array[j].finally_op) { in zend_ssa_remove_nops()
282 op_array->try_catch_array[j].finally_op -= shiftlist[op_array->try_catch_array[j].finally_op]; in zend_ssa_remove_nops()
283 op_array->try_catch_array[j].finally_end -= shiftlist[op_array->try_catch_array[j].finally_end]; in zend_ssa_remove_nops()
288 if (op_array->fn_flags & ZEND_ACC_EARLY_BINDING) { in zend_ssa_remove_nops()
291 ZEND_ASSERT(op_array == &ctx->script->main_op_array); in zend_ssa_remove_nops()
294 opline_num = &op_array->opcodes[*opline_num].result.opline_num; in zend_ssa_remove_nops()
303 shiftlist[call_info->caller_init_opline - op_array->opcodes]; in zend_ssa_remove_nops()
306 shiftlist[call_info->caller_call_opline - op_array->opcodes]; in zend_ssa_remove_nops()
312 op_array->last = target; in zend_ssa_remove_nops()
318 zend_op_array *op_array, zend_ssa *ssa, zend_ssa_op *ssa_op) { in can_elide_return_type_check() argument
319 zend_arg_info *info = &op_array->arg_info[-1]; in can_elide_return_type_check()
384 int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa) in zend_dfa_optimize_calls() argument
386 zend_func_info *func_info = ZEND_FUNC_INFO(op_array); in zend_dfa_optimize_calls()
411 … if (zend_is_true(CT_CONSTANT_EX(op_array, (call_info->caller_call_opline - 1)->op1.constant))) { in zend_dfa_optimize_calls()
420 && Z_TYPE_P(CT_CONSTANT_EX(op_array, send_array->op1.constant)) == IS_ARRAY in zend_dfa_optimize_calls()
426 HashTable *src = Z_ARRVAL_P(CT_CONSTANT_EX(op_array, send_array->op1.constant)); in zend_dfa_optimize_calls()
457 uint32_t op_num = send_needly - op_array->opcodes; in zend_dfa_optimize_calls()
469 op_num = call_info->caller_call_opline - op_array->opcodes; in zend_dfa_optimize_calls()
484 call_info->caller_call_opline->op2.constant = zend_optimizer_add_literal(op_array, &tmp); in zend_dfa_optimize_calls()
524 static void compress_block(zend_op_array *op_array, zend_basic_block *block) in compress_block() argument
527 zend_op *opline = &op_array->opcodes[block->start + block->len - 1]; in compress_block()
581 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
596 opline = op_array->opcodes + src->start + src->len - 1; in zend_ssa_replace_control_link()
600 ZEND_ASSERT(ZEND_OP1_JMP_ADDR(opline) == op_array->opcodes + old->start); in zend_ssa_replace_control_link()
601 ZEND_SET_OP_JMP_ADDR(opline, opline->op1, op_array->opcodes + dst->start); in zend_ssa_replace_control_link()
604 if (ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value) == old->start) { in zend_ssa_replace_control_link()
605 opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, dst->start); in zend_ssa_replace_control_link()
617 if (ZEND_OP2_JMP_ADDR(opline) == op_array->opcodes + old->start) { in zend_ssa_replace_control_link()
618 ZEND_SET_OP_JMP_ADDR(opline, opline->op2, op_array->opcodes + dst->start); in zend_ssa_replace_control_link()
623 if (ZEND_OP2_JMP_ADDR(opline) == op_array->opcodes + old->start) { in zend_ssa_replace_control_link()
624 ZEND_SET_OP_JMP_ADDR(opline, opline->op2, op_array->opcodes + dst->start); in zend_ssa_replace_control_link()
632 if (ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value) == old->start) { in zend_ssa_replace_control_link()
633 opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, dst->start); in zend_ssa_replace_control_link()
642 if (ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, Z_LVAL_P(zv)) == old->start) { in zend_ssa_replace_control_link()
643 Z_LVAL_P(zv) = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, dst->start); in zend_ssa_replace_control_link()
646 if (ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value) == old->start) { in zend_ssa_replace_control_link()
647 opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, dst->start); in zend_ssa_replace_control_link()
657 static void zend_ssa_unlink_block(zend_op_array *op_array, zend_ssa *ssa, zend_basic_block *block, … in zend_ssa_unlink_block() argument
665 zend_ssa_replace_control_link(op_array, ssa, predecessors[i], block_num, block->successors[0]); in zend_ssa_unlink_block()
667 zend_ssa_remove_block(op_array, ssa, block_num); in zend_ssa_unlink_block()
671 static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa) in zend_dfa_optimize_jmps() argument
682 compress_block(op_array, block); in zend_dfa_optimize_jmps()
684 zend_ssa_unlink_block(op_array, ssa, block, block_num); in zend_dfa_optimize_jmps()
707 opline = op_array->opcodes + op_num; in zend_dfa_optimize_jmps()
722 if (zend_is_true(CT_CONSTANT_EX(op_array, opline->op1.constant))) { in zend_dfa_optimize_jmps()
753 if (zend_is_true(CT_CONSTANT_EX(op_array, opline->op1.constant))) { in zend_dfa_optimize_jmps()
783 if (zend_is_true(CT_CONSTANT_EX(op_array, opline->op1.constant))) { in zend_dfa_optimize_jmps()
832 if (zend_is_true(CT_CONSTANT_EX(op_array, opline->op1.constant))) { in zend_dfa_optimize_jmps()
846 if (!zend_is_true(CT_CONSTANT_EX(op_array, opline->op1.constant))) { in zend_dfa_optimize_jmps()
860 if (!zend_is_true(CT_CONSTANT_EX(op_array, opline->op1.constant))) { in zend_dfa_optimize_jmps()
874 if (Z_TYPE_P(CT_CONSTANT_EX(op_array, opline->op1.constant)) == IS_NULL) { in zend_dfa_optimize_jmps()
882 zend_optimizer_remove_live_range_ex(op_array, opline->result.var, var->definition); in zend_dfa_optimize_jmps()
896 compress_block(op_array, block); in zend_dfa_optimize_jmps()
899 zend_ssa_unlink_block(op_array, ssa, block, block_num); in zend_dfa_optimize_jmps()
922 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
925 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "before dfa pass", ssa); in zend_dfa_optimize_op_array()
936 ssa_verify_integrity(op_array, ssa, "before dfa"); in zend_dfa_optimize_op_array()
940 if (sccp_optimize_op_array(ctx, op_array, ssa, call_map)) { in zend_dfa_optimize_op_array()
944 if (zend_dfa_optimize_jmps(op_array, ssa)) { in zend_dfa_optimize_op_array()
949 ssa_verify_integrity(op_array, ssa, "after sccp"); in zend_dfa_optimize_op_array()
951 if (ZEND_FUNC_INFO(op_array)) { in zend_dfa_optimize_op_array()
952 if (zend_dfa_optimize_calls(op_array, ssa)) { in zend_dfa_optimize_op_array()
957 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after sccp pass", ssa); in zend_dfa_optimize_op_array()
960 ssa_verify_integrity(op_array, ssa, "after calls"); in zend_dfa_optimize_op_array()
965 if (dce_optimize_op_array(op_array, ssa, 0)) { in zend_dfa_optimize_op_array()
968 if (zend_dfa_optimize_jmps(op_array, ssa)) { in zend_dfa_optimize_op_array()
972 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after dce pass", ssa); in zend_dfa_optimize_op_array()
975 ssa_verify_integrity(op_array, ssa, "after dce"); in zend_dfa_optimize_op_array()
979 for (v = op_array->last_var; v < ssa->vars_count; v++) { in zend_dfa_optimize_op_array()
987 opline = op_array->opcodes + op_1; in zend_dfa_optimize_op_array()
999 zval *zv = CT_CONSTANT_EX(op_array, opline->op2.constant); in zend_dfa_optimize_op_array()
1002 opline->op2.constant = zend_optimizer_add_literal(op_array, &tmp); in zend_dfa_optimize_op_array()
1010 zval *zv = CT_CONSTANT_EX(op_array, opline->op1.constant); in zend_dfa_optimize_op_array()
1013 opline->op1.constant = zend_optimizer_add_literal(op_array, &tmp); in zend_dfa_optimize_op_array()
1029 && Z_TYPE_INFO_P(CT_CONSTANT_EX(op_array, opline->op1.constant)) == IS_LONG in zend_dfa_optimize_op_array()
1034 zval *zv = CT_CONSTANT_EX(op_array, opline->op1.constant); in zend_dfa_optimize_op_array()
1036 opline->op1.constant = zend_optimizer_add_literal(op_array, &tmp); in zend_dfa_optimize_op_array()
1041 && Z_TYPE_INFO_P(CT_CONSTANT_EX(op_array, opline->op2.constant)) == IS_LONG in zend_dfa_optimize_op_array()
1046 zval *zv = CT_CONSTANT_EX(op_array, opline->op2.constant); in zend_dfa_optimize_op_array()
1048 opline->op2.constant = zend_optimizer_add_literal(op_array, &tmp); in zend_dfa_optimize_op_array()
1058 if (ssa->vars[v].var >= op_array->last_var) { in zend_dfa_optimize_op_array()
1086 ssa, &op_array->opcodes[ssa->vars[src_var].definition], in zend_dfa_optimize_op_array()
1109 op_array->opcodes[op_2].result_type = opline->op1_type; in zend_dfa_optimize_op_array()
1110 op_array->opcodes[op_2].result.var = opline->op1.var; in zend_dfa_optimize_op_array()
1151 && Z_TYPE_P(CT_CONSTANT_EX(op_array, opline->op2.constant)) == IS_LONG in zend_dfa_optimize_op_array()
1152 && Z_LVAL_P(CT_CONSTANT_EX(op_array, opline->op2.constant)) == 1 in zend_dfa_optimize_op_array()
1165 && Z_TYPE_P(CT_CONSTANT_EX(op_array, opline->op2.constant)) == IS_LONG in zend_dfa_optimize_op_array()
1166 && Z_LVAL_P(CT_CONSTANT_EX(op_array, opline->op2.constant)) == 1 in zend_dfa_optimize_op_array()
1180 && can_elide_return_type_check(op_array, ssa, &ssa->ops[op_1])) { in zend_dfa_optimize_op_array()
1234 ssa_verify_integrity(op_array, ssa, "after dfa"); in zend_dfa_optimize_op_array()
1238 zend_ssa_remove_nops(op_array, ssa, ctx); in zend_dfa_optimize_op_array()
1240 ssa_verify_integrity(op_array, ssa, "after nop"); in zend_dfa_optimize_op_array()
1246 zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after dfa pass", ssa); in zend_dfa_optimize_op_array()
1250 void zend_optimize_dfa(zend_op_array *op_array, zend_optimizer_ctx *ctx) in zend_optimize_dfa() argument
1255 if (zend_dfa_analyze_op_array(op_array, ctx, &ssa) != SUCCESS) { in zend_optimize_dfa()
1260 zend_dfa_optimize_op_array(op_array, ctx, &ssa, NULL); in zend_optimize_dfa()