38 for (i = 0; i <
count; i++) {
61 int r1 = union_find_root(parent, i);
62 int r2 = union_find_root(parent,
j);
89 union_find_init(parent,
size, ssa_vars_count);
91 for (i = 0; i < ssa_vars_count; i++) {
92 if (ssa_vars[i].definition_phi) {
95 union_find_unite(parent,
size, i,
p->sources[0]);
98 union_find_unite(parent,
size, i,
p->sources[
j]);
101 }
else if (ssa_vars[i].definition >= 0) {
140 for (i = 0; i < ssa_vars_count; i++) {
141 parent[i] = union_find_root(parent, i);
162 script, op_array, opline);
163 uint32_t forbidden_flags =
176 && !(ce->
ce_flags & forbidden_flags)
197 }
else if (ssa_op->
op1_def == var) {
236 script, op_array, opline);
251 }
else if (op->
op1_def == var) {
388 bool has_allocations;
397 for (i = op_array->
last_var; i < ssa_vars_count; i++) {
398 if (ssa_vars[i].definition >= 0
400 && is_allocation_def(op_array, ssa, ssa_vars[i].definition, i, script)) {
405 if (!has_allocations) {
411 ees =
do_alloca(
sizeof(
int) * ssa_vars_count, use_heap);
416 if (zend_build_equi_escape_sets(ees, op_array, ssa) ==
FAILURE) {
423 for (i = op_array->
last_var; i < ssa_vars_count; i++) {
432 }
else if (ssa_vars[i].definition >= 0
434 if (!is_local_def(op_array, ssa, ssa_vars[i].definition, i, script)) {
440 && is_allocation_def(op_array, ssa, ssa_vars[i].definition, i, script)) {
448 if (num_non_escaped) {
449 for (i = 0; i < ssa_vars_count; i++) {
450 if (ssa_vars[i].use_chain >= 0) {
454 if (is_escape_use(op_array, ssa, use, i)) {
457 if (num_non_escaped == 0) {
469 if (num_non_escaped) {
474 for (i = 0; i < ssa_vars_count; i++) {
475 if (ssa_vars[i].use_chain >= 0) {
488 (op-1)->op1_use >= 0) {
489 enclosing_root = ees[(op-1)->op1_use];
500 ssa_vars[enclosing_root].escape_state > ssa_vars[root].escape_state) {
508 if (num_non_escaped == 0) {
526 for (i = 0; i < ssa_vars_count; i++) {
count(Countable|array $value, int $mode=COUNT_NORMAL)
zend_result zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa)
zend_basic_block * blocks
zend_object *(* create_object)(zend_class_entry *class_type)
zend_function * constructor
zend_class_entry * parent
const zend_object_handlers * default_object_handlers
zend_function * destructor
zend_object_dtor_obj_t dtor_obj
zend_object_get_constructor_t get_constructor
unsigned int escape_state
zend_ssa_phi * definition_phi
zend_ssa_var_info * var_info
#define CRT_CONSTANT(node)
#define ZEND_ACC_IMPLICIT_ABSTRACT_CLASS
#define ZEND_ACC_EXPLICIT_ABSTRACT_CLASS
#define ZEND_ACC_INTERFACE
struct _zend_op_array zend_op_array
#define ZEND_ACC_CONSTANTS_UPDATED
#define ZEND_ARRAY_ELEMENT_REF
ZEND_API zend_function * zend_std_get_constructor(zend_object *zobj)
ZEND_API void zend_objects_destroy_object(zend_object *object)
zend_class_entry * zend_optimizer_get_class_entry_from_op1(const zend_script *script, const zend_op_array *op_array, const zend_op *opline)
struct _zend_script zend_script
#define ALLOCA_FLAG(name)
#define do_alloca(p, use_heap)
#define zend_always_inline
#define free_alloca(p, use_heap)
struct _zend_class_entry zend_class_entry
#define FOREACH_USE_END()
@ ESCAPE_STATE_GLOBAL_ESCAPE
struct _zend_ssa zend_ssa
struct _zend_ssa_var zend_ssa_var
#define FOREACH_USE(var, use)
struct _zend_ssa_phi zend_ssa_phi
struct _zend_ssa_op zend_ssa_op
ZEND_RESULT_CODE zend_result
#define ZEND_ASSIGN_DIM_OP
#define ZEND_ASSIGN_STATIC_PROP_OP
#define ZEND_FETCH_OBJ_IS
#define ZEND_POST_DEC_OBJ
#define ZEND_ISSET_ISEMPTY_PROP_OBJ
#define ZEND_ADD_ARRAY_ELEMENT
#define ZEND_ISSET_ISEMPTY_DIM_OBJ
#define ZEND_ASSIGN_OBJ_OP
#define ZEND_ASSIGN_OBJ_REF
#define ZEND_FETCH_DIM_IS
#define ZEND_POST_INC_OBJ