blob: 1eb35471872f7728139e77c4b9b25f2123825745 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2013 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "src/v8.h"
6
7#include "src/compiler/common-operator.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00008#include "src/compiler/graph.h"
9#include "src/compiler/machine-operator.h"
10#include "src/compiler/node.h"
11#include "src/compiler/operator.h"
12#include "src/compiler/schedule.h"
13#include "test/cctest/cctest.h"
14
15using namespace v8::internal;
16using namespace v8::internal::compiler;
17
Emily Bernierd0a1eb72015-03-24 16:35:39 -040018static Operator dummy_operator(IrOpcode::kParameter, Operator::kNoWrite,
19 "dummy", 0, 0, 0, 0, 0, 0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000020
21TEST(TestScheduleAllocation) {
22 HandleAndZoneScope scope;
23 Schedule schedule(scope.main_zone());
24
25 CHECK_NE(NULL, schedule.start());
Emily Bernierd0a1eb72015-03-24 16:35:39 -040026 CHECK_EQ(schedule.start(), schedule.GetBlockById(BasicBlock::Id::FromInt(0)));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000027}
28
29
30TEST(TestScheduleAddNode) {
31 HandleAndZoneScope scope;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040032 Schedule schedule(scope.main_zone());
Ben Murdochb8a8cc12014-11-26 15:28:44 +000033 Graph graph(scope.main_zone());
34 Node* n0 = graph.NewNode(&dummy_operator);
35 Node* n1 = graph.NewNode(&dummy_operator);
36
Ben Murdochb8a8cc12014-11-26 15:28:44 +000037 BasicBlock* entry = schedule.start();
38 schedule.AddNode(entry, n0);
39 schedule.AddNode(entry, n1);
40
41 CHECK_EQ(entry, schedule.block(n0));
42 CHECK_EQ(entry, schedule.block(n1));
43 CHECK(schedule.SameBasicBlock(n0, n1));
44
45 Node* n2 = graph.NewNode(&dummy_operator);
46 CHECK_EQ(NULL, schedule.block(n2));
47}
48
49
50TEST(TestScheduleAddGoto) {
51 HandleAndZoneScope scope;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000052 Schedule schedule(scope.main_zone());
Emily Bernierd0a1eb72015-03-24 16:35:39 -040053
Ben Murdochb8a8cc12014-11-26 15:28:44 +000054 BasicBlock* entry = schedule.start();
55 BasicBlock* next = schedule.NewBasicBlock();
56
57 schedule.AddGoto(entry, next);
58
Emily Bernierd0a1eb72015-03-24 16:35:39 -040059 CHECK_EQ(0, static_cast<int>(entry->PredecessorCount()));
60 CHECK_EQ(1, static_cast<int>(entry->SuccessorCount()));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000061 CHECK_EQ(next, entry->SuccessorAt(0));
62
Emily Bernierd0a1eb72015-03-24 16:35:39 -040063 CHECK_EQ(1, static_cast<int>(next->PredecessorCount()));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000064 CHECK_EQ(entry, next->PredecessorAt(0));
Emily Bernierd0a1eb72015-03-24 16:35:39 -040065 CHECK_EQ(0, static_cast<int>(next->SuccessorCount()));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000066}
67
68
69TEST(TestScheduleAddBranch) {
70 HandleAndZoneScope scope;
71 Schedule schedule(scope.main_zone());
Ben Murdochb8a8cc12014-11-26 15:28:44 +000072 Graph graph(scope.main_zone());
73 CommonOperatorBuilder common(scope.main_zone());
74 Node* n0 = graph.NewNode(&dummy_operator);
75 Node* b = graph.NewNode(common.Branch(), n0);
76
Emily Bernierd0a1eb72015-03-24 16:35:39 -040077 BasicBlock* entry = schedule.start();
78 BasicBlock* tblock = schedule.NewBasicBlock();
79 BasicBlock* fblock = schedule.NewBasicBlock();
80
Ben Murdochb8a8cc12014-11-26 15:28:44 +000081 schedule.AddBranch(entry, b, tblock, fblock);
82
Emily Bernierd0a1eb72015-03-24 16:35:39 -040083 CHECK_EQ(0, static_cast<int>(entry->PredecessorCount()));
84 CHECK_EQ(2, static_cast<int>(entry->SuccessorCount()));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000085 CHECK_EQ(tblock, entry->SuccessorAt(0));
86 CHECK_EQ(fblock, entry->SuccessorAt(1));
87
Emily Bernierd0a1eb72015-03-24 16:35:39 -040088 CHECK_EQ(1, static_cast<int>(tblock->PredecessorCount()));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000089 CHECK_EQ(entry, tblock->PredecessorAt(0));
Emily Bernierd0a1eb72015-03-24 16:35:39 -040090 CHECK_EQ(0, static_cast<int>(tblock->SuccessorCount()));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000091
Emily Bernierd0a1eb72015-03-24 16:35:39 -040092 CHECK_EQ(1, static_cast<int>(fblock->PredecessorCount()));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000093 CHECK_EQ(entry, fblock->PredecessorAt(0));
Emily Bernierd0a1eb72015-03-24 16:35:39 -040094 CHECK_EQ(0, static_cast<int>(fblock->SuccessorCount()));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000095}
96
97
98TEST(TestScheduleAddReturn) {
99 HandleAndZoneScope scope;
100 Schedule schedule(scope.main_zone());
101 Graph graph(scope.main_zone());
102 Node* n0 = graph.NewNode(&dummy_operator);
103 BasicBlock* entry = schedule.start();
104 schedule.AddReturn(entry, n0);
105
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400106 CHECK_EQ(0, static_cast<int>(entry->PredecessorCount()));
107 CHECK_EQ(1, static_cast<int>(entry->SuccessorCount()));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000108 CHECK_EQ(schedule.end(), entry->SuccessorAt(0));
109}
110
111
112TEST(TestScheduleAddThrow) {
113 HandleAndZoneScope scope;
114 Schedule schedule(scope.main_zone());
115 Graph graph(scope.main_zone());
116 Node* n0 = graph.NewNode(&dummy_operator);
117 BasicBlock* entry = schedule.start();
118 schedule.AddThrow(entry, n0);
119
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400120 CHECK_EQ(0, static_cast<int>(entry->PredecessorCount()));
121 CHECK_EQ(1, static_cast<int>(entry->SuccessorCount()));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000122 CHECK_EQ(schedule.end(), entry->SuccessorAt(0));
123}
124
125
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400126TEST(TestScheduleInsertBranch) {
127 HandleAndZoneScope scope;
128 Schedule schedule(scope.main_zone());
129 Graph graph(scope.main_zone());
130 CommonOperatorBuilder common(scope.main_zone());
131 Node* n0 = graph.NewNode(&dummy_operator);
132 Node* n1 = graph.NewNode(&dummy_operator);
133 Node* b = graph.NewNode(common.Branch(), n1);
134
135 BasicBlock* entry = schedule.start();
136 BasicBlock* tblock = schedule.NewBasicBlock();
137 BasicBlock* fblock = schedule.NewBasicBlock();
138 BasicBlock* merge = schedule.NewBasicBlock();
139 schedule.AddReturn(entry, n0);
140 schedule.AddGoto(tblock, merge);
141 schedule.AddGoto(fblock, merge);
142
143 schedule.InsertBranch(entry, merge, b, tblock, fblock);
144
145 CHECK_EQ(0, static_cast<int>(entry->PredecessorCount()));
146 CHECK_EQ(2, static_cast<int>(entry->SuccessorCount()));
147 CHECK_EQ(tblock, entry->SuccessorAt(0));
148 CHECK_EQ(fblock, entry->SuccessorAt(1));
149
150 CHECK_EQ(2, static_cast<int>(merge->PredecessorCount()));
151 CHECK_EQ(1, static_cast<int>(merge->SuccessorCount()));
152 CHECK_EQ(schedule.end(), merge->SuccessorAt(0));
153
154 CHECK_EQ(1, static_cast<int>(schedule.end()->PredecessorCount()));
155 CHECK_EQ(0, static_cast<int>(schedule.end()->SuccessorCount()));
156 CHECK_EQ(merge, schedule.end()->PredecessorAt(0));
157}
158
159
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000160TEST(BuildMulNodeGraph) {
161 HandleAndZoneScope scope;
162 Schedule schedule(scope.main_zone());
163 Graph graph(scope.main_zone());
164 CommonOperatorBuilder common(scope.main_zone());
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400165 // TODO(titzer): use test operators.
166 MachineOperatorBuilder machine(scope.main_zone());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000167
168 Node* start = graph.NewNode(common.Start(0));
169 graph.SetStart(start);
170 Node* param0 = graph.NewNode(common.Parameter(0), graph.start());
171 Node* param1 = graph.NewNode(common.Parameter(1), graph.start());
172
173 Node* mul = graph.NewNode(machine.Int32Mul(), param0, param1);
174 Node* ret = graph.NewNode(common.Return(), mul, start);
175
176 USE(ret);
177}