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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 | 71 |
72 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 72 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
73 CheckRPONumbers(order, 1, false); | 73 CheckRPONumbers(order, 1, false); |
74 CHECK_EQ(schedule.entry(), order->at(0)); | 74 CHECK_EQ(schedule.start(), order->at(0)); |
75 } | 75 } |
76 | 76 |
77 | 77 |
78 TEST(RPODegenerate2) { | 78 TEST(RPODegenerate2) { |
79 HandleAndZoneScope scope; | 79 HandleAndZoneScope scope; |
80 Schedule schedule(scope.main_zone()); | 80 Schedule schedule(scope.main_zone()); |
81 | 81 |
82 schedule.AddGoto(schedule.entry(), schedule.exit()); | 82 schedule.AddGoto(schedule.start(), schedule.end()); |
83 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 83 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
84 CheckRPONumbers(order, 2, false); | 84 CheckRPONumbers(order, 2, false); |
85 CHECK_EQ(schedule.entry(), order->at(0)); | 85 CHECK_EQ(schedule.start(), order->at(0)); |
86 CHECK_EQ(schedule.exit(), order->at(1)); | 86 CHECK_EQ(schedule.end(), order->at(1)); |
87 } | 87 } |
88 | 88 |
89 | 89 |
90 TEST(RPOLine) { | 90 TEST(RPOLine) { |
91 HandleAndZoneScope scope; | 91 HandleAndZoneScope scope; |
92 | 92 |
93 for (int i = 0; i < 10; i++) { | 93 for (int i = 0; i < 10; i++) { |
94 Schedule schedule(scope.main_zone()); | 94 Schedule schedule(scope.main_zone()); |
95 | 95 |
96 BasicBlock* last = schedule.entry(); | 96 BasicBlock* last = schedule.start(); |
97 for (int j = 0; j < i; j++) { | 97 for (int j = 0; j < i; j++) { |
98 BasicBlock* block = schedule.NewBasicBlock(); | 98 BasicBlock* block = schedule.NewBasicBlock(); |
99 schedule.AddGoto(last, block); | 99 schedule.AddGoto(last, block); |
100 last = block; | 100 last = block; |
101 } | 101 } |
102 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 102 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
103 CheckRPONumbers(order, 1 + i, false); | 103 CheckRPONumbers(order, 1 + i, false); |
104 | 104 |
105 Schedule::BasicBlocks blocks(schedule.all_blocks()); | 105 Schedule::BasicBlocks blocks(schedule.all_blocks()); |
106 for (Schedule::BasicBlocks::iterator iter = blocks.begin(); | 106 for (Schedule::BasicBlocks::iterator iter = blocks.begin(); |
107 iter != blocks.end(); ++iter) { | 107 iter != blocks.end(); ++iter) { |
108 BasicBlock* block = *iter; | 108 BasicBlock* block = *iter; |
109 if (block->rpo_number_ >= 0 && block->SuccessorCount() == 1) { | 109 if (block->rpo_number_ >= 0 && block->SuccessorCount() == 1) { |
110 CHECK(block->rpo_number_ + 1 == block->SuccessorAt(0)->rpo_number_); | 110 CHECK(block->rpo_number_ + 1 == block->SuccessorAt(0)->rpo_number_); |
111 } | 111 } |
112 } | 112 } |
113 } | 113 } |
114 } | 114 } |
115 | 115 |
116 | 116 |
117 TEST(RPOSelfLoop) { | 117 TEST(RPOSelfLoop) { |
118 HandleAndZoneScope scope; | 118 HandleAndZoneScope scope; |
119 Schedule schedule(scope.main_zone()); | 119 Schedule schedule(scope.main_zone()); |
120 schedule.AddSuccessor(schedule.entry(), schedule.entry()); | 120 schedule.AddSuccessor(schedule.start(), schedule.start()); |
121 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 121 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
122 CheckRPONumbers(order, 1, true); | 122 CheckRPONumbers(order, 1, true); |
123 BasicBlock* loop[] = {schedule.entry()}; | 123 BasicBlock* loop[] = {schedule.start()}; |
124 CheckLoopContains(loop, 1); | 124 CheckLoopContains(loop, 1); |
125 } | 125 } |
126 | 126 |
127 | 127 |
128 TEST(RPOEntryLoop) { | 128 TEST(RPOEntryLoop) { |
129 HandleAndZoneScope scope; | 129 HandleAndZoneScope scope; |
130 Schedule schedule(scope.main_zone()); | 130 Schedule schedule(scope.main_zone()); |
131 schedule.AddSuccessor(schedule.entry(), schedule.exit()); | 131 schedule.AddSuccessor(schedule.start(), schedule.end()); |
132 schedule.AddSuccessor(schedule.exit(), schedule.entry()); | 132 schedule.AddSuccessor(schedule.end(), schedule.start()); |
133 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 133 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
134 CheckRPONumbers(order, 2, true); | 134 CheckRPONumbers(order, 2, true); |
135 BasicBlock* loop[] = {schedule.entry(), schedule.exit()}; | 135 BasicBlock* loop[] = {schedule.start(), schedule.end()}; |
136 CheckLoopContains(loop, 2); | 136 CheckLoopContains(loop, 2); |
137 } | 137 } |
138 | 138 |
139 | 139 |
140 TEST(RPOEndLoop) { | 140 TEST(RPOEndLoop) { |
141 HandleAndZoneScope scope; | 141 HandleAndZoneScope scope; |
142 Schedule schedule(scope.main_zone()); | 142 Schedule schedule(scope.main_zone()); |
143 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 2)); | 143 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 2)); |
144 schedule.AddSuccessor(schedule.entry(), loop1->header()); | 144 schedule.AddSuccessor(schedule.start(), loop1->header()); |
145 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 145 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
146 CheckRPONumbers(order, 3, true); | 146 CheckRPONumbers(order, 3, true); |
147 CheckLoopContains(loop1->nodes, loop1->count); | 147 CheckLoopContains(loop1->nodes, loop1->count); |
148 } | 148 } |
149 | 149 |
150 | 150 |
151 TEST(RPOEndLoopNested) { | 151 TEST(RPOEndLoopNested) { |
152 HandleAndZoneScope scope; | 152 HandleAndZoneScope scope; |
153 Schedule schedule(scope.main_zone()); | 153 Schedule schedule(scope.main_zone()); |
154 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 2)); | 154 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 2)); |
155 schedule.AddSuccessor(schedule.entry(), loop1->header()); | 155 schedule.AddSuccessor(schedule.start(), loop1->header()); |
156 schedule.AddSuccessor(loop1->last(), schedule.entry()); | 156 schedule.AddSuccessor(loop1->last(), schedule.start()); |
157 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 157 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
158 CheckRPONumbers(order, 3, true); | 158 CheckRPONumbers(order, 3, true); |
159 CheckLoopContains(loop1->nodes, loop1->count); | 159 CheckLoopContains(loop1->nodes, loop1->count); |
160 } | 160 } |
161 | 161 |
162 | 162 |
163 TEST(RPODiamond) { | 163 TEST(RPODiamond) { |
164 HandleAndZoneScope scope; | 164 HandleAndZoneScope scope; |
165 Schedule schedule(scope.main_zone()); | 165 Schedule schedule(scope.main_zone()); |
166 | 166 |
167 BasicBlock* A = schedule.entry(); | 167 BasicBlock* A = schedule.start(); |
168 BasicBlock* B = schedule.NewBasicBlock(); | 168 BasicBlock* B = schedule.NewBasicBlock(); |
169 BasicBlock* C = schedule.NewBasicBlock(); | 169 BasicBlock* C = schedule.NewBasicBlock(); |
170 BasicBlock* D = schedule.exit(); | 170 BasicBlock* D = schedule.end(); |
171 | 171 |
172 schedule.AddSuccessor(A, B); | 172 schedule.AddSuccessor(A, B); |
173 schedule.AddSuccessor(A, C); | 173 schedule.AddSuccessor(A, C); |
174 schedule.AddSuccessor(B, D); | 174 schedule.AddSuccessor(B, D); |
175 schedule.AddSuccessor(C, D); | 175 schedule.AddSuccessor(C, D); |
176 | 176 |
177 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 177 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
178 CheckRPONumbers(order, 4, false); | 178 CheckRPONumbers(order, 4, false); |
179 | 179 |
180 CHECK_EQ(0, A->rpo_number_); | 180 CHECK_EQ(0, A->rpo_number_); |
181 CHECK((B->rpo_number_ == 1 && C->rpo_number_ == 2) || | 181 CHECK((B->rpo_number_ == 1 && C->rpo_number_ == 2) || |
182 (B->rpo_number_ == 2 && C->rpo_number_ == 1)); | 182 (B->rpo_number_ == 2 && C->rpo_number_ == 1)); |
183 CHECK_EQ(3, D->rpo_number_); | 183 CHECK_EQ(3, D->rpo_number_); |
184 } | 184 } |
185 | 185 |
186 | 186 |
187 TEST(RPOLoop1) { | 187 TEST(RPOLoop1) { |
188 HandleAndZoneScope scope; | 188 HandleAndZoneScope scope; |
189 Schedule schedule(scope.main_zone()); | 189 Schedule schedule(scope.main_zone()); |
190 | 190 |
191 BasicBlock* A = schedule.entry(); | 191 BasicBlock* A = schedule.start(); |
192 BasicBlock* B = schedule.NewBasicBlock(); | 192 BasicBlock* B = schedule.NewBasicBlock(); |
193 BasicBlock* C = schedule.NewBasicBlock(); | 193 BasicBlock* C = schedule.NewBasicBlock(); |
194 BasicBlock* D = schedule.exit(); | 194 BasicBlock* D = schedule.end(); |
195 | 195 |
196 schedule.AddSuccessor(A, B); | 196 schedule.AddSuccessor(A, B); |
197 schedule.AddSuccessor(B, C); | 197 schedule.AddSuccessor(B, C); |
198 schedule.AddSuccessor(C, B); | 198 schedule.AddSuccessor(C, B); |
199 schedule.AddSuccessor(C, D); | 199 schedule.AddSuccessor(C, D); |
200 | 200 |
201 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 201 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
202 CheckRPONumbers(order, 4, true); | 202 CheckRPONumbers(order, 4, true); |
203 BasicBlock* loop[] = {B, C}; | 203 BasicBlock* loop[] = {B, C}; |
204 CheckLoopContains(loop, 2); | 204 CheckLoopContains(loop, 2); |
205 } | 205 } |
206 | 206 |
207 | 207 |
208 TEST(RPOLoop2) { | 208 TEST(RPOLoop2) { |
209 HandleAndZoneScope scope; | 209 HandleAndZoneScope scope; |
210 Schedule schedule(scope.main_zone()); | 210 Schedule schedule(scope.main_zone()); |
211 | 211 |
212 BasicBlock* A = schedule.entry(); | 212 BasicBlock* A = schedule.start(); |
213 BasicBlock* B = schedule.NewBasicBlock(); | 213 BasicBlock* B = schedule.NewBasicBlock(); |
214 BasicBlock* C = schedule.NewBasicBlock(); | 214 BasicBlock* C = schedule.NewBasicBlock(); |
215 BasicBlock* D = schedule.exit(); | 215 BasicBlock* D = schedule.end(); |
216 | 216 |
217 schedule.AddSuccessor(A, B); | 217 schedule.AddSuccessor(A, B); |
218 schedule.AddSuccessor(B, C); | 218 schedule.AddSuccessor(B, C); |
219 schedule.AddSuccessor(C, B); | 219 schedule.AddSuccessor(C, B); |
220 schedule.AddSuccessor(B, D); | 220 schedule.AddSuccessor(B, D); |
221 | 221 |
222 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 222 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
223 CheckRPONumbers(order, 4, true); | 223 CheckRPONumbers(order, 4, true); |
224 BasicBlock* loop[] = {B, C}; | 224 BasicBlock* loop[] = {B, C}; |
225 CheckLoopContains(loop, 2); | 225 CheckLoopContains(loop, 2); |
226 } | 226 } |
227 | 227 |
228 | 228 |
229 TEST(RPOLoopN) { | 229 TEST(RPOLoopN) { |
230 HandleAndZoneScope scope; | 230 HandleAndZoneScope scope; |
231 | 231 |
232 for (int i = 0; i < 11; i++) { | 232 for (int i = 0; i < 11; i++) { |
233 Schedule schedule(scope.main_zone()); | 233 Schedule schedule(scope.main_zone()); |
234 BasicBlock* A = schedule.entry(); | 234 BasicBlock* A = schedule.start(); |
235 BasicBlock* B = schedule.NewBasicBlock(); | 235 BasicBlock* B = schedule.NewBasicBlock(); |
236 BasicBlock* C = schedule.NewBasicBlock(); | 236 BasicBlock* C = schedule.NewBasicBlock(); |
237 BasicBlock* D = schedule.NewBasicBlock(); | 237 BasicBlock* D = schedule.NewBasicBlock(); |
238 BasicBlock* E = schedule.NewBasicBlock(); | 238 BasicBlock* E = schedule.NewBasicBlock(); |
239 BasicBlock* F = schedule.NewBasicBlock(); | 239 BasicBlock* F = schedule.NewBasicBlock(); |
240 BasicBlock* G = schedule.exit(); | 240 BasicBlock* G = schedule.end(); |
241 | 241 |
242 schedule.AddSuccessor(A, B); | 242 schedule.AddSuccessor(A, B); |
243 schedule.AddSuccessor(B, C); | 243 schedule.AddSuccessor(B, C); |
244 schedule.AddSuccessor(C, D); | 244 schedule.AddSuccessor(C, D); |
245 schedule.AddSuccessor(D, E); | 245 schedule.AddSuccessor(D, E); |
246 schedule.AddSuccessor(E, F); | 246 schedule.AddSuccessor(E, F); |
247 schedule.AddSuccessor(F, B); | 247 schedule.AddSuccessor(F, B); |
248 schedule.AddSuccessor(B, G); | 248 schedule.AddSuccessor(B, G); |
249 | 249 |
250 // Throw in extra backedges from time to time. | 250 // Throw in extra backedges from time to time. |
(...skipping 15 matching lines...) Expand all Loading... |
266 BasicBlock* loop[] = {B, C, D, E, F}; | 266 BasicBlock* loop[] = {B, C, D, E, F}; |
267 CheckLoopContains(loop, 5); | 267 CheckLoopContains(loop, 5); |
268 } | 268 } |
269 } | 269 } |
270 | 270 |
271 | 271 |
272 TEST(RPOLoopNest1) { | 272 TEST(RPOLoopNest1) { |
273 HandleAndZoneScope scope; | 273 HandleAndZoneScope scope; |
274 Schedule schedule(scope.main_zone()); | 274 Schedule schedule(scope.main_zone()); |
275 | 275 |
276 BasicBlock* A = schedule.entry(); | 276 BasicBlock* A = schedule.start(); |
277 BasicBlock* B = schedule.NewBasicBlock(); | 277 BasicBlock* B = schedule.NewBasicBlock(); |
278 BasicBlock* C = schedule.NewBasicBlock(); | 278 BasicBlock* C = schedule.NewBasicBlock(); |
279 BasicBlock* D = schedule.NewBasicBlock(); | 279 BasicBlock* D = schedule.NewBasicBlock(); |
280 BasicBlock* E = schedule.NewBasicBlock(); | 280 BasicBlock* E = schedule.NewBasicBlock(); |
281 BasicBlock* F = schedule.exit(); | 281 BasicBlock* F = schedule.end(); |
282 | 282 |
283 schedule.AddSuccessor(A, B); | 283 schedule.AddSuccessor(A, B); |
284 schedule.AddSuccessor(B, C); | 284 schedule.AddSuccessor(B, C); |
285 schedule.AddSuccessor(C, D); | 285 schedule.AddSuccessor(C, D); |
286 schedule.AddSuccessor(D, C); | 286 schedule.AddSuccessor(D, C); |
287 schedule.AddSuccessor(D, E); | 287 schedule.AddSuccessor(D, E); |
288 schedule.AddSuccessor(E, B); | 288 schedule.AddSuccessor(E, B); |
289 schedule.AddSuccessor(E, F); | 289 schedule.AddSuccessor(E, F); |
290 | 290 |
291 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 291 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
292 CheckRPONumbers(order, 6, true); | 292 CheckRPONumbers(order, 6, true); |
293 BasicBlock* loop1[] = {B, C, D, E}; | 293 BasicBlock* loop1[] = {B, C, D, E}; |
294 CheckLoopContains(loop1, 4); | 294 CheckLoopContains(loop1, 4); |
295 | 295 |
296 BasicBlock* loop2[] = {C, D}; | 296 BasicBlock* loop2[] = {C, D}; |
297 CheckLoopContains(loop2, 2); | 297 CheckLoopContains(loop2, 2); |
298 } | 298 } |
299 | 299 |
300 | 300 |
301 TEST(RPOLoopNest2) { | 301 TEST(RPOLoopNest2) { |
302 HandleAndZoneScope scope; | 302 HandleAndZoneScope scope; |
303 Schedule schedule(scope.main_zone()); | 303 Schedule schedule(scope.main_zone()); |
304 | 304 |
305 BasicBlock* A = schedule.entry(); | 305 BasicBlock* A = schedule.start(); |
306 BasicBlock* B = schedule.NewBasicBlock(); | 306 BasicBlock* B = schedule.NewBasicBlock(); |
307 BasicBlock* C = schedule.NewBasicBlock(); | 307 BasicBlock* C = schedule.NewBasicBlock(); |
308 BasicBlock* D = schedule.NewBasicBlock(); | 308 BasicBlock* D = schedule.NewBasicBlock(); |
309 BasicBlock* E = schedule.NewBasicBlock(); | 309 BasicBlock* E = schedule.NewBasicBlock(); |
310 BasicBlock* F = schedule.NewBasicBlock(); | 310 BasicBlock* F = schedule.NewBasicBlock(); |
311 BasicBlock* G = schedule.NewBasicBlock(); | 311 BasicBlock* G = schedule.NewBasicBlock(); |
312 BasicBlock* H = schedule.exit(); | 312 BasicBlock* H = schedule.end(); |
313 | 313 |
314 schedule.AddSuccessor(A, B); | 314 schedule.AddSuccessor(A, B); |
315 schedule.AddSuccessor(B, C); | 315 schedule.AddSuccessor(B, C); |
316 schedule.AddSuccessor(C, D); | 316 schedule.AddSuccessor(C, D); |
317 schedule.AddSuccessor(D, E); | 317 schedule.AddSuccessor(D, E); |
318 schedule.AddSuccessor(E, F); | 318 schedule.AddSuccessor(E, F); |
319 schedule.AddSuccessor(F, G); | 319 schedule.AddSuccessor(F, G); |
320 schedule.AddSuccessor(G, H); | 320 schedule.AddSuccessor(G, H); |
321 | 321 |
322 schedule.AddSuccessor(E, D); | 322 schedule.AddSuccessor(E, D); |
(...skipping 13 matching lines...) Expand all Loading... |
336 } | 336 } |
337 | 337 |
338 | 338 |
339 TEST(RPOLoopFollow1) { | 339 TEST(RPOLoopFollow1) { |
340 HandleAndZoneScope scope; | 340 HandleAndZoneScope scope; |
341 Schedule schedule(scope.main_zone()); | 341 Schedule schedule(scope.main_zone()); |
342 | 342 |
343 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); | 343 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); |
344 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); | 344 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); |
345 | 345 |
346 BasicBlock* A = schedule.entry(); | 346 BasicBlock* A = schedule.start(); |
347 BasicBlock* E = schedule.exit(); | 347 BasicBlock* E = schedule.end(); |
348 | 348 |
349 schedule.AddSuccessor(A, loop1->header()); | 349 schedule.AddSuccessor(A, loop1->header()); |
350 schedule.AddSuccessor(loop1->header(), loop2->header()); | 350 schedule.AddSuccessor(loop1->header(), loop2->header()); |
351 schedule.AddSuccessor(loop2->last(), E); | 351 schedule.AddSuccessor(loop2->last(), E); |
352 | 352 |
353 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 353 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
354 | 354 |
355 CheckLoopContains(loop1->nodes, loop1->count); | 355 CheckLoopContains(loop1->nodes, loop1->count); |
356 | 356 |
357 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); | 357 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); |
358 CheckLoopContains(loop1->nodes, loop1->count); | 358 CheckLoopContains(loop1->nodes, loop1->count); |
359 CheckLoopContains(loop2->nodes, loop2->count); | 359 CheckLoopContains(loop2->nodes, loop2->count); |
360 } | 360 } |
361 | 361 |
362 | 362 |
363 TEST(RPOLoopFollow2) { | 363 TEST(RPOLoopFollow2) { |
364 HandleAndZoneScope scope; | 364 HandleAndZoneScope scope; |
365 Schedule schedule(scope.main_zone()); | 365 Schedule schedule(scope.main_zone()); |
366 | 366 |
367 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); | 367 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); |
368 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); | 368 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); |
369 | 369 |
370 BasicBlock* A = schedule.entry(); | 370 BasicBlock* A = schedule.start(); |
371 BasicBlock* S = schedule.NewBasicBlock(); | 371 BasicBlock* S = schedule.NewBasicBlock(); |
372 BasicBlock* E = schedule.exit(); | 372 BasicBlock* E = schedule.end(); |
373 | 373 |
374 schedule.AddSuccessor(A, loop1->header()); | 374 schedule.AddSuccessor(A, loop1->header()); |
375 schedule.AddSuccessor(loop1->header(), S); | 375 schedule.AddSuccessor(loop1->header(), S); |
376 schedule.AddSuccessor(S, loop2->header()); | 376 schedule.AddSuccessor(S, loop2->header()); |
377 schedule.AddSuccessor(loop2->last(), E); | 377 schedule.AddSuccessor(loop2->last(), E); |
378 | 378 |
379 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 379 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
380 | 380 |
381 CheckLoopContains(loop1->nodes, loop1->count); | 381 CheckLoopContains(loop1->nodes, loop1->count); |
382 | 382 |
383 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); | 383 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); |
384 CheckLoopContains(loop1->nodes, loop1->count); | 384 CheckLoopContains(loop1->nodes, loop1->count); |
385 CheckLoopContains(loop2->nodes, loop2->count); | 385 CheckLoopContains(loop2->nodes, loop2->count); |
386 } | 386 } |
387 | 387 |
388 | 388 |
389 TEST(RPOLoopFollowN) { | 389 TEST(RPOLoopFollowN) { |
390 HandleAndZoneScope scope; | 390 HandleAndZoneScope scope; |
391 | 391 |
392 for (int size = 1; size < 5; size++) { | 392 for (int size = 1; size < 5; size++) { |
393 for (int exit = 0; exit < size; exit++) { | 393 for (int exit = 0; exit < size; exit++) { |
394 Schedule schedule(scope.main_zone()); | 394 Schedule schedule(scope.main_zone()); |
395 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); | 395 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); |
396 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, size)); | 396 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, size)); |
397 BasicBlock* A = schedule.entry(); | 397 BasicBlock* A = schedule.start(); |
398 BasicBlock* E = schedule.exit(); | 398 BasicBlock* E = schedule.end(); |
399 | 399 |
400 schedule.AddSuccessor(A, loop1->header()); | 400 schedule.AddSuccessor(A, loop1->header()); |
401 schedule.AddSuccessor(loop1->nodes[exit], loop2->header()); | 401 schedule.AddSuccessor(loop1->nodes[exit], loop2->header()); |
402 schedule.AddSuccessor(loop2->nodes[exit], E); | 402 schedule.AddSuccessor(loop2->nodes[exit], E); |
403 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 403 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
404 CheckLoopContains(loop1->nodes, loop1->count); | 404 CheckLoopContains(loop1->nodes, loop1->count); |
405 | 405 |
406 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); | 406 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); |
407 CheckLoopContains(loop1->nodes, loop1->count); | 407 CheckLoopContains(loop1->nodes, loop1->count); |
408 CheckLoopContains(loop2->nodes, loop2->count); | 408 CheckLoopContains(loop2->nodes, loop2->count); |
409 } | 409 } |
410 } | 410 } |
411 } | 411 } |
412 | 412 |
413 | 413 |
414 TEST(RPONestedLoopFollow1) { | 414 TEST(RPONestedLoopFollow1) { |
415 HandleAndZoneScope scope; | 415 HandleAndZoneScope scope; |
416 Schedule schedule(scope.main_zone()); | 416 Schedule schedule(scope.main_zone()); |
417 | 417 |
418 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); | 418 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); |
419 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); | 419 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); |
420 | 420 |
421 BasicBlock* A = schedule.entry(); | 421 BasicBlock* A = schedule.start(); |
422 BasicBlock* B = schedule.NewBasicBlock(); | 422 BasicBlock* B = schedule.NewBasicBlock(); |
423 BasicBlock* C = schedule.NewBasicBlock(); | 423 BasicBlock* C = schedule.NewBasicBlock(); |
424 BasicBlock* E = schedule.exit(); | 424 BasicBlock* E = schedule.end(); |
425 | 425 |
426 schedule.AddSuccessor(A, B); | 426 schedule.AddSuccessor(A, B); |
427 schedule.AddSuccessor(B, loop1->header()); | 427 schedule.AddSuccessor(B, loop1->header()); |
428 schedule.AddSuccessor(loop1->header(), loop2->header()); | 428 schedule.AddSuccessor(loop1->header(), loop2->header()); |
429 schedule.AddSuccessor(loop2->last(), C); | 429 schedule.AddSuccessor(loop2->last(), C); |
430 schedule.AddSuccessor(C, E); | 430 schedule.AddSuccessor(C, E); |
431 schedule.AddSuccessor(C, B); | 431 schedule.AddSuccessor(C, B); |
432 | 432 |
433 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 433 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
434 | 434 |
435 CheckLoopContains(loop1->nodes, loop1->count); | 435 CheckLoopContains(loop1->nodes, loop1->count); |
436 | 436 |
437 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); | 437 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); |
438 CheckLoopContains(loop1->nodes, loop1->count); | 438 CheckLoopContains(loop1->nodes, loop1->count); |
439 CheckLoopContains(loop2->nodes, loop2->count); | 439 CheckLoopContains(loop2->nodes, loop2->count); |
440 | 440 |
441 BasicBlock* loop3[] = {B, loop1->nodes[0], loop2->nodes[0], C}; | 441 BasicBlock* loop3[] = {B, loop1->nodes[0], loop2->nodes[0], C}; |
442 CheckLoopContains(loop3, 4); | 442 CheckLoopContains(loop3, 4); |
443 } | 443 } |
444 | 444 |
445 | 445 |
446 TEST(RPOLoopBackedges1) { | 446 TEST(RPOLoopBackedges1) { |
447 HandleAndZoneScope scope; | 447 HandleAndZoneScope scope; |
448 | 448 |
449 int size = 8; | 449 int size = 8; |
450 for (int i = 0; i < size; i++) { | 450 for (int i = 0; i < size; i++) { |
451 for (int j = 0; j < size; j++) { | 451 for (int j = 0; j < size; j++) { |
452 Schedule schedule(scope.main_zone()); | 452 Schedule schedule(scope.main_zone()); |
453 BasicBlock* A = schedule.entry(); | 453 BasicBlock* A = schedule.start(); |
454 BasicBlock* E = schedule.exit(); | 454 BasicBlock* E = schedule.end(); |
455 | 455 |
456 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); | 456 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); |
457 schedule.AddSuccessor(A, loop1->header()); | 457 schedule.AddSuccessor(A, loop1->header()); |
458 schedule.AddSuccessor(loop1->last(), E); | 458 schedule.AddSuccessor(loop1->last(), E); |
459 | 459 |
460 schedule.AddSuccessor(loop1->nodes[i], loop1->header()); | 460 schedule.AddSuccessor(loop1->nodes[i], loop1->header()); |
461 schedule.AddSuccessor(loop1->nodes[j], E); | 461 schedule.AddSuccessor(loop1->nodes[j], E); |
462 | 462 |
463 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 463 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
464 CheckRPONumbers(order, schedule.BasicBlockCount(), true); | 464 CheckRPONumbers(order, schedule.BasicBlockCount(), true); |
465 CheckLoopContains(loop1->nodes, loop1->count); | 465 CheckLoopContains(loop1->nodes, loop1->count); |
466 } | 466 } |
467 } | 467 } |
468 } | 468 } |
469 | 469 |
470 | 470 |
471 TEST(RPOLoopOutedges1) { | 471 TEST(RPOLoopOutedges1) { |
472 HandleAndZoneScope scope; | 472 HandleAndZoneScope scope; |
473 | 473 |
474 int size = 8; | 474 int size = 8; |
475 for (int i = 0; i < size; i++) { | 475 for (int i = 0; i < size; i++) { |
476 for (int j = 0; j < size; j++) { | 476 for (int j = 0; j < size; j++) { |
477 Schedule schedule(scope.main_zone()); | 477 Schedule schedule(scope.main_zone()); |
478 BasicBlock* A = schedule.entry(); | 478 BasicBlock* A = schedule.start(); |
479 BasicBlock* D = schedule.NewBasicBlock(); | 479 BasicBlock* D = schedule.NewBasicBlock(); |
480 BasicBlock* E = schedule.exit(); | 480 BasicBlock* E = schedule.end(); |
481 | 481 |
482 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); | 482 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); |
483 schedule.AddSuccessor(A, loop1->header()); | 483 schedule.AddSuccessor(A, loop1->header()); |
484 schedule.AddSuccessor(loop1->last(), E); | 484 schedule.AddSuccessor(loop1->last(), E); |
485 | 485 |
486 schedule.AddSuccessor(loop1->nodes[i], loop1->header()); | 486 schedule.AddSuccessor(loop1->nodes[i], loop1->header()); |
487 schedule.AddSuccessor(loop1->nodes[j], D); | 487 schedule.AddSuccessor(loop1->nodes[j], D); |
488 schedule.AddSuccessor(D, E); | 488 schedule.AddSuccessor(D, E); |
489 | 489 |
490 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 490 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
491 CheckRPONumbers(order, schedule.BasicBlockCount(), true); | 491 CheckRPONumbers(order, schedule.BasicBlockCount(), true); |
492 CheckLoopContains(loop1->nodes, loop1->count); | 492 CheckLoopContains(loop1->nodes, loop1->count); |
493 } | 493 } |
494 } | 494 } |
495 } | 495 } |
496 | 496 |
497 | 497 |
498 TEST(RPOLoopOutedges2) { | 498 TEST(RPOLoopOutedges2) { |
499 HandleAndZoneScope scope; | 499 HandleAndZoneScope scope; |
500 | 500 |
501 int size = 8; | 501 int size = 8; |
502 for (int i = 0; i < size; i++) { | 502 for (int i = 0; i < size; i++) { |
503 Schedule schedule(scope.main_zone()); | 503 Schedule schedule(scope.main_zone()); |
504 BasicBlock* A = schedule.entry(); | 504 BasicBlock* A = schedule.start(); |
505 BasicBlock* E = schedule.exit(); | 505 BasicBlock* E = schedule.end(); |
506 | 506 |
507 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); | 507 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); |
508 schedule.AddSuccessor(A, loop1->header()); | 508 schedule.AddSuccessor(A, loop1->header()); |
509 schedule.AddSuccessor(loop1->last(), E); | 509 schedule.AddSuccessor(loop1->last(), E); |
510 | 510 |
511 for (int j = 0; j < size; j++) { | 511 for (int j = 0; j < size; j++) { |
512 BasicBlock* O = schedule.NewBasicBlock(); | 512 BasicBlock* O = schedule.NewBasicBlock(); |
513 schedule.AddSuccessor(loop1->nodes[j], O); | 513 schedule.AddSuccessor(loop1->nodes[j], O); |
514 schedule.AddSuccessor(O, E); | 514 schedule.AddSuccessor(O, E); |
515 } | 515 } |
516 | 516 |
517 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 517 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
518 CheckRPONumbers(order, schedule.BasicBlockCount(), true); | 518 CheckRPONumbers(order, schedule.BasicBlockCount(), true); |
519 CheckLoopContains(loop1->nodes, loop1->count); | 519 CheckLoopContains(loop1->nodes, loop1->count); |
520 } | 520 } |
521 } | 521 } |
522 | 522 |
523 | 523 |
524 TEST(RPOLoopOutloops1) { | 524 TEST(RPOLoopOutloops1) { |
525 HandleAndZoneScope scope; | 525 HandleAndZoneScope scope; |
526 | 526 |
527 int size = 8; | 527 int size = 8; |
528 for (int i = 0; i < size; i++) { | 528 for (int i = 0; i < size; i++) { |
529 Schedule schedule(scope.main_zone()); | 529 Schedule schedule(scope.main_zone()); |
530 BasicBlock* A = schedule.entry(); | 530 BasicBlock* A = schedule.start(); |
531 BasicBlock* E = schedule.exit(); | 531 BasicBlock* E = schedule.end(); |
532 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); | 532 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); |
533 schedule.AddSuccessor(A, loop1->header()); | 533 schedule.AddSuccessor(A, loop1->header()); |
534 schedule.AddSuccessor(loop1->last(), E); | 534 schedule.AddSuccessor(loop1->last(), E); |
535 | 535 |
536 TestLoop** loopN = new TestLoop* [size]; | 536 TestLoop** loopN = new TestLoop* [size]; |
537 for (int j = 0; j < size; j++) { | 537 for (int j = 0; j < size; j++) { |
538 loopN[j] = CreateLoop(&schedule, 2); | 538 loopN[j] = CreateLoop(&schedule, 2); |
539 schedule.AddSuccessor(loop1->nodes[j], loopN[j]->header()); | 539 schedule.AddSuccessor(loop1->nodes[j], loopN[j]->header()); |
540 schedule.AddSuccessor(loopN[j]->last(), E); | 540 schedule.AddSuccessor(loopN[j]->last(), E); |
541 } | 541 } |
542 | 542 |
543 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); | 543 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); |
544 CheckRPONumbers(order, schedule.BasicBlockCount(), true); | 544 CheckRPONumbers(order, schedule.BasicBlockCount(), true); |
545 CheckLoopContains(loop1->nodes, loop1->count); | 545 CheckLoopContains(loop1->nodes, loop1->count); |
546 | 546 |
547 for (int j = 0; j < size; j++) { | 547 for (int j = 0; j < size; j++) { |
548 CheckLoopContains(loopN[j]->nodes, loopN[j]->count); | 548 CheckLoopContains(loopN[j]->nodes, loopN[j]->count); |
549 delete loopN[j]; | 549 delete loopN[j]; |
550 } | 550 } |
551 delete[] loopN; | 551 delete[] loopN; |
552 } | 552 } |
553 } | 553 } |
554 | 554 |
555 | 555 |
556 TEST(RPOLoopMultibackedge) { | 556 TEST(RPOLoopMultibackedge) { |
557 HandleAndZoneScope scope; | 557 HandleAndZoneScope scope; |
558 Schedule schedule(scope.main_zone()); | 558 Schedule schedule(scope.main_zone()); |
559 | 559 |
560 BasicBlock* A = schedule.entry(); | 560 BasicBlock* A = schedule.start(); |
561 BasicBlock* B = schedule.NewBasicBlock(); | 561 BasicBlock* B = schedule.NewBasicBlock(); |
562 BasicBlock* C = schedule.NewBasicBlock(); | 562 BasicBlock* C = schedule.NewBasicBlock(); |
563 BasicBlock* D = schedule.exit(); | 563 BasicBlock* D = schedule.end(); |
564 BasicBlock* E = schedule.NewBasicBlock(); | 564 BasicBlock* E = schedule.NewBasicBlock(); |
565 | 565 |
566 schedule.AddSuccessor(A, B); | 566 schedule.AddSuccessor(A, B); |
567 schedule.AddSuccessor(B, C); | 567 schedule.AddSuccessor(B, C); |
568 schedule.AddSuccessor(B, D); | 568 schedule.AddSuccessor(B, D); |
569 schedule.AddSuccessor(B, E); | 569 schedule.AddSuccessor(B, E); |
570 schedule.AddSuccessor(C, B); | 570 schedule.AddSuccessor(C, B); |
571 schedule.AddSuccessor(D, B); | 571 schedule.AddSuccessor(D, B); |
572 schedule.AddSuccessor(E, B); | 572 schedule.AddSuccessor(E, B); |
573 | 573 |
(...skipping 1226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1800 CHECK_EQ(deoptimization_node, deopt_block->control_input_); | 1800 CHECK_EQ(deoptimization_node, deopt_block->control_input_); |
1801 CHECK_EQ(5, static_cast<int>(deopt_block->nodes_.size())); | 1801 CHECK_EQ(5, static_cast<int>(deopt_block->nodes_.size())); |
1802 CHECK_EQ(lazy_deopt_node, deopt_block->nodes_[0]); | 1802 CHECK_EQ(lazy_deopt_node, deopt_block->nodes_[0]); |
1803 CHECK_EQ(IrOpcode::kStateValues, deopt_block->nodes_[1]->op()->opcode()); | 1803 CHECK_EQ(IrOpcode::kStateValues, deopt_block->nodes_[1]->op()->opcode()); |
1804 CHECK_EQ(IrOpcode::kStateValues, deopt_block->nodes_[2]->op()->opcode()); | 1804 CHECK_EQ(IrOpcode::kStateValues, deopt_block->nodes_[2]->op()->opcode()); |
1805 CHECK_EQ(IrOpcode::kStateValues, deopt_block->nodes_[3]->op()->opcode()); | 1805 CHECK_EQ(IrOpcode::kStateValues, deopt_block->nodes_[3]->op()->opcode()); |
1806 CHECK_EQ(state_node, deopt_block->nodes_[4]); | 1806 CHECK_EQ(state_node, deopt_block->nodes_[4]); |
1807 } | 1807 } |
1808 | 1808 |
1809 #endif | 1809 #endif |
OLD | NEW |