Lines Matching refs:ssa

78 		if (!ssa->vars[var2].no_val) { \
80 zend_ssa_check_scc_var(op_array, ssa, var2, index, dfs, root, stack); \
82 if (ssa->vars[var2].scc < 0 && dfs[root[var]] >= dfs[root[var2]]) { \
90 if (ssa->vars[var2].scc != ssa->vars[var].scc) { \
91 ssa->vars[var2].scc_entry = 1; \
97 if (ssa->vars[_var].scc == scc) { \
104 if (ssa->vars[_var].scc == scc && \
112 if (ssa->ops[line].op1_def >= 0) { \
113 MACRO(ssa->ops[line].op1_def); \
115 if (ssa->ops[line].op2_def >= 0) { \
116 MACRO(ssa->ops[line].op2_def); \
118 if (ssa->ops[line].result_def >= 0) { \
119 MACRO(ssa->ops[line].result_def); \
122 if (ssa->ops[line-1].op1_def >= 0) { \
123 MACRO(ssa->ops[line-1].op1_def); \
125 if (ssa->ops[line-1].op2_def >= 0) { \
126 MACRO(ssa->ops[line-1].op2_def); \
128 if (ssa->ops[line-1].result_def >= 0) { \
129 MACRO(ssa->ops[line-1].result_def); \
133 if (ssa->ops[line+1].op1_def >= 0) { \
134 MACRO(ssa->ops[line+1].op1_def); \
136 if (ssa->ops[line+1].op2_def >= 0) { \
137 MACRO(ssa->ops[line+1].op2_def); \
139 if (ssa->ops[line+1].result_def >= 0) { \
140 MACRO(ssa->ops[line+1].result_def); \
148 zend_ssa_phi *p = ssa->vars[_var].phi_use_chain; \
149 int use = ssa->vars[_var].use_chain; \
152 use = zend_ssa_next_use(ssa->ops, _var, use); \
154 p = ssa->vars[_var].phi_use_chain; \
157 p = zend_ssa_next_use_phi(ssa, _var, p); \
172 static void zend_ssa_check_scc_var(const zend_op_array *op_array, zend_ssa *ssa, int var, int *inde… in zend_ssa_check_scc_var() argument
186 p = ssa->vars[var].sym_use_chain; in zend_ssa_check_scc_var()
194 ssa->vars[var].scc = ssa->sccs; in zend_ssa_check_scc_var()
201 ssa->vars[var2].scc = ssa->sccs; in zend_ssa_check_scc_var()
203 ssa->sccs++; in zend_ssa_check_scc_var()
210 int zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ in zend_ssa_find_sccs() argument
219 dfs = do_alloca(sizeof(int) * ssa->vars_count, dfs_use_heap); in zend_ssa_find_sccs()
220 memset(dfs, -1, sizeof(int) * ssa->vars_count); in zend_ssa_find_sccs()
221 root = do_alloca(sizeof(int) * ssa->vars_count, root_use_heap); in zend_ssa_find_sccs()
222 ZEND_WORKLIST_STACK_ALLOCA(&stack, ssa->vars_count, stack_use_heap); in zend_ssa_find_sccs()
225 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_find_sccs()
226 if (!ssa->vars[j].no_val && dfs[j] < 0) { in zend_ssa_find_sccs()
227 zend_ssa_check_scc_var(op_array, ssa, j, &index, dfs, root, &stack); in zend_ssa_find_sccs()
232 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_find_sccs()
233 if (ssa->vars[j].scc >= 0) { in zend_ssa_find_sccs()
234 ssa->vars[j].scc = ssa->sccs - (ssa->vars[j].scc + 1); in zend_ssa_find_sccs()
238 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_find_sccs()
239 if (ssa->vars[j].scc >= 0) { in zend_ssa_find_sccs()
242 ssa->vars[j].scc_entry = 1; in zend_ssa_find_sccs()
256 int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ in zend_ssa_find_false_dependencies() argument
258 zend_ssa_var *ssa_vars = ssa->vars; in zend_ssa_find_false_dependencies()
259 zend_ssa_op *ssa_ops = ssa->ops; in zend_ssa_find_false_dependencies()
260 int ssa_vars_count = ssa->vars_count; in zend_ssa_find_false_dependencies()
266 if (!op_array->function_name || !ssa->vars || !ssa->ops) { in zend_ssa_find_false_dependencies()
275 use = ssa->vars[i].use_chain; in zend_ssa_find_false_dependencies()
277 if (!zend_ssa_is_no_val_use(&op_array->opcodes[use], &ssa->ops[use], i)) { in zend_ssa_find_false_dependencies()
296 for (j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { in zend_ssa_find_false_dependencies()
298 if (ssa->vars[p->sources[j]].no_val) { in zend_ssa_find_false_dependencies()
552 const zend_op_array *op_array, zend_ssa *ssa, in zend_inference_calc_binary_op_range() argument
841 int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int var, int widening, … in zend_inference_calc_range() argument
847 if (ssa->vars[var].definition_phi) { in zend_inference_calc_range()
848 zend_ssa_phi *p = ssa->vars[var].definition_phi; in zend_inference_calc_range()
858 if (ssa->var_info[p->sources[0]].has_range) { in zend_inference_calc_range()
859 *tmp = ssa->var_info[p->sources[0]].range; in zend_inference_calc_range()
870 ssa->var_info[p->ssa_var].has_range) { in zend_inference_calc_range()
874 ssa->var_info[p->ssa_var].range.min, in zend_inference_calc_range()
875 ssa->var_info[p->ssa_var].range.max, in zend_inference_calc_range()
891 } else if (ssa->var_info[p->sources[0]].has_range) { in zend_inference_calc_range()
893 *tmp = ssa->var_info[p->sources[0]].range; in zend_inference_calc_range()
898 } else if (narrowing && ssa->var_info[constraint->min_ssa_var].has_range) { in zend_inference_calc_range()
899 tmp->underflow = ssa->var_info[constraint->min_ssa_var].range.underflow && tmp->underflow; in zend_inference_calc_range()
900 … if (!add_will_overflow(ssa->var_info[constraint->min_ssa_var].range.min, constraint->range.min)) { in zend_inference_calc_range()
901 …tmp->min = MAX(ssa->var_info[constraint->min_ssa_var].range.min + constraint->range.min, tmp->min); in zend_inference_calc_range()
909 } else if (narrowing && ssa->var_info[constraint->max_ssa_var].has_range) { in zend_inference_calc_range()
910 … if (!add_will_overflow(ssa->var_info[constraint->max_ssa_var].range.max, constraint->range.max)) { in zend_inference_calc_range()
911 …tmp->max = MIN(ssa->var_info[constraint->max_ssa_var].range.max + constraint->range.max, tmp->max); in zend_inference_calc_range()
913 tmp->overflow = ssa->var_info[constraint->max_ssa_var].range.overflow && tmp->overflow; in zend_inference_calc_range()
921 } else if (narrowing && ssa->var_info[constraint->min_ssa_var].has_range) { in zend_inference_calc_range()
922 … if (add_will_overflow(ssa->var_info[constraint->min_ssa_var].range.min, constraint->range.min)) { in zend_inference_calc_range()
926 tmp->underflow = ssa->var_info[constraint->min_ssa_var].range.underflow; in zend_inference_calc_range()
927 tmp->min = ssa->var_info[constraint->min_ssa_var].range.min + constraint->range.min; in zend_inference_calc_range()
938 } else if (narrowing && ssa->var_info[constraint->max_ssa_var].has_range) { in zend_inference_calc_range()
939 … if (add_will_overflow(ssa->var_info[constraint->max_ssa_var].range.max, constraint->range.max)) { in zend_inference_calc_range()
943 tmp->max = ssa->var_info[constraint->max_ssa_var].range.max + constraint->range.max; in zend_inference_calc_range()
944 tmp->overflow = ssa->var_info[constraint->max_ssa_var].range.overflow; in zend_inference_calc_range()
953 for (i = 0; i < ssa->cfg.blocks[p->block].predecessors_count; i++) { in zend_inference_calc_range()
955 if (ssa->var_info[p->sources[i]].has_range) { in zend_inference_calc_range()
957 tmp->underflow |= ssa->var_info[p->sources[i]].range.underflow; in zend_inference_calc_range()
958 tmp->min = MIN(tmp->min, ssa->var_info[p->sources[i]].range.min); in zend_inference_calc_range()
959 tmp->max = MAX(tmp->max, ssa->var_info[p->sources[i]].range.max); in zend_inference_calc_range()
960 tmp->overflow |= ssa->var_info[p->sources[i]].range.overflow; in zend_inference_calc_range()
970 } else if (ssa->vars[var].definition < 0) { in zend_inference_calc_range()
982 line = ssa->vars[var].definition; in zend_inference_calc_range()
998 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1000 op_array, ssa, opline, &ssa->ops[line], opline->opcode, tmp); in zend_inference_calc_range()
1005 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1022 if (ssa->ops[line].op1_def == var) { in zend_inference_calc_range()
1023 if (ssa->ops[line].op1_def >= 0) { in zend_inference_calc_range()
1032 } else if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1065 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1080 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1095 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1124 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1145 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1165 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1183 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1204 if (ssa->ops[line].op1_def == var) { in zend_inference_calc_range()
1205 if (ssa->ops[line].op1_def >= 0) { in zend_inference_calc_range()
1215 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1226 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1233 if (ssa->ops[line].op1_def == var) { in zend_inference_calc_range()
1234 if (ssa->ops[line].op1_def >= 0) { in zend_inference_calc_range()
1246 if (ssa->ops[line].op1_def == var || ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1265 if (ssa->ops[line].op1_def == var || ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1284 if (ssa->ops[line].op1_def == var || ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1290 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1306 if (ssa->ops[line].op1_def == var || ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1312 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1329 if (ssa->ops[line].op1_def == var) { in zend_inference_calc_range()
1342 …if (ssa->ops[line].op1_def == var || ssa->ops[line].op2_def == var || ssa->ops[line].result_def ==… in zend_inference_calc_range()
1354 if (ssa->ops[line+1].op1_def == var) { in zend_inference_calc_range()
1368 if (ssa->ops[line].op1_def == var || ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1370 op_array, ssa, opline, &ssa->ops[line], in zend_inference_calc_range()
1379 if (ssa->ops[line+1].op1_def == var) { in zend_inference_calc_range()
1398 if (ssa->ops[line].op1_def == var) { in zend_inference_calc_range()
1412 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1439 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1465 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1487 type = zend_get_func_info(call_info, ssa); in zend_inference_calc_range()
1514 void zend_inference_init_range(const zend_op_array *op_array, zend_ssa *ssa, int var, zend_bool und… in zend_inference_init_range() argument
1522 ssa->var_info[var].has_range = 1; in zend_inference_init_range()
1523 ssa->var_info[var].range.underflow = underflow; in zend_inference_init_range()
1524 ssa->var_info[var].range.min = min; in zend_inference_init_range()
1525 ssa->var_info[var].range.max = max; in zend_inference_init_range()
1526 ssa->var_info[var].range.overflow = overflow; in zend_inference_init_range()
1527 …LOG_SSA_RANGE(" change range (init SCC %2d) %2d [%s%ld..%ld%s]\n", ssa->vars[var].scc, var, … in zend_inference_init_range()
1558 static int zend_ssa_range_widening(const zend_op_array *op_array, zend_ssa *ssa, int var, int scc) in zend_ssa_range_widening() argument
1562 if (zend_inference_calc_range(op_array, ssa, var, 1, 0, &tmp)) { in zend_ssa_range_widening()
1563 if (zend_inference_widening_meet(&ssa->var_info[var], &tmp)) { in zend_ssa_range_widening()
1603 static int zend_ssa_range_narrowing(const zend_op_array *op_array, zend_ssa *ssa, int var, int scc) in zend_ssa_range_narrowing() argument
1607 if (zend_inference_calc_range(op_array, ssa, var, 0, 1, &tmp)) { in zend_ssa_range_narrowing()
1608 if (zend_inference_narrowing_meet(&ssa->var_info[var], &tmp)) { in zend_ssa_range_narrowing()
1619 if (ssa->vars[var2].scc == ssa->vars[var].scc && \
1620 !ssa->vars[var2].scc_entry && \
1622 zend_check_inner_cycles(op_array, ssa, worklist, visited, var2)) { \
1627 static int zend_check_inner_cycles(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset workli… in zend_check_inner_cycles() argument
1639 static void zend_infer_ranges_warmup(const zend_op_array *op_array, zend_ssa *ssa, int *scc_var, in… in zend_infer_ranges_warmup() argument
1641 int worklist_len = zend_bitset_len(ssa->vars_count); in zend_infer_ranges_warmup()
1655 zend_check_inner_cycles(op_array, ssa, worklist, visited, j)) { in zend_infer_ranges_warmup()
1668 if (ssa->vars[j].scc_entry) { in zend_infer_ranges_warmup()
1677 if (zend_inference_calc_range(op_array, ssa, j, 0, 0, &tmp)) { in zend_infer_ranges_warmup()
1680 ssa->var_info[j].has_range && in zend_infer_ranges_warmup()
1681 ssa->vars[j].definition_phi && in zend_infer_ranges_warmup()
1682 ssa->vars[j].definition_phi->pi >= 0 && in zend_infer_ranges_warmup()
1683 ssa->vars[j].definition_phi->has_range_constraint && in zend_infer_ranges_warmup()
1684 ssa->vars[j].definition_phi->constraint.range.negative && in zend_infer_ranges_warmup()
1685 ssa->vars[j].definition_phi->constraint.range.min_ssa_var < 0 && in zend_infer_ranges_warmup()
1686 ssa->vars[j].definition_phi->constraint.range.max_ssa_var < 0) { in zend_infer_ranges_warmup()
1688 &ssa->vars[j].definition_phi->constraint.range; in zend_infer_ranges_warmup()
1689 if (tmp.min == ssa->var_info[j].range.min && in zend_infer_ranges_warmup()
1690 tmp.max == ssa->var_info[j].range.max) { in zend_infer_ranges_warmup()
1695 } else if (tmp.min == ssa->var_info[j].range.min && in zend_infer_ranges_warmup()
1696 tmp.max == ssa->var_info[j].range.max + 1 && in zend_infer_ranges_warmup()
1707 } else if (tmp.max == ssa->var_info[j].range.max && in zend_infer_ranges_warmup()
1708 tmp.min == ssa->var_info[j].range.min - 1 && in zend_infer_ranges_warmup()
1725 if (zend_inference_narrowing_meet(&ssa->var_info[j], &tmp)) { in zend_infer_ranges_warmup()
1736 static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ in zend_infer_ranges() argument
1738 int worklist_len = zend_bitset_len(ssa->vars_count); in zend_infer_ranges()
1749 ZEND_MM_ALIGNED_SIZE(sizeof(int) * ssa->vars_count) + in zend_infer_ranges()
1750 sizeof(int) * ssa->sccs, use_heap); in zend_infer_ranges()
1752 scc_var = (int*)((char*)next_scc_var + ZEND_MM_ALIGNED_SIZE(sizeof(int) * ssa->vars_count)); in zend_infer_ranges()
1757 memset(scc_var, -1, sizeof(int) * ssa->sccs); in zend_infer_ranges()
1758 for (j = 0; j < ssa->vars_count; j++) { in zend_infer_ranges()
1759 if (ssa->vars[j].scc >= 0) { in zend_infer_ranges()
1760 next_scc_var[j] = scc_var[ssa->vars[j].scc]; in zend_infer_ranges()
1761 scc_var[ssa->vars[j].scc] = j; in zend_infer_ranges()
1765 for (scc = 0; scc < ssa->sccs; scc++) { in zend_infer_ranges()
1769 if (zend_inference_calc_range(op_array, ssa, j, 0, 1, &tmp)) { in zend_infer_ranges()
1770 zend_inference_init_range(op_array, ssa, j, tmp.underflow, tmp.min, tmp.max, tmp.overflow); in zend_infer_ranges()
1772 zend_inference_init_range(op_array, ssa, j, 1, ZEND_LONG_MIN, ZEND_LONG_MAX, 1); in zend_infer_ranges()
1778 if (ssa->vars[j].scc_entry) { in zend_infer_ranges()
1785 zend_infer_ranges_warmup(op_array, ssa, scc_var, next_scc_var, scc); in zend_infer_ranges()
1795 if (zend_ssa_range_widening(op_array, ssa, j, scc)) { in zend_infer_ranges()
1802 if (!ssa->var_info[j].has_range) { in zend_infer_ranges()
1803 zend_inference_init_range(op_array, ssa, j, 1, ZEND_LONG_MIN, ZEND_LONG_MAX, 1); in zend_infer_ranges()
1810 if (zend_ssa_range_widening(op_array, ssa, j, scc)) { in zend_infer_ranges()
1817 if (ssa->vars[j].definition_phi in zend_infer_ranges()
1818 && ssa->vars[j].definition_phi->pi < 0) { in zend_infer_ranges()
1820 zend_ssa_range_narrowing(op_array, ssa, j, scc); in zend_infer_ranges()
1827 if (zend_ssa_range_narrowing(op_array, ssa, j, scc)) { in zend_infer_ranges()
1831 p = ssa->vars[j].sym_use_chain; in zend_infer_ranges()
1881 handle_type_narrowing(op_array, ssa, worklist, \
1886 add_usages(op_array, ssa, worklist, __var); \
1899 add_usages(op_array, ssa, worklist, var); \
1915 static void add_usages(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset worklist, int var) in add_usages() argument
1917 if (ssa->vars[var].phi_use_chain) { in add_usages()
1918 zend_ssa_phi *p = ssa->vars[var].phi_use_chain; in add_usages()
1921 p = zend_ssa_next_use_phi(ssa, var, p); in add_usages()
1924 if (ssa->vars[var].use_chain >= 0) { in add_usages()
1925 int use = ssa->vars[var].use_chain; in add_usages()
1929 op = ssa->ops + use; in add_usages()
1963 use = zend_ssa_next_use(ssa->ops, var, use); in add_usages()
1968 static void reset_dependent_vars(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset worklist… in reset_dependent_vars() argument
1970 zend_ssa_op *ssa_ops = ssa->ops; in reset_dependent_vars()
1971 zend_ssa_var *ssa_vars = ssa->vars; in reset_dependent_vars()
1972 zend_ssa_var_info *ssa_var_info = ssa->var_info; in reset_dependent_vars()
1981 reset_dependent_vars(op_array, ssa, worklist, p->ssa_var); in reset_dependent_vars()
1983 p = zend_ssa_next_use_phi(ssa, var, p); in reset_dependent_vars()
1990 reset_dependent_vars(op_array, ssa, worklist, ssa_ops[use].op1_def); in reset_dependent_vars()
1995 reset_dependent_vars(op_array, ssa, worklist, ssa_ops[use].op2_def); in reset_dependent_vars()
2000 reset_dependent_vars(op_array, ssa, worklist, ssa_ops[use].result_def); in reset_dependent_vars()
2006 reset_dependent_vars(op_array, ssa, worklist, ssa_ops[use+1].op1_def); in reset_dependent_vars()
2011 reset_dependent_vars(op_array, ssa, worklist, ssa_ops[use+1].op2_def); in reset_dependent_vars()
2016 reset_dependent_vars(op_array, ssa, worklist, ssa_ops[use+1].result_def); in reset_dependent_vars()
2023 p = ssa->vars[var].sym_use_chain; in reset_dependent_vars()
2027 reset_dependent_vars(op_array, ssa, worklist, p->ssa_var); in reset_dependent_vars()
2033 static void handle_type_narrowing(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset worklis… in handle_type_narrowing() argument
2037 int def_op_num = ssa->vars[var].definition; in handle_type_narrowing()
2047 reset_dependent_vars(op_array, ssa, worklist, var); in handle_type_narrowing()
2156 zend_ssa *ssa, zend_uchar opcode, uint32_t t1, uint32_t t2, int result_var, in binary_op_result_type() argument
2175 !ssa->var_info[result_var].has_range || in binary_op_result_type()
2176 ssa->var_info[result_var].range.underflow || in binary_op_result_type()
2177 ssa->var_info[result_var].range.overflow) { in binary_op_result_type()
2202 !ssa->var_info[result_var].has_range || in binary_op_result_type()
2203 ssa->var_info[result_var].range.underflow || in binary_op_result_type()
2204 ssa->var_info[result_var].range.overflow) { in binary_op_result_type()
2335 static zend_property_info *zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ssa, zend_… in zend_fetch_prop_info() argument
2343 } else if (ssa->ops[i].op1_use >= 0) { in zend_fetch_prop_info()
2344 ce = ssa->var_info[ssa->ops[i].op1_use].ce; in zend_fetch_prop_info()
2348 Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants)), in zend_fetch_prop_info()
2358 …prop_info(const zend_script *script, const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline) in zend_fetch_static_prop_info() argument
2379 zval *zv = CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants); in zend_fetch_static_prop_info()
2384 zval *zv = CRT_CONSTANT_EX(op_array, opline, opline->op1, ssa->rt_constants); in zend_fetch_static_prop_info()
2427 zend_ssa *ssa, in zend_update_type_info() argument
2436 zend_ssa_op *ssa_ops = ssa->ops; in zend_update_type_info()
2437 zend_ssa_var *ssa_vars = ssa->vars; in zend_update_type_info()
2438 zend_ssa_var_info *ssa_var_info = ssa->var_info; in zend_update_type_info()
2481 …tmp = binary_op_result_type(ssa, opline->opcode, t1, t2, ssa_ops[i].result_def, optimization_level… in zend_update_type_info()
2622 prop_info = zend_fetch_prop_info(op_array, ssa, opline, i); in zend_update_type_info()
2634 prop_info = zend_fetch_static_prop_info(script, op_array, ssa, opline); in zend_update_type_info()
2644 ssa, opline->extended_value, t1, t2, in zend_update_type_info()
2896 zend_fetch_prop_info(op_array, ssa, opline, i), &ce); in zend_update_type_info()
3146 … Z_TYPE_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants)) == IS_CONSTANT_AST) { in zend_update_type_info()
3191 …cript->class_table, Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op1, ssa->rt_constants)))) !… in zend_update_type_info()
3219 zval *zv = CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants); in zend_update_type_info()
3233 …(ce = get_class_entry(script, Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op1, ssa->rt_const… in zend_update_type_info()
3568 zend_fetch_prop_info(op_array, ssa, opline, i), &ce); in zend_update_type_info()
3585 zend_fetch_static_prop_info(script, op_array, ssa, opline), &ce); in zend_update_type_info()
3609 tmp = zend_get_func_info(call_info, ssa) & ~FUNC_MAY_WARN; in zend_update_type_info()
3758 int zend_infer_types_ex(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, ze… in zend_infer_types_ex() argument
3760 zend_basic_block *blocks = ssa->cfg.blocks; in zend_infer_types_ex()
3761 zend_ssa_var *ssa_vars = ssa->vars; in zend_infer_types_ex()
3762 zend_ssa_var_info *ssa_var_info = ssa->var_info; in zend_infer_types_ex()
3763 int ssa_vars_count = ssa->vars_count; in zend_infer_types_ex()
3775 tmp = get_ssa_var_info(ssa, p->sources[0]); in zend_infer_types_ex()
3805 tmp |= get_ssa_var_info(ssa, p->sources[i]); in zend_infer_types_ex()
3828 if (zend_update_type_info(op_array, ssa, script, worklist, i, optimization_level) == FAILURE) { in zend_infer_types_ex()
3875 const zend_op_array *op_array, zend_ssa *ssa, int var_num, in can_convert_to_double() argument
3877 zend_ssa_var *var = &ssa->vars[var_num]; in can_convert_to_double()
3887 for (use = var->use_chain; use >= 0; use = zend_ssa_next_use(ssa->ops, var_num, use)) { in can_convert_to_double()
3889 zend_ssa_op *ssa_op = &ssa->ops[use]; in can_convert_to_double()
3900 type = ssa->var_info[ssa_op->result_def].type; in can_convert_to_double()
3928 zval *zv = CRT_CONSTANT_EX(op_array, opline, opline->op1, ssa->rt_constants); in can_convert_to_double()
3941 zval *zv = CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants); in can_convert_to_double()
3985 if (!can_convert_to_double(op_array, ssa, ssa_op->result_def, &orig_result, visited)) { in can_convert_to_double()
3991 for (phi = var->phi_use_chain; phi; phi = zend_ssa_next_use_phi(ssa, var_num, phi)) { in can_convert_to_double()
3993 type = ssa->var_info[phi->ssa_var].type; in can_convert_to_double()
3998 if (!can_convert_to_double(op_array, ssa, phi->ssa_var, value, visited)) { in can_convert_to_double()
4006 …rowing(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimiza… in zend_type_narrowing() argument
4008 uint32_t bitset_len = zend_bitset_len(ssa->vars_count); in zend_type_narrowing()
4020 for (v = op_array->last_var; v < ssa->vars_count; v++) { in zend_type_narrowing()
4021 if ((ssa->var_info[v].type & (MAY_BE_REF | MAY_BE_ANY | MAY_BE_UNDEF)) != MAY_BE_LONG) continue; in zend_type_narrowing()
4022 if (ssa->vars[v].definition < 0) continue; in zend_type_narrowing()
4023 if (ssa->vars[v].no_val) continue; in zend_type_narrowing()
4024 opline = op_array->opcodes + ssa->vars[v].definition; in zend_type_narrowing()
4029 zval *value = CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants); in zend_type_narrowing()
4032 if (can_convert_to_double(op_array, ssa, v, value, visited)) { in zend_type_narrowing()
4034 ssa->var_info[v].use_as_double = 1; in zend_type_narrowing()
4038 ssa->var_info[i].type &= ~MAY_BE_ANY; in zend_type_narrowing()
4050 if (zend_infer_types_ex(op_array, script, ssa, worklist, optimization_level) != SUCCESS) { in zend_type_narrowing()
4064 if (info->ssa.ops && info->ssa.vars && info->call_map && in is_recursive_tail_call()
4065 info->ssa.ops[opline - op_array->opcodes].op1_use >= 0 && in is_recursive_tail_call()
4066 info->ssa.vars[info->ssa.ops[opline - op_array->opcodes].op1_use].definition >= 0) { in is_recursive_tail_call()
4068 …zend_op *op = op_array->opcodes + info->ssa.vars[info->ssa.ops[opline - op_array->opcodes].op1_use… in is_recursive_tail_call()
4107 zend_ssa *ssa = &info->ssa; in zend_func_return_info() local
4108 int blocks_count = info->ssa.cfg.blocks_count; in zend_func_return_info()
4109 zend_basic_block *blocks = info->ssa.cfg.blocks; in zend_func_return_info()
4135 info->ssa.ops && in zend_func_return_info()
4136 info->ssa.var_info && in zend_func_return_info()
4137 info->ssa.ops[opline - op_array->opcodes].op1_use >= 0 && in zend_func_return_info()
4138 info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].recursive) { in zend_func_return_info()
4159 if (info->ssa.ops && in zend_func_return_info()
4160 info->ssa.var_info && in zend_func_return_info()
4161 info->ssa.ops[opline - op_array->opcodes].op1_use >= 0 && in zend_func_return_info()
4162 info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].ce) { in zend_func_return_info()
4163 arg_ce = info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].ce; in zend_func_return_info()
4164 …arg_is_instanceof = info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].is_insta… in zend_func_return_info()
4183 zval *zv = CRT_CONSTANT_EX(op_array, opline, opline->op1, info->ssa.rt_constants); in zend_func_return_info()
4248 } else if (info->ssa.ops && in zend_func_return_info()
4249 info->ssa.var_info && in zend_func_return_info()
4250 info->ssa.ops[opline - op_array->opcodes].op1_use >= 0) { in zend_func_return_info()
4251 if (info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].has_range) { in zend_func_return_info()
4254 tmp_range = info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].range; in zend_func_return_info()
4257 if (info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].range.underflow) { in zend_func_return_info()
4261 …tmp_range.min = MIN(tmp_range.min, info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op… in zend_func_return_info()
4263 if (info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].range.overflow) { in zend_func_return_info()
4267 …tmp_range.max = MAX(tmp_range.max, info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op… in zend_func_return_info()
4300 static int zend_infer_types(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa in zend_infer_types() argument
4302 zend_ssa_var_info *ssa_var_info = ssa->var_info; in zend_infer_types()
4303 int ssa_vars_count = ssa->vars_count; in zend_infer_types()
4317 if (zend_infer_types_ex(op_array, script, ssa, worklist, optimization_level) != SUCCESS) { in zend_infer_types()
4323 zend_type_narrowing(op_array, script, ssa, optimization_level); in zend_infer_types()
4333 …arena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimiza… in zend_ssa_inference() argument
4338 if (!ssa->var_info) { in zend_ssa_inference()
4339 ssa->var_info = zend_arena_calloc(arena, ssa->vars_count, sizeof(zend_ssa_var_info)); in zend_ssa_inference()
4341 ssa_var_info = ssa->var_info; in zend_ssa_inference()
4352 if (ssa->vars[i].alias) { in zend_ssa_inference()
4353 ssa_var_info[i].type |= get_ssa_alias_types(ssa->vars[i].alias); in zend_ssa_inference()
4357 for (i = op_array->last_var; i < ssa->vars_count; i++) { in zend_ssa_inference()
4362 if (zend_infer_ranges(op_array, ssa) != SUCCESS) { in zend_ssa_inference()
4366 if (zend_infer_types(op_array, script, ssa, optimization_level) != SUCCESS) { in zend_ssa_inference()
4382 if (!info->ssa.var_info || !(info->flags & ZEND_FUNC_RECURSIVE)) { in zend_inference_check_recursive_dependencies()
4385 worklist_len = zend_bitset_len(info->ssa.vars_count); in zend_inference_check_recursive_dependencies()
4391 info->ssa.ops[call_info->caller_call_opline - op_array->opcodes].result_def >= 0) { in zend_inference_check_recursive_dependencies()
4392 …zend_bitset_incl(worklist, info->ssa.ops[call_info->caller_call_opline - op_array->opcodes].result… in zend_inference_check_recursive_dependencies()
4397 if (!info->ssa.var_info[i].recursive) { in zend_inference_check_recursive_dependencies()
4398 info->ssa.var_info[i].recursive = 1; in zend_inference_check_recursive_dependencies()
4399 add_usages(op_array, &info->ssa, worklist, i); in zend_inference_check_recursive_dependencies()
4405 int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa) in zend_may_throw() argument
4516 return zend_may_throw(opline + 1, op_array, ssa); in zend_may_throw()
4637 if (_ssa_op1_info(op_array, ssa, opline+1) & MAY_BE_UNDEF) { in zend_may_throw()
4647 if (ssa->ops[opline - op_array->opcodes].op1_use) { in zend_may_throw()
4648 zend_ssa_var_info *var_info = ssa->var_info + ssa->ops[opline - op_array->opcodes].op1_use; in zend_may_throw()
4662 Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants))); in zend_may_throw()
4692 …if (Z_TYPE_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants)) == IS_CONSTANT_AST… in zend_may_throw()