Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(340)

Side by Side Diff: test/cctest/compiler/test-scheduler.cc

Issue 606403003: Refactor BasicBlock, no inheritance from GenericNode (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Attempt n+1 to address the size_t madness Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « test/cctest/compiler/test-schedule.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 26 matching lines...) Expand all
37 loop->nodes = new BasicBlock* [count]; 37 loop->nodes = new BasicBlock* [count];
38 for (int i = 0; i < count; i++) { 38 for (int i = 0; i < count; i++) {
39 loop->nodes[i] = schedule->NewBasicBlock(); 39 loop->nodes[i] = schedule->NewBasicBlock();
40 if (i > 0) schedule->AddSuccessor(loop->nodes[i - 1], loop->nodes[i]); 40 if (i > 0) schedule->AddSuccessor(loop->nodes[i - 1], loop->nodes[i]);
41 } 41 }
42 schedule->AddSuccessor(loop->nodes[count - 1], loop->nodes[0]); 42 schedule->AddSuccessor(loop->nodes[count - 1], loop->nodes[0]);
43 return loop; 43 return loop;
44 } 44 }
45 45
46 46
47 static void CheckRPONumbers(BasicBlockVector* order, int expected, 47 static void CheckRPONumbers(BasicBlockVector* order, size_t expected,
48 bool loops_allowed) { 48 bool loops_allowed) {
49 CHECK_EQ(expected, static_cast<int>(order->size())); 49 CHECK(expected == order->size());
50 for (int i = 0; i < static_cast<int>(order->size()); i++) { 50 for (int i = 0; i < static_cast<int>(order->size()); i++) {
51 CHECK(order->at(i)->rpo_number_ == i); 51 CHECK(order->at(i)->rpo_number() == i);
52 if (!loops_allowed) CHECK_LT(order->at(i)->loop_end_, 0); 52 if (!loops_allowed) CHECK_LT(order->at(i)->loop_end(), 0);
53 } 53 }
54 } 54 }
55 55
56 56
57 static void CheckLoopContains(BasicBlock** blocks, int body_size) { 57 static void CheckLoopContains(BasicBlock** blocks, int body_size) {
58 BasicBlock* header = blocks[0]; 58 BasicBlock* header = blocks[0];
59 CHECK_GT(header->loop_end_, 0); 59 CHECK_GT(header->loop_end(), 0);
60 CHECK_EQ(body_size, (header->loop_end_ - header->rpo_number_)); 60 CHECK_EQ(body_size, (header->loop_end() - header->rpo_number()));
61 for (int i = 0; i < body_size; i++) { 61 for (int i = 0; i < body_size; i++) {
62 int num = blocks[i]->rpo_number_; 62 int num = blocks[i]->rpo_number();
63 CHECK(num >= header->rpo_number_ && num < header->loop_end_); 63 CHECK(num >= header->rpo_number() && num < header->loop_end());
64 CHECK(header->LoopContains(blocks[i])); 64 CHECK(header->LoopContains(blocks[i]));
65 CHECK(header->IsLoopHeader() || blocks[i]->loop_header_ == header); 65 CHECK(header->IsLoopHeader() || blocks[i]->loop_header() == header);
66 } 66 }
67 } 67 }
68 68
69 69
70 static int GetScheduledNodeCount(Schedule* schedule) { 70 static int GetScheduledNodeCount(Schedule* schedule) {
71 int node_count = 0; 71 int node_count = 0;
72 for (BasicBlockVectorIter i = schedule->rpo_order()->begin(); 72 for (BasicBlockVectorIter i = schedule->rpo_order()->begin();
73 i != schedule->rpo_order()->end(); ++i) { 73 i != schedule->rpo_order()->end(); ++i) {
74 BasicBlock* block = *i; 74 BasicBlock* block = *i;
75 for (BasicBlock::const_iterator j = block->begin(); j != block->end(); 75 for (BasicBlock::const_iterator j = block->begin(); j != block->end();
76 ++j) { 76 ++j) {
77 ++node_count; 77 ++node_count;
78 } 78 }
79 BasicBlock::Control control = block->control_; 79 BasicBlock::Control control = block->control();
80 if (control != BasicBlock::kNone) { 80 if (control != BasicBlock::kNone) {
81 ++node_count; 81 ++node_count;
82 } 82 }
83 } 83 }
84 return node_count; 84 return node_count;
85 } 85 }
86 86
87 87
88 static Schedule* ComputeAndVerifySchedule(int expected, Graph* graph) { 88 static Schedule* ComputeAndVerifySchedule(int expected, Graph* graph) {
89 if (FLAG_trace_turbo) { 89 if (FLAG_trace_turbo) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 133
134 BasicBlock* last = schedule.start(); 134 BasicBlock* last = schedule.start();
135 for (int j = 0; j < i; j++) { 135 for (int j = 0; j < i; j++) {
136 BasicBlock* block = schedule.NewBasicBlock(); 136 BasicBlock* block = schedule.NewBasicBlock();
137 schedule.AddGoto(last, block); 137 schedule.AddGoto(last, block);
138 last = block; 138 last = block;
139 } 139 }
140 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); 140 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
141 CheckRPONumbers(order, 1 + i, false); 141 CheckRPONumbers(order, 1 + i, false);
142 142
143 Schedule::BasicBlocks blocks(schedule.all_blocks()); 143 for (size_t i = 0; i < schedule.BasicBlockCount(); i++) {
144 for (Schedule::BasicBlocks::iterator iter = blocks.begin(); 144 BasicBlock* block = schedule.GetBlockById(BasicBlock::Id::FromSize(i));
145 iter != blocks.end(); ++iter) { 145 if (block->rpo_number() >= 0 && block->SuccessorCount() == 1) {
146 BasicBlock* block = *iter; 146 CHECK(block->rpo_number() + 1 == block->SuccessorAt(0)->rpo_number());
147 if (block->rpo_number_ >= 0 && block->SuccessorCount() == 1) {
148 CHECK(block->rpo_number_ + 1 == block->SuccessorAt(0)->rpo_number_);
149 } 147 }
150 } 148 }
151 } 149 }
152 } 150 }
153 151
154 152
155 TEST(RPOSelfLoop) { 153 TEST(RPOSelfLoop) {
156 HandleAndZoneScope scope; 154 HandleAndZoneScope scope;
157 Schedule schedule(scope.main_zone()); 155 Schedule schedule(scope.main_zone());
158 schedule.AddSuccessor(schedule.start(), schedule.start()); 156 schedule.AddSuccessor(schedule.start(), schedule.start());
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 BasicBlock* D = schedule.end(); 206 BasicBlock* D = schedule.end();
209 207
210 schedule.AddSuccessor(A, B); 208 schedule.AddSuccessor(A, B);
211 schedule.AddSuccessor(A, C); 209 schedule.AddSuccessor(A, C);
212 schedule.AddSuccessor(B, D); 210 schedule.AddSuccessor(B, D);
213 schedule.AddSuccessor(C, D); 211 schedule.AddSuccessor(C, D);
214 212
215 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); 213 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
216 CheckRPONumbers(order, 4, false); 214 CheckRPONumbers(order, 4, false);
217 215
218 CHECK_EQ(0, A->rpo_number_); 216 CHECK_EQ(0, A->rpo_number());
219 CHECK((B->rpo_number_ == 1 && C->rpo_number_ == 2) || 217 CHECK((B->rpo_number() == 1 && C->rpo_number() == 2) ||
220 (B->rpo_number_ == 2 && C->rpo_number_ == 1)); 218 (B->rpo_number() == 2 && C->rpo_number() == 1));
221 CHECK_EQ(3, D->rpo_number_); 219 CHECK_EQ(3, D->rpo_number());
222 } 220 }
223 221
224 222
225 TEST(RPOLoop1) { 223 TEST(RPOLoop1) {
226 HandleAndZoneScope scope; 224 HandleAndZoneScope scope;
227 Schedule schedule(scope.main_zone()); 225 Schedule schedule(scope.main_zone());
228 226
229 BasicBlock* A = schedule.start(); 227 BasicBlock* A = schedule.start();
230 BasicBlock* B = schedule.NewBasicBlock(); 228 BasicBlock* B = schedule.NewBasicBlock();
231 BasicBlock* C = schedule.NewBasicBlock(); 229 BasicBlock* C = schedule.NewBasicBlock();
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 BasicBlock* E = schedule.end(); 383 BasicBlock* E = schedule.end();
386 384
387 schedule.AddSuccessor(A, loop1->header()); 385 schedule.AddSuccessor(A, loop1->header());
388 schedule.AddSuccessor(loop1->header(), loop2->header()); 386 schedule.AddSuccessor(loop1->header(), loop2->header());
389 schedule.AddSuccessor(loop2->last(), E); 387 schedule.AddSuccessor(loop2->last(), E);
390 388
391 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); 389 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
392 390
393 CheckLoopContains(loop1->nodes, loop1->count); 391 CheckLoopContains(loop1->nodes, loop1->count);
394 392
395 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); 393 CHECK_EQ(static_cast<int>(schedule.BasicBlockCount()),
394 static_cast<int>(order->size()));
396 CheckLoopContains(loop1->nodes, loop1->count); 395 CheckLoopContains(loop1->nodes, loop1->count);
397 CheckLoopContains(loop2->nodes, loop2->count); 396 CheckLoopContains(loop2->nodes, loop2->count);
398 } 397 }
399 398
400 399
401 TEST(RPOLoopFollow2) { 400 TEST(RPOLoopFollow2) {
402 HandleAndZoneScope scope; 401 HandleAndZoneScope scope;
403 Schedule schedule(scope.main_zone()); 402 Schedule schedule(scope.main_zone());
404 403
405 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1)); 404 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1));
406 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1)); 405 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1));
407 406
408 BasicBlock* A = schedule.start(); 407 BasicBlock* A = schedule.start();
409 BasicBlock* S = schedule.NewBasicBlock(); 408 BasicBlock* S = schedule.NewBasicBlock();
410 BasicBlock* E = schedule.end(); 409 BasicBlock* E = schedule.end();
411 410
412 schedule.AddSuccessor(A, loop1->header()); 411 schedule.AddSuccessor(A, loop1->header());
413 schedule.AddSuccessor(loop1->header(), S); 412 schedule.AddSuccessor(loop1->header(), S);
414 schedule.AddSuccessor(S, loop2->header()); 413 schedule.AddSuccessor(S, loop2->header());
415 schedule.AddSuccessor(loop2->last(), E); 414 schedule.AddSuccessor(loop2->last(), E);
416 415
417 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); 416 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
418 417
419 CheckLoopContains(loop1->nodes, loop1->count); 418 CheckLoopContains(loop1->nodes, loop1->count);
420 419
421 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); 420 CHECK_EQ(static_cast<int>(schedule.BasicBlockCount()),
421 static_cast<int>(order->size()));
422 CheckLoopContains(loop1->nodes, loop1->count); 422 CheckLoopContains(loop1->nodes, loop1->count);
423 CheckLoopContains(loop2->nodes, loop2->count); 423 CheckLoopContains(loop2->nodes, loop2->count);
424 } 424 }
425 425
426 426
427 TEST(RPOLoopFollowN) { 427 TEST(RPOLoopFollowN) {
428 HandleAndZoneScope scope; 428 HandleAndZoneScope scope;
429 429
430 for (int size = 1; size < 5; size++) { 430 for (int size = 1; size < 5; size++) {
431 for (int exit = 0; exit < size; exit++) { 431 for (int exit = 0; exit < size; exit++) {
432 Schedule schedule(scope.main_zone()); 432 Schedule schedule(scope.main_zone());
433 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size)); 433 SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size));
434 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, size)); 434 SmartPointer<TestLoop> loop2(CreateLoop(&schedule, size));
435 BasicBlock* A = schedule.start(); 435 BasicBlock* A = schedule.start();
436 BasicBlock* E = schedule.end(); 436 BasicBlock* E = schedule.end();
437 437
438 schedule.AddSuccessor(A, loop1->header()); 438 schedule.AddSuccessor(A, loop1->header());
439 schedule.AddSuccessor(loop1->nodes[exit], loop2->header()); 439 schedule.AddSuccessor(loop1->nodes[exit], loop2->header());
440 schedule.AddSuccessor(loop2->nodes[exit], E); 440 schedule.AddSuccessor(loop2->nodes[exit], E);
441 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); 441 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
442 CheckLoopContains(loop1->nodes, loop1->count); 442 CheckLoopContains(loop1->nodes, loop1->count);
443 443
444 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); 444 CHECK_EQ(static_cast<int>(schedule.BasicBlockCount()),
445 static_cast<int>(order->size()));
445 CheckLoopContains(loop1->nodes, loop1->count); 446 CheckLoopContains(loop1->nodes, loop1->count);
446 CheckLoopContains(loop2->nodes, loop2->count); 447 CheckLoopContains(loop2->nodes, loop2->count);
447 } 448 }
448 } 449 }
449 } 450 }
450 451
451 452
452 TEST(RPONestedLoopFollow1) { 453 TEST(RPONestedLoopFollow1) {
453 HandleAndZoneScope scope; 454 HandleAndZoneScope scope;
454 Schedule schedule(scope.main_zone()); 455 Schedule schedule(scope.main_zone());
(...skipping 10 matching lines...) Expand all
465 schedule.AddSuccessor(B, loop1->header()); 466 schedule.AddSuccessor(B, loop1->header());
466 schedule.AddSuccessor(loop1->header(), loop2->header()); 467 schedule.AddSuccessor(loop1->header(), loop2->header());
467 schedule.AddSuccessor(loop2->last(), C); 468 schedule.AddSuccessor(loop2->last(), C);
468 schedule.AddSuccessor(C, E); 469 schedule.AddSuccessor(C, E);
469 schedule.AddSuccessor(C, B); 470 schedule.AddSuccessor(C, B);
470 471
471 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule); 472 BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
472 473
473 CheckLoopContains(loop1->nodes, loop1->count); 474 CheckLoopContains(loop1->nodes, loop1->count);
474 475
475 CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size())); 476 CHECK_EQ(static_cast<int>(schedule.BasicBlockCount()),
477 static_cast<int>(order->size()));
476 CheckLoopContains(loop1->nodes, loop1->count); 478 CheckLoopContains(loop1->nodes, loop1->count);
477 CheckLoopContains(loop2->nodes, loop2->count); 479 CheckLoopContains(loop2->nodes, loop2->count);
478 480
479 BasicBlock* loop3[] = {B, loop1->nodes[0], loop2->nodes[0], C}; 481 BasicBlock* loop3[] = {B, loop1->nodes[0], loop2->nodes[0], C};
480 CheckLoopContains(loop3, 4); 482 CheckLoopContains(loop3, 4);
481 } 483 }
482 484
483 485
484 TEST(RPOLoopBackedges1) { 486 TEST(RPOLoopBackedges1) {
485 HandleAndZoneScope scope; 487 HandleAndZoneScope scope;
(...skipping 1218 matching lines...) Expand 10 before | Expand all | Expand 10 after
1704 Node* d3 = CreateDiamond(&graph, &common, add); 1706 Node* d3 = CreateDiamond(&graph, &common, add);
1705 Node* ret = graph.NewNode(common.Return(), d3, start, start); 1707 Node* ret = graph.NewNode(common.Return(), d3, start, start);
1706 Node* end = graph.NewNode(common.End(), ret, start); 1708 Node* end = graph.NewNode(common.End(), ret, start);
1707 1709
1708 graph.SetEnd(end); 1710 graph.SetEnd(end);
1709 1711
1710 ComputeAndVerifySchedule(33, &graph); 1712 ComputeAndVerifySchedule(33, &graph);
1711 } 1713 }
1712 1714
1713 #endif 1715 #endif
OLDNEW
« no previous file with comments | « test/cctest/compiler/test-schedule.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698