Lines Matching refs:ssa

77 		if (!ssa->vars[var2].no_val) { \
79 zend_ssa_check_scc_var(op_array, ssa, var2, index, dfs, root, stack); \
81 if (ssa->vars[var2].scc < 0 && dfs[root[var]] >= dfs[root[var2]]) { \
89 if (ssa->vars[var2].scc != ssa->vars[var].scc) { \
90 ssa->vars[var2].scc_entry = 1; \
96 if (ssa->vars[_var].scc == scc) { \
103 if (ssa->vars[_var].scc == scc && \
111 if (ssa->ops[line].op1_def >= 0) { \
112 MACRO(ssa->ops[line].op1_def); \
114 if (ssa->ops[line].op2_def >= 0) { \
115 MACRO(ssa->ops[line].op2_def); \
117 if (ssa->ops[line].result_def >= 0) { \
118 MACRO(ssa->ops[line].result_def); \
121 if (ssa->ops[line-1].op1_def >= 0) { \
122 MACRO(ssa->ops[line-1].op1_def); \
124 if (ssa->ops[line-1].op2_def >= 0) { \
125 MACRO(ssa->ops[line-1].op2_def); \
127 if (ssa->ops[line-1].result_def >= 0) { \
128 MACRO(ssa->ops[line-1].result_def); \
132 if (ssa->ops[line+1].op1_def >= 0) { \
133 MACRO(ssa->ops[line+1].op1_def); \
135 if (ssa->ops[line+1].op2_def >= 0) { \
136 MACRO(ssa->ops[line+1].op2_def); \
138 if (ssa->ops[line+1].result_def >= 0) { \
139 MACRO(ssa->ops[line+1].result_def); \
147 zend_ssa_phi *p = ssa->vars[_var].phi_use_chain; \
148 int use = ssa->vars[_var].use_chain; \
151 use = zend_ssa_next_use(ssa->ops, _var, use); \
153 p = ssa->vars[_var].phi_use_chain; \
156 p = zend_ssa_next_use_phi(ssa, _var, p); \
171 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
185 p = ssa->vars[var].sym_use_chain; in zend_ssa_check_scc_var()
193 ssa->vars[var].scc = ssa->sccs; in zend_ssa_check_scc_var()
200 ssa->vars[var2].scc = ssa->sccs; in zend_ssa_check_scc_var()
202 ssa->sccs++; in zend_ssa_check_scc_var()
209 int zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ in zend_ssa_find_sccs() argument
218 dfs = do_alloca(sizeof(int) * ssa->vars_count, dfs_use_heap); in zend_ssa_find_sccs()
219 memset(dfs, -1, sizeof(int) * ssa->vars_count); in zend_ssa_find_sccs()
220 root = do_alloca(sizeof(int) * ssa->vars_count, root_use_heap); in zend_ssa_find_sccs()
221 ZEND_WORKLIST_STACK_ALLOCA(&stack, ssa->vars_count, stack_use_heap); in zend_ssa_find_sccs()
224 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_find_sccs()
225 if (!ssa->vars[j].no_val && dfs[j] < 0) { in zend_ssa_find_sccs()
226 zend_ssa_check_scc_var(op_array, ssa, j, &index, dfs, root, &stack); in zend_ssa_find_sccs()
231 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_find_sccs()
232 if (ssa->vars[j].scc >= 0) { in zend_ssa_find_sccs()
233 ssa->vars[j].scc = ssa->sccs - (ssa->vars[j].scc + 1); in zend_ssa_find_sccs()
237 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_find_sccs()
238 if (ssa->vars[j].scc >= 0) { in zend_ssa_find_sccs()
241 ssa->vars[j].scc_entry = 1; in zend_ssa_find_sccs()
267 int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ in zend_ssa_find_false_dependencies() argument
269 zend_ssa_var *ssa_vars = ssa->vars; in zend_ssa_find_false_dependencies()
270 zend_ssa_op *ssa_ops = ssa->ops; in zend_ssa_find_false_dependencies()
271 int ssa_vars_count = ssa->vars_count; in zend_ssa_find_false_dependencies()
277 if (!op_array->function_name || !ssa->vars || !ssa->ops) { in zend_ssa_find_false_dependencies()
286 use = ssa->vars[i].use_chain; in zend_ssa_find_false_dependencies()
288 if (!is_no_val_use(&op_array->opcodes[use], &ssa->ops[use], i)) { in zend_ssa_find_false_dependencies()
307 for (j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { in zend_ssa_find_false_dependencies()
308 if (p->sources[j] >= 0 && ssa->vars[p->sources[j]].no_val) { in zend_ssa_find_false_dependencies()
546 const zend_op_array *op_array, zend_ssa *ssa, in zend_inference_calc_binary_op_range() argument
781 int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int var, int widening, … in zend_inference_calc_range() argument
787 if (ssa->vars[var].definition_phi) { in zend_inference_calc_range()
788 zend_ssa_phi *p = ssa->vars[var].definition_phi; in zend_inference_calc_range()
798 if (ssa->var_info[p->sources[0]].has_range) { in zend_inference_calc_range()
799 *tmp = ssa->var_info[p->sources[0]].range; in zend_inference_calc_range()
810 ssa->var_info[p->ssa_var].has_range) { in zend_inference_calc_range()
814 ssa->var_info[p->ssa_var].range.min, in zend_inference_calc_range()
815 ssa->var_info[p->ssa_var].range.max, in zend_inference_calc_range()
831 } else if (ssa->var_info[p->sources[0]].has_range) { in zend_inference_calc_range()
833 *tmp = ssa->var_info[p->sources[0]].range; in zend_inference_calc_range()
838 } else if (narrowing && ssa->var_info[constraint->min_ssa_var].has_range) { in zend_inference_calc_range()
839 tmp->underflow = ssa->var_info[constraint->min_ssa_var].range.underflow && tmp->underflow; in zend_inference_calc_range()
840 … if (!add_will_overflow(ssa->var_info[constraint->min_ssa_var].range.min, constraint->range.min)) { in zend_inference_calc_range()
841 …tmp->min = MAX(ssa->var_info[constraint->min_ssa_var].range.min + constraint->range.min, tmp->min); in zend_inference_calc_range()
849 } else if (narrowing && ssa->var_info[constraint->max_ssa_var].has_range) { in zend_inference_calc_range()
850 … if (!add_will_overflow(ssa->var_info[constraint->max_ssa_var].range.max, constraint->range.max)) { in zend_inference_calc_range()
851 …tmp->max = MIN(ssa->var_info[constraint->max_ssa_var].range.max + constraint->range.max, tmp->max); in zend_inference_calc_range()
853 tmp->overflow = ssa->var_info[constraint->max_ssa_var].range.overflow && tmp->overflow; in zend_inference_calc_range()
861 } else if (narrowing && ssa->var_info[constraint->min_ssa_var].has_range) { in zend_inference_calc_range()
862 … if (add_will_overflow(ssa->var_info[constraint->min_ssa_var].range.min, constraint->range.min)) { in zend_inference_calc_range()
866 tmp->underflow = ssa->var_info[constraint->min_ssa_var].range.underflow; in zend_inference_calc_range()
867 tmp->min = ssa->var_info[constraint->min_ssa_var].range.min + constraint->range.min; in zend_inference_calc_range()
878 } else if (narrowing && ssa->var_info[constraint->max_ssa_var].has_range) { in zend_inference_calc_range()
879 … if (add_will_overflow(ssa->var_info[constraint->max_ssa_var].range.max, constraint->range.max)) { in zend_inference_calc_range()
883 tmp->max = ssa->var_info[constraint->max_ssa_var].range.max + constraint->range.max; in zend_inference_calc_range()
884 tmp->overflow = ssa->var_info[constraint->max_ssa_var].range.overflow; in zend_inference_calc_range()
893 for (i = 0; i < ssa->cfg.blocks[p->block].predecessors_count; i++) { in zend_inference_calc_range()
894 if (p->sources[i] >= 0 && ssa->var_info[p->sources[i]].has_range) { in zend_inference_calc_range()
896 tmp->underflow |= ssa->var_info[p->sources[i]].range.underflow; in zend_inference_calc_range()
897 tmp->min = MIN(tmp->min, ssa->var_info[p->sources[i]].range.min); in zend_inference_calc_range()
898 tmp->max = MAX(tmp->max, ssa->var_info[p->sources[i]].range.max); in zend_inference_calc_range()
899 tmp->overflow |= ssa->var_info[p->sources[i]].range.overflow; in zend_inference_calc_range()
909 } else if (ssa->vars[var].definition < 0) { in zend_inference_calc_range()
921 line = ssa->vars[var].definition; in zend_inference_calc_range()
937 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
939 op_array, ssa, opline, &ssa->ops[line], opline->opcode, tmp); in zend_inference_calc_range()
944 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
961 if (ssa->ops[line].op1_def == var) { in zend_inference_calc_range()
962 if (ssa->ops[line].op1_def >= 0) { in zend_inference_calc_range()
971 } else if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1004 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1019 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1034 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1063 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1084 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1104 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1122 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1142 if (ssa->ops[line].op1_def == var) { in zend_inference_calc_range()
1143 if (ssa->ops[line].op1_def >= 0) { in zend_inference_calc_range()
1153 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1164 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1171 if (ssa->ops[line].op1_def == var) { in zend_inference_calc_range()
1172 if (ssa->ops[line].op1_def >= 0) { in zend_inference_calc_range()
1184 if (ssa->ops[line].op1_def == var || ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1203 if (ssa->ops[line].op1_def == var || ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1222 if (ssa->ops[line].op1_def == var || ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1228 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1244 if (ssa->ops[line].op1_def == var || ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1250 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1267 if (ssa->ops[line].op1_def == var) { in zend_inference_calc_range()
1280 …if (ssa->ops[line].op1_def == var || ssa->ops[line].op2_def == var || ssa->ops[line].result_def ==… in zend_inference_calc_range()
1292 if (ssa->ops[line+1].op1_def == var) { in zend_inference_calc_range()
1314 if (ssa->ops[line].op1_def == var || ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1316 op_array, ssa, opline, &ssa->ops[line], in zend_inference_calc_range()
1320 if (ssa->ops[line+1].op1_def == var) { in zend_inference_calc_range()
1339 if (ssa->ops[line].op1_def == var) { in zend_inference_calc_range()
1353 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1380 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1397 if (ssa->ops[line].result_def == var) { in zend_inference_calc_range()
1419 type = zend_get_func_info(call_info, ssa); in zend_inference_calc_range()
1446 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
1454 ssa->var_info[var].has_range = 1; in zend_inference_init_range()
1455 ssa->var_info[var].range.underflow = underflow; in zend_inference_init_range()
1456 ssa->var_info[var].range.min = min; in zend_inference_init_range()
1457 ssa->var_info[var].range.max = max; in zend_inference_init_range()
1458 ssa->var_info[var].range.overflow = overflow; in zend_inference_init_range()
1459 …LOG_SSA_RANGE(" change range (init SCC %2d) %2d [%s%ld..%ld%s]\n", ssa->vars[var].scc, var, … in zend_inference_init_range()
1490 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
1494 if (zend_inference_calc_range(op_array, ssa, var, 1, 0, &tmp)) { in zend_ssa_range_widening()
1495 if (zend_inference_widening_meet(&ssa->var_info[var], &tmp)) { in zend_ssa_range_widening()
1535 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
1539 if (zend_inference_calc_range(op_array, ssa, var, 0, 1, &tmp)) { in zend_ssa_range_narrowing()
1540 if (zend_inference_narrowing_meet(&ssa->var_info[var], &tmp)) { in zend_ssa_range_narrowing()
1551 if (ssa->vars[var2].scc == ssa->vars[var].scc && \
1552 !ssa->vars[var2].scc_entry && \
1554 zend_check_inner_cycles(op_array, ssa, worklist, visited, var2)) { \
1559 static int zend_check_inner_cycles(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset workli… in zend_check_inner_cycles() argument
1571 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
1573 int worklist_len = zend_bitset_len(ssa->vars_count); in zend_infer_ranges_warmup()
1587 zend_check_inner_cycles(op_array, ssa, worklist, visited, j)) { in zend_infer_ranges_warmup()
1600 if (ssa->vars[j].scc_entry) { in zend_infer_ranges_warmup()
1609 if (zend_inference_calc_range(op_array, ssa, j, 0, 0, &tmp)) { in zend_infer_ranges_warmup()
1612 ssa->var_info[j].has_range && in zend_infer_ranges_warmup()
1613 ssa->vars[j].definition_phi && in zend_infer_ranges_warmup()
1614 ssa->vars[j].definition_phi->pi >= 0 && in zend_infer_ranges_warmup()
1615 ssa->vars[j].definition_phi->has_range_constraint && in zend_infer_ranges_warmup()
1616 ssa->vars[j].definition_phi->constraint.range.negative && in zend_infer_ranges_warmup()
1617 ssa->vars[j].definition_phi->constraint.range.min_ssa_var < 0 && in zend_infer_ranges_warmup()
1618 ssa->vars[j].definition_phi->constraint.range.max_ssa_var < 0) { in zend_infer_ranges_warmup()
1620 &ssa->vars[j].definition_phi->constraint.range; in zend_infer_ranges_warmup()
1621 if (tmp.min == ssa->var_info[j].range.min && in zend_infer_ranges_warmup()
1622 tmp.max == ssa->var_info[j].range.max) { in zend_infer_ranges_warmup()
1627 } else if (tmp.min == ssa->var_info[j].range.min && in zend_infer_ranges_warmup()
1628 tmp.max == ssa->var_info[j].range.max + 1 && in zend_infer_ranges_warmup()
1639 } else if (tmp.max == ssa->var_info[j].range.max && in zend_infer_ranges_warmup()
1640 tmp.min == ssa->var_info[j].range.min - 1 && in zend_infer_ranges_warmup()
1657 if (zend_inference_narrowing_meet(&ssa->var_info[j], &tmp)) { in zend_infer_ranges_warmup()
1668 static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ in zend_infer_ranges() argument
1670 int worklist_len = zend_bitset_len(ssa->vars_count); in zend_infer_ranges()
1681 ZEND_MM_ALIGNED_SIZE(sizeof(int) * ssa->vars_count) + in zend_infer_ranges()
1682 sizeof(int) * ssa->sccs, use_heap); in zend_infer_ranges()
1684 scc_var = (int*)((char*)next_scc_var + ZEND_MM_ALIGNED_SIZE(sizeof(int) * ssa->vars_count)); in zend_infer_ranges()
1689 memset(scc_var, -1, sizeof(int) * ssa->sccs); in zend_infer_ranges()
1690 for (j = 0; j < ssa->vars_count; j++) { in zend_infer_ranges()
1691 if (ssa->vars[j].scc >= 0) { in zend_infer_ranges()
1692 next_scc_var[j] = scc_var[ssa->vars[j].scc]; in zend_infer_ranges()
1693 scc_var[ssa->vars[j].scc] = j; in zend_infer_ranges()
1697 for (scc = 0; scc < ssa->sccs; scc++) { in zend_infer_ranges()
1701 if (zend_inference_calc_range(op_array, ssa, j, 0, 1, &tmp)) { in zend_infer_ranges()
1702 zend_inference_init_range(op_array, ssa, j, tmp.underflow, tmp.min, tmp.max, tmp.overflow); in zend_infer_ranges()
1704 zend_inference_init_range(op_array, ssa, j, 1, ZEND_LONG_MIN, ZEND_LONG_MAX, 1); in zend_infer_ranges()
1710 if (ssa->vars[j].scc_entry) { in zend_infer_ranges()
1717 zend_infer_ranges_warmup(op_array, ssa, scc_var, next_scc_var, scc); in zend_infer_ranges()
1727 if (zend_ssa_range_widening(op_array, ssa, j, scc)) { in zend_infer_ranges()
1734 if (!ssa->var_info[j].has_range) { in zend_infer_ranges()
1735 zend_inference_init_range(op_array, ssa, j, 1, ZEND_LONG_MIN, ZEND_LONG_MAX, 1); in zend_infer_ranges()
1736 } else if (ssa->vars[j].definition_phi && in zend_infer_ranges()
1737 ssa->vars[j].definition_phi->pi < 0) { in zend_infer_ranges()
1739 zend_ssa_range_narrowing(op_array, ssa, j, scc); in zend_infer_ranges()
1746 if (zend_ssa_range_narrowing(op_array, ssa, j, scc)) { in zend_infer_ranges()
1750 p = ssa->vars[j].sym_use_chain; in zend_infer_ranges()
1786 handle_type_narrowing(op_array, ssa, worklist, \
1791 add_usages(op_array, ssa, worklist, __var); \
1804 add_usages(op_array, ssa, worklist, var); \
1820 static void add_usages(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset worklist, int var) in add_usages() argument
1822 if (ssa->vars[var].phi_use_chain) { in add_usages()
1823 zend_ssa_phi *p = ssa->vars[var].phi_use_chain; in add_usages()
1826 p = zend_ssa_next_use_phi(ssa, var, p); in add_usages()
1829 if (ssa->vars[var].use_chain >= 0) { in add_usages()
1830 int use = ssa->vars[var].use_chain; in add_usages()
1834 op = ssa->ops + use; in add_usages()
1856 use = zend_ssa_next_use(ssa->ops, var, use); in add_usages()
1861 static void reset_dependent_vars(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset worklist… in reset_dependent_vars() argument
1863 zend_ssa_op *ssa_ops = ssa->ops; in reset_dependent_vars()
1864 zend_ssa_var *ssa_vars = ssa->vars; in reset_dependent_vars()
1865 zend_ssa_var_info *ssa_var_info = ssa->var_info; in reset_dependent_vars()
1874 reset_dependent_vars(op_array, ssa, worklist, p->ssa_var); in reset_dependent_vars()
1876 p = zend_ssa_next_use_phi(ssa, var, p); in reset_dependent_vars()
1883 reset_dependent_vars(op_array, ssa, worklist, ssa_ops[use].op1_def); in reset_dependent_vars()
1888 reset_dependent_vars(op_array, ssa, worklist, ssa_ops[use].op2_def); in reset_dependent_vars()
1893 reset_dependent_vars(op_array, ssa, worklist, ssa_ops[use].result_def); in reset_dependent_vars()
1899 reset_dependent_vars(op_array, ssa, worklist, ssa_ops[use+1].op1_def); in reset_dependent_vars()
1904 reset_dependent_vars(op_array, ssa, worklist, ssa_ops[use+1].op2_def); in reset_dependent_vars()
1909 reset_dependent_vars(op_array, ssa, worklist, ssa_ops[use+1].result_def); in reset_dependent_vars()
1916 p = ssa->vars[var].sym_use_chain; in reset_dependent_vars()
1920 reset_dependent_vars(op_array, ssa, worklist, p->ssa_var); in reset_dependent_vars()
1926 static void handle_type_narrowing(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset worklis… in handle_type_narrowing() argument
1930 int def_op_num = ssa->vars[var].definition; in handle_type_narrowing()
1940 reset_dependent_vars(op_array, ssa, worklist, var); in handle_type_narrowing()
2031 zend_ssa *ssa, zend_uchar opcode, uint32_t t1, uint32_t t2, uint32_t result_var) { in binary_op_result_type() argument
2038 if (!ssa->var_info[result_var].has_range || in binary_op_result_type()
2039 ssa->var_info[result_var].range.underflow || in binary_op_result_type()
2040 ssa->var_info[result_var].range.overflow) { in binary_op_result_type()
2064 if (!ssa->var_info[result_var].has_range || in binary_op_result_type()
2065 ssa->var_info[result_var].range.underflow || in binary_op_result_type()
2066 ssa->var_info[result_var].range.overflow) { in binary_op_result_type()
2166 zend_ssa *ssa, in zend_update_type_info() argument
2174 zend_ssa_op *ssa_ops = ssa->ops; in zend_update_type_info()
2175 zend_ssa_var *ssa_vars = ssa->vars; in zend_update_type_info()
2176 zend_ssa_var_info *ssa_var_info = ssa->var_info; in zend_update_type_info()
2219 tmp = binary_op_result_type(ssa, opline->opcode, t1, t2, ssa_ops[i].result_def); in zend_update_type_info()
2368 ssa, get_compound_assign_op(opline->opcode), t1, t2, ssa_ops[i].op1_def); in zend_update_type_info()
2776 Z_CONSTANT_P(CRT_CONSTANT_EX(op_array, opline->op2, ssa->rt_constants))) { in zend_update_type_info()
2824 …d_ptr(&script->class_table, Z_STR_P(CRT_CONSTANT_EX(op_array, opline->op1, ssa->rt_constants)))) !… in zend_update_type_info()
2852 zval *zv = CRT_CONSTANT_EX(op_array, opline->op2, ssa->rt_constants); in zend_update_type_info()
2866 …(ce = get_class_entry(script, Z_STR_P(CRT_CONSTANT_EX(op_array, opline->op1, ssa->rt_constants)+1)… in zend_update_type_info()
3207 tmp = zend_get_func_info(call_info, ssa) & ~FUNC_MAY_WARN; in zend_update_type_info()
3333 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
3335 zend_basic_block *blocks = ssa->cfg.blocks; in zend_infer_types_ex()
3336 zend_ssa_var *ssa_vars = ssa->vars; in zend_infer_types_ex()
3337 zend_ssa_var_info *ssa_var_info = ssa->var_info; in zend_infer_types_ex()
3338 int ssa_vars_count = ssa->vars_count; in zend_infer_types_ex()
3350 tmp = get_ssa_var_info(ssa, p->sources[0]); in zend_infer_types_ex()
3377 tmp |= get_ssa_var_info(ssa, p->sources[i]); in zend_infer_types_ex()
3399 if (zend_update_type_info(op_array, ssa, script, worklist, i) == FAILURE) { in zend_infer_types_ex()
3446 const zend_op_array *op_array, zend_ssa *ssa, int var_num, in can_convert_to_double() argument
3448 zend_ssa_var *var = &ssa->vars[var_num]; in can_convert_to_double()
3458 for (use = var->use_chain; use >= 0; use = zend_ssa_next_use(ssa->ops, var_num, use)) { in can_convert_to_double()
3460 zend_ssa_op *ssa_op = &ssa->ops[use]; in can_convert_to_double()
3471 type = ssa->var_info[ssa_op->result_def].type; in can_convert_to_double()
3499 zval *zv = CRT_CONSTANT_EX(op_array, opline->op1, ssa->rt_constants); in can_convert_to_double()
3512 zval *zv = CRT_CONSTANT_EX(op_array, opline->op2, ssa->rt_constants); in can_convert_to_double()
3550 if (!can_convert_to_double(op_array, ssa, ssa_op->result_def, &orig_result, visited)) { in can_convert_to_double()
3556 for (phi = var->phi_use_chain; phi; phi = zend_ssa_next_use_phi(ssa, var_num, phi)) { in can_convert_to_double()
3558 type = ssa->var_info[phi->ssa_var].type; in can_convert_to_double()
3563 if (!can_convert_to_double(op_array, ssa, phi->ssa_var, value, visited)) { in can_convert_to_double()
3571 …ic int zend_type_narrowing(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa) in zend_type_narrowing() argument
3573 uint32_t bitset_len = zend_bitset_len(ssa->vars_count); in zend_type_narrowing()
3585 for (v = op_array->last_var; v < ssa->vars_count; v++) { in zend_type_narrowing()
3586 if ((ssa->var_info[v].type & (MAY_BE_REF | MAY_BE_ANY | MAY_BE_UNDEF)) != MAY_BE_LONG) continue; in zend_type_narrowing()
3587 if (ssa->vars[v].definition < 0) continue; in zend_type_narrowing()
3588 if (ssa->vars[v].no_val) continue; in zend_type_narrowing()
3589 opline = op_array->opcodes + ssa->vars[v].definition; in zend_type_narrowing()
3594 zval *value = CRT_CONSTANT_EX(op_array, opline->op2, ssa->rt_constants); in zend_type_narrowing()
3597 if (can_convert_to_double(op_array, ssa, v, value, visited)) { in zend_type_narrowing()
3599 ssa->var_info[v].use_as_double = 1; in zend_type_narrowing()
3603 ssa->var_info[i].type &= ~MAY_BE_ANY; in zend_type_narrowing()
3615 if (zend_infer_types_ex(op_array, script, ssa, worklist) != SUCCESS) { in zend_type_narrowing()
3629 if (info->ssa.ops && info->ssa.vars && info->call_map && in is_recursive_tail_call()
3630 info->ssa.ops[opline - op_array->opcodes].op1_use >= 0 && in is_recursive_tail_call()
3631 info->ssa.vars[info->ssa.ops[opline - op_array->opcodes].op1_use].definition >= 0) { in is_recursive_tail_call()
3633 …zend_op *op = op_array->opcodes + info->ssa.vars[info->ssa.ops[opline - op_array->opcodes].op1_use… in is_recursive_tail_call()
3670 zend_ssa *ssa = &info->ssa; in zend_func_return_info() local
3671 int blocks_count = info->ssa.cfg.blocks_count; in zend_func_return_info()
3672 zend_basic_block *blocks = info->ssa.cfg.blocks; in zend_func_return_info()
3698 info->ssa.ops && in zend_func_return_info()
3699 info->ssa.var_info && in zend_func_return_info()
3700 info->ssa.ops[opline - op_array->opcodes].op1_use >= 0 && in zend_func_return_info()
3701 info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].recursive) { in zend_func_return_info()
3722 if (info->ssa.ops && in zend_func_return_info()
3723 info->ssa.var_info && in zend_func_return_info()
3724 info->ssa.ops[opline - op_array->opcodes].op1_use >= 0 && in zend_func_return_info()
3725 info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].ce) { in zend_func_return_info()
3726 arg_ce = info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].ce; in zend_func_return_info()
3727 …arg_is_instanceof = info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].is_insta… in zend_func_return_info()
3746 zval *zv = CRT_CONSTANT_EX(op_array, opline->op1, info->ssa.rt_constants); in zend_func_return_info()
3811 } else if (info->ssa.ops && in zend_func_return_info()
3812 info->ssa.var_info && in zend_func_return_info()
3813 info->ssa.ops[opline - op_array->opcodes].op1_use >= 0) { in zend_func_return_info()
3814 if (info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].has_range) { in zend_func_return_info()
3817 tmp_range = info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].range; in zend_func_return_info()
3820 if (info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].range.underflow) { in zend_func_return_info()
3824 …tmp_range.min = MIN(tmp_range.min, info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op… in zend_func_return_info()
3826 if (info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op1_use].range.overflow) { in zend_func_return_info()
3830 …tmp_range.max = MAX(tmp_range.max, info->ssa.var_info[info->ssa.ops[opline - op_array->opcodes].op… in zend_func_return_info()
3863 static int zend_infer_types(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa) in zend_infer_types() argument
3865 zend_ssa_var_info *ssa_var_info = ssa->var_info; in zend_infer_types()
3866 int ssa_vars_count = ssa->vars_count; in zend_infer_types()
3880 if (zend_infer_types_ex(op_array, script, ssa, worklist) != SUCCESS) { in zend_infer_types()
3886 zend_type_narrowing(op_array, script, ssa); in zend_infer_types()
3893 if (ssa->vars[i].var == j) { in zend_infer_types()
3900 if (ssa->vars[i].var == j) { in zend_infer_types()
3915 …d_arena **arena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa) /* {{{ */ in zend_ssa_inference() argument
3920 if (!ssa->var_info) { in zend_ssa_inference()
3921 ssa->var_info = zend_arena_calloc(arena, ssa->vars_count, sizeof(zend_ssa_var_info)); in zend_ssa_inference()
3923 ssa_var_info = ssa->var_info; in zend_ssa_inference()
3936 for (i = op_array->last_var; i < ssa->vars_count; i++) { in zend_ssa_inference()
3941 if (zend_infer_ranges(op_array, ssa) != SUCCESS) { in zend_ssa_inference()
3945 if (zend_infer_types(op_array, script, ssa) != SUCCESS) { in zend_ssa_inference()
3961 if (!info->ssa.var_info || !(info->flags & ZEND_FUNC_RECURSIVE)) { in zend_inference_check_recursive_dependencies()
3964 worklist_len = zend_bitset_len(info->ssa.vars_count); in zend_inference_check_recursive_dependencies()
3970 info->ssa.ops[call_info->caller_call_opline - op_array->opcodes].result_def >= 0) { in zend_inference_check_recursive_dependencies()
3971 …zend_bitset_incl(worklist, info->ssa.ops[call_info->caller_call_opline - op_array->opcodes].result… in zend_inference_check_recursive_dependencies()
3976 if (!info->ssa.var_info[i].recursive) { in zend_inference_check_recursive_dependencies()
3977 info->ssa.var_info[i].recursive = 1; in zend_inference_check_recursive_dependencies()
3978 add_usages(op_array, &info->ssa, worklist, i); in zend_inference_check_recursive_dependencies()