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