Skip to content

Commit bfb5031

Browse files
committed
Remove tail call optimization
1 parent d2b79af commit bfb5031

File tree

1 file changed

+49
-64
lines changed

1 file changed

+49
-64
lines changed

Zend/Optimizer/zend_cfg.c

Lines changed: 49 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -35,82 +35,67 @@ static void zend_mark_reachable(zend_op *opcodes, zend_cfg *cfg, zend_basic_bloc
3535
zend_worklist_push(&work, b - cfg->blocks);
3636

3737
while (zend_worklist_len(&work)) {
38+
int i;
3839
b = cfg->blocks + zend_worklist_pop(&work);
3940

40-
bool finished = false;
41-
while (!finished) {
42-
int i;
43-
44-
b->flags |= ZEND_BB_REACHABLE;
45-
if (b->successors_count == 0) {
46-
b->flags |= ZEND_BB_EXIT;
47-
break;
48-
}
41+
b->flags |= ZEND_BB_REACHABLE;
42+
if (b->successors_count == 0) {
43+
b->flags |= ZEND_BB_EXIT;
44+
continue;
45+
}
4946

50-
for (i = 0; i < b->successors_count; i++) {
51-
zend_basic_block* succ = blocks + b->successors[i];
47+
for (i = 0; i < b->successors_count; i++) {
48+
zend_basic_block* succ = blocks + b->successors[i];
5249

53-
if (b->len != 0) {
54-
uint8_t opcode = opcodes[b->start + b->len - 1].opcode;
55-
if (opcode == ZEND_MATCH) {
50+
if (b->len != 0) {
51+
uint8_t opcode = opcodes[b->start + b->len - 1].opcode;
52+
if (opcode == ZEND_MATCH) {
53+
succ->flags |= ZEND_BB_TARGET;
54+
} else if (opcode == ZEND_SWITCH_LONG || opcode == ZEND_SWITCH_STRING) {
55+
if (i == b->successors_count - 1) {
56+
succ->flags |= ZEND_BB_FOLLOW | ZEND_BB_TARGET;
57+
} else {
5658
succ->flags |= ZEND_BB_TARGET;
57-
} else if (opcode == ZEND_SWITCH_LONG || opcode == ZEND_SWITCH_STRING) {
58-
if (i == b->successors_count - 1) {
59-
succ->flags |= ZEND_BB_FOLLOW | ZEND_BB_TARGET;
60-
} else {
61-
succ->flags |= ZEND_BB_TARGET;
62-
}
63-
} else if (b->successors_count == 1) {
64-
if (opcode == ZEND_JMP) {
65-
succ->flags |= ZEND_BB_TARGET;
66-
} else {
67-
succ->flags |= ZEND_BB_FOLLOW;
68-
69-
if ((cfg->flags & ZEND_CFG_STACKLESS)) {
70-
if (opcode == ZEND_INCLUDE_OR_EVAL ||
71-
opcode == ZEND_GENERATOR_CREATE ||
72-
opcode == ZEND_YIELD ||
73-
opcode == ZEND_YIELD_FROM ||
74-
opcode == ZEND_DO_FCALL ||
75-
opcode == ZEND_DO_UCALL ||
76-
opcode == ZEND_DO_FCALL_BY_NAME) {
77-
succ->flags |= ZEND_BB_ENTRY;
78-
}
79-
}
80-
if ((cfg->flags & ZEND_CFG_RECV_ENTRY)) {
81-
if (opcode == ZEND_RECV ||
82-
opcode == ZEND_RECV_INIT) {
83-
succ->flags |= ZEND_BB_RECV_ENTRY;
84-
}
59+
}
60+
} else if (b->successors_count == 1) {
61+
if (opcode == ZEND_JMP) {
62+
succ->flags |= ZEND_BB_TARGET;
63+
} else {
64+
succ->flags |= ZEND_BB_FOLLOW;
65+
66+
if ((cfg->flags & ZEND_CFG_STACKLESS)) {
67+
if (opcode == ZEND_INCLUDE_OR_EVAL ||
68+
opcode == ZEND_GENERATOR_CREATE ||
69+
opcode == ZEND_YIELD ||
70+
opcode == ZEND_YIELD_FROM ||
71+
opcode == ZEND_DO_FCALL ||
72+
opcode == ZEND_DO_UCALL ||
73+
opcode == ZEND_DO_FCALL_BY_NAME) {
74+
succ->flags |= ZEND_BB_ENTRY;
8575
}
8676
}
87-
} else {
88-
ZEND_ASSERT(b->successors_count == 2);
89-
if (i == 0) {
90-
succ->flags |= ZEND_BB_TARGET;
91-
} else {
92-
succ->flags |= ZEND_BB_FOLLOW;
77+
if ((cfg->flags & ZEND_CFG_RECV_ENTRY)) {
78+
if (opcode == ZEND_RECV ||
79+
opcode == ZEND_RECV_INIT) {
80+
succ->flags |= ZEND_BB_RECV_ENTRY;
81+
}
9382
}
9483
}
9584
} else {
96-
succ->flags |= ZEND_BB_FOLLOW;
97-
}
98-
99-
if (i == b->successors_count - 1) {
100-
/* Tail call optimization */
101-
if (succ->flags & ZEND_BB_REACHABLE) {
102-
finished = true;
103-
break;
104-
}
105-
106-
b = succ;
107-
break;
108-
} else {
109-
/* Recursively check reachability */
110-
if (!(succ->flags & ZEND_BB_REACHABLE)) {
111-
zend_worklist_push(&work, succ - cfg->blocks);
85+
ZEND_ASSERT(b->successors_count == 2);
86+
if (i == 0) {
87+
succ->flags |= ZEND_BB_TARGET;
88+
} else {
89+
succ->flags |= ZEND_BB_FOLLOW;
11290
}
11391
}
92+
} else {
93+
succ->flags |= ZEND_BB_FOLLOW;
94+
}
95+
96+
/* Check reachability of successor */
97+
if (!(succ->flags & ZEND_BB_REACHABLE)) {
98+
zend_worklist_push(&work, succ - cfg->blocks);
11499
}
115100
}
116101
}

0 commit comments

Comments
 (0)