Lines Matching refs:ssa

134 static zend_bool zend_ssa_is_last_use(const zend_op_array *op_array, const zend_ssa *ssa, int var, …  in zend_ssa_is_last_use()  argument
138 if (ssa->vars[var].phi_use_chain) { in zend_ssa_is_last_use()
139 zend_ssa_phi *phi = ssa->vars[var].phi_use_chain; in zend_ssa_is_last_use()
141 if (!ssa->vars[phi->ssa_var].no_val) { in zend_ssa_is_last_use()
144 phi = zend_ssa_next_use_phi(ssa, var, phi); in zend_ssa_is_last_use()
148 if (ssa->cfg.blocks[ssa->cfg.map[use]].loop_header > 0 in zend_ssa_is_last_use()
149 || (ssa->cfg.blocks[ssa->cfg.map[use]].flags & ZEND_BB_LOOP_HEADER)) { in zend_ssa_is_last_use()
150 int b = ssa->cfg.map[use]; in zend_ssa_is_last_use()
151 int prev_use = ssa->vars[var].use_chain; in zend_ssa_is_last_use()
154 if (b != ssa->cfg.map[prev_use] in zend_ssa_is_last_use()
155 && dominates(ssa->cfg.blocks, b, ssa->cfg.map[prev_use]) in zend_ssa_is_last_use()
156 && !zend_ssa_is_no_val_use(op_array->opcodes + prev_use, ssa->ops + prev_use, var)) { in zend_ssa_is_last_use()
159 prev_use = zend_ssa_next_use(ssa->ops, var, prev_use); in zend_ssa_is_last_use()
163 next_use = zend_ssa_next_use(ssa->ops, var, use); in zend_ssa_is_last_use()
166 } else if (zend_ssa_is_no_val_use(op_array->opcodes + next_use, ssa->ops + next_use, var)) { in zend_ssa_is_last_use()
208 ssa->var_info && \
210 ssa->var_info[(ssa_op)->opN##_use].has_range) ? \
211 &ssa->var_info[(ssa_op)->opN##_use].range : NULL)
327 zend_ssa *ssa, in dasm_link_and_encode() argument
340 if (rt_opline && ssa && ssa->cfg.map) { in dasm_link_and_encode()
344 int b = ssa->cfg.map[rt_opline - op_array->opcodes]; in dasm_link_and_encode()
349 if (!(ssa->cfg.blocks[b].flags & (ZEND_BB_START|ZEND_BB_ENTRY|ZEND_BB_RECV_ENTRY))) { in dasm_link_and_encode()
351 zend_jit_label(dasm_state, ssa->cfg.blocks_count + b); in dasm_link_and_encode()
359 for (i = 0; i < ssa->vars_count; i++) { in dasm_link_and_encode()
366 if (!zend_jit_load_var(dasm_state, ssa->var_info[i].type, ssa->vars[i].var, ival->reg)) { in dasm_link_and_encode()
408 if (op_array && ssa) { in dasm_link_and_encode()
411 for (b = 0; b < ssa->cfg.blocks_count; b++) { in dasm_link_and_encode()
415 if (ssa->cfg.blocks[b].flags & (ZEND_BB_START|ZEND_BB_ENTRY|ZEND_BB_RECV_ENTRY)) { in dasm_link_and_encode()
417 zend_op *opline = op_array->opcodes + ssa->cfg.blocks[b].start; in dasm_link_and_encode()
418 int offset = dasm_getpclabel(dasm_state, ssa->cfg.blocks_count + b); in dasm_link_and_encode()
425 if (rt_opline && ssa && ssa->cfg.map) { in dasm_link_and_encode()
426 int b = ssa->cfg.map[rt_opline - op_array->opcodes]; in dasm_link_and_encode()
428 int offset = dasm_getpclabel(dasm_state, ssa->cfg.blocks_count + b); in dasm_link_and_encode()
451 &ssa->cfg, in dasm_link_and_encode()
463 ssa ? &ssa->cfg : NULL, in dasm_link_and_encode()
530 …low(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa) in zend_may_overflow() argument
535 if (!ssa->ops || !ssa->var_info) { in zend_may_overflow()
543 || !ssa->var_info[res].has_range in zend_may_overflow()
544 || ssa->var_info[res].range.overflow) { in zend_may_overflow()
558 || !ssa->var_info[res].has_range in zend_may_overflow()
559 || ssa->var_info[res].range.underflow) { in zend_may_overflow()
572 || !ssa->var_info[res].has_range in zend_may_overflow()
573 || ssa->var_info[res].range.underflow) { in zend_may_overflow()
584 || !ssa->var_info[res].has_range in zend_may_overflow()
585 || ssa->var_info[res].range.overflow) { in zend_may_overflow()
599 || !ssa->var_info[res].has_range in zend_may_overflow()
600 || ssa->var_info[res].range.underflow) { in zend_may_overflow()
611 || !ssa->var_info[res].has_range in zend_may_overflow()
612 || ssa->var_info[res].range.overflow) { in zend_may_overflow()
626 !ssa->var_info[res].has_range || in zend_may_overflow()
627 ssa->var_info[res].range.underflow || in zend_may_overflow()
628 ssa->var_info[res].range.overflow); in zend_may_overflow()
633 || !ssa->var_info[res].has_range in zend_may_overflow()
634 || ssa->var_info[res].range.underflow) { in zend_may_overflow()
645 || !ssa->var_info[res].has_range in zend_may_overflow()
646 || ssa->var_info[res].range.overflow) { in zend_may_overflow()
660 || !ssa->var_info[res].has_range in zend_may_overflow()
661 || ssa->var_info[res].range.underflow) { in zend_may_overflow()
672 || !ssa->var_info[res].has_range in zend_may_overflow()
673 || ssa->var_info[res].range.overflow) { in zend_may_overflow()
687 !ssa->var_info[res].has_range || in zend_may_overflow()
688 ssa->var_info[res].range.underflow || in zend_may_overflow()
689 ssa->var_info[res].range.overflow); in zend_may_overflow()
730 …c int zend_jit_op_array_analyze1(const zend_op_array *op_array, zend_script *script, zend_ssa *ssa) in zend_jit_op_array_analyze1() argument
732 if (zend_jit_build_cfg(op_array, &ssa->cfg) != SUCCESS) { in zend_jit_op_array_analyze1()
738 if ((ssa->cfg.flags & ZEND_FUNC_HAS_EXTENDED_INFO)) { in zend_jit_op_array_analyze1()
745 ssa->cfg.flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS; in zend_jit_op_array_analyze1()
749 && ssa->cfg.blocks in zend_jit_op_array_analyze1()
752 && !(ssa->cfg.flags & ZEND_FUNC_INDIRECT_VAR_ACCESS)) { in zend_jit_op_array_analyze1()
753 …a(&CG(arena), script, op_array, ZEND_SSA_RC_INFERENCE | ZEND_SSA_USE_CV_RESULTS, ssa) != SUCCESS) { in zend_jit_op_array_analyze1()
757 if (zend_ssa_compute_use_def_chains(&CG(arena), op_array, ssa) != SUCCESS) { in zend_jit_op_array_analyze1()
761 if (zend_ssa_find_false_dependencies(op_array, ssa) != SUCCESS) { in zend_jit_op_array_analyze1()
765 if (zend_ssa_find_sccs(op_array, ssa) != SUCCESS){ in zend_jit_op_array_analyze1()
773 …ray_analyze2(const zend_op_array *op_array, zend_script *script, zend_ssa *ssa, uint32_t optimizat… in zend_jit_op_array_analyze2() argument
776 && ssa->cfg.blocks in zend_jit_op_array_analyze2()
779 && !(ssa->cfg.flags & ZEND_FUNC_INDIRECT_VAR_ACCESS)) { in zend_jit_op_array_analyze2()
780 if (zend_ssa_inference(&CG(arena), op_array, script, ssa, in zend_jit_op_array_analyze2()
1030 static int *zend_jit_compute_block_order_int(zend_ssa *ssa, int n, int *block_order) in zend_jit_compute_block_order_int() argument
1032 zend_basic_block *b = ssa->cfg.blocks + n; in zend_jit_compute_block_order_int()
1040 b = ssa->cfg.blocks + n; in zend_jit_compute_block_order_int()
1044 block_order = zend_jit_compute_block_order_int(ssa, n, block_order); in zend_jit_compute_block_order_int()
1051 static int zend_jit_compute_block_order(zend_ssa *ssa, int *block_order) in zend_jit_compute_block_order() argument
1053 int *end = zend_jit_compute_block_order_int(ssa, 0, block_order); in zend_jit_compute_block_order()
1058 static zend_bool zend_jit_in_loop(zend_ssa *ssa, int header, zend_basic_block *b) in zend_jit_in_loop() argument
1064 b = ssa->cfg.blocks + b->loop_header; in zend_jit_in_loop()
1069 static void zend_jit_compute_loop_body(zend_ssa *ssa, int header, int n, zend_bitset loop_body) in zend_jit_compute_loop_body() argument
1071 zend_basic_block *b = ssa->cfg.blocks + n; in zend_jit_compute_loop_body()
1083 b = ssa->cfg.blocks + n; in zend_jit_compute_loop_body()
1084 if (zend_jit_in_loop(ssa, header, b)) { in zend_jit_compute_loop_body()
1088 zend_jit_compute_loop_body(ssa, header, n, loop_body); in zend_jit_compute_loop_body()
1117 static int zend_jit_compute_liveness(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset cand… in zend_jit_compute_liveness() argument
1128 set_size = zend_bitset_len(ssa->vars_count); in zend_jit_compute_liveness()
1130 ZEND_MM_ALIGNED_SIZE(ssa->vars_count * sizeof(zend_lifetime_interval*)) + in zend_jit_compute_liveness()
1131 ZEND_MM_ALIGNED_SIZE((set_size * ssa->cfg.blocks_count) * ZEND_BITSET_ELM_SIZE) + in zend_jit_compute_liveness()
1135 ZEND_MM_ALIGNED_SIZE(ssa->cfg.blocks_count * sizeof(int)); in zend_jit_compute_liveness()
1142 …live_in = (zend_bitset)((char*)intervals + ZEND_MM_ALIGNED_SIZE(ssa->vars_count * sizeof(zend_life… in zend_jit_compute_liveness()
1143 …live = (zend_bitset)((char*)live_in + ZEND_MM_ALIGNED_SIZE((set_size * ssa->cfg.blocks_count) * ZE… in zend_jit_compute_liveness()
1148 memset(intervals, 0, ssa->vars_count * sizeof(zend_lifetime_interval*)); in zend_jit_compute_liveness()
1149 zend_bitset_clear(live_in, set_size * ssa->cfg.blocks_count); in zend_jit_compute_liveness()
1155 for (l = zend_jit_compute_block_order(ssa, block_order) - 1; l >= 0; l--) { in zend_jit_compute_liveness()
1159 b = ssa->cfg.blocks + i; in zend_jit_compute_liveness()
1169 for (phi = ssa->blocks[succ].phis; phi; phi = phi->next) { in zend_jit_compute_liveness()
1170 if (ssa->vars[phi->ssa_var].no_val) { in zend_jit_compute_liveness()
1180 for (k = 0; k < ssa->cfg.blocks[succ].predecessors_count; k++) { in zend_jit_compute_liveness()
1181 if (ssa->cfg.predecessors[ssa->cfg.blocks[succ].predecessor_offset + k] == i) { in zend_jit_compute_liveness()
1208 op = ssa->ops + n; in zend_jit_compute_liveness()
1269 for (phi = ssa->blocks[i].phis; phi; phi = phi->next) { in zend_jit_compute_liveness()
1277 for (i = ssa->cfg.blocks_count - 1; i >= 0; i--) { in zend_jit_compute_liveness()
1278 zend_basic_block *b = ssa->cfg.blocks + i; in zend_jit_compute_liveness()
1288 zend_jit_compute_loop_body(ssa, i, i, loop_body); in zend_jit_compute_liveness()
1312 for (i = 0; i < ssa->vars_count; i++) { in zend_jit_compute_liveness()
1316 if (ssa->vars[i].definition_phi) { in zend_jit_compute_liveness()
1317 zend_ssa_phi *phi = ssa->vars[i].definition_phi; in zend_jit_compute_liveness()
1325 for (k = 0; k < ssa->cfg.blocks[phi->block].predecessors_count; k++) { in zend_jit_compute_liveness()
1328 if (ssa->vars[src].definition_phi in zend_jit_compute_liveness()
1329 && ssa->vars[src].definition_phi->pi >= 0 in zend_jit_compute_liveness()
1330 && phi->block == ssa->vars[src].definition_phi->block) { in zend_jit_compute_liveness()
1332 src = ssa->vars[src].definition_phi->sources[0]; in zend_jit_compute_liveness()
1343 for (i = 0; i < ssa->vars_count; i++) { in zend_jit_compute_liveness()
1346 if (ssa->vars[i].definition >= 0) { in zend_jit_compute_liveness()
1347 uint32_t line = ssa->vars[i].definition; in zend_jit_compute_liveness()
1354 if (ssa->ops[line].op1_use >= 0 && in zend_jit_compute_liveness()
1355 intervals[ssa->ops[line].op1_use] && in zend_jit_compute_liveness()
1356 (i == ssa->ops[line].op1_def || in zend_jit_compute_liveness()
1357 (i == ssa->ops[line].result_def && in zend_jit_compute_liveness()
1358 (ssa->ops[line].op1_def < 0 || in zend_jit_compute_liveness()
1359 !intervals[ssa->ops[line].op1_def])))) { in zend_jit_compute_liveness()
1360 zend_jit_add_hint(intervals, i, ssa->ops[line].op1_use); in zend_jit_compute_liveness()
1366 if (i == ssa->ops[line].op1_def && in zend_jit_compute_liveness()
1367 ssa->ops[line].op1_use >= 0 && in zend_jit_compute_liveness()
1368 intervals[ssa->ops[line].op1_use]) { in zend_jit_compute_liveness()
1369 zend_jit_add_hint(intervals, i, ssa->ops[line].op1_use); in zend_jit_compute_liveness()
1373 if (ssa->ops[line].op2_use >= 0 && in zend_jit_compute_liveness()
1374 intervals[ssa->ops[line].op2_use] && in zend_jit_compute_liveness()
1375 (i == ssa->ops[line].op2_def || in zend_jit_compute_liveness()
1376 (i == ssa->ops[line].op1_def && in zend_jit_compute_liveness()
1377 (ssa->ops[line].op2_def < 0 || in zend_jit_compute_liveness()
1378 !intervals[ssa->ops[line].op2_def])) || in zend_jit_compute_liveness()
1379 (i == ssa->ops[line].result_def && in zend_jit_compute_liveness()
1380 (ssa->ops[line].op2_def < 0 || in zend_jit_compute_liveness()
1381 !intervals[ssa->ops[line].op2_def]) && in zend_jit_compute_liveness()
1382 (ssa->ops[line].op1_def < 0 || in zend_jit_compute_liveness()
1383 !intervals[ssa->ops[line].op1_def])))) { in zend_jit_compute_liveness()
1384 zend_jit_add_hint(intervals, i, ssa->ops[line].op2_use); in zend_jit_compute_liveness()
1393 if (i == ssa->ops[line].result_def) { in zend_jit_compute_liveness()
1394 if (ssa->ops[line].op1_use >= 0 && in zend_jit_compute_liveness()
1395 intervals[ssa->ops[line].op1_use] && in zend_jit_compute_liveness()
1396 ssa->ops[line].op1_use_chain < 0 && in zend_jit_compute_liveness()
1397 !ssa->vars[ssa->ops[line].op1_use].phi_use_chain && in zend_jit_compute_liveness()
1398 (ssa->var_info[i].type & MAY_BE_ANY) == in zend_jit_compute_liveness()
1399 (ssa->var_info[ssa->ops[line].op1_use].type & MAY_BE_ANY)) { in zend_jit_compute_liveness()
1400 zend_jit_add_hint(intervals, i, ssa->ops[line].op1_use); in zend_jit_compute_liveness()
1402 ssa->ops[line].op2_use >= 0 && in zend_jit_compute_liveness()
1403 intervals[ssa->ops[line].op2_use] && in zend_jit_compute_liveness()
1404 ssa->ops[line].op2_use_chain < 0 && in zend_jit_compute_liveness()
1405 !ssa->vars[ssa->ops[line].op2_use].phi_use_chain && in zend_jit_compute_liveness()
1406 (ssa->var_info[i].type & MAY_BE_ANY) == in zend_jit_compute_liveness()
1407 (ssa->var_info[ssa->ops[line].op2_use].type & MAY_BE_ANY)) { in zend_jit_compute_liveness()
1408 zend_jit_add_hint(intervals, i, ssa->ops[line].op2_use); in zend_jit_compute_liveness()
1418 *list = zend_jit_sort_intervals(intervals, ssa->vars_count); in zend_jit_compute_liveness()
1485 …_reg(const zend_op_array *op_array, const zend_op **ssa_opcodes, zend_ssa *ssa, zend_lifetime_inte… in zend_jit_try_allocate_free_reg() argument
1495 if ((ssa->var_info[current->ssa_var].type & MAY_BE_ANY) == MAY_BE_DOUBLE) { in zend_jit_try_allocate_free_reg()
1514 if (ssa->vars[current->ssa_var].definition == current->range.start) { in zend_jit_try_allocate_free_reg()
1520 ssa->ops + current->range.start, ssa, current->ssa_var, it->ssa_var)) { in zend_jit_try_allocate_free_reg()
1578 if (ssa->ops[line].op1_def == current->ssa_var || in zend_jit_try_allocate_free_reg()
1579 ssa->ops[line].op2_def == current->ssa_var || in zend_jit_try_allocate_free_reg()
1580 ssa->ops[line].result_def == current->ssa_var) { in zend_jit_try_allocate_free_reg()
1583 ssa->ops + line, in zend_jit_try_allocate_free_reg()
1584 op_array, ssa, current->ssa_var, line == last_use_line); in zend_jit_try_allocate_free_reg()
1595 ssa->ops + line, in zend_jit_try_allocate_free_reg()
1596 op_array, ssa, current->ssa_var, line == last_use_line); in zend_jit_try_allocate_free_reg()
1609 if (ssa->vars[current->ssa_var].definition == current->start) { in zend_jit_try_allocate_free_reg()
1615 hint = ssa->ops[current->start].op2_use; in zend_jit_try_allocate_free_reg()
1617 hint = ssa->ops[current->start].op1_use; in zend_jit_try_allocate_free_reg()
1622 hint = ssa->ops[current->start].op1_use; in zend_jit_try_allocate_free_reg()
1628 hint = ssa->ops[current->start].op1_use; in zend_jit_try_allocate_free_reg()
1726 …scan(const zend_op_array *op_array, const zend_op **ssa_opcodes, zend_ssa *ssa, zend_lifetime_inte… in zend_jit_linear_scan() argument
1785 …if (zend_jit_try_allocate_free_reg(op_array, ssa_opcodes, ssa, current, available, &hints, active,… in zend_jit_linear_scan()
1815 static void zend_jit_dump_lifetime_interval(const zend_op_array *op_array, const zend_ssa *ssa, con… in zend_jit_dump_lifetime_interval() argument
1818 int var_num = ssa->vars[ival->ssa_var].var; in zend_jit_dump_lifetime_interval()
1843 var_num = ssa->vars[ival->hint->ssa_var].var; in zend_jit_dump_lifetime_interval()
1854 … zend_lifetime_interval** zend_jit_allocate_registers(const zend_op_array *op_array, zend_ssa *ssa) in zend_jit_allocate_registers() argument
1863 if (!ssa->var_info) { in zend_jit_allocate_registers()
1868 set_size = zend_bitset_len(ssa->vars_count); in zend_jit_allocate_registers()
1875 for (i = 0; i < ssa->vars_count; i++) { in zend_jit_allocate_registers()
1876 if (zend_jit_may_be_in_reg(op_array, ssa, i)) { in zend_jit_allocate_registers()
1889 if (zend_jit_compute_liveness(op_array, ssa, candidates, &list) != SUCCESS) { in zend_jit_allocate_registers()
1902 if (zend_ssa_is_last_use(op_array, ssa, ival->ssa_var, range->end)) { in zend_jit_allocate_registers()
1914 zend_jit_dump_lifetime_interval(op_array, ssa, ival); in zend_jit_allocate_registers()
1921 list = zend_jit_linear_scan(op_array, NULL, ssa, list); in zend_jit_allocate_registers()
1924 intervals = zend_arena_calloc(&CG(arena), ssa->vars_count, sizeof(zend_lifetime_interval*)); in zend_jit_allocate_registers()
1940 for (i = 0; i < ssa->vars_count; i++) { in zend_jit_allocate_registers()
1941 if (ssa->vars[i].definition_phi && !ssa->vars[i].no_val) { in zend_jit_allocate_registers()
1942 zend_ssa_phi *phi = ssa->vars[i].definition_phi; in zend_jit_allocate_registers()
1946 if (!ssa->vars[i].phi_use_chain in zend_jit_allocate_registers()
1947 || ssa->vars[i].phi_use_chain->block != phi->block) { in zend_jit_allocate_registers()
1963 for (k = 0; k < ssa->cfg.blocks[phi->block].predecessors_count; k++) { in zend_jit_allocate_registers()
1966 if (ssa->vars[src].definition_phi in zend_jit_allocate_registers()
1967 && ssa->vars[src].definition_phi->pi >= 0 in zend_jit_allocate_registers()
1968 && phi->block == ssa->vars[src].definition_phi->block) { in zend_jit_allocate_registers()
1970 src = ssa->vars[src].definition_phi->sources[0]; in zend_jit_allocate_registers()
1987 for (k = 0; k < ssa->cfg.blocks[phi->block].predecessors_count; k++) { in zend_jit_allocate_registers()
1990 if (ssa->vars[src].definition_phi in zend_jit_allocate_registers()
1991 && ssa->vars[src].definition_phi->pi >= 0 in zend_jit_allocate_registers()
1992 && phi->block == ssa->vars[src].definition_phi->block) { in zend_jit_allocate_registers()
1994 src = ssa->vars[src].definition_phi->sources[0]; in zend_jit_allocate_registers()
2006 for (i = 0; i < ssa->vars_count; i++) { in zend_jit_allocate_registers()
2009 ((intervals[i]->flags & ZREG_STORE) && ssa->vars[i].definition >= 0)) && in zend_jit_allocate_registers()
2010 ssa->vars[i].use_chain < 0) { in zend_jit_allocate_registers()
2012 zend_ssa_phi *phi = ssa->vars[i].phi_use_chain; in zend_jit_allocate_registers()
2020 phi = zend_ssa_next_use_phi(ssa, i, phi); in zend_jit_allocate_registers()
2028 for (i = 0; i < ssa->vars_count; i++) { in zend_jit_allocate_registers()
2032 (ssa->vars[i].use_chain < 0 || in zend_jit_allocate_registers()
2033 zend_ssa_next_use(ssa->ops, i, ssa->vars[i].use_chain) < 0)) { in zend_jit_allocate_registers()
2035 zend_ssa_phi *phi = ssa->vars[i].phi_use_chain; in zend_jit_allocate_registers()
2043 phi = zend_ssa_next_use_phi(ssa, i, phi); in zend_jit_allocate_registers()
2054 for (i = 0; i < ssa->vars_count; i++) { in zend_jit_allocate_registers()
2057 zend_jit_dump_lifetime_interval(op_array, ssa, ival); in zend_jit_allocate_registers()
2104 static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op *rt_opline) in zend_jit() argument
2138 ra = zend_jit_allocate_registers(op_array, ssa); in zend_jit()
2142 for (b = 0; b < ssa->cfg.blocks_count; b++) { in zend_jit()
2143 if (ssa->cfg.blocks[b].flags & ZEND_BB_REACHABLE && in zend_jit()
2144 ssa->cfg.blocks[b].len > 1) { in zend_jit()
2146 opline = op_array->opcodes + ssa->cfg.blocks[b].start + ssa->cfg.blocks[b].len - 1; in zend_jit()
2149 ssa->cfg.blocks[ssa->cfg.blocks[b].successors[0]].flags |= ZEND_BB_TARGET; in zend_jit()
2158 dasm_growpc(&dasm_state, ssa->cfg.blocks_count * 2 + 1); in zend_jit()
2161 for (b = 0; b < ssa->cfg.blocks_count; b++) { in zend_jit()
2162 if ((ssa->cfg.blocks[b].flags & ZEND_BB_REACHABLE) == 0) { in zend_jit()
2166 if (ssa->cfg.blocks[b].flags & ZEND_BB_ENTRY) { in zend_jit()
2167 if (ssa->cfg.blocks[b].flags & ZEND_BB_TARGET) { in zend_jit()
2170 ssa->cfg.blocks[b].len == 1 && in zend_jit()
2171 (ssa->cfg.blocks[b].flags & ZEND_BB_EXIT) && in zend_jit()
2172 op_array->opcodes[ssa->cfg.blocks[b].start].opcode != ZEND_JMP) { in zend_jit()
2176 if (ssa->cfg.blocks[b].flags & ZEND_BB_FOLLOW) { in zend_jit()
2181 zend_jit_label(&dasm_state, ssa->cfg.blocks_count + b); in zend_jit()
2185 if (ssa->cfg.blocks[b].flags & (ZEND_BB_START|ZEND_BB_RECV_ENTRY)) { in zend_jit()
2186 opline = op_array->opcodes + ssa->cfg.blocks[b].start; in zend_jit()
2187 if (ssa->cfg.flags & ZEND_CFG_RECV_ENTRY) { in zend_jit()
2194 zend_jit_label(&dasm_state, ssa->cfg.blocks_count + b); in zend_jit()
2196 zend_jit_label(&dasm_state, ssa->cfg.blocks_count + b + i); in zend_jit()
2207 zend_jit_label(&dasm_state, ssa->cfg.blocks_count + b); in zend_jit()
2224 zend_jit_label(&dasm_state, ssa->cfg.blocks_count + b); in zend_jit()
2232 ssa->cfg.blocks[b].len == 1 && in zend_jit()
2233 (ssa->cfg.blocks[b].flags & ZEND_BB_EXIT)) { in zend_jit()
2242 zend_jit_label(&dasm_state, ssa->cfg.blocks_count + b); in zend_jit()
2247 ssa->cfg.blocks[b].len == 1 && in zend_jit()
2248 (ssa->cfg.blocks[b].flags & ZEND_BB_EXIT)) { in zend_jit()
2257 zend_jit_label(&dasm_state, ssa->cfg.blocks_count + b); in zend_jit()
2266 if ((ssa->cfg.blocks[b].flags & ZEND_BB_FOLLOW) in zend_jit()
2267 && ssa->cfg.blocks[b].start != 0 in zend_jit()
2268 && (op_array->opcodes[ssa->cfg.blocks[b].start - 1].opcode == ZEND_NOP in zend_jit()
2269 || op_array->opcodes[ssa->cfg.blocks[b].start - 1].opcode == ZEND_SWITCH_LONG in zend_jit()
2270 || op_array->opcodes[ssa->cfg.blocks[b].start - 1].opcode == ZEND_SWITCH_STRING in zend_jit()
2271 || op_array->opcodes[ssa->cfg.blocks[b].start - 1].opcode == ZEND_MATCH)) { in zend_jit()
2273 if (!zend_jit_set_ip(&dasm_state, op_array->opcodes + ssa->cfg.blocks[b].start)) { in zend_jit()
2277 zend_jit_set_last_valid_opline(op_array->opcodes + ssa->cfg.blocks[b].start); in zend_jit()
2279 } else if (ssa->cfg.blocks[b].flags & ZEND_BB_TARGET) { in zend_jit()
2281 } else if (ssa->cfg.blocks[b].flags & (ZEND_BB_START|ZEND_BB_RECV_ENTRY|ZEND_BB_ENTRY)) { in zend_jit()
2282 zend_jit_set_last_valid_opline(op_array->opcodes + ssa->cfg.blocks[b].start); in zend_jit()
2284 if (ssa->cfg.blocks[b].flags & ZEND_BB_LOOP_HEADER) { in zend_jit()
2285 if (!zend_jit_check_timeout(&dasm_state, op_array->opcodes + ssa->cfg.blocks[b].start, NULL)) { in zend_jit()
2289 if (!ssa->cfg.blocks[b].len) { in zend_jit()
2293 zend_ssa_phi *phi = ssa->blocks[b].phis; in zend_jit()
2302 …if (!zend_jit_load_var(&dasm_state, ssa->var_info[phi->ssa_var].type, ssa->vars[phi->ssa_var].var,… in zend_jit()
2308 …if (!zend_jit_store_var(&dasm_state, ssa->var_info[phi->ssa_var].type, ssa->vars[phi->ssa_var].var… in zend_jit()
2316 end = ssa->cfg.blocks[b].start + ssa->cfg.blocks[b].len - 1; in zend_jit()
2317 for (i = ssa->cfg.blocks[b].start; i <= end; i++) { in zend_jit()
2318 zend_ssa_op *ssa_op = ssa->ops ? &ssa->ops[i] : NULL; in zend_jit()
2349 && ssa->vars in zend_jit()
2351 && !ssa->vars[ssa_op->result_use].no_val) { in zend_jit()
2373 …MAY_BE_LONG) && (op1_def_info & MAY_BE_DOUBLE) && zend_may_overflow(opline, ssa_op, op_array, ssa), in zend_jit()
2374 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
2384 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
2414 && ssa->vars in zend_jit()
2416 && !ssa->vars[ssa_op->result_use].no_val) { in zend_jit()
2430 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
2438 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
2472 && ssa->vars in zend_jit()
2474 && !ssa->vars[ssa_op->result_use].no_val) { in zend_jit()
2496 …o & MAY_BE_LONG) && (res_info & MAY_BE_DOUBLE) && zend_may_overflow(opline, ssa_op, op_array, ssa), in zend_jit()
2497 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
2504 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
2532 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
2540 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
2553 …MAY_BE_LONG) && (op1_def_info & MAY_BE_DOUBLE) && zend_may_overflow(opline, ssa_op, op_array, ssa), in zend_jit()
2554 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
2562 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
2572 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
2580 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
2585 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
2598 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
2614 if (ssa->var_info && ssa->ops) { in zend_jit()
2615 zend_ssa_op *ssa_op = &ssa->ops[opline - op_array->opcodes]; in zend_jit()
2617 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit()
2625 if (!zend_jit_incdec_obj(&dasm_state, opline, op_array, ssa, ssa_op, in zend_jit()
2628 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
2641 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
2661 if (ssa->var_info && ssa->ops) { in zend_jit()
2662 zend_ssa_op *ssa_op = &ssa->ops[opline - op_array->opcodes]; in zend_jit()
2664 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit()
2672 if (!zend_jit_assign_obj_op(&dasm_state, opline, op_array, ssa, ssa_op, in zend_jit()
2675 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
2685 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
2701 if (ssa->var_info && ssa->ops) { in zend_jit()
2702 zend_ssa_op *ssa_op = &ssa->ops[opline - op_array->opcodes]; in zend_jit()
2704 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit()
2712 if (!zend_jit_assign_obj(&dasm_state, opline, op_array, ssa, ssa_op, in zend_jit()
2715 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
2723 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
2728 && ssa->ops[opline - op_array->opcodes].op2_def >= 0 in zend_jit()
2729 && !ssa->vars[ssa->ops[opline - op_array->opcodes].op2_def].no_val) { in zend_jit()
2735 if (ra && ssa->vars[ssa_op->op1_use].no_val) { in zend_jit()
2764 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
2771 && ssa->ops[opline - op_array->opcodes].op1_def >= 0 in zend_jit()
2772 && !ssa->vars[ssa->ops[opline - op_array->opcodes].op1_def].no_val) { in zend_jit()
2786 … if (!zend_jit_init_fcall(&dasm_state, opline, b, op_array, ssa, ssa_op, call_level, NULL, 1)) { in zend_jit()
2831 && ssa->ops[opline - op_array->opcodes].op1_def >= 0 in zend_jit()
2832 && !ssa->vars[ssa->ops[opline - op_array->opcodes].op1_def].no_val) { in zend_jit()
2865 if (!zend_jit_do_fcall(&dasm_state, opline, op_array, ssa, call_level, b + 1, NULL)) { in zend_jit()
2886 target_label = ssa->cfg.blocks[b].successors[0]; in zend_jit()
2887 target_label2 = ssa->cfg.blocks[b].successors[1]; in zend_jit()
2901 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit()
2920 target_label = ssa->cfg.blocks[b].successors[0]; in zend_jit()
2921 target_label2 = ssa->cfg.blocks[b].successors[1]; in zend_jit()
2930 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit()
2946 target_label = ssa->cfg.blocks[b].successors[0]; in zend_jit()
2947 target_label2 = ssa->cfg.blocks[b].successors[1]; in zend_jit()
2970 target_label = ssa->cfg.blocks[b].successors[0]; in zend_jit()
2971 target_label2 = ssa->cfg.blocks[b].successors[1]; in zend_jit()
2982 if ((PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) in zend_jit()
3005 jit_return_label = ssa->cfg.blocks_count * 2; in zend_jit()
3010 uint32_t info = zend_ssa_cv_info(op_array, ssa, j); in zend_jit()
3025 NULL, NULL, (ssa->cfg.flags & ZEND_FUNC_INDIRECT_VAR_ACCESS) != 0, 1)) { in zend_jit()
3035 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit()
3042 if (opline > op_array->opcodes + ssa->cfg.blocks[b].start && in zend_jit()
3045 if (!zend_jit_cond_jmp(&dasm_state, opline + 1, ssa->cfg.blocks[b].successors[0])) { in zend_jit()
3061 ssa->cfg.blocks[b].successors[0], ssa->cfg.blocks[b].successors[1], in zend_jit()
3062 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit()
3081 target_label = ssa->cfg.blocks[b].successors[0]; in zend_jit()
3082 target_label2 = ssa->cfg.blocks[b].successors[1]; in zend_jit()
3111 target_label = ssa->cfg.blocks[b].successors[0]; in zend_jit()
3112 target_label2 = ssa->cfg.blocks[b].successors[1]; in zend_jit()
3127 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
3130 if (!zend_jit_fetch_dim_read(&dasm_state, opline, ssa, ssa_op, in zend_jit()
3133 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
3141 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
3149 zend_may_throw_ex(opline, ssa_op, op_array, ssa, OP1_INFO(), in zend_jit()
3159 if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) { in zend_jit()
3171 target_label = ssa->cfg.blocks[b].successors[0]; in zend_jit()
3172 target_label2 = ssa->cfg.blocks[b].successors[1]; in zend_jit()
3180 zend_may_throw(opline, ssa_op, op_array, ssa), in zend_jit()
3207 if (ssa->var_info && ssa->ops) { in zend_jit()
3208 zend_ssa_op *ssa_op = &ssa->ops[opline - op_array->opcodes]; in zend_jit()
3210 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit()
3218 if (!zend_jit_fetch_obj(&dasm_state, opline, op_array, ssa, ssa_op, in zend_jit()
3220 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
3225 if (!ssa->ops || !ssa->var_info) { in zend_jit()
3242 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
3249 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
3279 if (!zend_jit_switch(&dasm_state, opline, op_array, ssa, NULL, NULL)) { in zend_jit()
3319 ssa->cfg.blocks[b].successors[0], opline->opcode, NULL)) { in zend_jit()
3324 if (!zend_jit_fetch_constant(&dasm_state, opline, op_array, ssa, ssa_op)) { in zend_jit()
3346 if (ssa->var_info && ssa->ops) { in zend_jit()
3347 zend_ssa_op *ssa_op = &ssa->ops[opline - op_array->opcodes]; in zend_jit()
3349 zend_ssa_var_info *op1_ssa = ssa->var_info + ssa_op->op1_use; in zend_jit()
3357 if (!zend_jit_init_method_call(&dasm_state, opline, b, op_array, ssa, ssa_op, call_level, in zend_jit()
3375 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
3395 if (!zend_jit_jmp(&dasm_state, ssa->cfg.blocks[b].successors[0])) { in zend_jit()
3429 zend_may_throw(opline, ssa_op, op_array, ssa)) || in zend_jit()
3430 …!zend_jit_cond_jmp(&dasm_state, OP_JMP_ADDR(opline, opline->op2), ssa->cfg.blocks[b].successors[1]… in zend_jit()
3431 !zend_jit_jmp(&dasm_state, ssa->cfg.blocks[b].successors[0])) { in zend_jit()
3438 if (opline > op_array->opcodes + ssa->cfg.blocks[b].start && in zend_jit()
3441 if (!zend_jit_cond_jmp(&dasm_state, opline + 1, ssa->cfg.blocks[b].successors[0])) { in zend_jit()
3458 zend_may_throw(opline, ssa_op, op_array, ssa)) || in zend_jit()
3459 !zend_jit_cond_jmp(&dasm_state, opline + 1, ssa->cfg.blocks[b].successors[0])) { in zend_jit()
3471 if (ssa->ops && ssa->var_info) { in zend_jit()
3472 … zend_ssa_var_info *res_ssa = &ssa->var_info[ssa->ops[opline - op_array->opcodes].result_def]; in zend_jit()
3492 zend_jit_cond_jmp(&dasm_state, next_opline, ssa->cfg.blocks[b].successors[0]); in zend_jit()
3497 zend_jit_do_fcall(&dasm_state, next_opline, op_array, ssa, call_level, b + 1, NULL); in zend_jit()
3504 zend_may_throw(opline, ssa_op, op_array, ssa))) { in zend_jit()
3510 if (!zend_jit_cond_jmp(&dasm_state, opline + 2, ssa->cfg.blocks[b+1].successors[0])) { in zend_jit()
3513 if (!zend_jit_jmp(&dasm_state, ssa->cfg.blocks[b+1].successors[1])) { in zend_jit()
3530 handler = dasm_link_and_encode(&dasm_state, op_array, ssa, rt_opline, ra, NULL, 0); in zend_jit()
3583 memset(&func_info->ssa, 0, sizeof(zend_func_info) - offsetof(zend_func_info, ssa)); in zend_jit_cleanup_func_info()
3605 zend_ssa ssa; in zend_real_jit_func() local
3616 memset(&ssa, 0, sizeof(zend_ssa)); in zend_real_jit_func()
3618 if (zend_jit_op_array_analyze1(op_array, script, &ssa) != SUCCESS) { in zend_real_jit_func()
3633 …if (zend_jit_op_array_analyze2(op_array, script, &ssa, ZCG(accel_directives).optimization_level) !… in zend_real_jit_func()
3638 …p_op_array(op_array, ZEND_DUMP_HIDE_UNREACHABLE|ZEND_DUMP_RC_INFERENCE|ZEND_DUMP_SSA, "JIT", &ssa); in zend_real_jit_func()
3641 if (zend_jit(op_array, &ssa, rt_opline) != SUCCESS) { in zend_real_jit_func()
3943 if (zend_jit_op_array_analyze1(call_graph.op_arrays[i], script, &info->ssa) != SUCCESS) { in zend_jit_script()
3946 info->flags = info->ssa.cfg.flags; in zend_jit_script()
3963 …if (zend_jit_op_array_analyze2(call_graph.op_arrays[i], script, &info->ssa, ZCG(accel_directives).… in zend_jit_script()
3966 info->flags = info->ssa.cfg.flags; in zend_jit_script()
3974 ….op_arrays[i], ZEND_DUMP_HIDE_UNREACHABLE|ZEND_DUMP_RC_INFERENCE|ZEND_DUMP_SSA, "JIT", &info->ssa); in zend_jit_script()
3982 if (zend_jit(call_graph.op_arrays[i], &info->ssa, NULL) != SUCCESS) { in zend_jit_script()