OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 #include "test/cctest/cctest.h" | 6 #include "test/cctest/cctest.h" |
7 | 7 |
8 #include "src/compiler/common-operator.h" | 8 #include "src/compiler/common-operator.h" |
9 #include "src/compiler/generic-node-inl.h" | 9 #include "src/compiler/generic-node-inl.h" |
10 #include "src/compiler/generic-node.h" | 10 #include "src/compiler/generic-node.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 CHECK(num >= header->rpo_number_ && num < header->loop_end_); | 61 CHECK(num >= header->rpo_number_ && num < header->loop_end_); |
62 CHECK(header->LoopContains(blocks[i])); | 62 CHECK(header->LoopContains(blocks[i])); |
63 CHECK(header->IsLoopHeader() || blocks[i]->loop_header_ == header); | 63 CHECK(header->IsLoopHeader() || blocks[i]->loop_header_ == header); |
64 } | 64 } |
65 } | 65 } |
66 | 66 |
67 | 67 |
68 TEST(RPODegenerate1) { | 68 TEST(RPODegenerate1) { |
69 HandleAndZoneScope scope; | 69 HandleAndZoneScope scope; |
70 Schedule schedule(scope.main_zone()); | 70 Schedule schedule(scope.main_zone()); |
71 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
72 | 71 |
73 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 72 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
74 CheckRPONumbers(order, 1, false); | 73 CheckRPONumbers(order, 1, false); |
75 CHECK_EQ(schedule.entry(), order->at(0)); | 74 CHECK_EQ(schedule.entry(), order->at(0)); |
76 } | 75 } |
77 | 76 |
78 | 77 |
79 TEST(RPODegenerate2) { | 78 TEST(RPODegenerate2) { |
80 HandleAndZoneScope scope; | 79 HandleAndZoneScope scope; |
81 Schedule schedule(scope.main_zone()); | 80 Schedule schedule(scope.main_zone()); |
82 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
83 | 81 |
84 schedule.AddGoto(schedule.entry(), schedule.exit()); | 82 schedule.AddGoto(schedule.entry(), schedule.exit()); |
85 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 83 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
86 CheckRPONumbers(order, 2, false); | 84 CheckRPONumbers(order, 2, false); |
87 CHECK_EQ(schedule.entry(), order->at(0)); | 85 CHECK_EQ(schedule.entry(), order->at(0)); |
88 CHECK_EQ(schedule.exit(), order->at(1)); | 86 CHECK_EQ(schedule.exit(), order->at(1)); |
89 } | 87 } |
90 | 88 |
91 | 89 |
92 TEST(RPOLine) { | 90 TEST(RPOLine) { |
93 HandleAndZoneScope scope; | 91 HandleAndZoneScope scope; |
94 | 92 |
95 for (int i = 0; i < 10; i++) { | 93 for (int i = 0; i < 10; i++) { |
96 Schedule schedule(scope.main_zone()); | 94 Schedule schedule(scope.main_zone()); |
97 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
98 | 95 |
99 BasicBlock* last = schedule.entry(); | 96 BasicBlock* last = schedule.entry(); |
100 for (int j = 0; j < i; j++) { | 97 for (int j = 0; j < i; j++) { |
101 BasicBlock* block = schedule.NewBasicBlock(); | 98 BasicBlock* block = schedule.NewBasicBlock(); |
102 schedule.AddGoto(last, block); | 99 schedule.AddGoto(last, block); |
103 last = block; | 100 last = block; |
104 } | 101 } |
105 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 102 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
106 CheckRPONumbers(order, 1 + i, false); | 103 CheckRPONumbers(order, 1 + i, false); |
107 | 104 |
108 Schedule::BasicBlocks blocks(schedule.all_blocks()); | 105 Schedule::BasicBlocks blocks(schedule.all_blocks()); |
109 for (Schedule::BasicBlocks::iterator iter = blocks.begin(); | 106 for (Schedule::BasicBlocks::iterator iter = blocks.begin(); |
110 iter != blocks.end(); ++iter) { | 107 iter != blocks.end(); ++iter) { |
111 BasicBlock* block = *iter; | 108 BasicBlock* block = *iter; |
112 if (block->rpo_number_ >= 0 && block->SuccessorCount() == 1) { | 109 if (block->rpo_number_ >= 0 && block->SuccessorCount() == 1) { |
113 CHECK(block->rpo_number_ + 1 == block->SuccessorAt(0)->rpo_number_); | 110 CHECK(block->rpo_number_ + 1 == block->SuccessorAt(0)->rpo_number_); |
114 } | 111 } |
115 } | 112 } |
116 } | 113 } |
117 } | 114 } |
118 | 115 |
119 | 116 |
120 TEST(RPOSelfLoop) { | 117 TEST(RPOSelfLoop) { |
121 HandleAndZoneScope scope; | 118 HandleAndZoneScope scope; |
122 Schedule schedule(scope.main_zone()); | 119 Schedule schedule(scope.main_zone()); |
123 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
124 schedule.AddSuccessor(schedule.entry(), schedule.entry()); | 120 schedule.AddSuccessor(schedule.entry(), schedule.entry()); |
125 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 121 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
126 CheckRPONumbers(order, 1, true); | 122 CheckRPONumbers(order, 1, true); |
127 BasicBlock* loop[] = {schedule.entry()}; | 123 BasicBlock* loop[] = {schedule.entry()}; |
128 CheckLoopContains(loop, 1); | 124 CheckLoopContains(loop, 1); |
129 } | 125 } |
130 | 126 |
131 | 127 |
132 TEST(RPOEntryLoop) { | 128 TEST(RPOEntryLoop) { |
133 HandleAndZoneScope scope; | 129 HandleAndZoneScope scope; |
134 Schedule schedule(scope.main_zone()); | 130 Schedule schedule(scope.main_zone()); |
135 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
136 schedule.AddSuccessor(schedule.entry(), schedule.exit()); | 131 schedule.AddSuccessor(schedule.entry(), schedule.exit()); |
137 schedule.AddSuccessor(schedule.exit(), schedule.entry()); | 132 schedule.AddSuccessor(schedule.exit(), schedule.entry()); |
138 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 133 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
139 CheckRPONumbers(order, 2, true); | 134 CheckRPONumbers(order, 2, true); |
140 BasicBlock* loop[] = {schedule.entry(), schedule.exit()}; | 135 BasicBlock* loop[] = {schedule.entry(), schedule.exit()}; |
141 CheckLoopContains(loop, 2); | 136 CheckLoopContains(loop, 2); |
142 } | 137 } |
143 | 138 |
144 | 139 |
145 TEST(RPOEndLoop) { | 140 TEST(RPOEndLoop) { |
146 HandleAndZoneScope scope; | 141 HandleAndZoneScope scope; |
147 Schedule schedule(scope.main_zone()); | 142 Schedule schedule(scope.main_zone()); |
148 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
149 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 2)); | 143 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 2)); |
150 schedule.AddSuccessor(schedule.entry(), loop1->header()); | 144 schedule.AddSuccessor(schedule.entry(), loop1->header()); |
151 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 145 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
152 CheckRPONumbers(order, 3, true); | 146 CheckRPONumbers(order, 3, true); |
153 CheckLoopContains(loop1->nodes, loop1->count); | 147 CheckLoopContains(loop1->nodes, loop1->count); |
154 } | 148 } |
155 | 149 |
156 | 150 |
157 TEST(RPOEndLoopNested) { | 151 TEST(RPOEndLoopNested) { |
158 HandleAndZoneScope scope; | 152 HandleAndZoneScope scope; |
159 Schedule schedule(scope.main_zone()); | 153 Schedule schedule(scope.main_zone()); |
160 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
161 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 2)); | 154 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 2)); |
162 schedule.AddSuccessor(schedule.entry(), loop1->header()); | 155 schedule.AddSuccessor(schedule.entry(), loop1->header()); |
163 schedule.AddSuccessor(loop1->last(), schedule.entry()); | 156 schedule.AddSuccessor(loop1->last(), schedule.entry()); |
164 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 157 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
165 CheckRPONumbers(order, 3, true); | 158 CheckRPONumbers(order, 3, true); |
166 CheckLoopContains(loop1->nodes, loop1->count); | 159 CheckLoopContains(loop1->nodes, loop1->count); |
167 } | 160 } |
168 | 161 |
169 | 162 |
170 TEST(RPODiamond) { | 163 TEST(RPODiamond) { |
171 HandleAndZoneScope scope; | 164 HandleAndZoneScope scope; |
172 Schedule schedule(scope.main_zone()); | 165 Schedule schedule(scope.main_zone()); |
173 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
174 | 166 |
175 BasicBlock* A = schedule.entry(); | 167 BasicBlock* A = schedule.entry(); |
176 BasicBlock* B = schedule.NewBasicBlock(); | 168 BasicBlock* B = schedule.NewBasicBlock(); |
177 BasicBlock* C = schedule.NewBasicBlock(); | 169 BasicBlock* C = schedule.NewBasicBlock(); |
178 BasicBlock* D = schedule.exit(); | 170 BasicBlock* D = schedule.exit(); |
179 | 171 |
180 schedule.AddSuccessor(A, B); | 172 schedule.AddSuccessor(A, B); |
181 schedule.AddSuccessor(A, C); | 173 schedule.AddSuccessor(A, C); |
182 schedule.AddSuccessor(B, D); | 174 schedule.AddSuccessor(B, D); |
183 schedule.AddSuccessor(C, D); | 175 schedule.AddSuccessor(C, D); |
184 | 176 |
185 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 177 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
186 CheckRPONumbers(order, 4, false); | 178 CheckRPONumbers(order, 4, false); |
187 | 179 |
188 CHECK_EQ(0, A->rpo_number_); | 180 CHECK_EQ(0, A->rpo_number_); |
189 CHECK((B->rpo_number_ == 1 && C->rpo_number_ == 2) || | 181 CHECK((B->rpo_number_ == 1 && C->rpo_number_ == 2) || |
190 (B->rpo_number_ == 2 && C->rpo_number_ == 1)); | 182 (B->rpo_number_ == 2 && C->rpo_number_ == 1)); |
191 CHECK_EQ(3, D->rpo_number_); | 183 CHECK_EQ(3, D->rpo_number_); |
192 } | 184 } |
193 | 185 |
194 | 186 |
195 TEST(RPOLoop1) { | 187 TEST(RPOLoop1) { |
196 HandleAndZoneScope scope; | 188 HandleAndZoneScope scope; |
197 Schedule schedule(scope.main_zone()); | 189 Schedule schedule(scope.main_zone()); |
198 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
199 | 190 |
200 BasicBlock* A = schedule.entry(); | 191 BasicBlock* A = schedule.entry(); |
201 BasicBlock* B = schedule.NewBasicBlock(); | 192 BasicBlock* B = schedule.NewBasicBlock(); |
202 BasicBlock* C = schedule.NewBasicBlock(); | 193 BasicBlock* C = schedule.NewBasicBlock(); |
203 BasicBlock* D = schedule.exit(); | 194 BasicBlock* D = schedule.exit(); |
204 | 195 |
205 schedule.AddSuccessor(A, B); | 196 schedule.AddSuccessor(A, B); |
206 schedule.AddSuccessor(B, C); | 197 schedule.AddSuccessor(B, C); |
207 schedule.AddSuccessor(C, B); | 198 schedule.AddSuccessor(C, B); |
208 schedule.AddSuccessor(C, D); | 199 schedule.AddSuccessor(C, D); |
209 | 200 |
210 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 201 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
211 CheckRPONumbers(order, 4, true); | 202 CheckRPONumbers(order, 4, true); |
212 BasicBlock* loop[] = {B, C}; | 203 BasicBlock* loop[] = {B, C}; |
213 CheckLoopContains(loop, 2); | 204 CheckLoopContains(loop, 2); |
214 } | 205 } |
215 | 206 |
216 | 207 |
217 TEST(RPOLoop2) { | 208 TEST(RPOLoop2) { |
218 HandleAndZoneScope scope; | 209 HandleAndZoneScope scope; |
219 Schedule schedule(scope.main_zone()); | 210 Schedule schedule(scope.main_zone()); |
220 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
221 | 211 |
222 BasicBlock* A = schedule.entry(); | 212 BasicBlock* A = schedule.entry(); |
223 BasicBlock* B = schedule.NewBasicBlock(); | 213 BasicBlock* B = schedule.NewBasicBlock(); |
224 BasicBlock* C = schedule.NewBasicBlock(); | 214 BasicBlock* C = schedule.NewBasicBlock(); |
225 BasicBlock* D = schedule.exit(); | 215 BasicBlock* D = schedule.exit(); |
226 | 216 |
227 schedule.AddSuccessor(A, B); | 217 schedule.AddSuccessor(A, B); |
228 schedule.AddSuccessor(B, C); | 218 schedule.AddSuccessor(B, C); |
229 schedule.AddSuccessor(C, B); | 219 schedule.AddSuccessor(C, B); |
230 schedule.AddSuccessor(B, D); | 220 schedule.AddSuccessor(B, D); |
231 | 221 |
232 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 222 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
233 CheckRPONumbers(order, 4, true); | 223 CheckRPONumbers(order, 4, true); |
234 BasicBlock* loop[] = {B, C}; | 224 BasicBlock* loop[] = {B, C}; |
235 CheckLoopContains(loop, 2); | 225 CheckLoopContains(loop, 2); |
236 } | 226 } |
237 | 227 |
238 | 228 |
239 TEST(RPOLoopN) { | 229 TEST(RPOLoopN) { |
240 HandleAndZoneScope scope; | 230 HandleAndZoneScope scope; |
241 | 231 |
242 for (int i = 0; i < 11; i++) { | 232 for (int i = 0; i < 11; i++) { |
243 Schedule schedule(scope.main_zone()); | 233 Schedule schedule(scope.main_zone()); |
244 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
245 BasicBlock* A = schedule.entry(); | 234 BasicBlock* A = schedule.entry(); |
246 BasicBlock* B = schedule.NewBasicBlock(); | 235 BasicBlock* B = schedule.NewBasicBlock(); |
247 BasicBlock* C = schedule.NewBasicBlock(); | 236 BasicBlock* C = schedule.NewBasicBlock(); |
248 BasicBlock* D = schedule.NewBasicBlock(); | 237 BasicBlock* D = schedule.NewBasicBlock(); |
249 BasicBlock* E = schedule.NewBasicBlock(); | 238 BasicBlock* E = schedule.NewBasicBlock(); |
250 BasicBlock* F = schedule.NewBasicBlock(); | 239 BasicBlock* F = schedule.NewBasicBlock(); |
251 BasicBlock* G = schedule.exit(); | 240 BasicBlock* G = schedule.exit(); |
252 | 241 |
253 schedule.AddSuccessor(A, B); | 242 schedule.AddSuccessor(A, B); |
254 schedule.AddSuccessor(B, C); | 243 schedule.AddSuccessor(B, C); |
(...skipping 10 matching lines...) Expand all Loading... |
265 if (i == 4) schedule.AddSuccessor(E, B); | 254 if (i == 4) schedule.AddSuccessor(E, B); |
266 if (i == 5) schedule.AddSuccessor(F, B); | 255 if (i == 5) schedule.AddSuccessor(F, B); |
267 | 256 |
268 // Throw in extra loop exits from time to time. | 257 // Throw in extra loop exits from time to time. |
269 if (i == 6) schedule.AddSuccessor(B, G); | 258 if (i == 6) schedule.AddSuccessor(B, G); |
270 if (i == 7) schedule.AddSuccessor(C, G); | 259 if (i == 7) schedule.AddSuccessor(C, G); |
271 if (i == 8) schedule.AddSuccessor(D, G); | 260 if (i == 8) schedule.AddSuccessor(D, G); |
272 if (i == 9) schedule.AddSuccessor(E, G); | 261 if (i == 9) schedule.AddSuccessor(E, G); |
273 if (i == 10) schedule.AddSuccessor(F, G); | 262 if (i == 10) schedule.AddSuccessor(F, G); |
274 | 263 |
275 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 264 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
276 CheckRPONumbers(order, 7, true); | 265 CheckRPONumbers(order, 7, true); |
277 BasicBlock* loop[] = {B, C, D, E, F}; | 266 BasicBlock* loop[] = {B, C, D, E, F}; |
278 CheckLoopContains(loop, 5); | 267 CheckLoopContains(loop, 5); |
279 } | 268 } |
280 } | 269 } |
281 | 270 |
282 | 271 |
283 TEST(RPOLoopNest1) { | 272 TEST(RPOLoopNest1) { |
284 HandleAndZoneScope scope; | 273 HandleAndZoneScope scope; |
285 Schedule schedule(scope.main_zone()); | 274 Schedule schedule(scope.main_zone()); |
286 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
287 | 275 |
288 BasicBlock* A = schedule.entry(); | 276 BasicBlock* A = schedule.entry(); |
289 BasicBlock* B = schedule.NewBasicBlock(); | 277 BasicBlock* B = schedule.NewBasicBlock(); |
290 BasicBlock* C = schedule.NewBasicBlock(); | 278 BasicBlock* C = schedule.NewBasicBlock(); |
291 BasicBlock* D = schedule.NewBasicBlock(); | 279 BasicBlock* D = schedule.NewBasicBlock(); |
292 BasicBlock* E = schedule.NewBasicBlock(); | 280 BasicBlock* E = schedule.NewBasicBlock(); |
293 BasicBlock* F = schedule.exit(); | 281 BasicBlock* F = schedule.exit(); |
294 | 282 |
295 schedule.AddSuccessor(A, B); | 283 schedule.AddSuccessor(A, B); |
296 schedule.AddSuccessor(B, C); | 284 schedule.AddSuccessor(B, C); |
297 schedule.AddSuccessor(C, D); | 285 schedule.AddSuccessor(C, D); |
298 schedule.AddSuccessor(D, C); | 286 schedule.AddSuccessor(D, C); |
299 schedule.AddSuccessor(D, E); | 287 schedule.AddSuccessor(D, E); |
300 schedule.AddSuccessor(E, B); | 288 schedule.AddSuccessor(E, B); |
301 schedule.AddSuccessor(E, F); | 289 schedule.AddSuccessor(E, F); |
302 | 290 |
303 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 291 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
304 CheckRPONumbers(order, 6, true); | 292 CheckRPONumbers(order, 6, true); |
305 BasicBlock* loop1[] = {B, C, D, E}; | 293 BasicBlock* loop1[] = {B, C, D, E}; |
306 CheckLoopContains(loop1, 4); | 294 CheckLoopContains(loop1, 4); |
307 | 295 |
308 BasicBlock* loop2[] = {C, D}; | 296 BasicBlock* loop2[] = {C, D}; |
309 CheckLoopContains(loop2, 2); | 297 CheckLoopContains(loop2, 2); |
310 } | 298 } |
311 | 299 |
312 | 300 |
313 TEST(RPOLoopNest2) { | 301 TEST(RPOLoopNest2) { |
314 HandleAndZoneScope scope; | 302 HandleAndZoneScope scope; |
315 Schedule schedule(scope.main_zone()); | 303 Schedule schedule(scope.main_zone()); |
316 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
317 | 304 |
318 BasicBlock* A = schedule.entry(); | 305 BasicBlock* A = schedule.entry(); |
319 BasicBlock* B = schedule.NewBasicBlock(); | 306 BasicBlock* B = schedule.NewBasicBlock(); |
320 BasicBlock* C = schedule.NewBasicBlock(); | 307 BasicBlock* C = schedule.NewBasicBlock(); |
321 BasicBlock* D = schedule.NewBasicBlock(); | 308 BasicBlock* D = schedule.NewBasicBlock(); |
322 BasicBlock* E = schedule.NewBasicBlock(); | 309 BasicBlock* E = schedule.NewBasicBlock(); |
323 BasicBlock* F = schedule.NewBasicBlock(); | 310 BasicBlock* F = schedule.NewBasicBlock(); |
324 BasicBlock* G = schedule.NewBasicBlock(); | 311 BasicBlock* G = schedule.NewBasicBlock(); |
325 BasicBlock* H = schedule.exit(); | 312 BasicBlock* H = schedule.exit(); |
326 | 313 |
327 schedule.AddSuccessor(A, B); | 314 schedule.AddSuccessor(A, B); |
328 schedule.AddSuccessor(B, C); | 315 schedule.AddSuccessor(B, C); |
329 schedule.AddSuccessor(C, D); | 316 schedule.AddSuccessor(C, D); |
330 schedule.AddSuccessor(D, E); | 317 schedule.AddSuccessor(D, E); |
331 schedule.AddSuccessor(E, F); | 318 schedule.AddSuccessor(E, F); |
332 schedule.AddSuccessor(F, G); | 319 schedule.AddSuccessor(F, G); |
333 schedule.AddSuccessor(G, H); | 320 schedule.AddSuccessor(G, H); |
334 | 321 |
335 schedule.AddSuccessor(E, D); | 322 schedule.AddSuccessor(E, D); |
336 schedule.AddSuccessor(F, C); | 323 schedule.AddSuccessor(F, C); |
337 schedule.AddSuccessor(G, B); | 324 schedule.AddSuccessor(G, B); |
338 | 325 |
339 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 326 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
340 CheckRPONumbers(order, 8, true); | 327 CheckRPONumbers(order, 8, true); |
341 BasicBlock* loop1[] = {B, C, D, E, F, G}; | 328 BasicBlock* loop1[] = {B, C, D, E, F, G}; |
342 CheckLoopContains(loop1, 6); | 329 CheckLoopContains(loop1, 6); |
343 | 330 |
344 BasicBlock* loop2[] = {C, D, E, F}; | 331 BasicBlock* loop2[] = {C, D, E, F}; |
345 CheckLoopContains(loop2, 4); | 332 CheckLoopContains(loop2, 4); |
346 | 333 |
347 BasicBlock* loop3[] = {D, E}; | 334 BasicBlock* loop3[] = {D, E}; |
348 CheckLoopContains(loop3, 2); | 335 CheckLoopContains(loop3, 2); |
349 } | 336 } |
350 | 337 |
351 | 338 |
352 TEST(RPOLoopFollow1) { | 339 TEST(RPOLoopFollow1) { |
353 HandleAndZoneScope scope; | 340 HandleAndZoneScope scope; |
354 Schedule schedule(scope.main_zone()); | 341 Schedule schedule(scope.main_zone()); |
355 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
356 | 342 |
357 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); | 343 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); |
358 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); | 344 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); |
359 | 345 |
360 BasicBlock* A = schedule.entry(); | 346 BasicBlock* A = schedule.entry(); |
361 BasicBlock* E = schedule.exit(); | 347 BasicBlock* E = schedule.exit(); |
362 | 348 |
363 schedule.AddSuccessor(A, loop1->header()); | 349 schedule.AddSuccessor(A, loop1->header()); |
364 schedule.AddSuccessor(loop1->header(), loop2->header()); | 350 schedule.AddSuccessor(loop1->header(), loop2->header()); |
365 schedule.AddSuccessor(loop2->last(), E); | 351 schedule.AddSuccessor(loop2->last(), E); |
366 | 352 |
367 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 353 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
368 | 354 |
369 CheckLoopContains(loop1->nodes, loop1->count); | 355 CheckLoopContains(loop1->nodes, loop1->count); |
370 | 356 |
371 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); | 357 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); |
372 CheckLoopContains(loop1->nodes, loop1->count); | 358 CheckLoopContains(loop1->nodes, loop1->count); |
373 CheckLoopContains(loop2->nodes, loop2->count); | 359 CheckLoopContains(loop2->nodes, loop2->count); |
374 } | 360 } |
375 | 361 |
376 | 362 |
377 TEST(RPOLoopFollow2) { | 363 TEST(RPOLoopFollow2) { |
378 HandleAndZoneScope scope; | 364 HandleAndZoneScope scope; |
379 Schedule schedule(scope.main_zone()); | 365 Schedule schedule(scope.main_zone()); |
380 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
381 | 366 |
382 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); | 367 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); |
383 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); | 368 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); |
384 | 369 |
385 BasicBlock* A = schedule.entry(); | 370 BasicBlock* A = schedule.entry(); |
386 BasicBlock* S = schedule.NewBasicBlock(); | 371 BasicBlock* S = schedule.NewBasicBlock(); |
387 BasicBlock* E = schedule.exit(); | 372 BasicBlock* E = schedule.exit(); |
388 | 373 |
389 schedule.AddSuccessor(A, loop1->header()); | 374 schedule.AddSuccessor(A, loop1->header()); |
390 schedule.AddSuccessor(loop1->header(), S); | 375 schedule.AddSuccessor(loop1->header(), S); |
391 schedule.AddSuccessor(S, loop2->header()); | 376 schedule.AddSuccessor(S, loop2->header()); |
392 schedule.AddSuccessor(loop2->last(), E); | 377 schedule.AddSuccessor(loop2->last(), E); |
393 | 378 |
394 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 379 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
395 | 380 |
396 CheckLoopContains(loop1->nodes, loop1->count); | 381 CheckLoopContains(loop1->nodes, loop1->count); |
397 | 382 |
398 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); | 383 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); |
399 CheckLoopContains(loop1->nodes, loop1->count); | 384 CheckLoopContains(loop1->nodes, loop1->count); |
400 CheckLoopContains(loop2->nodes, loop2->count); | 385 CheckLoopContains(loop2->nodes, loop2->count); |
401 } | 386 } |
402 | 387 |
403 | 388 |
404 TEST(RPOLoopFollowN) { | 389 TEST(RPOLoopFollowN) { |
405 HandleAndZoneScope scope; | 390 HandleAndZoneScope scope; |
406 | 391 |
407 for (int size = 1; size < 5; size++) { | 392 for (int size = 1; size < 5; size++) { |
408 for (int exit = 0; exit < size; exit++) { | 393 for (int exit = 0; exit < size; exit++) { |
409 Schedule schedule(scope.main_zone()); | 394 Schedule schedule(scope.main_zone()); |
410 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
411 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); | 395 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); |
412 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, size)); | 396 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, size)); |
413 BasicBlock* A = schedule.entry(); | 397 BasicBlock* A = schedule.entry(); |
414 BasicBlock* E = schedule.exit(); | 398 BasicBlock* E = schedule.exit(); |
415 | 399 |
416 schedule.AddSuccessor(A, loop1->header()); | 400 schedule.AddSuccessor(A, loop1->header()); |
417 schedule.AddSuccessor(loop1->nodes[exit], loop2->header()); | 401 schedule.AddSuccessor(loop1->nodes[exit], loop2->header()); |
418 schedule.AddSuccessor(loop2->nodes[exit], E); | 402 schedule.AddSuccessor(loop2->nodes[exit], E); |
419 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 403 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
420 CheckLoopContains(loop1->nodes, loop1->count); | 404 CheckLoopContains(loop1->nodes, loop1->count); |
421 | 405 |
422 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); | 406 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); |
423 CheckLoopContains(loop1->nodes, loop1->count); | 407 CheckLoopContains(loop1->nodes, loop1->count); |
424 CheckLoopContains(loop2->nodes, loop2->count); | 408 CheckLoopContains(loop2->nodes, loop2->count); |
425 } | 409 } |
426 } | 410 } |
427 } | 411 } |
428 | 412 |
429 | 413 |
430 TEST(RPONestedLoopFollow1) { | 414 TEST(RPONestedLoopFollow1) { |
431 HandleAndZoneScope scope; | 415 HandleAndZoneScope scope; |
432 Schedule schedule(scope.main_zone()); | 416 Schedule schedule(scope.main_zone()); |
433 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
434 | 417 |
435 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); | 418 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); |
436 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); | 419 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); |
437 | 420 |
438 BasicBlock* A = schedule.entry(); | 421 BasicBlock* A = schedule.entry(); |
439 BasicBlock* B = schedule.NewBasicBlock(); | 422 BasicBlock* B = schedule.NewBasicBlock(); |
440 BasicBlock* C = schedule.NewBasicBlock(); | 423 BasicBlock* C = schedule.NewBasicBlock(); |
441 BasicBlock* E = schedule.exit(); | 424 BasicBlock* E = schedule.exit(); |
442 | 425 |
443 schedule.AddSuccessor(A, B); | 426 schedule.AddSuccessor(A, B); |
444 schedule.AddSuccessor(B, loop1->header()); | 427 schedule.AddSuccessor(B, loop1->header()); |
445 schedule.AddSuccessor(loop1->header(), loop2->header()); | 428 schedule.AddSuccessor(loop1->header(), loop2->header()); |
446 schedule.AddSuccessor(loop2->last(), C); | 429 schedule.AddSuccessor(loop2->last(), C); |
447 schedule.AddSuccessor(C, E); | 430 schedule.AddSuccessor(C, E); |
448 schedule.AddSuccessor(C, B); | 431 schedule.AddSuccessor(C, B); |
449 | 432 |
450 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 433 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
451 | 434 |
452 CheckLoopContains(loop1->nodes, loop1->count); | 435 CheckLoopContains(loop1->nodes, loop1->count); |
453 | 436 |
454 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); | 437 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); |
455 CheckLoopContains(loop1->nodes, loop1->count); | 438 CheckLoopContains(loop1->nodes, loop1->count); |
456 CheckLoopContains(loop2->nodes, loop2->count); | 439 CheckLoopContains(loop2->nodes, loop2->count); |
457 | 440 |
458 BasicBlock* loop3[] = {B, loop1->nodes[0], loop2->nodes[0], C}; | 441 BasicBlock* loop3[] = {B, loop1->nodes[0], loop2->nodes[0], C}; |
459 CheckLoopContains(loop3, 4); | 442 CheckLoopContains(loop3, 4); |
460 } | 443 } |
461 | 444 |
462 | 445 |
463 TEST(RPOLoopBackedges1) { | 446 TEST(RPOLoopBackedges1) { |
464 HandleAndZoneScope scope; | 447 HandleAndZoneScope scope; |
465 | 448 |
466 int size = 8; | 449 int size = 8; |
467 for (int i = 0; i < size; i++) { | 450 for (int i = 0; i < size; i++) { |
468 for (int j = 0; j < size; j++) { | 451 for (int j = 0; j < size; j++) { |
469 Schedule schedule(scope.main_zone()); | 452 Schedule schedule(scope.main_zone()); |
470 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
471 BasicBlock* A = schedule.entry(); | 453 BasicBlock* A = schedule.entry(); |
472 BasicBlock* E = schedule.exit(); | 454 BasicBlock* E = schedule.exit(); |
473 | 455 |
474 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); | 456 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); |
475 schedule.AddSuccessor(A, loop1->header()); | 457 schedule.AddSuccessor(A, loop1->header()); |
476 schedule.AddSuccessor(loop1->last(), E); | 458 schedule.AddSuccessor(loop1->last(), E); |
477 | 459 |
478 schedule.AddSuccessor(loop1->nodes[i], loop1->header()); | 460 schedule.AddSuccessor(loop1->nodes[i], loop1->header()); |
479 schedule.AddSuccessor(loop1->nodes[j], E); | 461 schedule.AddSuccessor(loop1->nodes[j], E); |
480 | 462 |
481 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 463 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
482 CheckRPONumbers(order, schedule.BasicBlockCount(), true); | 464 CheckRPONumbers(order, schedule.BasicBlockCount(), true); |
483 CheckLoopContains(loop1->nodes, loop1->count); | 465 CheckLoopContains(loop1->nodes, loop1->count); |
484 } | 466 } |
485 } | 467 } |
486 } | 468 } |
487 | 469 |
488 | 470 |
489 TEST(RPOLoopOutedges1) { | 471 TEST(RPOLoopOutedges1) { |
490 HandleAndZoneScope scope; | 472 HandleAndZoneScope scope; |
491 | 473 |
492 int size = 8; | 474 int size = 8; |
493 for (int i = 0; i < size; i++) { | 475 for (int i = 0; i < size; i++) { |
494 for (int j = 0; j < size; j++) { | 476 for (int j = 0; j < size; j++) { |
495 Schedule schedule(scope.main_zone()); | 477 Schedule schedule(scope.main_zone()); |
496 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
497 BasicBlock* A = schedule.entry(); | 478 BasicBlock* A = schedule.entry(); |
498 BasicBlock* D = schedule.NewBasicBlock(); | 479 BasicBlock* D = schedule.NewBasicBlock(); |
499 BasicBlock* E = schedule.exit(); | 480 BasicBlock* E = schedule.exit(); |
500 | 481 |
501 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); | 482 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); |
502 schedule.AddSuccessor(A, loop1->header()); | 483 schedule.AddSuccessor(A, loop1->header()); |
503 schedule.AddSuccessor(loop1->last(), E); | 484 schedule.AddSuccessor(loop1->last(), E); |
504 | 485 |
505 schedule.AddSuccessor(loop1->nodes[i], loop1->header()); | 486 schedule.AddSuccessor(loop1->nodes[i], loop1->header()); |
506 schedule.AddSuccessor(loop1->nodes[j], D); | 487 schedule.AddSuccessor(loop1->nodes[j], D); |
507 schedule.AddSuccessor(D, E); | 488 schedule.AddSuccessor(D, E); |
508 | 489 |
509 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 490 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
510 CheckRPONumbers(order, schedule.BasicBlockCount(), true); | 491 CheckRPONumbers(order, schedule.BasicBlockCount(), true); |
511 CheckLoopContains(loop1->nodes, loop1->count); | 492 CheckLoopContains(loop1->nodes, loop1->count); |
512 } | 493 } |
513 } | 494 } |
514 } | 495 } |
515 | 496 |
516 | 497 |
517 TEST(RPOLoopOutedges2) { | 498 TEST(RPOLoopOutedges2) { |
518 HandleAndZoneScope scope; | 499 HandleAndZoneScope scope; |
519 | 500 |
520 int size = 8; | 501 int size = 8; |
521 for (int i = 0; i < size; i++) { | 502 for (int i = 0; i < size; i++) { |
522 Schedule schedule(scope.main_zone()); | 503 Schedule schedule(scope.main_zone()); |
523 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
524 BasicBlock* A = schedule.entry(); | 504 BasicBlock* A = schedule.entry(); |
525 BasicBlock* E = schedule.exit(); | 505 BasicBlock* E = schedule.exit(); |
526 | 506 |
527 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); | 507 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); |
528 schedule.AddSuccessor(A, loop1->header()); | 508 schedule.AddSuccessor(A, loop1->header()); |
529 schedule.AddSuccessor(loop1->last(), E); | 509 schedule.AddSuccessor(loop1->last(), E); |
530 | 510 |
531 for (int j = 0; j < size; j++) { | 511 for (int j = 0; j < size; j++) { |
532 BasicBlock* O = schedule.NewBasicBlock(); | 512 BasicBlock* O = schedule.NewBasicBlock(); |
533 schedule.AddSuccessor(loop1->nodes[j], O); | 513 schedule.AddSuccessor(loop1->nodes[j], O); |
534 schedule.AddSuccessor(O, E); | 514 schedule.AddSuccessor(O, E); |
535 } | 515 } |
536 | 516 |
537 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 517 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
538 CheckRPONumbers(order, schedule.BasicBlockCount(), true); | 518 CheckRPONumbers(order, schedule.BasicBlockCount(), true); |
539 CheckLoopContains(loop1->nodes, loop1->count); | 519 CheckLoopContains(loop1->nodes, loop1->count); |
540 } | 520 } |
541 } | 521 } |
542 | 522 |
543 | 523 |
544 TEST(RPOLoopOutloops1) { | 524 TEST(RPOLoopOutloops1) { |
545 HandleAndZoneScope scope; | 525 HandleAndZoneScope scope; |
546 | 526 |
547 int size = 8; | 527 int size = 8; |
548 for (int i = 0; i < size; i++) { | 528 for (int i = 0; i < size; i++) { |
549 Schedule schedule(scope.main_zone()); | 529 Schedule schedule(scope.main_zone()); |
550 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
551 BasicBlock* A = schedule.entry(); | 530 BasicBlock* A = schedule.entry(); |
552 BasicBlock* E = schedule.exit(); | 531 BasicBlock* E = schedule.exit(); |
553 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); | 532 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); |
554 schedule.AddSuccessor(A, loop1->header()); | 533 schedule.AddSuccessor(A, loop1->header()); |
555 schedule.AddSuccessor(loop1->last(), E); | 534 schedule.AddSuccessor(loop1->last(), E); |
556 | 535 |
557 TestLoop** loopN = new TestLoop* [size]; | 536 TestLoop** loopN = new TestLoop* [size]; |
558 for (int j = 0; j < size; j++) { | 537 for (int j = 0; j < size; j++) { |
559 loopN[j] = CreateLoop(&schedule, 2); | 538 loopN[j] = CreateLoop(&schedule, 2); |
560 schedule.AddSuccessor(loop1->nodes[j], loopN[j]->header()); | 539 schedule.AddSuccessor(loop1->nodes[j], loopN[j]->header()); |
561 schedule.AddSuccessor(loopN[j]->last(), E); | 540 schedule.AddSuccessor(loopN[j]->last(), E); |
562 } | 541 } |
563 | 542 |
564 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 543 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
565 CheckRPONumbers(order, schedule.BasicBlockCount(), true); | 544 CheckRPONumbers(order, schedule.BasicBlockCount(), true); |
566 CheckLoopContains(loop1->nodes, loop1->count); | 545 CheckLoopContains(loop1->nodes, loop1->count); |
567 | 546 |
568 for (int j = 0; j < size; j++) { | 547 for (int j = 0; j < size; j++) { |
569 CheckLoopContains(loopN[j]->nodes, loopN[j]->count); | 548 CheckLoopContains(loopN[j]->nodes, loopN[j]->count); |
570 delete loopN[j]; | 549 delete loopN[j]; |
571 } | 550 } |
572 delete[] loopN; | 551 delete[] loopN; |
573 } | 552 } |
574 } | 553 } |
575 | 554 |
576 | 555 |
577 TEST(RPOLoopMultibackedge) { | 556 TEST(RPOLoopMultibackedge) { |
578 HandleAndZoneScope scope; | 557 HandleAndZoneScope scope; |
579 Schedule schedule(scope.main_zone()); | 558 Schedule schedule(scope.main_zone()); |
580 Scheduler scheduler(scope.main_zone(), NULL, &schedule); | |
581 | 559 |
582 BasicBlock* A = schedule.entry(); | 560 BasicBlock* A = schedule.entry(); |
583 BasicBlock* B = schedule.NewBasicBlock(); | 561 BasicBlock* B = schedule.NewBasicBlock(); |
584 BasicBlock* C = schedule.NewBasicBlock(); | 562 BasicBlock* C = schedule.NewBasicBlock(); |
585 BasicBlock* D = schedule.exit(); | 563 BasicBlock* D = schedule.exit(); |
586 BasicBlock* E = schedule.NewBasicBlock(); | 564 BasicBlock* E = schedule.NewBasicBlock(); |
587 | 565 |
588 schedule.AddSuccessor(A, B); | 566 schedule.AddSuccessor(A, B); |
589 schedule.AddSuccessor(B, C); | 567 schedule.AddSuccessor(B, C); |
590 schedule.AddSuccessor(B, D); | 568 schedule.AddSuccessor(B, D); |
591 schedule.AddSuccessor(B, E); | 569 schedule.AddSuccessor(B, E); |
592 schedule.AddSuccessor(C, B); | 570 schedule.AddSuccessor(C, B); |
593 schedule.AddSuccessor(D, B); | 571 schedule.AddSuccessor(D, B); |
594 schedule.AddSuccessor(E, B); | 572 schedule.AddSuccessor(E, B); |
595 | 573 |
596 BasicBlockVector* order = scheduler.ComputeSpecialRPO(); | 574 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
597 CheckRPONumbers(order, 5, true); | 575 CheckRPONumbers(order, 5, true); |
598 | 576 |
599 BasicBlock* loop1[] = {B, C, D, E}; | 577 BasicBlock* loop1[] = {B, C, D, E}; |
600 CheckLoopContains(loop1, 4); | 578 CheckLoopContains(loop1, 4); |
601 } | 579 } |
602 | 580 |
603 | 581 |
604 TEST(BuildScheduleEmpty) { | 582 TEST(BuildScheduleEmpty) { |
605 HandleAndZoneScope scope; | 583 HandleAndZoneScope scope; |
606 Graph graph(scope.main_zone()); | 584 Graph graph(scope.main_zone()); |
607 CommonOperatorBuilder builder(scope.main_zone()); | 585 CommonOperatorBuilder builder(scope.main_zone()); |
608 graph.SetStart(graph.NewNode(builder.Start(0))); | 586 graph.SetStart(graph.NewNode(builder.Start(0))); |
609 graph.SetEnd(graph.NewNode(builder.End(), graph.start())); | 587 graph.SetEnd(graph.NewNode(builder.End(), graph.start())); |
610 | 588 |
611 Scheduler scheduler(scope.main_zone()); | 589 USE(Scheduler::ComputeSchedule(&graph)); |
612 USE(scheduler.NewSchedule(&graph)); | |
613 } | 590 } |
614 | 591 |
615 | 592 |
616 TEST(BuildScheduleOneParameter) { | 593 TEST(BuildScheduleOneParameter) { |
617 HandleAndZoneScope scope; | 594 HandleAndZoneScope scope; |
618 Graph graph(scope.main_zone()); | 595 Graph graph(scope.main_zone()); |
619 CommonOperatorBuilder builder(scope.main_zone()); | 596 CommonOperatorBuilder builder(scope.main_zone()); |
620 graph.SetStart(graph.NewNode(builder.Start(0))); | 597 graph.SetStart(graph.NewNode(builder.Start(0))); |
621 | 598 |
622 Node* p1 = graph.NewNode(builder.Parameter(0), graph.start()); | 599 Node* p1 = graph.NewNode(builder.Parameter(0), graph.start()); |
623 Node* ret = graph.NewNode(builder.Return(), p1, graph.start(), graph.start()); | 600 Node* ret = graph.NewNode(builder.Return(), p1, graph.start(), graph.start()); |
624 | 601 |
625 graph.SetEnd(graph.NewNode(builder.End(), ret)); | 602 graph.SetEnd(graph.NewNode(builder.End(), ret)); |
626 | 603 |
627 Scheduler scheduler(scope.main_zone()); | 604 USE(Scheduler::ComputeSchedule(&graph)); |
628 USE(scheduler.NewSchedule(&graph)); | |
629 } | 605 } |
630 | 606 |
631 | 607 |
632 static int GetScheduledNodeCount(Schedule* schedule) { | 608 static int GetScheduledNodeCount(Schedule* schedule) { |
633 int node_count = 0; | 609 int node_count = 0; |
634 for (BasicBlockVectorIter i = schedule->rpo_order()->begin(); | 610 for (BasicBlockVectorIter i = schedule->rpo_order()->begin(); |
635 i != schedule->rpo_order()->end(); ++i) { | 611 i != schedule->rpo_order()->end(); ++i) { |
636 BasicBlock* block = *i; | 612 BasicBlock* block = *i; |
637 for (BasicBlock::const_iterator j = block->begin(); j != block->end(); | 613 for (BasicBlock::const_iterator j = block->begin(); j != block->end(); |
638 ++j) { | 614 ++j) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 Node* true_branch = graph.NewNode(builder.IfTrue(), branch); | 653 Node* true_branch = graph.NewNode(builder.IfTrue(), branch); |
678 Node* false_branch = graph.NewNode(builder.IfFalse(), branch); | 654 Node* false_branch = graph.NewNode(builder.IfFalse(), branch); |
679 | 655 |
680 Node* ret1 = graph.NewNode(builder.Return(), p4, graph.start(), true_branch); | 656 Node* ret1 = graph.NewNode(builder.Return(), p4, graph.start(), true_branch); |
681 Node* ret2 = graph.NewNode(builder.Return(), p5, graph.start(), false_branch); | 657 Node* ret2 = graph.NewNode(builder.Return(), p5, graph.start(), false_branch); |
682 Node* merge = graph.NewNode(builder.Merge(2), ret1, ret2); | 658 Node* merge = graph.NewNode(builder.Merge(2), ret1, ret2); |
683 graph.SetEnd(graph.NewNode(builder.End(), merge)); | 659 graph.SetEnd(graph.NewNode(builder.End(), merge)); |
684 | 660 |
685 PrintGraph(&graph); | 661 PrintGraph(&graph); |
686 | 662 |
687 Scheduler scheduler(scope.main_zone()); | 663 Schedule* schedule = Scheduler::ComputeSchedule(&graph); |
688 Schedule* schedule = scheduler.NewSchedule(&graph); | |
689 | 664 |
690 PrintSchedule(schedule); | 665 PrintSchedule(schedule); |
691 | 666 |
692 | 667 |
693 CHECK_EQ(13, GetScheduledNodeCount(schedule)); | 668 CHECK_EQ(13, GetScheduledNodeCount(schedule)); |
694 } | 669 } |
695 | 670 |
696 | 671 |
697 TEST(BuildScheduleIfSplitWithEffects) { | 672 TEST(BuildScheduleIfSplitWithEffects) { |
698 HandleAndZoneScope scope; | 673 HandleAndZoneScope scope; |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
831 n21->ReplaceInput(1, n20); | 806 n21->ReplaceInput(1, n20); |
832 n21->ReplaceInput(2, n18); | 807 n21->ReplaceInput(2, n18); |
833 n22->ReplaceInput(1, n21); | 808 n22->ReplaceInput(1, n21); |
834 n23->ReplaceInput(0, n22); | 809 n23->ReplaceInput(0, n22); |
835 | 810 |
836 graph.SetStart(n0); | 811 graph.SetStart(n0); |
837 graph.SetEnd(n23); | 812 graph.SetEnd(n23); |
838 | 813 |
839 PrintGraph(&graph); | 814 PrintGraph(&graph); |
840 | 815 |
841 Scheduler scheduler(scope.main_zone()); | 816 Schedule* schedule = Scheduler::ComputeSchedule(&graph); |
842 Schedule* schedule = scheduler.NewSchedule(&graph); | |
843 | 817 |
844 PrintSchedule(schedule); | 818 PrintSchedule(schedule); |
845 | 819 |
846 CHECK_EQ(20, GetScheduledNodeCount(schedule)); | 820 CHECK_EQ(20, GetScheduledNodeCount(schedule)); |
847 } | 821 } |
848 | 822 |
849 | 823 |
850 TEST(BuildScheduleSimpleLoop) { | 824 TEST(BuildScheduleSimpleLoop) { |
851 HandleAndZoneScope scope; | 825 HandleAndZoneScope scope; |
852 Isolate* isolate = scope.main_isolate(); | 826 Isolate* isolate = scope.main_isolate(); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
951 USE(n15); | 925 USE(n15); |
952 n15->ReplaceInput(0, n13); | 926 n15->ReplaceInput(0, n13); |
953 n19->ReplaceInput(2, n15); | 927 n19->ReplaceInput(2, n15); |
954 n20->ReplaceInput(0, n19); | 928 n20->ReplaceInput(0, n19); |
955 | 929 |
956 graph.SetStart(n0); | 930 graph.SetStart(n0); |
957 graph.SetEnd(n20); | 931 graph.SetEnd(n20); |
958 | 932 |
959 PrintGraph(&graph); | 933 PrintGraph(&graph); |
960 | 934 |
961 Scheduler scheduler(scope.main_zone()); | 935 Schedule* schedule = Scheduler::ComputeSchedule(&graph); |
962 Schedule* schedule = scheduler.NewSchedule(&graph); | |
963 | 936 |
964 PrintSchedule(schedule); | 937 PrintSchedule(schedule); |
965 | 938 |
966 CHECK_EQ(19, GetScheduledNodeCount(schedule)); | 939 CHECK_EQ(19, GetScheduledNodeCount(schedule)); |
967 } | 940 } |
968 | 941 |
969 | 942 |
970 TEST(BuildScheduleComplexLoops) { | 943 TEST(BuildScheduleComplexLoops) { |
971 HandleAndZoneScope scope; | 944 HandleAndZoneScope scope; |
972 Isolate* isolate = scope.main_isolate(); | 945 Isolate* isolate = scope.main_isolate(); |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1206 USE(n42); | 1179 USE(n42); |
1207 n42->ReplaceInput(0, n40); | 1180 n42->ReplaceInput(0, n40); |
1208 n45->ReplaceInput(2, n42); | 1181 n45->ReplaceInput(2, n42); |
1209 n46->ReplaceInput(0, n45); | 1182 n46->ReplaceInput(0, n45); |
1210 | 1183 |
1211 graph.SetStart(n0); | 1184 graph.SetStart(n0); |
1212 graph.SetEnd(n46); | 1185 graph.SetEnd(n46); |
1213 | 1186 |
1214 PrintGraph(&graph); | 1187 PrintGraph(&graph); |
1215 | 1188 |
1216 Scheduler scheduler(scope.main_zone()); | 1189 Schedule* schedule = Scheduler::ComputeSchedule(&graph); |
1217 Schedule* schedule = scheduler.NewSchedule(&graph); | |
1218 | 1190 |
1219 PrintSchedule(schedule); | 1191 PrintSchedule(schedule); |
1220 | 1192 |
1221 CHECK_EQ(46, GetScheduledNodeCount(schedule)); | 1193 CHECK_EQ(46, GetScheduledNodeCount(schedule)); |
1222 } | 1194 } |
1223 | 1195 |
1224 | 1196 |
1225 TEST(BuildScheduleBreakAndContinue) { | 1197 TEST(BuildScheduleBreakAndContinue) { |
1226 HandleAndZoneScope scope; | 1198 HandleAndZoneScope scope; |
1227 Isolate* isolate = scope.main_isolate(); | 1199 Isolate* isolate = scope.main_isolate(); |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1543 n57->ReplaceInput(0, n56); | 1515 n57->ReplaceInput(0, n56); |
1544 n57->ReplaceInput(1, n56); | 1516 n57->ReplaceInput(1, n56); |
1545 n57->ReplaceInput(2, n19); | 1517 n57->ReplaceInput(2, n19); |
1546 n58->ReplaceInput(0, n57); | 1518 n58->ReplaceInput(0, n57); |
1547 | 1519 |
1548 graph.SetStart(n0); | 1520 graph.SetStart(n0); |
1549 graph.SetEnd(n58); | 1521 graph.SetEnd(n58); |
1550 | 1522 |
1551 PrintGraph(&graph); | 1523 PrintGraph(&graph); |
1552 | 1524 |
1553 Scheduler scheduler(scope.main_zone()); | 1525 Schedule* schedule = Scheduler::ComputeSchedule(&graph); |
1554 Schedule* schedule = scheduler.NewSchedule(&graph); | |
1555 | 1526 |
1556 PrintSchedule(schedule); | 1527 PrintSchedule(schedule); |
1557 | 1528 |
1558 CHECK_EQ(62, GetScheduledNodeCount(schedule)); | 1529 CHECK_EQ(62, GetScheduledNodeCount(schedule)); |
1559 } | 1530 } |
1560 | 1531 |
1561 | 1532 |
1562 TEST(BuildScheduleSimpleLoopWithCodeMotion) { | 1533 TEST(BuildScheduleSimpleLoopWithCodeMotion) { |
1563 HandleAndZoneScope scope; | 1534 HandleAndZoneScope scope; |
1564 Isolate* isolate = scope.main_isolate(); | 1535 Isolate* isolate = scope.main_isolate(); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1675 USE(n18); | 1646 USE(n18); |
1676 n18->ReplaceInput(0, n16); | 1647 n18->ReplaceInput(0, n16); |
1677 n21->ReplaceInput(2, n18); | 1648 n21->ReplaceInput(2, n18); |
1678 n22->ReplaceInput(0, n21); | 1649 n22->ReplaceInput(0, n21); |
1679 | 1650 |
1680 graph.SetStart(n0); | 1651 graph.SetStart(n0); |
1681 graph.SetEnd(n22); | 1652 graph.SetEnd(n22); |
1682 | 1653 |
1683 PrintGraph(&graph); | 1654 PrintGraph(&graph); |
1684 | 1655 |
1685 Scheduler scheduler(scope.main_zone()); | 1656 Schedule* schedule = Scheduler::ComputeSchedule(&graph); |
1686 Schedule* schedule = scheduler.NewSchedule(&graph); | |
1687 | 1657 |
1688 PrintSchedule(schedule); | 1658 PrintSchedule(schedule); |
1689 | 1659 |
1690 CHECK_EQ(19, GetScheduledNodeCount(schedule)); | 1660 CHECK_EQ(19, GetScheduledNodeCount(schedule)); |
1691 | 1661 |
1692 // Make sure the integer-only add gets hoisted to a different block that the | 1662 // Make sure the integer-only add gets hoisted to a different block that the |
1693 // JSAdd. | 1663 // JSAdd. |
1694 CHECK(schedule->block(n19) != schedule->block(n20)); | 1664 CHECK(schedule->block(n19) != schedule->block(n20)); |
1695 } | 1665 } |
1696 | 1666 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1796 Node* merge_node = | 1766 Node* merge_node = |
1797 graph.NewNode(common.Merge(2), return_node, deoptimization_node); | 1767 graph.NewNode(common.Merge(2), return_node, deoptimization_node); |
1798 | 1768 |
1799 Node* end_node = graph.NewNode(common.End(), merge_node); | 1769 Node* end_node = graph.NewNode(common.End(), merge_node); |
1800 | 1770 |
1801 graph.SetStart(start_node); | 1771 graph.SetStart(start_node); |
1802 graph.SetEnd(end_node); | 1772 graph.SetEnd(end_node); |
1803 | 1773 |
1804 PrintGraph(&graph); | 1774 PrintGraph(&graph); |
1805 | 1775 |
1806 Scheduler scheduler(scope.main_zone()); | 1776 Schedule* schedule = Scheduler::ComputeSchedule(&graph); |
1807 Schedule* schedule = scheduler.NewSchedule(&graph); | |
1808 | 1777 |
1809 PrintSchedule(schedule); | 1778 PrintSchedule(schedule); |
1810 | 1779 |
1811 // Tests: | 1780 // Tests: |
1812 // Continuation and deopt have basic blocks. | 1781 // Continuation and deopt have basic blocks. |
1813 BasicBlock* cont_block = schedule->block(cont_node); | 1782 BasicBlock* cont_block = schedule->block(cont_node); |
1814 BasicBlock* deopt_block = schedule->block(lazy_deopt_node); | 1783 BasicBlock* deopt_block = schedule->block(lazy_deopt_node); |
1815 BasicBlock* call_block = schedule->block(call_node); | 1784 BasicBlock* call_block = schedule->block(call_node); |
1816 CHECK_NE(NULL, cont_block); | 1785 CHECK_NE(NULL, cont_block); |
1817 CHECK_NE(NULL, deopt_block); | 1786 CHECK_NE(NULL, deopt_block); |
(...skipping 13 matching lines...) Expand all Loading... |
1831 CHECK_EQ(deoptimization_node, deopt_block->control_input_); | 1800 CHECK_EQ(deoptimization_node, deopt_block->control_input_); |
1832 CHECK_EQ(5, static_cast<int>(deopt_block->nodes_.size())); | 1801 CHECK_EQ(5, static_cast<int>(deopt_block->nodes_.size())); |
1833 CHECK_EQ(lazy_deopt_node, deopt_block->nodes_[0]); | 1802 CHECK_EQ(lazy_deopt_node, deopt_block->nodes_[0]); |
1834 CHECK_EQ(IrOpcode::kStateValues, deopt_block->nodes_[1]->op()->opcode()); | 1803 CHECK_EQ(IrOpcode::kStateValues, deopt_block->nodes_[1]->op()->opcode()); |
1835 CHECK_EQ(IrOpcode::kStateValues, deopt_block->nodes_[2]->op()->opcode()); | 1804 CHECK_EQ(IrOpcode::kStateValues, deopt_block->nodes_[2]->op()->opcode()); |
1836 CHECK_EQ(IrOpcode::kStateValues, deopt_block->nodes_[3]->op()->opcode()); | 1805 CHECK_EQ(IrOpcode::kStateValues, deopt_block->nodes_[3]->op()->opcode()); |
1837 CHECK_EQ(state_node, deopt_block->nodes_[4]); | 1806 CHECK_EQ(state_node, deopt_block->nodes_[4]); |
1838 } | 1807 } |
1839 | 1808 |
1840 #endif | 1809 #endif |
OLD | NEW |