Lines Matching refs:ssa

60 static bool needs_pi(const zend_op_array *op_array, const zend_dfg *dfg, const zend_ssa *ssa, int f…  in needs_pi()  argument
72 from_block = &ssa->cfg.blocks[from]; in needs_pi()
78 to_block = &ssa->cfg.blocks[to]; in needs_pi()
88 return !will_rejoin(&ssa->cfg, dfg, to_block, other_successor, from, var); in needs_pi()
93 zend_arena **arena, const zend_op_array *op_array, zend_dfg *dfg, zend_ssa *ssa, in add_pi() argument
97 if (!needs_pi(op_array, dfg, ssa, from, to, var)) { in add_pi()
103 ZEND_MM_ALIGNED_SIZE(sizeof(int) * ssa->cfg.blocks[to].predecessors_count) + in add_pi()
104 sizeof(void*) * ssa->cfg.blocks[to].predecessors_count); in add_pi()
106 memset(phi->sources, 0xff, sizeof(int) * ssa->cfg.blocks[to].predecessors_count); in add_pi()
107 …phi->use_chains = (zend_ssa_phi**)(((char*)phi->sources) + ZEND_MM_ALIGNED_SIZE(sizeof(int) * ssa-… in add_pi()
112 phi->next = ssa->blocks[to].phis; in add_pi()
113 ssa->blocks[to].phis = phi; in add_pi()
123 if (ssa->cfg.blocks[to].predecessors_count > 1) { in add_pi()
243 uint32_t build_flags, zend_ssa *ssa, zend_dfg *dfg) /* {{{ */ { in place_essa_pis() argument
244 zend_basic_block *blocks = ssa->cfg.blocks; in place_essa_pis()
245 int j, blocks_count = ssa->cfg.blocks_count; in place_essa_pis()
270 if ((pi = add_pi(arena, op_array, dfg, ssa, j, blocks[j].successors[0], var))) { in place_essa_pis()
278 if ((pi = add_pi(arena, op_array, dfg, ssa, j, blocks[j].successors[1], var))) { in place_essa_pis()
368 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var1))) { in place_essa_pis()
371 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var1))) { in place_essa_pis()
375 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var1))) { in place_essa_pis()
378 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var1))) { in place_essa_pis()
383 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var1))) { in place_essa_pis()
387 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var1))) { in place_essa_pis()
391 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var1))) { in place_essa_pis()
395 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var1))) { in place_essa_pis()
403 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var2))) { in place_essa_pis()
406 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var2))) { in place_essa_pis()
410 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var2))) { in place_essa_pis()
413 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var2))) { in place_essa_pis()
418 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var2))) { in place_essa_pis()
422 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var2))) { in place_essa_pis()
426 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var2))) { in place_essa_pis()
430 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var2))) { in place_essa_pis()
444 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var))) { in place_essa_pis()
447 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
451 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var))) { in place_essa_pis()
454 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
465 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var))) { in place_essa_pis()
469 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
476 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
481 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var))) { in place_essa_pis()
510 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
513 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var))) { in place_essa_pis()
517 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var))) { in place_essa_pis()
520 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
534 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
790 …_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa, int *var, int n) /… in zend_ssa_rename() argument
792 zend_basic_block *blocks = ssa->cfg.blocks; in zend_ssa_rename()
793 zend_ssa_block *ssa_blocks = ssa->blocks; in zend_ssa_rename()
794 zend_ssa_op *ssa_ops = ssa->ops; in zend_ssa_rename()
795 int ssa_vars_count = ssa->vars_count; in zend_ssa_rename()
859 if (ssa->cfg.predecessors[blocks[succ].predecessor_offset + j] == n) { in zend_ssa_rename()
876 if (ssa->cfg.predecessors[blocks[succ].predecessor_offset + j] == n) { in zend_ssa_rename()
889 ssa->vars_count = ssa_vars_count; in zend_ssa_rename()
894 if (zend_ssa_rename(op_array, build_flags, ssa, var, j) == FAILURE) in zend_ssa_rename()
907 … zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa) /* {{{ */ in zend_build_ssa() argument
909 zend_basic_block *blocks = ssa->cfg.blocks; in zend_build_ssa()
911 int blocks_count = ssa->cfg.blocks_count; in zend_build_ssa()
926 ssa->blocks = ssa_blocks; in zend_build_ssa()
938 zend_build_dfg(op_array, &ssa->cfg, &dfg, build_flags); in zend_build_ssa()
941 zend_dump_dfg(op_array, &ssa->cfg, &dfg); in zend_build_ssa()
953 place_essa_pis(arena, script, op_array, build_flags, ssa, &dfg); in zend_build_ssa()
971 i = ssa->cfg.predecessors[blocks[j].predecessor_offset + k]; in zend_build_ssa()
1007 …zend_ssa_phi**)(((char*)phi->sources) + ZEND_MM_ALIGNED_SIZE(sizeof(int) * ssa->cfg.blocks[j].pred… in zend_build_ssa()
1030 zend_dump_phi_placement(op_array, ssa); in zend_build_ssa()
1034 ssa->ops = zend_arena_calloc(arena, op_array->last, sizeof(zend_ssa_op)); in zend_build_ssa()
1035 memset(ssa->ops, 0xff, op_array->last * sizeof(zend_ssa_op)); in zend_build_ssa()
1041 ssa->vars_count = op_array->last_var; in zend_build_ssa()
1042 if (zend_ssa_rename(op_array, build_flags, ssa, var, 0) == FAILURE) { in zend_build_ssa()
1055 …_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ in zend_ssa_compute_use_def_chains() argument
1060 if (!ssa->vars) { in zend_ssa_compute_use_def_chains()
1061 ssa->vars = zend_arena_calloc(arena, ssa->vars_count, sizeof(zend_ssa_var)); in zend_ssa_compute_use_def_chains()
1063 ssa_vars = ssa->vars; in zend_ssa_compute_use_def_chains()
1071 for (i = op_array->last_var; i < ssa->vars_count; i++) { in zend_ssa_compute_use_def_chains()
1079 zend_ssa_op *op = ssa->ops + i; in zend_ssa_compute_use_def_chains()
1107 for (i = 0; i < ssa->cfg.blocks_count; i++) { in zend_ssa_compute_use_def_chains()
1108 zend_ssa_phi *phi = ssa->blocks[i].phis; in zend_ssa_compute_use_def_chains()
1119 p = zend_ssa_next_use_phi(ssa, phi->sources[0], p); in zend_ssa_compute_use_def_chains()
1139 for (j = 0; j < ssa->cfg.blocks[i].predecessors_count; j++) { in zend_ssa_compute_use_def_chains()
1145 p = zend_ssa_next_use_phi(ssa, phi->sources[j], p); in zend_ssa_compute_use_def_chains()
1159 if ((ssa->cfg.flags & ZEND_FUNC_INDIRECT_VAR_ACCESS)) { in zend_ssa_compute_use_def_chains()
1165 for (i = op_array->last_var; i < ssa->vars_count; i++) { in zend_ssa_compute_use_def_chains()
1173 void zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var) /* {{{ */ in zend_ssa_unlink_use_chain() argument
1175 if (ssa->vars[var].use_chain == op) { in zend_ssa_unlink_use_chain()
1176 ssa->vars[var].use_chain = zend_ssa_next_use(ssa->ops, var, op); in zend_ssa_unlink_use_chain()
1179 int use = ssa->vars[var].use_chain; in zend_ssa_unlink_use_chain()
1182 if (ssa->ops[use].result_use == var) { in zend_ssa_unlink_use_chain()
1183 if (ssa->ops[use].res_use_chain == op) { in zend_ssa_unlink_use_chain()
1184 ssa->ops[use].res_use_chain = zend_ssa_next_use(ssa->ops, var, op); in zend_ssa_unlink_use_chain()
1187 use = ssa->ops[use].res_use_chain; in zend_ssa_unlink_use_chain()
1189 } else if (ssa->ops[use].op1_use == var) { in zend_ssa_unlink_use_chain()
1190 if (ssa->ops[use].op1_use_chain == op) { in zend_ssa_unlink_use_chain()
1191 ssa->ops[use].op1_use_chain = zend_ssa_next_use(ssa->ops, var, op); in zend_ssa_unlink_use_chain()
1194 use = ssa->ops[use].op1_use_chain; in zend_ssa_unlink_use_chain()
1196 } else if (ssa->ops[use].op2_use == var) { in zend_ssa_unlink_use_chain()
1197 if (ssa->ops[use].op2_use_chain == op) { in zend_ssa_unlink_use_chain()
1198 ssa->ops[use].op2_use_chain = zend_ssa_next_use(ssa->ops, var, op); in zend_ssa_unlink_use_chain()
1201 use = ssa->ops[use].op2_use_chain; in zend_ssa_unlink_use_chain()
1212 void zend_ssa_replace_use_chain(zend_ssa *ssa, int op, int new_op, int var) /* {{{ */ in zend_ssa_replace_use_chain() argument
1214 if (ssa->vars[var].use_chain == op) { in zend_ssa_replace_use_chain()
1215 ssa->vars[var].use_chain = new_op; in zend_ssa_replace_use_chain()
1218 int use = ssa->vars[var].use_chain; in zend_ssa_replace_use_chain()
1221 if (ssa->ops[use].result_use == var) { in zend_ssa_replace_use_chain()
1222 if (ssa->ops[use].res_use_chain == op) { in zend_ssa_replace_use_chain()
1223 ssa->ops[use].res_use_chain = new_op; in zend_ssa_replace_use_chain()
1226 use = ssa->ops[use].res_use_chain; in zend_ssa_replace_use_chain()
1228 } else if (ssa->ops[use].op1_use == var) { in zend_ssa_replace_use_chain()
1229 if (ssa->ops[use].op1_use_chain == op) { in zend_ssa_replace_use_chain()
1230 ssa->ops[use].op1_use_chain = new_op; in zend_ssa_replace_use_chain()
1233 use = ssa->ops[use].op1_use_chain; in zend_ssa_replace_use_chain()
1235 } else if (ssa->ops[use].op2_use == var) { in zend_ssa_replace_use_chain()
1236 if (ssa->ops[use].op2_use_chain == op) { in zend_ssa_replace_use_chain()
1237 ssa->ops[use].op2_use_chain = new_op; in zend_ssa_replace_use_chain()
1240 use = ssa->ops[use].op2_use_chain; in zend_ssa_replace_use_chain()
1252 void zend_ssa_remove_instr(zend_ssa *ssa, zend_op *opline, zend_ssa_op *ssa_op) /* {{{ */ in zend_ssa_remove_instr() argument
1255 zend_ssa_unlink_use_chain(ssa, ssa_op - ssa->ops, ssa_op->result_use); in zend_ssa_remove_instr()
1261 zend_ssa_unlink_use_chain(ssa, ssa_op - ssa->ops, ssa_op->op1_use); in zend_ssa_remove_instr()
1269 zend_ssa_unlink_use_chain(ssa, ssa_op - ssa->ops, ssa_op->op2_use); in zend_ssa_remove_instr()
1283 static inline zend_ssa_phi **zend_ssa_next_use_phi_ptr(zend_ssa *ssa, int var, zend_ssa_phi *p) /* … in zend_ssa_next_use_phi_ptr() argument
1289 for (j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { in zend_ssa_next_use_phi_ptr()
1302 static inline void zend_ssa_remove_use_of_phi_source(zend_ssa *ssa, zend_ssa_phi *phi, int source, … in zend_ssa_remove_use_of_phi_source() argument
1304 zend_ssa_phi **cur = &ssa->vars[source].phi_use_chain; in zend_ssa_remove_use_of_phi_source()
1306 cur = zend_ssa_next_use_phi_ptr(ssa, source, *cur); in zend_ssa_remove_use_of_phi_source()
1314 static void zend_ssa_remove_uses_of_phi_sources(zend_ssa *ssa, zend_ssa_phi *phi) /* {{{ */ in zend_ssa_remove_uses_of_phi_sources() argument
1318 zend_ssa_remove_use_of_phi_source(ssa, phi, source, zend_ssa_next_use_phi(ssa, source, phi)); in zend_ssa_remove_uses_of_phi_sources()
1323 static void zend_ssa_remove_phi_from_block(zend_ssa *ssa, zend_ssa_phi *phi) /* {{{ */ in zend_ssa_remove_phi_from_block() argument
1325 zend_ssa_block *block = &ssa->blocks[phi->block]; in zend_ssa_remove_phi_from_block()
1335 void zend_ssa_remove_defs_of_instr(zend_ssa *ssa, zend_ssa_op *ssa_op) /* {{{ */ in zend_ssa_remove_defs_of_instr() argument
1338 zend_ssa_remove_uses_of_var(ssa, ssa_op->op1_def); in zend_ssa_remove_defs_of_instr()
1339 zend_ssa_remove_op1_def(ssa, ssa_op); in zend_ssa_remove_defs_of_instr()
1342 zend_ssa_remove_uses_of_var(ssa, ssa_op->op2_def); in zend_ssa_remove_defs_of_instr()
1343 zend_ssa_remove_op2_def(ssa, ssa_op); in zend_ssa_remove_defs_of_instr()
1346 zend_ssa_remove_uses_of_var(ssa, ssa_op->result_def); in zend_ssa_remove_defs_of_instr()
1347 zend_ssa_remove_result_def(ssa, ssa_op); in zend_ssa_remove_defs_of_instr()
1352 static inline void zend_ssa_remove_phi_source(zend_ssa *ssa, zend_ssa_phi *phi, int pred_offset, in… in zend_ssa_remove_phi_source() argument
1377 zend_ssa_remove_use_of_phi_source(ssa, phi, var_num, next_phi); in zend_ssa_remove_phi_source()
1381 void zend_ssa_remove_phi(zend_ssa *ssa, zend_ssa_phi *phi) /* {{{ */ in zend_ssa_remove_phi() argument
1384 ZEND_ASSERT(ssa->vars[phi->ssa_var].use_chain < 0 in zend_ssa_remove_phi()
1385 && ssa->vars[phi->ssa_var].phi_use_chain == NULL); in zend_ssa_remove_phi()
1386 zend_ssa_remove_uses_of_phi_sources(ssa, phi); in zend_ssa_remove_phi()
1387 zend_ssa_remove_phi_from_block(ssa, phi); in zend_ssa_remove_phi()
1388 ssa->vars[phi->ssa_var].definition_phi = NULL; in zend_ssa_remove_phi()
1393 void zend_ssa_remove_uses_of_var(zend_ssa *ssa, int var_num) /* {{{ */ in zend_ssa_remove_uses_of_var() argument
1395 zend_ssa_var *var = &ssa->vars[var_num]; in zend_ssa_remove_uses_of_var()
1408 zend_ssa_op *ssa_op = &ssa->ops[use]; in zend_ssa_remove_uses_of_var()
1426 void zend_ssa_remove_predecessor(zend_ssa *ssa, int from, int to) /* {{{ */ in zend_ssa_remove_predecessor() argument
1428 zend_basic_block *next_block = &ssa->cfg.blocks[to]; in zend_ssa_remove_predecessor()
1429 zend_ssa_block *next_ssa_block = &ssa->blocks[to]; in zend_ssa_remove_predecessor()
1435 int *predecessors = &ssa->cfg.predecessors[next_block->predecessor_offset]; in zend_ssa_remove_predecessor()
1454 zend_ssa_rename_var_uses(ssa, phi->ssa_var, phi->sources[0], /* update_types */ 0); in zend_ssa_remove_predecessor()
1455 zend_ssa_remove_phi(ssa, phi); in zend_ssa_remove_predecessor()
1459 zend_ssa_remove_phi_source(ssa, phi, pred_offset, next_block->predecessors_count); in zend_ssa_remove_predecessor()
1466 predecessors = &ssa->cfg.predecessors[next_block->predecessor_offset + pred_offset]; in zend_ssa_remove_predecessor()
1472 void zend_ssa_remove_block(zend_op_array *op_array, zend_ssa *ssa, int i) /* {{{ */ in zend_ssa_remove_block() argument
1474 zend_basic_block *block = &ssa->cfg.blocks[i]; in zend_ssa_remove_block()
1475 zend_ssa_block *ssa_block = &ssa->blocks[i]; in zend_ssa_remove_block()
1483 zend_ssa_remove_uses_of_var(ssa, phi->ssa_var); in zend_ssa_remove_block()
1484 zend_ssa_remove_phi(ssa, phi); in zend_ssa_remove_block()
1493 zend_ssa_remove_defs_of_instr(ssa, &ssa->ops[j]); in zend_ssa_remove_block()
1494 zend_ssa_remove_instr(ssa, &op_array->opcodes[j], &ssa->ops[j]); in zend_ssa_remove_block()
1497 zend_ssa_remove_block_from_cfg(ssa, i); in zend_ssa_remove_block()
1501 void zend_ssa_remove_block_from_cfg(zend_ssa *ssa, int i) /* {{{ */ in zend_ssa_remove_block_from_cfg() argument
1503 zend_basic_block *block = &ssa->cfg.blocks[i]; in zend_ssa_remove_block_from_cfg()
1508 zend_ssa_remove_predecessor(ssa, i, block->successors[s]); in zend_ssa_remove_block_from_cfg()
1512 predecessors = &ssa->cfg.predecessors[block->predecessor_offset]; in zend_ssa_remove_block_from_cfg()
1515 zend_basic_block *prev_block = &ssa->cfg.blocks[predecessors[j]]; in zend_ssa_remove_block_from_cfg()
1534 j = ssa->cfg.blocks[block->idom].children; in zend_ssa_remove_block_from_cfg()
1536 ssa->cfg.blocks[block->idom].children = block->next_child; in zend_ssa_remove_block_from_cfg()
1538 while (ssa->cfg.blocks[j].next_child >= 0) { in zend_ssa_remove_block_from_cfg()
1539 if (ssa->cfg.blocks[j].next_child == i) { in zend_ssa_remove_block_from_cfg()
1540 ssa->cfg.blocks[j].next_child = block->next_child; in zend_ssa_remove_block_from_cfg()
1543 j = ssa->cfg.blocks[j].next_child; in zend_ssa_remove_block_from_cfg()
1554 static void propagate_phi_type_widening(zend_ssa *ssa, int var) /* {{{ */ in propagate_phi_type_widening() argument
1557 FOREACH_PHI_USE(&ssa->vars[var], phi) { in propagate_phi_type_widening()
1558 if (ssa->var_info[var].type & ~ssa->var_info[phi->ssa_var].type) { in propagate_phi_type_widening()
1559 ssa->var_info[phi->ssa_var].type |= ssa->var_info[var].type; in propagate_phi_type_widening()
1560 propagate_phi_type_widening(ssa, phi->ssa_var); in propagate_phi_type_widening()
1566 void zend_ssa_rename_var_uses(zend_ssa *ssa, int old, int new, bool update_types) /* {{{ */ in zend_ssa_rename_var_uses() argument
1568 zend_ssa_var *old_var = &ssa->vars[old]; in zend_ssa_rename_var_uses()
1569 zend_ssa_var *new_var = &ssa->vars[new]; in zend_ssa_rename_var_uses()
1581 zend_ssa_op *ssa_op = &ssa->ops[use]; in zend_ssa_rename_var_uses()
1642 for (j = 0; j < ssa->cfg.blocks[phi->block].predecessors_count; j++) { in zend_ssa_rename_var_uses()
1649 for (j = 0; j < ssa->cfg.blocks[phi->block].predecessors_count; j++) { in zend_ssa_rename_var_uses()
1676 if (update_types && (ssa->var_info[new].type & ~ssa->var_info[phi->ssa_var].type)) { in zend_ssa_rename_var_uses()
1677 ssa->var_info[phi->ssa_var].type |= ssa->var_info[new].type; in zend_ssa_rename_var_uses()
1678 propagate_phi_type_widening(ssa, phi->ssa_var); in zend_ssa_rename_var_uses()