Lines Matching refs:op_array

89 static void strip_leading_nops(zend_op_array *op_array, zend_basic_block *b)  in strip_leading_nops()  argument
91 zend_op *opcodes = op_array->opcodes; in strip_leading_nops()
96 && (op_array->opcodes[b->start + 1].opcode == ZEND_JMPZ in strip_leading_nops()
97 || op_array->opcodes[b->start + 1].opcode == ZEND_JMPNZ) in strip_leading_nops()
98 && (op_array->opcodes[b->start + 1].op1_type & (IS_CV|IS_CONST)) in strip_leading_nops()
100 && zend_is_smart_branch(op_array->opcodes + b->start - 1)) { in strip_leading_nops()
108 static void strip_nops(zend_op_array *op_array, zend_basic_block *b) in strip_nops() argument
112 strip_leading_nops(op_array, b); in strip_nops()
120 if (op_array->opcodes[i].opcode != ZEND_NOP) { in strip_nops()
122 op_array->opcodes[j] = op_array->opcodes[i]; in strip_nops()
127 && (op_array->opcodes[i+1].opcode == ZEND_JMPZ in strip_nops()
128 || op_array->opcodes[i+1].opcode == ZEND_JMPNZ) in strip_nops()
129 && op_array->opcodes[i+1].op1_type & (IS_CV|IS_CONST) in strip_nops()
130 && zend_is_smart_branch(op_array->opcodes + j - 1)) { in strip_nops()
138 MAKE_NOP(op_array->opcodes + j); in strip_nops()
143 static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array, zend_bitset used_… in zend_optimize_block() argument
149 strip_leading_nops(op_array, block); in zend_optimize_block()
151 opline = op_array->opcodes + block->start; in zend_optimize_block()
171 if (zend_optimizer_update_op1_const(op_array, opline, &c)) { in zend_optimize_block()
172 zend_optimizer_remove_live_range(op_array, op1.var); in zend_optimize_block()
192 if (zend_optimizer_update_op2_const(op_array, opline, &c)) { in zend_optimize_block()
193 zend_optimizer_remove_live_range(op_array, op2.var); in zend_optimize_block()
279 op_array->live_range[opline->op2.num].var = (uint32_t)-1; in zend_optimize_block()
333 ZEND_OP1_LITERAL(opline) = zend_optimizer_add_literal(op_array, &c); in zend_optimize_block()
723 zend_optimizer_update_op1_const(op_array, opline, &result); in zend_optimize_block()
747 zend_optimizer_update_op1_const(op_array, opline, &result); in zend_optimize_block()
798 static void assemble_code_blocks(zend_cfg *cfg, zend_op_array *op_array) in assemble_code_blocks() argument
813 opline = op_array->opcodes + b->start + b->len - 1; in assemble_code_blocks()
832 zend_op *op = op_array->opcodes + b->start; in assemble_code_blocks()
851 memcpy(opline, op_array->opcodes + b->start, b->len * sizeof(zend_op)); in assemble_code_blocks()
858 efree(op_array->opcodes); in assemble_code_blocks()
859 op_array->opcodes = new_opcodes; in assemble_code_blocks()
860 op_array->last = len; in assemble_code_blocks()
866 opline = op_array->opcodes + b->start + b->len - 1; in assemble_code_blocks()
901 if (op_array->last_try_catch) { in assemble_code_blocks()
906 map = (uint32_t *)do_alloca(sizeof(uint32_t) * op_array->last_try_catch, use_heap); in assemble_code_blocks()
907 for (i = 0, j = 0; i< op_array->last_try_catch; i++) { in assemble_code_blocks()
908 if (blocks[cfg->map[op_array->try_catch_array[i].try_op]].flags & ZEND_BB_REACHABLE) { in assemble_code_blocks()
910op_array->try_catch_array[j].try_op = blocks[cfg->map[op_array->try_catch_array[i].try_op]].start; in assemble_code_blocks()
911 if (op_array->try_catch_array[i].catch_op) { in assemble_code_blocks()
912op_array->try_catch_array[j].catch_op = blocks[cfg->map[op_array->try_catch_array[i].catch_op]].st… in assemble_code_blocks()
914 op_array->try_catch_array[j].catch_op = 0; in assemble_code_blocks()
916 if (op_array->try_catch_array[i].finally_op) { in assemble_code_blocks()
917op_array->try_catch_array[j].finally_op = blocks[cfg->map[op_array->try_catch_array[i].finally_op]… in assemble_code_blocks()
919 op_array->try_catch_array[j].finally_op = 0; in assemble_code_blocks()
921 if (!op_array->try_catch_array[i].finally_end) { in assemble_code_blocks()
922 op_array->try_catch_array[j].finally_end = 0; in assemble_code_blocks()
924op_array->try_catch_array[j].finally_end = blocks[cfg->map[op_array->try_catch_array[i].finally_en… in assemble_code_blocks()
930 op_array->last_try_catch = j; in assemble_code_blocks()
932 efree(op_array->try_catch_array); in assemble_code_blocks()
933 op_array->try_catch_array = NULL; in assemble_code_blocks()
936 if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) { in assemble_code_blocks()
953 if (op_array->last_live_range) { in assemble_code_blocks()
958 map = (uint32_t *)do_alloca(sizeof(uint32_t) * op_array->last_live_range, use_heap); in assemble_code_blocks()
960 for (i = 0, j = 0; i < op_array->last_live_range; i++) { in assemble_code_blocks()
961 if (op_array->live_range[i].var == (uint32_t)-1) { in assemble_code_blocks()
965 if (!(blocks[cfg->map[op_array->live_range[i].start]].flags & ZEND_BB_REACHABLE)) { in assemble_code_blocks()
966 ZEND_ASSERT(!(blocks[cfg->map[op_array->live_range[i].end]].flags & ZEND_BB_REACHABLE)); in assemble_code_blocks()
968 uint32_t start_op = blocks[cfg->map[op_array->live_range[i].start]].start; in assemble_code_blocks()
969 uint32_t end_op = blocks[cfg->map[op_array->live_range[i].end]].start; in assemble_code_blocks()
975 op_array->live_range[i].start = start_op; in assemble_code_blocks()
976 op_array->live_range[i].end = end_op; in assemble_code_blocks()
979 op_array->live_range[j] = op_array->live_range[i]; in assemble_code_blocks()
986 if ((op_array->last_live_range = j)) { in assemble_code_blocks()
998 efree(op_array->live_range); in assemble_code_blocks()
999 op_array->live_range = NULL; in assemble_code_blocks()
1006 if (op_array->early_binding != (uint32_t)-1) { in assemble_code_blocks()
1007 uint32_t *opline_num = &op_array->early_binding; in assemble_code_blocks()
1010 opline = op_array->opcodes; in assemble_code_blocks()
1011 end = opline + op_array->last; in assemble_code_blocks()
1014 *opline_num = opline - op_array->opcodes; in assemble_code_blocks()
1023 memset(cfg->map, -1, sizeof(int) * op_array->last); in assemble_code_blocks()
1031 static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_array, zend_cfg *cfg, … in zend_jmp_optimization() argument
1041 last_op = op_array->opcodes + block->start + block->len - 1; in zend_jmp_optimization()
1046 zend_op *target = op_array->opcodes + target_block->start; in zend_jmp_optimization()
1076 last_op->op1.constant = zend_optimizer_add_literal(op_array, &zv); in zend_jmp_optimization()
1086 !(op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK)) { in zend_jmp_optimization()
1092 last_op->op1.constant = zend_optimizer_add_literal(op_array, &zv); in zend_jmp_optimization()
1100 op_array->last_try_catch == 0 && in zend_jmp_optimization()
1203 target = op_array->opcodes + target_block->start; in zend_jmp_optimization()
1272 target = op_array->opcodes + target_block->start; in zend_jmp_optimization()
1273 target_end = op_array->opcodes + target_block->start + 1; in zend_jmp_optimization()
1329 int var_num = op_array->last_var + op_array->T; in zend_jmp_optimization()
1339 target = op_array->opcodes + target_block->start; in zend_jmp_optimization()
1462 target = op_array->opcodes + target_block->start; in zend_jmp_optimization()
1506 static void zend_t_usage(zend_cfg *cfg, zend_op_array *op_array, zend_bitset used_ext, zend_optimiz… in zend_t_usage() argument
1518 if (op_array->T == 0) { in zend_t_usage()
1524 bitset_len = zend_bitset_len(op_array->last_var + op_array->T); in zend_t_usage()
1535 opline = op_array->opcodes + block->start; in zend_t_usage()
1591 for (i = op_array->last_var; i< op_array->T; i++) { in zend_t_usage()
1615 end = op_array->opcodes + block->start; in zend_t_usage()
1729 static void zend_merge_blocks(zend_op_array *op_array, zend_cfg *cfg) in zend_merge_blocks() argument
1743 zend_op *last_op = op_array->opcodes + prev->start + prev->len - 1; in zend_merge_blocks()
1749 zend_op *op = op_array->opcodes + bb->start; in zend_merge_blocks()
1785 void zend_optimize_cfg(zend_op_array *op_array, zend_optimizer_ctx *ctx) in zend_optimize_cfg() argument
1798 if (zend_build_cfg(&ctx->arena, op_array, ZEND_CFG_SPLIT_AT_LIVE_RANGES, &cfg, NULL) != SUCCESS) { in zend_optimize_cfg()
1803 if (cfg.blocks_count * (op_array->last_var + op_array->T) > 64 * 1024 * 1024) { in zend_optimize_cfg()
1809 zend_dump_op_array(op_array, ZEND_DUMP_CFG, "before block pass", &cfg); in zend_optimize_cfg()
1812 if (op_array->last_var || op_array->T) { in zend_optimize_cfg()
1813 bitset_len = zend_bitset_len(op_array->last_var + op_array->T); in zend_optimize_cfg()
1814 Tsource = zend_arena_calloc(&ctx->arena, op_array->last_var + op_array->T, sizeof(zend_op *)); in zend_optimize_cfg()
1815 same_t = zend_arena_alloc(&ctx->arena, op_array->last_var + op_array->T); in zend_optimize_cfg()
1828 zend_t_usage(&cfg, op_array, usage, ctx); in zend_optimize_cfg()
1839 memset(Tsource, 0, (op_array->last_var + op_array->T) * sizeof(zend_op *)); in zend_optimize_cfg()
1841 zend_optimize_block(b, op_array, usage, &cfg, Tsource); in zend_optimize_cfg()
1847 strip_nops(op_array, b); in zend_optimize_cfg()
1854 zend_jmp_optimization(b, op_array, &cfg, same_t); in zend_optimize_cfg()
1859 zend_cfg_remark_reachable_blocks(op_array, &cfg); in zend_optimize_cfg()
1862 zend_merge_blocks(op_array, &cfg); in zend_optimize_cfg()
1866 zend_t_usage(&cfg, op_array, usage, ctx); in zend_optimize_cfg()
1867 assemble_code_blocks(&cfg, op_array); in zend_optimize_cfg()
1870 …zend_dump_op_array(op_array, ZEND_DUMP_CFG | ZEND_DUMP_HIDE_UNREACHABLE, "after block pass", &cfg); in zend_optimize_cfg()