Index: test/cctest/compiler/test-scheduler.cc |
diff --git a/test/cctest/compiler/test-scheduler.cc b/test/cctest/compiler/test-scheduler.cc |
index 894f0f0acc554132d928647d4dd13b161b8432aa..50fa126dc6f8f7aaa117c50e2b09a3dc4bb8a9ab 100644 |
--- a/test/cctest/compiler/test-scheduler.cc |
+++ b/test/cctest/compiler/test-scheduler.cc |
@@ -24,12 +24,47 @@ using namespace v8::internal; |
using namespace v8::internal::compiler; |
// TODO(titzer): pull RPO tests out to their own file. |
+static void CheckRPONumbers(BasicBlockVector* order, size_t expected, |
+ bool loops_allowed) { |
+ CHECK(expected == order->size()); |
+ for (int i = 0; i < static_cast<int>(order->size()); i++) { |
+ CHECK(order->at(i)->rpo_number() == i); |
+ if (!loops_allowed) { |
+ CHECK_LT(order->at(i)->loop_end(), 0); |
+ CHECK_EQ(NULL, order->at(i)->loop_header()); |
+ } |
+ } |
+} |
+ |
+ |
+static void CheckLoop(BasicBlockVector* order, BasicBlock** blocks, |
+ int body_size) { |
+ BasicBlock* header = blocks[0]; |
+ CHECK_GT(header->loop_end(), 0); |
+ CHECK_EQ(body_size, (header->loop_end() - header->rpo_number())); |
+ for (int i = 0; i < body_size; i++) { |
+ int num = blocks[i]->rpo_number(); |
+ CHECK(num >= header->rpo_number() && num < header->loop_end()); |
+ CHECK(header->LoopContains(blocks[i])); |
+ CHECK(header->IsLoopHeader() || blocks[i]->loop_header() == header); |
+ } |
+ if (header->rpo_number() > 0) { |
+ CHECK_NE(order->at(header->rpo_number() - 1)->loop_header(), header); |
+ } |
+ if (header->loop_end() < static_cast<int>(order->size())) { |
+ CHECK_NE(order->at(header->loop_end())->loop_header(), header); |
+ } |
+} |
+ |
+ |
struct TestLoop { |
int count; |
BasicBlock** nodes; |
BasicBlock* header() { return nodes[0]; } |
BasicBlock* last() { return nodes[count - 1]; } |
~TestLoop() { delete[] nodes; } |
+ |
+ void Check(BasicBlockVector* order) { CheckLoop(order, nodes, count); } |
}; |
@@ -46,29 +81,6 @@ static TestLoop* CreateLoop(Schedule* schedule, int count) { |
} |
-static void CheckRPONumbers(BasicBlockVector* order, size_t expected, |
- bool loops_allowed) { |
- CHECK(expected == order->size()); |
- for (int i = 0; i < static_cast<int>(order->size()); i++) { |
- CHECK(order->at(i)->rpo_number() == i); |
- if (!loops_allowed) CHECK_LT(order->at(i)->loop_end(), 0); |
- } |
-} |
- |
- |
-static void CheckLoopContains(BasicBlock** blocks, int body_size) { |
- BasicBlock* header = blocks[0]; |
- CHECK_GT(header->loop_end(), 0); |
- CHECK_EQ(body_size, (header->loop_end() - header->rpo_number())); |
- for (int i = 0; i < body_size; i++) { |
- int num = blocks[i]->rpo_number(); |
- CHECK(num >= header->rpo_number() && num < header->loop_end()); |
- CHECK(header->LoopContains(blocks[i])); |
- CHECK(header->IsLoopHeader() || blocks[i]->loop_header() == header); |
- } |
-} |
- |
- |
static int GetScheduledNodeCount(Schedule* schedule) { |
int node_count = 0; |
for (BasicBlockVectorIter i = schedule->rpo_order()->begin(); |
@@ -165,7 +177,7 @@ TEST(RPOSelfLoop) { |
BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, 1, true); |
BasicBlock* loop[] = {schedule.start()}; |
- CheckLoopContains(loop, 1); |
+ CheckLoop(order, loop, 1); |
} |
@@ -178,7 +190,7 @@ TEST(RPOEntryLoop) { |
BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, 2, true); |
BasicBlock* loop[] = {schedule.start(), schedule.end()}; |
- CheckLoopContains(loop, 2); |
+ CheckLoop(order, loop, 2); |
} |
@@ -190,7 +202,7 @@ TEST(RPOEndLoop) { |
ZonePool zone_pool(scope.main_isolate()); |
BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, 3, true); |
- CheckLoopContains(loop1->nodes, loop1->count); |
+ loop1->Check(order); |
} |
@@ -203,7 +215,7 @@ TEST(RPOEndLoopNested) { |
ZonePool zone_pool(scope.main_isolate()); |
BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, 3, true); |
- CheckLoopContains(loop1->nodes, loop1->count); |
+ loop1->Check(order); |
} |
@@ -250,7 +262,7 @@ TEST(RPOLoop1) { |
BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, 4, true); |
BasicBlock* loop[] = {B, C}; |
- CheckLoopContains(loop, 2); |
+ CheckLoop(order, loop, 2); |
} |
@@ -272,7 +284,7 @@ TEST(RPOLoop2) { |
BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, 4, true); |
BasicBlock* loop[] = {B, C}; |
- CheckLoopContains(loop, 2); |
+ CheckLoop(order, loop, 2); |
} |
@@ -316,7 +328,7 @@ TEST(RPOLoopN) { |
Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, 7, true); |
BasicBlock* loop[] = {B, C, D, E, F}; |
- CheckLoopContains(loop, 5); |
+ CheckLoop(order, loop, 5); |
} |
} |
@@ -344,10 +356,10 @@ TEST(RPOLoopNest1) { |
BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, 6, true); |
BasicBlock* loop1[] = {B, C, D, E}; |
- CheckLoopContains(loop1, 4); |
+ CheckLoop(order, loop1, 4); |
BasicBlock* loop2[] = {C, D}; |
- CheckLoopContains(loop2, 2); |
+ CheckLoop(order, loop2, 2); |
} |
@@ -380,13 +392,13 @@ TEST(RPOLoopNest2) { |
BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, 8, true); |
BasicBlock* loop1[] = {B, C, D, E, F, G}; |
- CheckLoopContains(loop1, 6); |
+ CheckLoop(order, loop1, 6); |
BasicBlock* loop2[] = {C, D, E, F}; |
- CheckLoopContains(loop2, 4); |
+ CheckLoop(order, loop2, 4); |
BasicBlock* loop3[] = {D, E}; |
- CheckLoopContains(loop3, 2); |
+ CheckLoop(order, loop3, 2); |
} |
@@ -407,12 +419,11 @@ TEST(RPOLoopFollow1) { |
ZonePool zone_pool(scope.main_isolate()); |
BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
- CheckLoopContains(loop1->nodes, loop1->count); |
- |
CHECK_EQ(static_cast<int>(schedule.BasicBlockCount()), |
static_cast<int>(order->size())); |
- CheckLoopContains(loop1->nodes, loop1->count); |
- CheckLoopContains(loop2->nodes, loop2->count); |
+ |
+ loop1->Check(order); |
+ loop2->Check(order); |
} |
@@ -435,12 +446,10 @@ TEST(RPOLoopFollow2) { |
ZonePool zone_pool(scope.main_isolate()); |
BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
- CheckLoopContains(loop1->nodes, loop1->count); |
- |
CHECK_EQ(static_cast<int>(schedule.BasicBlockCount()), |
static_cast<int>(order->size())); |
- CheckLoopContains(loop1->nodes, loop1->count); |
- CheckLoopContains(loop2->nodes, loop2->count); |
+ loop1->Check(order); |
+ loop2->Check(order); |
} |
@@ -461,12 +470,11 @@ TEST(RPOLoopFollowN) { |
ZonePool zone_pool(scope.main_isolate()); |
BasicBlockVector* order = |
Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
- CheckLoopContains(loop1->nodes, loop1->count); |
CHECK_EQ(static_cast<int>(schedule.BasicBlockCount()), |
static_cast<int>(order->size())); |
- CheckLoopContains(loop1->nodes, loop1->count); |
- CheckLoopContains(loop2->nodes, loop2->count); |
+ loop1->Check(order); |
+ loop2->Check(order); |
} |
} |
} |
@@ -494,15 +502,13 @@ TEST(RPONestedLoopFollow1) { |
ZonePool zone_pool(scope.main_isolate()); |
BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
- CheckLoopContains(loop1->nodes, loop1->count); |
- |
CHECK_EQ(static_cast<int>(schedule.BasicBlockCount()), |
static_cast<int>(order->size())); |
- CheckLoopContains(loop1->nodes, loop1->count); |
- CheckLoopContains(loop2->nodes, loop2->count); |
+ loop1->Check(order); |
+ loop2->Check(order); |
BasicBlock* loop3[] = {B, loop1->nodes[0], loop2->nodes[0], C}; |
- CheckLoopContains(loop3, 4); |
+ CheckLoop(order, loop3, 4); |
} |
@@ -527,7 +533,7 @@ TEST(RPOLoopBackedges1) { |
BasicBlockVector* order = |
Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, schedule.BasicBlockCount(), true); |
- CheckLoopContains(loop1->nodes, loop1->count); |
+ loop1->Check(order); |
} |
} |
} |
@@ -556,7 +562,7 @@ TEST(RPOLoopOutedges1) { |
BasicBlockVector* order = |
Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, schedule.BasicBlockCount(), true); |
- CheckLoopContains(loop1->nodes, loop1->count); |
+ loop1->Check(order); |
} |
} |
} |
@@ -585,7 +591,7 @@ TEST(RPOLoopOutedges2) { |
BasicBlockVector* order = |
Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, schedule.BasicBlockCount(), true); |
- CheckLoopContains(loop1->nodes, loop1->count); |
+ loop1->Check(order); |
} |
} |
@@ -613,10 +619,10 @@ TEST(RPOLoopOutloops1) { |
BasicBlockVector* order = |
Scheduler::ComputeSpecialRPO(&zone_pool, &schedule); |
CheckRPONumbers(order, schedule.BasicBlockCount(), true); |
- CheckLoopContains(loop1->nodes, loop1->count); |
+ loop1->Check(order); |
for (int j = 0; j < size; j++) { |
- CheckLoopContains(loopN[j]->nodes, loopN[j]->count); |
+ loopN[j]->Check(order); |
delete loopN[j]; |
} |
delete[] loopN; |
@@ -647,7 +653,7 @@ TEST(RPOLoopMultibackedge) { |
CheckRPONumbers(order, 5, true); |
BasicBlock* loop1[] = {B, C, D, E}; |
- CheckLoopContains(loop1, 4); |
+ CheckLoop(order, loop1, 4); |
} |