Lines Matching refs:op_array

67 int zend_optimizer_lookup_cv(zend_op_array *op_array, zend_string* name)  in zend_optimizer_lookup_cv()  argument
72 while (i < op_array->last_var) { in zend_optimizer_lookup_cv()
73 if (op_array->vars[i] == name || in zend_optimizer_lookup_cv()
74 (ZSTR_H(op_array->vars[i]) == hash_value && in zend_optimizer_lookup_cv()
75 ZSTR_LEN(op_array->vars[i]) == ZSTR_LEN(name) && in zend_optimizer_lookup_cv()
76 memcmp(ZSTR_VAL(op_array->vars[i]), ZSTR_VAL(name), ZSTR_LEN(name)) == 0)) { in zend_optimizer_lookup_cv()
81 i = op_array->last_var; in zend_optimizer_lookup_cv()
82 op_array->last_var++; in zend_optimizer_lookup_cv()
83 op_array->vars = erealloc(op_array->vars, op_array->last_var * sizeof(zend_string*)); in zend_optimizer_lookup_cv()
84 op_array->vars[i] = zend_string_dup(name, 0); in zend_optimizer_lookup_cv()
88 zend_op *opline = op_array->opcodes; in zend_optimizer_lookup_cv()
89 zend_op *end = opline + op_array->last; in zend_optimizer_lookup_cv()
107 int zend_optimizer_add_literal(zend_op_array *op_array, zval *zv) in zend_optimizer_add_literal() argument
109 int i = op_array->last_literal; in zend_optimizer_add_literal()
110 op_array->last_literal++; in zend_optimizer_add_literal()
111 op_array->literals = (zval*)erealloc(op_array->literals, op_array->last_literal * sizeof(zval)); in zend_optimizer_add_literal()
112 ZVAL_COPY_VALUE(&op_array->literals[i], zv); in zend_optimizer_add_literal()
113 Z_CACHE_SLOT(op_array->literals[i]) = -1; in zend_optimizer_add_literal()
117 static inline int zend_optimizer_add_literal_string(zend_op_array *op_array, zend_string *str) { in zend_optimizer_add_literal_string() argument
121 return zend_optimizer_add_literal(op_array, &zv); in zend_optimizer_add_literal_string()
139 static inline void alloc_cache_slots_op1(zend_op_array *op_array, zend_op *opline, uint32_t num) { in alloc_cache_slots_op1() argument
140 Z_CACHE_SLOT(op_array->literals[opline->op1.constant]) = op_array->cache_size; in alloc_cache_slots_op1()
141 op_array->cache_size += num * sizeof(void *); in alloc_cache_slots_op1()
143 static inline void alloc_cache_slots_op2(zend_op_array *op_array, zend_op *opline, uint32_t num) { in alloc_cache_slots_op2() argument
144 Z_CACHE_SLOT(op_array->literals[opline->op2.constant]) = op_array->cache_size; in alloc_cache_slots_op2()
145 op_array->cache_size += num * sizeof(void *); in alloc_cache_slots_op2()
163 int zend_optimizer_update_op1_const(zend_op_array *op_array, in zend_optimizer_update_op1_const() argument
180 opline->op1.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op1_const()
181 alloc_cache_slots_op1(op_array, opline, 1); in zend_optimizer_update_op1_const()
182 zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); in zend_optimizer_update_op1_const()
191 opline->op1.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op1_const()
192 alloc_cache_slots_op1(op_array, opline, 2); in zend_optimizer_update_op1_const()
196 opline->op1.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op1_const()
219 opline->op1.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op1_const()
230 int zend_optimizer_update_op2_const(zend_op_array *op_array, in zend_optimizer_update_op2_const() argument
255 opline->op2.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op2_const()
256 zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); in zend_optimizer_update_op2_const()
257 alloc_cache_slots_op2(op_array, opline, 1); in zend_optimizer_update_op2_const()
262 opline->op2.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op2_const()
263 alloc_cache_slots_op2(op_array, opline, 1); in zend_optimizer_update_op2_const()
281 opline->op2.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op2_const()
282 zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); in zend_optimizer_update_op2_const()
283 alloc_cache_slots_op2(op_array, opline, 1); in zend_optimizer_update_op2_const()
285 opline->op2.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op2_const()
291 opline->op2.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op2_const()
292 zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); in zend_optimizer_update_op2_const()
293 alloc_cache_slots_op2(op_array, opline, 2); in zend_optimizer_update_op2_const()
310 opline->op2.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op2_const()
311 alloc_cache_slots_op2(op_array, opline, 2); in zend_optimizer_update_op2_const()
327 opline->op2.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op2_const()
328 alloc_cache_slots_op2(op_array, opline, 2); in zend_optimizer_update_op2_const()
330 opline->op2.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op2_const()
352 opline->op2.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op2_const()
362 opline->op2.constant = zend_optimizer_add_literal(op_array, val); in zend_optimizer_update_op2_const()
373 void zend_optimizer_remove_live_range(zend_op_array *op_array, uint32_t var) in zend_optimizer_remove_live_range() argument
375 if (op_array->last_live_range) { in zend_optimizer_remove_live_range()
381 map = (uint32_t *)do_alloca(sizeof(uint32_t) * op_array->last_live_range, use_heap); in zend_optimizer_remove_live_range()
384 if ((op_array->live_range[i].var & ~ZEND_LIVE_MASK) != var) { in zend_optimizer_remove_live_range()
387 op_array->live_range[j] = op_array->live_range[i]; in zend_optimizer_remove_live_range()
392 } while (i < op_array->last_live_range); in zend_optimizer_remove_live_range()
394 if ((op_array->last_live_range = j)) { in zend_optimizer_remove_live_range()
395 zend_op *opline = op_array->opcodes; in zend_optimizer_remove_live_range()
396 zend_op *end = opline + op_array->last; in zend_optimizer_remove_live_range()
406 efree(op_array->live_range); in zend_optimizer_remove_live_range()
407 op_array->live_range = NULL; in zend_optimizer_remove_live_range()
414 int zend_optimizer_replace_by_const(zend_op_array *op_array, in zend_optimizer_replace_by_const() argument
420 zend_op *end = op_array->opcodes + op_array->last; in zend_optimizer_replace_by_const()
464 zend_optimizer_update_op1_const(op_array, m, val); in zend_optimizer_replace_by_const()
470 zend_optimizer_remove_live_range(op_array, var); in zend_optimizer_replace_by_const()
476 int brk = op_array->last_live_range; in zend_optimizer_replace_by_const()
479 if (op_array->live_range[brk].start <= (uint32_t)(opline - op_array->opcodes) && in zend_optimizer_replace_by_const()
480 op_array->live_range[brk].end > (uint32_t)(opline - op_array->opcodes)) { in zend_optimizer_replace_by_const()
494 n = op_array->opcodes + op_array->live_range[brk].end; in zend_optimizer_replace_by_const()
499 n = op_array->opcodes + op_array->last; in zend_optimizer_replace_by_const()
508 zend_optimizer_update_op1_const(op_array, m, val); in zend_optimizer_replace_by_const()
519 zend_optimizer_remove_live_range(op_array, var); in zend_optimizer_replace_by_const()
523 zend_arg_info *ret_info = op_array->arg_info - 1; in zend_optimizer_replace_by_const()
527 || (op_array->fn_flags & ZEND_ACC_RETURN_REFERENCE)) { in zend_optimizer_replace_by_const()
544 if (zend_optimizer_update_op1_const(op_array, opline, val)) { in zend_optimizer_replace_by_const()
545 zend_optimizer_remove_live_range(op_array, var); in zend_optimizer_replace_by_const()
553 if (zend_optimizer_update_op2_const(op_array, opline, val)) { in zend_optimizer_replace_by_const()
554 zend_optimizer_remove_live_range(op_array, var); in zend_optimizer_replace_by_const()
566 zend_script *script, zend_op_array *op_array, zend_op *opline, zend_bool rt_constants) { in get_class_entry_from_op1() argument
568 zval *op1 = CRT_CONSTANT_EX(op_array, opline->op1, rt_constants); in get_class_entry_from_op1()
579 ce->info.user.filename == op_array->filename) { in get_class_entry_from_op1()
584 } else if (opline->op1_type == IS_UNUSED && op_array->scope in get_class_entry_from_op1()
585 && !(op_array->scope->ce_flags & ZEND_ACC_TRAIT) in get_class_entry_from_op1()
587 return op_array->scope; in get_class_entry_from_op1()
593 zend_script *script, zend_op_array *op_array, zend_op *opline, zend_bool rt_constants) in zend_optimizer_get_called_func() argument
595 #define GET_OP(op) CRT_CONSTANT_EX(op_array, opline->op, rt_constants) in zend_optimizer_get_called_func()
607 func->op_array.filename && in zend_optimizer_get_called_func()
608 func->op_array.filename == op_array->filename) { in zend_optimizer_get_called_func()
625 func->op_array.filename && in zend_optimizer_get_called_func()
626 func->op_array.filename == op_array->filename) { in zend_optimizer_get_called_func()
635 script, op_array, opline, rt_constants); in zend_optimizer_get_called_func()
645 && op_array->scope && !(op_array->scope->ce_flags & ZEND_ACC_TRAIT)) { in zend_optimizer_get_called_func()
648 &op_array->scope->function_table, method_name); in zend_optimizer_get_called_func()
652 zend_bool same_scope = fbc->common.scope == op_array->scope; in zend_optimizer_get_called_func()
663 script, op_array, opline, rt_constants); in zend_optimizer_get_called_func()
698 static void zend_optimize(zend_op_array *op_array, in zend_optimize() argument
701 if (op_array->type == ZEND_EVAL_CODE) { in zend_optimize()
706 zend_dump_op_array(op_array, 0, "before optimizer", NULL); in zend_optimize()
717 zend_optimizer_pass1(op_array, ctx); in zend_optimize()
719 zend_dump_op_array(op_array, 0, "after pass 1", NULL); in zend_optimize()
728 zend_optimizer_pass2(op_array); in zend_optimize()
730 zend_dump_op_array(op_array, 0, "after pass 2", NULL); in zend_optimize()
740 zend_optimizer_pass3(op_array); in zend_optimize()
742 zend_dump_op_array(op_array, 0, "after pass 3", NULL); in zend_optimize()
750 zend_optimize_func_calls(op_array, ctx); in zend_optimize()
752 zend_dump_op_array(op_array, 0, "after pass 4", NULL); in zend_optimize()
760 zend_optimize_cfg(op_array, ctx); in zend_optimize()
762 zend_dump_op_array(op_array, 0, "after pass 5", NULL); in zend_optimize()
772 zend_optimize_dfa(op_array, ctx); in zend_optimize()
774 zend_dump_op_array(op_array, 0, "after pass 6", NULL); in zend_optimize()
783 zend_optimize_temporary_variables(op_array, ctx); in zend_optimize()
785 zend_dump_op_array(op_array, 0, "after pass 9", NULL); in zend_optimize()
793 zend_optimizer_nop_removal(op_array); in zend_optimize()
795 zend_dump_op_array(op_array, 0, "after pass 10", NULL); in zend_optimize()
803 zend_optimizer_compact_literals(op_array, ctx); in zend_optimize()
805 zend_dump_op_array(op_array, 0, "after pass 11", NULL); in zend_optimize()
810 zend_dump_op_array(op_array, 0, "after optimizer", NULL); in zend_optimize()
814 static void zend_revert_pass_two(zend_op_array *op_array) in zend_revert_pass_two() argument
818 opline = op_array->opcodes; in zend_revert_pass_two()
819 end = opline + op_array->last; in zend_revert_pass_two()
822 ZEND_PASS_TWO_UNDO_CONSTANT(op_array, opline->op1); in zend_revert_pass_two()
825 ZEND_PASS_TWO_UNDO_CONSTANT(op_array, opline->op2); in zend_revert_pass_two()
831 static void zend_redo_pass_two(zend_op_array *op_array) in zend_redo_pass_two() argument
835 opline = op_array->opcodes; in zend_redo_pass_two()
836 end = opline + op_array->last; in zend_redo_pass_two()
839 ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline->op1); in zend_redo_pass_two()
842 ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline->op2); in zend_redo_pass_two()
850 static void zend_redo_pass_two_ex(zend_op_array *op_array, zend_ssa *ssa) in zend_redo_pass_two_ex() argument
854 opline = op_array->opcodes; in zend_redo_pass_two_ex()
855 end = opline + op_array->last; in zend_redo_pass_two_ex()
864 …((ssa->ops[opline - op_array->opcodes].op1_def >= 0) ? (OP1_DEF_INFO() & (MAY_BE_UNDEF|MAY_BE_ANY|… in zend_redo_pass_two_ex()
867 ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline->op1); in zend_redo_pass_two_ex()
870 ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline->op2); in zend_redo_pass_two_ex()
877 static void zend_optimize_op_array(zend_op_array *op_array, in zend_optimize_op_array() argument
881 zend_revert_pass_two(op_array); in zend_optimize_op_array()
884 zend_optimize(op_array, ctx); in zend_optimize_op_array()
887 zend_redo_pass_two(op_array); in zend_optimize_op_array()
890 static void zend_adjust_fcall_stack_size(zend_op_array *op_array, zend_optimizer_ctx *ctx) in zend_adjust_fcall_stack_size() argument
895 opline = op_array->opcodes; in zend_adjust_fcall_stack_size()
896 end = opline + op_array->last; in zend_adjust_fcall_stack_size()
901 Z_STR_P(RT_CONSTANT(op_array, opline->op2))); in zend_adjust_fcall_stack_size()
911 static void zend_adjust_fcall_stack_size_graph(zend_op_array *op_array) in zend_adjust_fcall_stack_size_graph() argument
913 zend_func_info *func_info = ZEND_FUNC_INFO(op_array); in zend_adjust_fcall_stack_size_graph()
933 zend_op_array *op_array; in zend_optimize_script() local
948 ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) { in zend_optimize_script()
949 zend_optimize_op_array(op_array, &ctx); in zend_optimize_script()
953 ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) { in zend_optimize_script()
954 if (op_array->scope == ce) { in zend_optimize_script()
955 zend_optimize_op_array(op_array, &ctx); in zend_optimize_script()
956 } else if (op_array->type == ZEND_USER_FUNCTION) { in zend_optimize_script()
958 if ((orig_op_array = zend_hash_find_ptr(&op_array->scope->function_table, name)) != NULL) { in zend_optimize_script()
959 HashTable *ht = op_array->static_variables; in zend_optimize_script()
960 *op_array = *orig_op_array; in zend_optimize_script()
961 op_array->static_variables = ht; in zend_optimize_script()
1031 ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) { in zend_optimize_script()
1032 if (op_array->scope != ce) { in zend_optimize_script()
1034 if ((orig_op_array = zend_hash_find_ptr(&op_array->scope->function_table, name)) != NULL) { in zend_optimize_script()
1035 HashTable *ht = op_array->static_variables; in zend_optimize_script()
1036 *op_array = *orig_op_array; in zend_optimize_script()
1037 op_array->static_variables = ht; in zend_optimize_script()
1050 ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) { in zend_optimize_script()
1051 zend_adjust_fcall_stack_size(op_array, &ctx); in zend_optimize_script()
1055 ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) { in zend_optimize_script()
1056 if (op_array->scope == ce) { in zend_optimize_script()
1057 zend_adjust_fcall_stack_size(op_array, &ctx); in zend_optimize_script()
1058 } else if (op_array->type == ZEND_USER_FUNCTION) { in zend_optimize_script()
1060 if ((orig_op_array = zend_hash_find_ptr(&op_array->scope->function_table, name)) != NULL) { in zend_optimize_script()
1061 HashTable *ht = op_array->static_variables; in zend_optimize_script()
1062 *op_array = *orig_op_array; in zend_optimize_script()
1063 op_array->static_variables = ht; in zend_optimize_script()