Lines Matching refs:ssa

79 		if (!ssa->vars[var2].no_val) { \
80 if (ssa->vars[var2].scc < 0) { \
81 zend_ssa_check_scc_var(op_array, ssa, var2, index, stack); \
83 if (ssa->vars[var2].scc < ssa->vars[var].scc) { \
84 ssa->vars[var].scc = ssa->vars[var2].scc; \
92 if (ssa->vars[var2].scc != ssa->vars[var].scc) { \
93 ssa->vars[var2].scc_entry = 1; \
99 if (ssa->vars[_var].scc == scc && \
100 !(ssa->var_info[_var].type & MAY_BE_REF)) { \
107 if (ssa->vars[_var].scc == scc && \
108 !(ssa->var_info[_var].type & MAY_BE_REF) && \
116 if (ssa->ops[line].op1_def >= 0) { \
117 MACRO(ssa->ops[line].op1_def); \
119 if (ssa->ops[line].op2_def >= 0) { \
120 MACRO(ssa->ops[line].op2_def); \
122 if (ssa->ops[line].result_def >= 0) { \
123 MACRO(ssa->ops[line].result_def); \
126 if (ssa->ops[line-1].op1_def >= 0) { \
127 MACRO(ssa->ops[line-1].op1_def); \
129 if (ssa->ops[line-1].op2_def >= 0) { \
130 MACRO(ssa->ops[line-1].op2_def); \
132 if (ssa->ops[line-1].result_def >= 0) { \
133 MACRO(ssa->ops[line-1].result_def); \
137 if (ssa->ops[line+1].op1_def >= 0) { \
138 MACRO(ssa->ops[line+1].op1_def); \
140 if (ssa->ops[line+1].op2_def >= 0) { \
141 MACRO(ssa->ops[line+1].op2_def); \
143 if (ssa->ops[line+1].result_def >= 0) { \
144 MACRO(ssa->ops[line+1].result_def); \
152 zend_ssa_phi *p = ssa->vars[_var].phi_use_chain; \
153 int use = ssa->vars[_var].use_chain; \
156 use = zend_ssa_next_use(ssa->ops, _var, use); \
158 p = ssa->vars[_var].phi_use_chain; \
161 p = zend_ssa_next_use_phi(ssa, _var, p); \
178 static void zend_ssa_check_scc_var(const zend_op_array *op_array, zend_ssa *ssa, int var, int *inde…
185 ssa->vars[var].scc = *index;
192 p = ssa->vars[var].sym_use_chain;
200 ssa->sccs--;
203 if (ssa->vars[var2].scc < ssa->vars[var].scc) {
207 ssa->vars[var2].scc = ssa->sccs;
210 ssa->vars[var].scc = ssa->sccs;
211 ssa->vars[var].scc_entry = 1;
219 ZEND_API void zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
226 ZEND_WORKLIST_STACK_ALLOCA(&stack, ssa->vars_count, stack_use_heap);
229 ssa->sccs = ssa->vars_count;
230 for (j = 0; j < ssa->vars_count; j++) {
231 if (!ssa->vars[j].no_val && ssa->vars[j].scc < 0) {
232 zend_ssa_check_scc_var(op_array, ssa, j, &index, &stack);
236 if (ssa->sccs) {
238 for (j = 0; j < ssa->vars_count; j++) {
239 if (ssa->vars[j].scc >= 0) {
240 ssa->vars[j].scc -= ssa->sccs;
244 ssa->sccs = ssa->vars_count - ssa->sccs;
246 for (j = 0; j < ssa->vars_count; j++) {
247 if (ssa->vars[j].scc >= 0) {
269 static int zend_scc_next(const zend_op_array *op_array, zend_ssa *ssa, int var, zend_scc_iterator *… in zend_scc_next() argument
292 use = ssa->vars[var].use_chain; in zend_scc_next()
295 var2 = ssa->ops[use].op1_def; in zend_scc_next()
296 if (var2 >= 0 && !ssa->vars[var2].no_val) { in zend_scc_next()
301 var2 = ssa->ops[use].op2_def; in zend_scc_next()
302 if (var2 >= 0 && !ssa->vars[var2].no_val) { in zend_scc_next()
307 var2 = ssa->ops[use].result_def; in zend_scc_next()
308 if (var2 >= 0 && !ssa->vars[var2].no_val) { in zend_scc_next()
314 var2 = ssa->ops[use-1].op1_def; in zend_scc_next()
315 if (var2 >= 0 && !ssa->vars[var2].no_val) { in zend_scc_next()
320 var2 = ssa->ops[use-1].op2_def; in zend_scc_next()
321 if (var2 >= 0 && !ssa->vars[var2].no_val) { in zend_scc_next()
326 var2 = ssa->ops[use-1].result_def; in zend_scc_next()
327 if (var2 >= 0 && !ssa->vars[var2].no_val) { in zend_scc_next()
333 var2 = ssa->ops[use+1].op1_def; in zend_scc_next()
334 if (var2 >= 0 && !ssa->vars[var2].no_val) { in zend_scc_next()
339 var2 = ssa->ops[use+1].op2_def; in zend_scc_next()
340 if (var2 >= 0 && !ssa->vars[var2].no_val) { in zend_scc_next()
345 var2 = ssa->ops[use+1].result_def; in zend_scc_next()
346 if (var2 >= 0 && !ssa->vars[var2].no_val) { in zend_scc_next()
352 use = zend_ssa_next_use(ssa->ops, var, use); in zend_scc_next()
355 phi = ssa->vars[var].phi_use_chain; in zend_scc_next()
358 if (!ssa->vars[var2].no_val) { in zend_scc_next()
364 phi = zend_ssa_next_use_phi(ssa, var, phi); in zend_scc_next()
369 phi = ssa->vars[var].sym_use_chain; in zend_scc_next()
372 if (!ssa->vars[var2].no_val) { in zend_scc_next()
388 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
394 ssa->vars[var].scc_entry = 1; in zend_ssa_check_scc_var()
395 ssa->vars[var].scc = *index; in zend_ssa_check_scc_var()
406 if (ssa->vars[var2].scc < ssa->vars[var].scc) { in zend_ssa_check_scc_var()
407 ssa->vars[var].scc = ssa->vars[var2].scc; in zend_ssa_check_scc_var()
408 ssa->vars[var].scc_entry = 0; in zend_ssa_check_scc_var()
411 var2 = zend_scc_next(op_array, ssa, var, iterators + var); in zend_ssa_check_scc_var()
415 if (ssa->vars[var2].scc < 0) { in zend_ssa_check_scc_var()
423 if (ssa->vars[var].scc_entry) { in zend_ssa_check_scc_var()
424 ssa->sccs--; in zend_ssa_check_scc_var()
427 if (ssa->vars[var2].scc < ssa->vars[var].scc) { in zend_ssa_check_scc_var()
431 ssa->vars[var2].scc = ssa->sccs; in zend_ssa_check_scc_var()
434 ssa->vars[var].scc = ssa->sccs; in zend_ssa_check_scc_var()
443 ZEND_API void zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ in zend_ssa_find_sccs() argument
453 iterators = do_alloca(sizeof(zend_scc_iterator) * ssa->vars_count, iterators_use_heap); in zend_ssa_find_sccs()
454 ZEND_WORKLIST_STACK_ALLOCA(&vstack, ssa->vars_count, vstack_use_heap); in zend_ssa_find_sccs()
455 ZEND_WORKLIST_STACK_ALLOCA(&stack, ssa->vars_count, stack_use_heap); in zend_ssa_find_sccs()
458 ssa->sccs = ssa->vars_count; in zend_ssa_find_sccs()
459 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_find_sccs()
460 if (!ssa->vars[j].no_val && ssa->vars[j].scc < 0) { in zend_ssa_find_sccs()
461 zend_ssa_check_scc_var(op_array, ssa, j, &index, &stack, &vstack, iterators); in zend_ssa_find_sccs()
465 if (ssa->sccs) { in zend_ssa_find_sccs()
467 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_find_sccs()
468 if (ssa->vars[j].scc >= 0) { in zend_ssa_find_sccs()
469 ssa->vars[j].scc -= ssa->sccs; in zend_ssa_find_sccs()
473 ssa->sccs = ssa->vars_count - ssa->sccs; in zend_ssa_find_sccs()
475 for (j = 0; j < ssa->vars_count; j++) { in zend_ssa_find_sccs()
476 if (ssa->vars[j].scc >= 0) { in zend_ssa_find_sccs()
490 ZEND_API void zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa) /* {{{… in zend_ssa_find_false_dependencies() argument
492 zend_ssa_var *ssa_vars = ssa->vars; in zend_ssa_find_false_dependencies()
493 zend_ssa_op *ssa_ops = ssa->ops; in zend_ssa_find_false_dependencies()
494 int ssa_vars_count = ssa->vars_count; in zend_ssa_find_false_dependencies()
500 if (!op_array->function_name || !ssa->vars || !ssa->ops) { in zend_ssa_find_false_dependencies()
509 use = ssa->vars[i].use_chain; in zend_ssa_find_false_dependencies()
511 if (!zend_ssa_is_no_val_use(&op_array->opcodes[use], &ssa->ops[use], i)) { in zend_ssa_find_false_dependencies()
530 for (j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { in zend_ssa_find_false_dependencies()
532 if (ssa->vars[p->sources[j]].no_val) { in zend_ssa_find_false_dependencies()
797 const zend_op_array *op_array, const zend_ssa *ssa, in zend_inference_calc_binary_op_range() argument
1081 static bool zend_inference_calc_range(const zend_op_array *op_array, const zend_ssa *ssa, int var, … in zend_inference_calc_range() argument
1087 if (ssa->vars[var].definition_phi) { in zend_inference_calc_range()
1088 const zend_ssa_phi *p = ssa->vars[var].definition_phi; in zend_inference_calc_range()
1100 if (ssa->var_info[src1].has_range) { in zend_inference_calc_range()
1101 *tmp = ssa->var_info[src1].range; in zend_inference_calc_range()
1107 && ssa->vars[src1].definition >= 0) { in zend_inference_calc_range()
1109 line = ssa->vars[src1].definition; in zend_inference_calc_range()
1115 const zend_ssa_phi *p = ssa->vars[ssa->ops[line].op1_use].definition_phi; in zend_inference_calc_range()
1118 && ssa->cfg.blocks[p->block].predecessors_count == 2 in zend_inference_calc_range()
1120 && ssa->var_info[p->sources[0]].has_range in zend_inference_calc_range()
1121 && ssa->var_info[p->sources[0]].range.min > constraint->range.max) { in zend_inference_calc_range()
1129 const zend_ssa_phi *p = ssa->vars[ssa->ops[line].op1_use].definition_phi; in zend_inference_calc_range()
1132 && ssa->cfg.blocks[p->block].predecessors_count == 2 in zend_inference_calc_range()
1134 && ssa->var_info[p->sources[0]].has_range in zend_inference_calc_range()
1135 && ssa->var_info[p->sources[0]].range.max < constraint->range.min) { in zend_inference_calc_range()
1152 ssa->var_info[p->ssa_var].has_range) { in zend_inference_calc_range()
1156 ssa->var_info[p->ssa_var].range.min, in zend_inference_calc_range()
1157 ssa->var_info[p->ssa_var].range.max, in zend_inference_calc_range()
1173 } else if (ssa->var_info[p->sources[0]].has_range) { in zend_inference_calc_range()
1175 *tmp = ssa->var_info[p->sources[0]].range; in zend_inference_calc_range()
1180 } else if (narrowing && ssa->var_info[constraint->min_ssa_var].has_range) { in zend_inference_calc_range()
1181 tmp->underflow = ssa->var_info[constraint->min_ssa_var].range.underflow && tmp->underflow; in zend_inference_calc_range()
1182 … if (!add_will_overflow(ssa->var_info[constraint->min_ssa_var].range.min, constraint->range.min)) { in zend_inference_calc_range()
1183 …tmp->min = MAX(ssa->var_info[constraint->min_ssa_var].range.min + constraint->range.min, tmp->min); in zend_inference_calc_range()
1191 } else if (narrowing && ssa->var_info[constraint->max_ssa_var].has_range) { in zend_inference_calc_range()
1192 … if (!add_will_overflow(ssa->var_info[constraint->max_ssa_var].range.max, constraint->range.max)) { in zend_inference_calc_range()
1193 …tmp->max = MIN(ssa->var_info[constraint->max_ssa_var].range.max + constraint->range.max, tmp->max); in zend_inference_calc_range()
1195 tmp->overflow = ssa->var_info[constraint->max_ssa_var].range.overflow && tmp->overflow; in zend_inference_calc_range()
1203 } else if (narrowing && ssa->var_info[constraint->min_ssa_var].has_range) { in zend_inference_calc_range()
1204 … if (add_will_overflow(ssa->var_info[constraint->min_ssa_var].range.min, constraint->range.min)) { in zend_inference_calc_range()
1208 tmp->underflow = ssa->var_info[constraint->min_ssa_var].range.underflow; in zend_inference_calc_range()
1209 tmp->min = ssa->var_info[constraint->min_ssa_var].range.min + constraint->range.min; in zend_inference_calc_range()
1220 } else if (narrowing && ssa->var_info[constraint->max_ssa_var].has_range) { in zend_inference_calc_range()
1221 … if (add_will_overflow(ssa->var_info[constraint->max_ssa_var].range.max, constraint->range.max)) { in zend_inference_calc_range()
1225 tmp->max = ssa->var_info[constraint->max_ssa_var].range.max + constraint->range.max; in zend_inference_calc_range()
1226 tmp->overflow = ssa->var_info[constraint->max_ssa_var].range.overflow; in zend_inference_calc_range()
1235 for (i = 0; i < ssa->cfg.blocks[p->block].predecessors_count; i++) { in zend_inference_calc_range()
1237 if (ssa->var_info[p->sources[i]].has_range) { in zend_inference_calc_range()
1239 tmp->underflow |= ssa->var_info[p->sources[i]].range.underflow; in zend_inference_calc_range()
1240 tmp->min = MIN(tmp->min, ssa->var_info[p->sources[i]].range.min); in zend_inference_calc_range()
1241 tmp->max = MAX(tmp->max, ssa->var_info[p->sources[i]].range.max); in zend_inference_calc_range()
1242 tmp->overflow |= ssa->var_info[p->sources[i]].range.overflow; in zend_inference_calc_range()
1252 } else if (ssa->vars[var].definition < 0) { in zend_inference_calc_range()
1255 line = ssa->vars[var].definition; in zend_inference_calc_range()
1257 ssa_op = &ssa->ops[line]; in zend_inference_calc_range()
1259 return zend_inference_propagate_range(op_array, ssa, opline, ssa_op, var, tmp); in zend_inference_calc_range()
1262 ZEND_API bool zend_inference_propagate_range(const zend_op_array *op_array, const zend_ssa *ssa, co… in zend_inference_propagate_range() argument
1279 op_array, ssa, opline, ssa_op, opline->opcode, tmp); in zend_inference_propagate_range()
1493 op_array, ssa, opline, ssa_op, in zend_inference_propagate_range()
1583 type = zend_get_func_info(call_info, ssa); in zend_inference_propagate_range()
1610 static void zend_inference_init_range(const zend_op_array *op_array, zend_ssa *ssa, int var, bool u… in zend_inference_init_range() argument
1618 ssa->var_info[var].has_range = 1; in zend_inference_init_range()
1619 ssa->var_info[var].range.underflow = underflow; in zend_inference_init_range()
1620 ssa->var_info[var].range.min = min; in zend_inference_init_range()
1621 ssa->var_info[var].range.max = max; in zend_inference_init_range()
1622 ssa->var_info[var].range.overflow = overflow; in zend_inference_init_range()
1623 …LOG_SSA_RANGE(" change range (init SCC %2d) %2d [%s%ld..%ld%s]\n", ssa->vars[var].scc, var, … in zend_inference_init_range()
1654 static bool zend_ssa_range_widening(const zend_op_array *op_array, zend_ssa *ssa, int var, int scc) in zend_ssa_range_widening() argument
1658 if (zend_inference_calc_range(op_array, ssa, var, 1, 0, &tmp)) { in zend_ssa_range_widening()
1659 if (zend_inference_widening_meet(&ssa->var_info[var], &tmp)) { in zend_ssa_range_widening()
1699 static bool zend_ssa_range_narrowing(const zend_op_array *op_array, zend_ssa *ssa, int var, int scc) in zend_ssa_range_narrowing() argument
1703 if (zend_inference_calc_range(op_array, ssa, var, 0, 1, &tmp)) { in zend_ssa_range_narrowing()
1704 if (zend_inference_narrowing_meet(&ssa->var_info[var], &tmp)) { in zend_ssa_range_narrowing()
1715 if (ssa->vars[var2].scc == ssa->vars[var].scc && \
1716 !ssa->vars[var2].scc_entry && \
1718 zend_check_inner_cycles(op_array, ssa, worklist, visited, var2)) { \
1723 static bool zend_check_inner_cycles(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset workl… in zend_check_inner_cycles() argument
1735 static void zend_infer_ranges_warmup(const zend_op_array *op_array, zend_ssa *ssa, const int *scc_v… in zend_infer_ranges_warmup() argument
1737 int worklist_len = zend_bitset_len(ssa->vars_count); in zend_infer_ranges_warmup()
1751 zend_check_inner_cycles(op_array, ssa, worklist, visited, j)) { in zend_infer_ranges_warmup()
1764 if (ssa->vars[j].scc_entry in zend_infer_ranges_warmup()
1765 && !(ssa->var_info[j].type & MAY_BE_REF)) { in zend_infer_ranges_warmup()
1774 if (zend_inference_calc_range(op_array, ssa, j, 0, 0, &tmp)) { in zend_infer_ranges_warmup()
1777 ssa->var_info[j].has_range && in zend_infer_ranges_warmup()
1778 ssa->vars[j].definition_phi && in zend_infer_ranges_warmup()
1779 ssa->vars[j].definition_phi->pi >= 0 && in zend_infer_ranges_warmup()
1780 ssa->vars[j].definition_phi->has_range_constraint && in zend_infer_ranges_warmup()
1781 ssa->vars[j].definition_phi->constraint.range.negative && in zend_infer_ranges_warmup()
1782 ssa->vars[j].definition_phi->constraint.range.min_ssa_var < 0 && in zend_infer_ranges_warmup()
1783 ssa->vars[j].definition_phi->constraint.range.max_ssa_var < 0) { in zend_infer_ranges_warmup()
1785 &ssa->vars[j].definition_phi->constraint.range; in zend_infer_ranges_warmup()
1786 if (tmp.min == ssa->var_info[j].range.min && in zend_infer_ranges_warmup()
1787 tmp.max == ssa->var_info[j].range.max) { in zend_infer_ranges_warmup()
1792 } else if (tmp.min == ssa->var_info[j].range.min && in zend_infer_ranges_warmup()
1793 tmp.max == ssa->var_info[j].range.max + 1 && in zend_infer_ranges_warmup()
1804 } else if (tmp.max == ssa->var_info[j].range.max && in zend_infer_ranges_warmup()
1805 tmp.min == ssa->var_info[j].range.min - 1 && in zend_infer_ranges_warmup()
1822 if (zend_inference_narrowing_meet(&ssa->var_info[j], &tmp)) { in zend_infer_ranges_warmup()
1833 static void zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ in zend_infer_ranges() argument
1835 int worklist_len = zend_bitset_len(ssa->vars_count); in zend_infer_ranges()
1846 ZEND_MM_ALIGNED_SIZE(sizeof(int) * ssa->vars_count) + in zend_infer_ranges()
1847 sizeof(int) * ssa->sccs, use_heap); in zend_infer_ranges()
1849 scc_var = (int*)((char*)next_scc_var + ZEND_MM_ALIGNED_SIZE(sizeof(int) * ssa->vars_count)); in zend_infer_ranges()
1854 memset(scc_var, -1, sizeof(int) * ssa->sccs); in zend_infer_ranges()
1855 for (j = 0; j < ssa->vars_count; j++) { in zend_infer_ranges()
1856 if (ssa->vars[j].scc >= 0) { in zend_infer_ranges()
1857 next_scc_var[j] = scc_var[ssa->vars[j].scc]; in zend_infer_ranges()
1858 scc_var[ssa->vars[j].scc] = j; in zend_infer_ranges()
1862 for (scc = 0; scc < ssa->sccs; scc++) { in zend_infer_ranges()
1866 if (ssa->var_info[j].type & MAY_BE_REF) { in zend_infer_ranges()
1868 } else if (zend_inference_calc_range(op_array, ssa, j, 0, 1, &tmp)) { in zend_infer_ranges()
1869 zend_inference_init_range(op_array, ssa, j, tmp.underflow, tmp.min, tmp.max, tmp.overflow); in zend_infer_ranges()
1871 zend_inference_init_range(op_array, ssa, j, 1, ZEND_LONG_MIN, ZEND_LONG_MAX, 1); in zend_infer_ranges()
1877 if (ssa->vars[j].scc_entry in zend_infer_ranges()
1878 && !(ssa->var_info[j].type & MAY_BE_REF)) { in zend_infer_ranges()
1885 zend_infer_ranges_warmup(op_array, ssa, scc_var, next_scc_var, scc); in zend_infer_ranges()
1888 if (!(ssa->var_info[j].type & MAY_BE_REF)) { in zend_infer_ranges()
1897 if (zend_ssa_range_widening(op_array, ssa, j, scc)) { in zend_infer_ranges()
1904 if (!ssa->var_info[j].has_range in zend_infer_ranges()
1905 && !(ssa->var_info[j].type & MAY_BE_REF)) { in zend_infer_ranges()
1906 zend_inference_init_range(op_array, ssa, j, 1, ZEND_LONG_MIN, ZEND_LONG_MAX, 1); in zend_infer_ranges()
1913 if (zend_ssa_range_widening(op_array, ssa, j, scc)) { in zend_infer_ranges()
1920 if (ssa->vars[j].definition_phi in zend_infer_ranges()
1921 && ssa->vars[j].definition_phi->pi < 0 in zend_infer_ranges()
1922 && !(ssa->var_info[j].type & MAY_BE_REF)) { in zend_infer_ranges()
1924 zend_ssa_range_narrowing(op_array, ssa, j, scc); in zend_infer_ranges()
1931 if (zend_ssa_range_narrowing(op_array, ssa, j, scc)) { in zend_infer_ranges()
1935 p = ssa->vars[j].sym_use_chain; in zend_infer_ranges()
1991 emit_type_narrowing_warning(op_array, ssa, __var); \
1996 add_usages(op_array, ssa, worklist, __var); \
2011 add_usages(op_array, ssa, worklist, var); \
2028 static void add_usages(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset worklist, int var) in add_usages() argument
2030 if (ssa->vars[var].phi_use_chain) { in add_usages()
2031 zend_ssa_phi *p = ssa->vars[var].phi_use_chain; in add_usages()
2034 p = zend_ssa_next_use_phi(ssa, var, p); in add_usages()
2037 if (ssa->vars[var].use_chain >= 0) { in add_usages()
2038 int use = ssa->vars[var].use_chain; in add_usages()
2042 op = ssa->ops + use; in add_usages()
2076 use = zend_ssa_next_use(ssa->ops, var, use); in add_usages()
2081 static void emit_type_narrowing_warning(const zend_op_array *op_array, zend_ssa *ssa, int var) in emit_type_narrowing_warning() argument
2083 int def_op_num = ssa->vars[var].definition; in emit_type_narrowing_warning()
2257 zend_ssa *ssa, uint8_t opcode, uint32_t t1, uint32_t t2, int result_var, in binary_op_result_type() argument
2276 !ssa->var_info[result_var].has_range || in binary_op_result_type()
2277 ssa->var_info[result_var].range.underflow || in binary_op_result_type()
2278 ssa->var_info[result_var].range.overflow) { in binary_op_result_type()
2303 !ssa->var_info[result_var].has_range || in binary_op_result_type()
2304 ssa->var_info[result_var].range.underflow || in binary_op_result_type()
2305 ssa->var_info[result_var].range.overflow) { in binary_op_result_type()
2434 static const zend_property_info *zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ssa,… in zend_fetch_prop_info() argument
2443 ce = ssa->var_info[ssa_op->op1_use].ce; in zend_fetch_prop_info()
2457 …(const zend_script *script, const zend_op_array *op_array, const zend_ssa *ssa, const zend_op *opl… in zend_fetch_static_prop_info() argument
2505 static bool result_may_be_separated(zend_ssa *ssa, zend_ssa_op *ssa_op) in result_may_be_separated() argument
2509 if (ssa->vars[tmp_var].use_chain >= 0 in result_may_be_separated()
2510 && !ssa->vars[tmp_var].phi_use_chain) { in result_may_be_separated()
2511 zend_ssa_op *use_op = &ssa->ops[ssa->vars[tmp_var].use_chain]; in result_may_be_separated()
2526 zend_ssa *ssa, in _zend_update_type_info() argument
2537 zend_ssa_var *ssa_vars = ssa->vars; in _zend_update_type_info()
2538 zend_ssa_var_info *ssa_var_info = ssa->var_info; in _zend_update_type_info()
2597 tmp = binary_op_result_type(ssa, opline->opcode, t1, t2, ssa_op->result_def, optimization_level); in _zend_update_type_info()
2750 prop_info = zend_fetch_prop_info(op_array, ssa, opline, ssa_op); in _zend_update_type_info()
2762 prop_info = zend_fetch_static_prop_info(script, op_array, ssa, opline); in _zend_update_type_info()
2772 ssa, opline->extended_value, t1, t2, in _zend_update_type_info()
2984 …tmp |= ssa->var_info[ssa_op->op1_def].type & (MAY_BE_ARRAY_PACKED|MAY_BE_ARRAY_NUMERIC_HASH|MAY_BE… in _zend_update_type_info()
3034 zend_fetch_prop_info(op_array, ssa, opline, ssa_op), &ce); in _zend_update_type_info()
3122 if (ssa->vars[ssa_op->result_def].use_chain < 0 in _zend_update_type_info()
3123 || opline + 1 != op_array->opcodes + ssa->vars[ssa_op->result_def].use_chain) { in _zend_update_type_info()
3127 if (ssa->vars[ssa_op->result_def].use_chain < 0 in _zend_update_type_info()
3128 || opline + 1 != ssa_opcodes[ssa->vars[ssa_op->result_def].use_chain]) { in _zend_update_type_info()
3687 j = zend_ssa_next_use(ssa->ops, ssa_op->result_def, j); in _zend_update_type_info()
3727 if (ssa->vars[ssa_op->result_def].use_chain < 0 in _zend_update_type_info()
3728 || opline + 1 != op_array->opcodes + ssa->vars[ssa_op->result_def].use_chain) { in _zend_update_type_info()
3732 if (ssa->vars[ssa_op->result_def].use_chain < 0 in _zend_update_type_info()
3733 || opline + 1 != ssa_opcodes[ssa->vars[ssa_op->result_def].use_chain]) { in _zend_update_type_info()
3760 const zend_property_info *prop_info = zend_fetch_prop_info(op_array, ssa, opline, ssa_op); in _zend_update_type_info()
3773 } else if (ssa_op->op1_use >= 0 && !ssa->var_info[ssa_op->op1_use].is_instanceof) { in _zend_update_type_info()
3774 ce = ssa->var_info[ssa_op->op1_use].ce; in _zend_update_type_info()
3781 && !result_may_be_separated(ssa, ssa_op)) { in _zend_update_type_info()
3803 zend_fetch_static_prop_info(script, op_array, ssa, opline), &ce); in _zend_update_type_info()
3812 if (!result_may_be_separated(ssa, ssa_op)) { in _zend_update_type_info()
3842 tmp = zend_get_func_info(call_info, ssa, &ce, &ce_is_instanceof); in _zend_update_type_info()
3986 zend_ssa *ssa, in zend_update_type_info() argument
3993 …return _zend_update_type_info(op_array, ssa, script, NULL, opline, ssa_op, ssa_opcodes, optimizati… in zend_update_type_info()
4053 …pes_ex(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_bitset workli… in zend_infer_types_ex() argument
4055 zend_basic_block *blocks = ssa->cfg.blocks; in zend_infer_types_ex()
4056 zend_ssa_var *ssa_vars = ssa->vars; in zend_infer_types_ex()
4057 zend_ssa_var_info *ssa_var_info = ssa->var_info; in zend_infer_types_ex()
4058 int ssa_vars_count = ssa->vars_count; in zend_infer_types_ex()
4072 tmp = get_ssa_var_info(ssa, p->sources[0]); in zend_infer_types_ex()
4106 tmp |= get_ssa_var_info(ssa, p->sources[i]); in zend_infer_types_ex()
4129 …if (_zend_update_type_info(op_array, ssa, script, worklist, op_array->opcodes + i, ssa->ops + i, N… in zend_infer_types_ex()
4176 const zend_op_array *op_array, zend_ssa *ssa, int var_num, in can_convert_to_double() argument
4178 zend_ssa_var *var = &ssa->vars[var_num]; in can_convert_to_double()
4188 for (use = var->use_chain; use >= 0; use = zend_ssa_next_use(ssa->ops, var_num, use)) { in can_convert_to_double()
4190 zend_ssa_op *ssa_op = &ssa->ops[use]; in can_convert_to_double()
4201 type = ssa->var_info[ssa_op->result_def].type; in can_convert_to_double()
4286 if (!can_convert_to_double(op_array, ssa, ssa_op->result_def, &orig_result, visited)) { in can_convert_to_double()
4292 for (phi = var->phi_use_chain; phi; phi = zend_ssa_next_use_phi(ssa, var_num, phi)) { in can_convert_to_double()
4294 type = ssa->var_info[phi->ssa_var].type; in can_convert_to_double()
4299 if (!can_convert_to_double(op_array, ssa, phi->ssa_var, value, visited)) { in can_convert_to_double()
4307 …rowing(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimiza… in zend_type_narrowing() argument
4309 uint32_t bitset_len = zend_bitset_len(ssa->vars_count); in zend_type_narrowing()
4321 for (v = op_array->last_var; v < ssa->vars_count; v++) { in zend_type_narrowing()
4322 if ((ssa->var_info[v].type & (MAY_BE_REF | MAY_BE_ANY | MAY_BE_UNDEF)) != MAY_BE_LONG) continue; in zend_type_narrowing()
4323 if (ssa->vars[v].definition < 0) continue; in zend_type_narrowing()
4324 if (ssa->vars[v].no_val) continue; in zend_type_narrowing()
4325 opline = op_array->opcodes + ssa->vars[v].definition; in zend_type_narrowing()
4333 if (can_convert_to_double(op_array, ssa, v, value, visited)) { in zend_type_narrowing()
4335 ssa->var_info[v].use_as_double = 1; in zend_type_narrowing()
4339 ssa->var_info[i].type &= ~MAY_BE_ANY; in zend_type_narrowing()
4351 if (zend_infer_types_ex(op_array, script, ssa, worklist, optimization_level) == FAILURE) { in zend_type_narrowing()
4365 if (info->ssa.ops && info->ssa.vars && info->call_map && in is_recursive_tail_call()
4366 info->ssa.ops[opline - op_array->opcodes].op1_use >= 0 && in is_recursive_tail_call()
4367 info->ssa.vars[info->ssa.ops[opline - op_array->opcodes].op1_use].definition >= 0) { in is_recursive_tail_call()
4369 …zend_op *op = op_array->opcodes + info->ssa.vars[info->ssa.ops[opline - op_array->opcodes].op1_use… in is_recursive_tail_call()
4429 zend_ssa *ssa = &info->ssa; in zend_func_return_info() local
4430 int blocks_count = info->ssa.cfg.blocks_count; in zend_func_return_info()
4431 zend_basic_block *blocks = info->ssa.cfg.blocks; in zend_func_return_info()
4462 zend_ssa_op *ssa_op = ssa->ops ? &ssa->ops[opline - op_array->opcodes] : NULL; in zend_func_return_info()
4463 if (!recursive && ssa_op && info->ssa.var_info && in zend_func_return_info()
4465 info->ssa.var_info[ssa_op->op1_use].recursive) { in zend_func_return_info()
4486 if (ssa_op && info->ssa.var_info && in zend_func_return_info()
4488 info->ssa.var_info[ssa_op->op1_use].ce) { in zend_func_return_info()
4489 arg_ce = info->ssa.var_info[ssa_op->op1_use].ce; in zend_func_return_info()
4490 arg_is_instanceof = info->ssa.var_info[ssa_op->op1_use].is_instanceof; in zend_func_return_info()
4529 } else if (ssa_op && info->ssa.var_info && ssa_op->op1_use >= 0) { in zend_func_return_info()
4530 if (info->ssa.var_info[ssa_op->op1_use].has_range) { in zend_func_return_info()
4533 tmp_range = info->ssa.var_info[ssa_op->op1_use].range; in zend_func_return_info()
4536 if (info->ssa.var_info[ssa_op->op1_use].range.underflow) { in zend_func_return_info()
4540 tmp_range.min = MIN(tmp_range.min, info->ssa.var_info[ssa_op->op1_use].range.min); in zend_func_return_info()
4542 if (info->ssa.var_info[ssa_op->op1_use].range.overflow) { in zend_func_return_info()
4546 tmp_range.max = MAX(tmp_range.max, info->ssa.var_info[ssa_op->op1_use].range.max); in zend_func_return_info()
4579 …_types(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimiza… in zend_infer_types() argument
4581 int ssa_vars_count = ssa->vars_count; in zend_infer_types()
4594 if (zend_infer_types_ex(op_array, script, ssa, worklist, optimization_level) == FAILURE) { in zend_infer_types()
4601 zend_type_narrowing(op_array, script, ssa, optimization_level); in zend_infer_types()
4612 …id zend_mark_cv_references(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa) in zend_mark_cv_references() argument
4617 uint32_t worklist_len = zend_bitset_len(ssa->vars_count); in zend_mark_cv_references()
4625 for (var = 0; var < ssa->vars_count; var++) { in zend_mark_cv_references()
4626 def = ssa->vars[var].definition; in zend_mark_cv_references()
4627 if (def >= 0 && ssa->vars[var].var < op_array->last_var) { in zend_mark_cv_references()
4629 if (ssa->ops[def].result_def == var) { in zend_mark_cv_references()
4641 } else if (ssa->ops[def].op1_def == var) { in zend_mark_cv_references()
4680 } else if (ssa->ops[def].op2_def == var) { in zend_mark_cv_references()
4697 } else if (ssa->var_info[var].type & MAY_BE_REF) { in zend_mark_cv_references()
4699 } else if (ssa->vars[var].alias == SYMTABLE_ALIAS) { in zend_mark_cv_references()
4707ssa->var_info[var].type |= MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_AN… in zend_mark_cv_references()
4709 if (ssa->vars[var].phi_use_chain) { in zend_mark_cv_references()
4710 zend_ssa_phi *p = ssa->vars[var].phi_use_chain; in zend_mark_cv_references()
4712 if (!(ssa->var_info[p->ssa_var].type & MAY_BE_REF)) { in zend_mark_cv_references()
4715 p = zend_ssa_next_use_phi(ssa, var, p); in zend_mark_cv_references()
4719 if (ssa->vars[var].use_chain >= 0) { in zend_mark_cv_references()
4720 int use = ssa->vars[var].use_chain; in zend_mark_cv_references()
4721 FOREACH_USE(&ssa->vars[var], use) { in zend_mark_cv_references()
4722 zend_ssa_op *op = ssa->ops + use; in zend_mark_cv_references()
4724 if (!(ssa->var_info[op->op1_def].type & MAY_BE_REF)) { in zend_mark_cv_references()
4734 if (!(ssa->var_info[op->op2_def].type & MAY_BE_REF)) { in zend_mark_cv_references()
4739 if (!(ssa->var_info[op->result_def].type & MAY_BE_REF)) { in zend_mark_cv_references()
4750 …arena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimiza… in zend_ssa_inference() argument
4755 if (!ssa->var_info) { in zend_ssa_inference()
4756 ssa->var_info = zend_arena_calloc(arena, ssa->vars_count, sizeof(zend_ssa_var_info)); in zend_ssa_inference()
4758 ssa_var_info = ssa->var_info; in zend_ssa_inference()
4769 if (ssa->vars[i].alias) { in zend_ssa_inference()
4770 ssa_var_info[i].type |= get_ssa_alias_types(ssa->vars[i].alias); in zend_ssa_inference()
4774 for (i = op_array->last_var; i < ssa->vars_count; i++) { in zend_ssa_inference()
4779 zend_mark_cv_references(op_array, script, ssa); in zend_ssa_inference()
4781 zend_infer_ranges(op_array, ssa); in zend_ssa_inference()
4783 if (zend_infer_types(op_array, script, ssa, optimization_level) == FAILURE) { in zend_ssa_inference()
4791 … const zend_ssa_op *ssa_op, const zend_op_array *op_array, const zend_ssa *ssa, uint32_t t1, uint3… in zend_may_throw_ex() argument
4917 return zend_may_throw(opline + 1, ssa_op ? ssa_op + 1 : NULL, op_array, ssa); in zend_may_throw_ex()
5054 if (_ssa_op1_info(op_array, ssa, opline+1, ssa_op+1) & MAY_BE_UNDEF) { in zend_may_throw_ex()
5068 if (_ssa_op1_info(op_array, ssa, opline+1, ssa_op+1) & MAY_BE_UNDEF) { in zend_may_throw_ex()
5073 const zend_ssa_var_info *var_info = ssa->var_info + ssa_op->op1_use; in zend_may_throw_ex()
5203 …nst zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, const zend_ssa *ssa) in zend_may_throw() argument
5205 return zend_may_throw_ex(opline, ssa_op, op_array, ssa, OP1_INFO(), OP2_INFO()); in zend_may_throw()