17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file.
47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/v8.h"
67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/common-operator.h"
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/generic-node-inl.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/graph.h"
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/machine-operator.h"
117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node.h"
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/operator.h"
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/schedule.h"
147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "test/cctest/cctest.h"
157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal;
177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal::compiler;
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic SimpleOperator dummy_operator(IrOpcode::kParameter, Operator::kNoWrite,
207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                     0, 0, "dummy");
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(TestScheduleAllocation) {
237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CHECK_NE(NULL, schedule.start());
275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CHECK_EQ(schedule.start(), *(schedule.all_blocks().begin()));
287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(TestScheduleAddNode) {
327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n0 = graph.NewNode(&dummy_operator);
357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n1 = graph.NewNode(&dummy_operator);
367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* entry = schedule.start();
407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddNode(entry, n0);
417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddNode(entry, n1);
427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(entry, schedule.block(n0));
447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(entry, schedule.block(n1));
457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK(schedule.SameBasicBlock(n0, n1));
467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n2 = graph.NewNode(&dummy_operator);
487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(NULL, schedule.block(n2));
497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(TestScheduleAddGoto) {
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* entry = schedule.start();
577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* next = schedule.NewBasicBlock();
587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddGoto(entry, next);
607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(0, entry->PredecessorCount());
627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(1, entry->SuccessorCount());
637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(next, entry->SuccessorAt(0));
647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(1, next->PredecessorCount());
667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(entry, next->PredecessorAt(0));
677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(0, next->SuccessorCount());
687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(TestScheduleAddBranch) {
727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* entry = schedule.start();
767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* tblock = schedule.NewBasicBlock();
777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* fblock = schedule.NewBasicBlock();
787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder common(scope.main_zone());
817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n0 = graph.NewNode(&dummy_operator);
827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* b = graph.NewNode(common.Branch(), n0);
837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddBranch(entry, b, tblock, fblock);
857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(0, entry->PredecessorCount());
877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(2, entry->SuccessorCount());
887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(tblock, entry->SuccessorAt(0));
897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(fblock, entry->SuccessorAt(1));
907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(1, tblock->PredecessorCount());
927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(entry, tblock->PredecessorAt(0));
937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(0, tblock->SuccessorCount());
947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(1, fblock->PredecessorCount());
967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(entry, fblock->PredecessorAt(0));
977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(0, fblock->SuccessorCount());
987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(TestScheduleAddReturn) {
1027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
1037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
1047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
1057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n0 = graph.NewNode(&dummy_operator);
1065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* entry = schedule.start();
1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddReturn(entry, n0);
1087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(0, entry->PredecessorCount());
1107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(1, entry->SuccessorCount());
1115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CHECK_EQ(schedule.end(), entry->SuccessorAt(0));
1127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(TestScheduleAddThrow) {
1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n0 = graph.NewNode(&dummy_operator);
1205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* entry = schedule.start();
1217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddThrow(entry, n0);
1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(0, entry->PredecessorCount());
1247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(1, entry->SuccessorCount());
1255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CHECK_EQ(schedule.end(), entry->SuccessorAt(0));
1267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(BuildMulNodeGraph) {
1307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
1317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
1327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder common(scope.main_zone());
1346313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  MachineOperatorBuilder machine;
1357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1363e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* start = graph.NewNode(common.Start(0));
1377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetStart(start);
1383e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* param0 = graph.NewNode(common.Parameter(0), graph.start());
1393e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* param1 = graph.NewNode(common.Parameter(1), graph.start());
1407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* mul = graph.NewNode(machine.Int32Mul(), param0, param1);
1427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* ret = graph.NewNode(common.Return(), mul, start);
1437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(ret);
1457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
146