Lines Matching refs:ssa

47 static zend_bool needs_pi(const zend_op_array *op_array, zend_dfg *dfg, zend_ssa *ssa, int from, in…  in needs_pi()  argument
59 from_block = &ssa->cfg.blocks[from]; in needs_pi()
65 to_block = &ssa->cfg.blocks[to]; in needs_pi()
75 return !dominates_other_predecessors(&ssa->cfg, to_block, other_successor, from); in needs_pi()
80 zend_arena **arena, const zend_op_array *op_array, zend_dfg *dfg, zend_ssa *ssa, in add_pi() argument
84 if (!needs_pi(op_array, dfg, ssa, from, to, var)) { in add_pi()
90 ZEND_MM_ALIGNED_SIZE(sizeof(int) * ssa->cfg.blocks[to].predecessors_count) + in add_pi()
91 sizeof(void*) * ssa->cfg.blocks[to].predecessors_count); in add_pi()
93 memset(phi->sources, 0xff, sizeof(int) * ssa->cfg.blocks[to].predecessors_count); in add_pi()
94 …phi->use_chains = (zend_ssa_phi**)(((char*)phi->sources) + ZEND_MM_ALIGNED_SIZE(sizeof(int) * ssa-… in add_pi()
99 phi->next = ssa->blocks[to].phis; in add_pi()
100 ssa->blocks[to].phis = phi; in add_pi()
110 if (ssa->cfg.blocks[to].predecessors_count > 1) { in add_pi()
230 uint32_t build_flags, zend_ssa *ssa, zend_dfg *dfg) /* {{{ */ { in place_essa_pis() argument
231 zend_basic_block *blocks = ssa->cfg.blocks; in place_essa_pis()
232 int j, blocks_count = ssa->cfg.blocks_count; in place_essa_pis()
348 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var1))) { in place_essa_pis()
351 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var1))) { in place_essa_pis()
355 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var1))) { in place_essa_pis()
358 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var1))) { in place_essa_pis()
363 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var1))) { in place_essa_pis()
367 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var1))) { in place_essa_pis()
371 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var1))) { in place_essa_pis()
375 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var1))) { in place_essa_pis()
383 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var2))) { in place_essa_pis()
386 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var2))) { in place_essa_pis()
390 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var2))) { in place_essa_pis()
393 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var2))) { in place_essa_pis()
398 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var2))) { in place_essa_pis()
402 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var2))) { in place_essa_pis()
406 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var2))) { in place_essa_pis()
410 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var2))) { in place_essa_pis()
424 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var))) { in place_essa_pis()
427 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
431 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var))) { in place_essa_pis()
434 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
445 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var))) { in place_essa_pis()
449 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
456 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
461 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var))) { in place_essa_pis()
490 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
493 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var))) { in place_essa_pis()
497 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bf, var))) { in place_essa_pis()
500 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
517 if ((pi = add_pi(arena, op_array, dfg, ssa, j, bt, var))) { in place_essa_pis()
526 static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa, int … in zend_ssa_rename() argument
528 zend_basic_block *blocks = ssa->cfg.blocks; in zend_ssa_rename()
529 zend_ssa_block *ssa_blocks = ssa->blocks; in zend_ssa_rename()
530 zend_ssa_op *ssa_ops = ssa->ops; in zend_ssa_rename()
531 int ssa_vars_count = ssa->vars_count; in zend_ssa_rename()
834 if (ssa->cfg.predecessors[blocks[succ].predecessor_offset + j] == n) { in zend_ssa_rename()
847 if (ssa->cfg.predecessors[blocks[succ].predecessor_offset + j] == n) { in zend_ssa_rename()
860 ssa->vars_count = ssa_vars_count; in zend_ssa_rename()
865 if (zend_ssa_rename(op_array, build_flags, ssa, var, j) != SUCCESS) in zend_ssa_rename()
878 … zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa) /* {{{ */ in zend_build_ssa() argument
880 zend_basic_block *blocks = ssa->cfg.blocks; in zend_build_ssa()
882 int blocks_count = ssa->cfg.blocks_count; in zend_build_ssa()
896 ssa->rt_constants = (build_flags & ZEND_RT_CONSTANTS); in zend_build_ssa()
898 ssa->blocks = ssa_blocks; in zend_build_ssa()
910 if (zend_build_dfg(op_array, &ssa->cfg, &dfg, build_flags) != SUCCESS) { in zend_build_ssa()
916 zend_dump_dfg(op_array, &ssa->cfg, &dfg); in zend_build_ssa()
928 place_essa_pis(arena, script, op_array, build_flags, ssa, &dfg); in zend_build_ssa()
946 i = ssa->cfg.predecessors[blocks[j].predecessor_offset + k]; in zend_build_ssa()
982 …zend_ssa_phi**)(((char*)phi->sources) + ZEND_MM_ALIGNED_SIZE(sizeof(int) * ssa->cfg.blocks[j].pred… in zend_build_ssa()
1005 zend_dump_phi_placement(op_array, ssa); in zend_build_ssa()
1009 ssa->ops = zend_arena_calloc(arena, op_array->last, sizeof(zend_ssa_op)); in zend_build_ssa()
1010 memset(ssa->ops, 0xff, op_array->last * sizeof(zend_ssa_op)); in zend_build_ssa()
1016 ssa->vars_count = op_array->last_var; in zend_build_ssa()
1017 if (zend_ssa_rename(op_array, build_flags, ssa, var, 0) != SUCCESS) { in zend_build_ssa()
1030 …_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ in zend_ssa_compute_use_def_chains() argument
1035 if (!ssa->vars) { in zend_ssa_compute_use_def_chains()
1036 ssa->vars = zend_arena_calloc(arena, ssa->vars_count, sizeof(zend_ssa_var)); in zend_ssa_compute_use_def_chains()
1038 ssa_vars = ssa->vars; in zend_ssa_compute_use_def_chains()
1046 for (i = op_array->last_var; i < ssa->vars_count; i++) { in zend_ssa_compute_use_def_chains()
1054 zend_ssa_op *op = ssa->ops + i; in zend_ssa_compute_use_def_chains()
1082 for (i = 0; i < ssa->cfg.blocks_count; i++) { in zend_ssa_compute_use_def_chains()
1083 zend_ssa_phi *phi = ssa->blocks[i].phis; in zend_ssa_compute_use_def_chains()
1094 p = zend_ssa_next_use_phi(ssa, phi->sources[0], p); in zend_ssa_compute_use_def_chains()
1114 for (j = 0; j < ssa->cfg.blocks[i].predecessors_count; j++) { in zend_ssa_compute_use_def_chains()
1120 p = zend_ssa_next_use_phi(ssa, phi->sources[j], p); in zend_ssa_compute_use_def_chains()
1134 if ((ssa->cfg.flags & ZEND_FUNC_INDIRECT_VAR_ACCESS)) { in zend_ssa_compute_use_def_chains()
1142 for (i = op_array->last_var; i < ssa->vars_count; i++) { in zend_ssa_compute_use_def_chains()
1152 int zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var) /* {{{ */ in zend_ssa_unlink_use_chain() argument
1154 if (ssa->vars[var].use_chain == op) { in zend_ssa_unlink_use_chain()
1155 ssa->vars[var].use_chain = zend_ssa_next_use(ssa->ops, var, op); in zend_ssa_unlink_use_chain()
1158 int use = ssa->vars[var].use_chain; in zend_ssa_unlink_use_chain()
1161 if (ssa->ops[use].result_use == var) { in zend_ssa_unlink_use_chain()
1162 if (ssa->ops[use].res_use_chain == op) { in zend_ssa_unlink_use_chain()
1163 ssa->ops[use].res_use_chain = zend_ssa_next_use(ssa->ops, var, op); in zend_ssa_unlink_use_chain()
1166 use = ssa->ops[use].res_use_chain; in zend_ssa_unlink_use_chain()
1168 } else if (ssa->ops[use].op1_use == var) { in zend_ssa_unlink_use_chain()
1169 if (ssa->ops[use].op1_use_chain == op) { in zend_ssa_unlink_use_chain()
1170 ssa->ops[use].op1_use_chain = zend_ssa_next_use(ssa->ops, var, op); in zend_ssa_unlink_use_chain()
1173 use = ssa->ops[use].op1_use_chain; in zend_ssa_unlink_use_chain()
1175 } else if (ssa->ops[use].op2_use == var) { in zend_ssa_unlink_use_chain()
1176 if (ssa->ops[use].op2_use_chain == op) { in zend_ssa_unlink_use_chain()
1177 ssa->ops[use].op2_use_chain = zend_ssa_next_use(ssa->ops, var, op); in zend_ssa_unlink_use_chain()
1180 use = ssa->ops[use].op2_use_chain; in zend_ssa_unlink_use_chain()
1193 void zend_ssa_remove_instr(zend_ssa *ssa, zend_op *opline, zend_ssa_op *ssa_op) /* {{{ */ in zend_ssa_remove_instr() argument
1196 zend_ssa_unlink_use_chain(ssa, ssa_op - ssa->ops, ssa_op->result_use); in zend_ssa_remove_instr()
1202 zend_ssa_unlink_use_chain(ssa, ssa_op - ssa->ops, ssa_op->op1_use); in zend_ssa_remove_instr()
1210 zend_ssa_unlink_use_chain(ssa, ssa_op - ssa->ops, ssa_op->op2_use); in zend_ssa_remove_instr()
1224 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
1230 for (j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { in zend_ssa_next_use_phi_ptr()
1243 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
1245 zend_ssa_phi **cur = &ssa->vars[source].phi_use_chain; in zend_ssa_remove_use_of_phi_source()
1247 cur = zend_ssa_next_use_phi_ptr(ssa, source, *cur); in zend_ssa_remove_use_of_phi_source()
1255 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
1259 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()
1264 static void zend_ssa_remove_phi_from_block(zend_ssa *ssa, zend_ssa_phi *phi) /* {{{ */ in zend_ssa_remove_phi_from_block() argument
1266 zend_ssa_block *block = &ssa->blocks[phi->block]; in zend_ssa_remove_phi_from_block()
1276 static inline void zend_ssa_remove_defs_of_instr(zend_ssa *ssa, zend_ssa_op *ssa_op) /* {{{ */ in zend_ssa_remove_defs_of_instr() argument
1279 zend_ssa_remove_uses_of_var(ssa, ssa_op->op1_def); in zend_ssa_remove_defs_of_instr()
1280 zend_ssa_remove_op1_def(ssa, ssa_op); in zend_ssa_remove_defs_of_instr()
1283 zend_ssa_remove_uses_of_var(ssa, ssa_op->op2_def); in zend_ssa_remove_defs_of_instr()
1284 zend_ssa_remove_op2_def(ssa, ssa_op); in zend_ssa_remove_defs_of_instr()
1287 zend_ssa_remove_uses_of_var(ssa, ssa_op->result_def); in zend_ssa_remove_defs_of_instr()
1288 zend_ssa_remove_result_def(ssa, ssa_op); in zend_ssa_remove_defs_of_instr()
1293 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
1318 zend_ssa_remove_use_of_phi_source(ssa, phi, var_num, next_phi); in zend_ssa_remove_phi_source()
1322 void zend_ssa_remove_phi(zend_ssa *ssa, zend_ssa_phi *phi) /* {{{ */ in zend_ssa_remove_phi() argument
1325 ZEND_ASSERT(ssa->vars[phi->ssa_var].use_chain < 0 in zend_ssa_remove_phi()
1326 && ssa->vars[phi->ssa_var].phi_use_chain == NULL); in zend_ssa_remove_phi()
1327 zend_ssa_remove_uses_of_phi_sources(ssa, phi); in zend_ssa_remove_phi()
1328 zend_ssa_remove_phi_from_block(ssa, phi); in zend_ssa_remove_phi()
1329 ssa->vars[phi->ssa_var].definition_phi = NULL; in zend_ssa_remove_phi()
1334 void zend_ssa_remove_uses_of_var(zend_ssa *ssa, int var_num) /* {{{ */ in zend_ssa_remove_uses_of_var() argument
1336 zend_ssa_var *var = &ssa->vars[var_num]; in zend_ssa_remove_uses_of_var()
1349 zend_ssa_op *ssa_op = &ssa->ops[use]; in zend_ssa_remove_uses_of_var()
1367 void zend_ssa_remove_predecessor(zend_ssa *ssa, int from, int to) /* {{{ */ in zend_ssa_remove_predecessor() argument
1369 zend_basic_block *next_block = &ssa->cfg.blocks[to]; in zend_ssa_remove_predecessor()
1370 zend_ssa_block *next_ssa_block = &ssa->blocks[to]; in zend_ssa_remove_predecessor()
1376 int *predecessors = &ssa->cfg.predecessors[next_block->predecessor_offset]; in zend_ssa_remove_predecessor()
1395 zend_ssa_rename_var_uses(ssa, phi->ssa_var, phi->sources[0], /* update_types */ 0); in zend_ssa_remove_predecessor()
1396 zend_ssa_remove_phi(ssa, phi); in zend_ssa_remove_predecessor()
1400 zend_ssa_remove_phi_source(ssa, phi, pred_offset, next_block->predecessors_count); in zend_ssa_remove_predecessor()
1407 predecessors = &ssa->cfg.predecessors[next_block->predecessor_offset + pred_offset]; in zend_ssa_remove_predecessor()
1413 void zend_ssa_remove_block(zend_op_array *op_array, zend_ssa *ssa, int i) /* {{{ */ in zend_ssa_remove_block() argument
1415 zend_basic_block *block = &ssa->cfg.blocks[i]; in zend_ssa_remove_block()
1416 zend_ssa_block *ssa_block = &ssa->blocks[i]; in zend_ssa_remove_block()
1425 zend_ssa_remove_uses_of_var(ssa, phi->ssa_var); in zend_ssa_remove_block()
1426 zend_ssa_remove_phi(ssa, phi); in zend_ssa_remove_block()
1435 zend_ssa_remove_defs_of_instr(ssa, &ssa->ops[j]); in zend_ssa_remove_block()
1436 zend_ssa_remove_instr(ssa, &op_array->opcodes[j], &ssa->ops[j]); in zend_ssa_remove_block()
1440 zend_ssa_remove_predecessor(ssa, i, block->successors[s]); in zend_ssa_remove_block()
1444 predecessors = &ssa->cfg.predecessors[block->predecessor_offset]; in zend_ssa_remove_block()
1447 zend_basic_block *prev_block = &ssa->cfg.blocks[predecessors[j]]; in zend_ssa_remove_block()
1466 j = ssa->cfg.blocks[block->idom].children; in zend_ssa_remove_block()
1468 ssa->cfg.blocks[block->idom].children = block->next_child; in zend_ssa_remove_block()
1470 while (ssa->cfg.blocks[j].next_child >= 0) { in zend_ssa_remove_block()
1471 if (ssa->cfg.blocks[j].next_child == i) { in zend_ssa_remove_block()
1472 ssa->cfg.blocks[j].next_child = block->next_child; in zend_ssa_remove_block()
1475 j = ssa->cfg.blocks[j].next_child; in zend_ssa_remove_block()
1486 static void propagate_phi_type_widening(zend_ssa *ssa, int var) /* {{{ */ in propagate_phi_type_widening() argument
1489 FOREACH_PHI_USE(&ssa->vars[var], phi) { in propagate_phi_type_widening()
1490 if (ssa->var_info[var].type & ~ssa->var_info[phi->ssa_var].type) { in propagate_phi_type_widening()
1491 ssa->var_info[phi->ssa_var].type |= ssa->var_info[var].type; in propagate_phi_type_widening()
1492 propagate_phi_type_widening(ssa, phi->ssa_var); in propagate_phi_type_widening()
1498 void zend_ssa_rename_var_uses(zend_ssa *ssa, int old, int new, zend_bool update_types) /* {{{ */ in zend_ssa_rename_var_uses() argument
1500 zend_ssa_var *old_var = &ssa->vars[old]; in zend_ssa_rename_var_uses()
1501 zend_ssa_var *new_var = &ssa->vars[new]; in zend_ssa_rename_var_uses()
1513 zend_ssa_op *ssa_op = &ssa->ops[use]; in zend_ssa_rename_var_uses()
1574 for (j = 0; j < ssa->cfg.blocks[phi->block].predecessors_count; j++) { in zend_ssa_rename_var_uses()
1581 for (j = 0; j < ssa->cfg.blocks[phi->block].predecessors_count; j++) { in zend_ssa_rename_var_uses()
1608 if (update_types && (ssa->var_info[new].type & ~ssa->var_info[phi->ssa_var].type)) { in zend_ssa_rename_var_uses()
1609 ssa->var_info[phi->ssa_var].type |= ssa->var_info[new].type; in zend_ssa_rename_var_uses()
1610 propagate_phi_type_widening(ssa, phi->ssa_var); in zend_ssa_rename_var_uses()