@@ -35,82 +35,67 @@ static void zend_mark_reachable(zend_op *opcodes, zend_cfg *cfg, zend_basic_bloc
35
35
zend_worklist_push (& work , b - cfg -> blocks );
36
36
37
37
while (zend_worklist_len (& work )) {
38
+ int i ;
38
39
b = cfg -> blocks + zend_worklist_pop (& work );
39
40
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
+ }
49
46
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 ];
52
49
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 {
56
58
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 ;
85
75
}
86
76
}
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
+ }
93
82
}
94
83
}
95
84
} 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 ;
112
90
}
113
91
}
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 );
114
99
}
115
100
}
116
101
}
0 commit comments