17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2014 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#include "test/cctest/cctest.h"
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/common-operator.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/generic-node-inl.h"
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/generic-node.h"
117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/graph.h"
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/graph-visualizer.h"
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/js-operator.h"
147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/machine-operator.h"
157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node.h"
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/operator.h"
177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/schedule.h"
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/scheduler.h"
19fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "src/compiler/verifier.h"
207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal;
227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal::compiler;
237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
24fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org// TODO(titzer): pull RPO tests out to their own file.
257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstruct TestLoop {
267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int count;
277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock** nodes;
287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* header() { return nodes[0]; }
297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* last() { return nodes[count - 1]; }
307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ~TestLoop() { delete[] nodes; }
317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic TestLoop* CreateLoop(Schedule* schedule, int count) {
357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  TestLoop* loop = new TestLoop();
367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  loop->count = count;
377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  loop->nodes = new BasicBlock* [count];
387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < count; i++) {
397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    loop->nodes[i] = schedule->NewBasicBlock();
407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (i > 0) schedule->AddSuccessor(loop->nodes[i - 1], loop->nodes[i]);
417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule->AddSuccessor(loop->nodes[count - 1], loop->nodes[0]);
437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return loop;
447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic void CheckRPONumbers(BasicBlockVector* order, int expected,
487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            bool loops_allowed) {
497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(expected, static_cast<int>(order->size()));
507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < static_cast<int>(order->size()); i++) {
517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(order->at(i)->rpo_number_ == i);
527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (!loops_allowed) CHECK_LT(order->at(i)->loop_end_, 0);
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic void CheckLoopContains(BasicBlock** blocks, int body_size) {
587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* header = blocks[0];
597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_GT(header->loop_end_, 0);
607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(body_size, (header->loop_end_ - header->rpo_number_));
617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < body_size; i++) {
627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    int num = blocks[i]->rpo_number_;
637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(num >= header->rpo_number_ && num < header->loop_end_);
647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(header->LoopContains(blocks[i]));
657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(header->IsLoopHeader() || blocks[i]->loop_header_ == header);
667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
70fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.orgstatic int GetScheduledNodeCount(Schedule* schedule) {
71fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  int node_count = 0;
72fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  for (BasicBlockVectorIter i = schedule->rpo_order()->begin();
73fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org       i != schedule->rpo_order()->end(); ++i) {
74fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    BasicBlock* block = *i;
75fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    for (BasicBlock::const_iterator j = block->begin(); j != block->end();
76fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org         ++j) {
77fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      ++node_count;
78fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    }
79fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    BasicBlock::Control control = block->control_;
80fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    if (control != BasicBlock::kNone) {
81fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      ++node_count;
82fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    }
83fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  }
84fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  return node_count;
85fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org}
86fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
87fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
88fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.orgstatic Schedule* ComputeAndVerifySchedule(int expected, Graph* graph) {
89fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  if (FLAG_trace_turbo) {
90fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    OFStream os(stdout);
91fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    os << AsDOT(*graph);
92fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  }
93fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
94fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Schedule* schedule = Scheduler::ComputeSchedule(graph);
95fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
96fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  if (FLAG_trace_turbo_scheduler) {
97fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    OFStream os(stdout);
98fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    os << *schedule << endl;
99fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  }
100fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  ScheduleVerifier::Run(schedule);
101fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  CHECK_EQ(expected, GetScheduledNodeCount(schedule));
102fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  return schedule;
103fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org}
104fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
105fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPODegenerate1) {
1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
1087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
1097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
1117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckRPONumbers(order, 1, false);
1125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CHECK_EQ(schedule.start(), order->at(0));
1137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPODegenerate2) {
1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  schedule.AddGoto(schedule.start(), schedule.end());
12131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckRPONumbers(order, 2, false);
1235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CHECK_EQ(schedule.start(), order->at(0));
1245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  CHECK_EQ(schedule.end(), order->at(1));
1257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLine) {
1297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
1307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < 10; i++) {
1327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Schedule schedule(scope.main_zone());
1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    BasicBlock* last = schedule.start();
1357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (int j = 0; j < i; j++) {
1367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      BasicBlock* block = schedule.NewBasicBlock();
1377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddGoto(last, block);
1387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      last = block;
1397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
14031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org    BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
1417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CheckRPONumbers(order, 1 + i, false);
1427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Schedule::BasicBlocks blocks(schedule.all_blocks());
1447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (Schedule::BasicBlocks::iterator iter = blocks.begin();
1457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         iter != blocks.end(); ++iter) {
1467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      BasicBlock* block = *iter;
1477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (block->rpo_number_ >= 0 && block->SuccessorCount() == 1) {
1487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        CHECK(block->rpo_number_ + 1 == block->SuccessorAt(0)->rpo_number_);
1497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
1507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
1517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOSelfLoop) {
1567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
1577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
1585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  schedule.AddSuccessor(schedule.start(), schedule.start());
15931c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
1607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckRPONumbers(order, 1, true);
1615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* loop[] = {schedule.start()};
1627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop, 1);
1637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOEntryLoop) {
1677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
1687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
1695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  schedule.AddSuccessor(schedule.start(), schedule.end());
1705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  schedule.AddSuccessor(schedule.end(), schedule.start());
17131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
1727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckRPONumbers(order, 2, true);
1735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* loop[] = {schedule.start(), schedule.end()};
1747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop, 2);
1757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOEndLoop) {
1797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
1807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
1817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 2));
1825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  schedule.AddSuccessor(schedule.start(), loop1->header());
18331c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
1847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckRPONumbers(order, 3, true);
1857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop1->nodes, loop1->count);
1867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOEndLoopNested) {
1907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
1917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
1927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 2));
1935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  schedule.AddSuccessor(schedule.start(), loop1->header());
1945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  schedule.AddSuccessor(loop1->last(), schedule.start());
19531c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
1967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckRPONumbers(order, 3, true);
1977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop1->nodes, loop1->count);
1987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPODiamond) {
2027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
2037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
2047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* A = schedule.start();
2067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* B = schedule.NewBasicBlock();
2077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* C = schedule.NewBasicBlock();
2085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* D = schedule.end();
2097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(A, B);
2117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(A, C);
2127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(B, D);
2137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(C, D);
2147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
21531c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
2167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckRPONumbers(order, 4, false);
2177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(0, A->rpo_number_);
2197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK((B->rpo_number_ == 1 && C->rpo_number_ == 2) ||
2207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        (B->rpo_number_ == 2 && C->rpo_number_ == 1));
2217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(3, D->rpo_number_);
2227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoop1) {
2267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
2277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
2287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* A = schedule.start();
2307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* B = schedule.NewBasicBlock();
2317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* C = schedule.NewBasicBlock();
2325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* D = schedule.end();
2337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(A, B);
2357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(B, C);
2367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(C, B);
2377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(C, D);
2387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
23931c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
2407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckRPONumbers(order, 4, true);
2417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* loop[] = {B, C};
2427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop, 2);
2437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoop2) {
2477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
2487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
2497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* A = schedule.start();
2517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* B = schedule.NewBasicBlock();
2527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* C = schedule.NewBasicBlock();
2535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* D = schedule.end();
2547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(A, B);
2567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(B, C);
2577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(C, B);
2587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(B, D);
2597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
26031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
2617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckRPONumbers(order, 4, true);
2627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* loop[] = {B, C};
2637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop, 2);
2647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoopN) {
2687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
2697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < 11; i++) {
2717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Schedule schedule(scope.main_zone());
2725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    BasicBlock* A = schedule.start();
2737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    BasicBlock* B = schedule.NewBasicBlock();
2747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    BasicBlock* C = schedule.NewBasicBlock();
2757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    BasicBlock* D = schedule.NewBasicBlock();
2767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    BasicBlock* E = schedule.NewBasicBlock();
2777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    BasicBlock* F = schedule.NewBasicBlock();
2785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    BasicBlock* G = schedule.end();
2797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    schedule.AddSuccessor(A, B);
2817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    schedule.AddSuccessor(B, C);
2827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    schedule.AddSuccessor(C, D);
2837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    schedule.AddSuccessor(D, E);
2847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    schedule.AddSuccessor(E, F);
2857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    schedule.AddSuccessor(F, B);
2867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    schedule.AddSuccessor(B, G);
2877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    // Throw in extra backedges from time to time.
2897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (i == 1) schedule.AddSuccessor(B, B);
2907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (i == 2) schedule.AddSuccessor(C, B);
2917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (i == 3) schedule.AddSuccessor(D, B);
2927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (i == 4) schedule.AddSuccessor(E, B);
2937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (i == 5) schedule.AddSuccessor(F, B);
2947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    // Throw in extra loop exits from time to time.
2967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (i == 6) schedule.AddSuccessor(B, G);
2977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (i == 7) schedule.AddSuccessor(C, G);
2987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (i == 8) schedule.AddSuccessor(D, G);
2997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (i == 9) schedule.AddSuccessor(E, G);
3007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (i == 10) schedule.AddSuccessor(F, G);
3017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
30231c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org    BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
3037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CheckRPONumbers(order, 7, true);
3047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    BasicBlock* loop[] = {B, C, D, E, F};
3057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CheckLoopContains(loop, 5);
3067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
3077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoopNest1) {
3117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
3127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
3137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* A = schedule.start();
3157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* B = schedule.NewBasicBlock();
3167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* C = schedule.NewBasicBlock();
3177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* D = schedule.NewBasicBlock();
3187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* E = schedule.NewBasicBlock();
3195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* F = schedule.end();
3207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(A, B);
3227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(B, C);
3237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(C, D);
3247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(D, C);
3257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(D, E);
3267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(E, B);
3277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(E, F);
3287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
32931c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
3307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckRPONumbers(order, 6, true);
3317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* loop1[] = {B, C, D, E};
3327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop1, 4);
3337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* loop2[] = {C, D};
3357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop2, 2);
3367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoopNest2) {
3407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
3417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
3427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* A = schedule.start();
3447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* B = schedule.NewBasicBlock();
3457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* C = schedule.NewBasicBlock();
3467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* D = schedule.NewBasicBlock();
3477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* E = schedule.NewBasicBlock();
3487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* F = schedule.NewBasicBlock();
3497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* G = schedule.NewBasicBlock();
3505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* H = schedule.end();
3517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(A, B);
3537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(B, C);
3547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(C, D);
3557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(D, E);
3567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(E, F);
3577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(F, G);
3587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(G, H);
3597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(E, D);
3617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(F, C);
3627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(G, B);
3637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
36431c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
3657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckRPONumbers(order, 8, true);
3667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* loop1[] = {B, C, D, E, F, G};
3677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop1, 6);
3687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* loop2[] = {C, D, E, F};
3707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop2, 4);
3717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* loop3[] = {D, E};
3737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop3, 2);
3747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoopFollow1) {
3787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
3797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
3807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1));
3827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1));
3837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* A = schedule.start();
3855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* E = schedule.end();
3867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(A, loop1->header());
3887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(loop1->header(), loop2->header());
3897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(loop2->last(), E);
3907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
39131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
3927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop1->nodes, loop1->count);
3947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size()));
3967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop1->nodes, loop1->count);
3977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop2->nodes, loop2->count);
3987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoopFollow2) {
4027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
4037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
4047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1));
4067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1));
4077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* A = schedule.start();
4097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* S = schedule.NewBasicBlock();
4105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* E = schedule.end();
4117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(A, loop1->header());
4137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(loop1->header(), S);
4147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(S, loop2->header());
4157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(loop2->last(), E);
4167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
41731c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
4187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop1->nodes, loop1->count);
4207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size()));
4227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop1->nodes, loop1->count);
4237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop2->nodes, loop2->count);
4247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
4257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoopFollowN) {
4287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
4297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int size = 1; size < 5; size++) {
4317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (int exit = 0; exit < size; exit++) {
4327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Schedule schedule(scope.main_zone());
4337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size));
4347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      SmartPointer<TestLoop> loop2(CreateLoop(&schedule, size));
4355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      BasicBlock* A = schedule.start();
4365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      BasicBlock* E = schedule.end();
4377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(A, loop1->header());
4397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(loop1->nodes[exit], loop2->header());
4407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(loop2->nodes[exit], E);
44131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org      BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
4427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CheckLoopContains(loop1->nodes, loop1->count);
4437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size()));
4457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CheckLoopContains(loop1->nodes, loop1->count);
4467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CheckLoopContains(loop2->nodes, loop2->count);
4477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
4487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
4497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
4507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPONestedLoopFollow1) {
4537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
4547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
4557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1));
4577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1));
4587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* A = schedule.start();
4607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* B = schedule.NewBasicBlock();
4617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* C = schedule.NewBasicBlock();
4625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* E = schedule.end();
4637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(A, B);
4657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(B, loop1->header());
4667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(loop1->header(), loop2->header());
4677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(loop2->last(), C);
4687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(C, E);
4697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(C, B);
4707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
47131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
4727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop1->nodes, loop1->count);
4747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size()));
4767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop1->nodes, loop1->count);
4777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop2->nodes, loop2->count);
4787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* loop3[] = {B, loop1->nodes[0], loop2->nodes[0], C};
4807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop3, 4);
4817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
4827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoopBackedges1) {
4857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
4867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int size = 8;
4887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < size; i++) {
4897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (int j = 0; j < size; j++) {
4907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Schedule schedule(scope.main_zone());
4915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      BasicBlock* A = schedule.start();
4925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      BasicBlock* E = schedule.end();
4937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size));
4957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(A, loop1->header());
4967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(loop1->last(), E);
4977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(loop1->nodes[i], loop1->header());
4997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(loop1->nodes[j], E);
5007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
50131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org      BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
5027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CheckRPONumbers(order, schedule.BasicBlockCount(), true);
5037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CheckLoopContains(loop1->nodes, loop1->count);
5047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
5057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
5067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
5077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoopOutedges1) {
5107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
5117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int size = 8;
5137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < size; i++) {
5147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (int j = 0; j < size; j++) {
5157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Schedule schedule(scope.main_zone());
5165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      BasicBlock* A = schedule.start();
5177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      BasicBlock* D = schedule.NewBasicBlock();
5185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      BasicBlock* E = schedule.end();
5197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size));
5217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(A, loop1->header());
5227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(loop1->last(), E);
5237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(loop1->nodes[i], loop1->header());
5257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(loop1->nodes[j], D);
5267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(D, E);
5277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
52831c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org      BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
5297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CheckRPONumbers(order, schedule.BasicBlockCount(), true);
5307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CheckLoopContains(loop1->nodes, loop1->count);
5317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
5327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
5337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
5347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoopOutedges2) {
5377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
5387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int size = 8;
5407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < size; i++) {
5417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Schedule schedule(scope.main_zone());
5425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    BasicBlock* A = schedule.start();
5435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    BasicBlock* E = schedule.end();
5447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size));
5467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    schedule.AddSuccessor(A, loop1->header());
5477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    schedule.AddSuccessor(loop1->last(), E);
5487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (int j = 0; j < size; j++) {
5507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      BasicBlock* O = schedule.NewBasicBlock();
5517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(loop1->nodes[j], O);
5527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(O, E);
5537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
5547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
55531c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org    BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
5567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CheckRPONumbers(order, schedule.BasicBlockCount(), true);
5577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CheckLoopContains(loop1->nodes, loop1->count);
5587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
5597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
5607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoopOutloops1) {
5637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
5647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int size = 8;
5667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < size; i++) {
5677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Schedule schedule(scope.main_zone());
5685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    BasicBlock* A = schedule.start();
5695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    BasicBlock* E = schedule.end();
5707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size));
5717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    schedule.AddSuccessor(A, loop1->header());
5727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    schedule.AddSuccessor(loop1->last(), E);
5737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    TestLoop** loopN = new TestLoop* [size];
5757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (int j = 0; j < size; j++) {
5767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      loopN[j] = CreateLoop(&schedule, 2);
5777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(loop1->nodes[j], loopN[j]->header());
5787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      schedule.AddSuccessor(loopN[j]->last(), E);
5797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
5807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
58131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org    BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
5827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CheckRPONumbers(order, schedule.BasicBlockCount(), true);
5837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CheckLoopContains(loop1->nodes, loop1->count);
5847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (int j = 0; j < size; j++) {
5867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CheckLoopContains(loopN[j]->nodes, loopN[j]->count);
5877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      delete loopN[j];
5887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
5897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    delete[] loopN;
5907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
5917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
5927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RPOLoopMultibackedge) {
5957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
5967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Schedule schedule(scope.main_zone());
5977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* A = schedule.start();
5997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* B = schedule.NewBasicBlock();
6007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* C = schedule.NewBasicBlock();
6015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  BasicBlock* D = schedule.end();
6027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* E = schedule.NewBasicBlock();
6037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(A, B);
6057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(B, C);
6067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(B, D);
6077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(B, E);
6087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(C, B);
6097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(D, B);
6107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  schedule.AddSuccessor(E, B);
6117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
61231c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
6137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckRPONumbers(order, 5, true);
6147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  BasicBlock* loop1[] = {B, C, D, E};
6167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckLoopContains(loop1, 4);
6177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
6187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(BuildScheduleEmpty) {
6217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
6227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
6237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder builder(scope.main_zone());
6243e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  graph.SetStart(graph.NewNode(builder.Start(0)));
6257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetEnd(graph.NewNode(builder.End(), graph.start()));
6267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
62731c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  USE(Scheduler::ComputeSchedule(&graph));
6287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
6297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(BuildScheduleOneParameter) {
6327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
6337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
6347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder builder(scope.main_zone());
6353e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  graph.SetStart(graph.NewNode(builder.Start(0)));
6367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6373e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* p1 = graph.NewNode(builder.Parameter(0), graph.start());
6387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* ret = graph.NewNode(builder.Return(), p1, graph.start(), graph.start());
6397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetEnd(graph.NewNode(builder.End(), ret));
6417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
64231c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  USE(Scheduler::ComputeSchedule(&graph));
6437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
6447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(BuildScheduleIfSplit) {
6477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
6487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
6497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder builder(scope.main_zone());
6507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  JSOperatorBuilder js_builder(scope.main_zone());
6513e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  graph.SetStart(graph.NewNode(builder.Start(3)));
6527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6533e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* p1 = graph.NewNode(builder.Parameter(0), graph.start());
6543e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* p2 = graph.NewNode(builder.Parameter(1), graph.start());
6553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* p3 = graph.NewNode(builder.Parameter(2), graph.start());
6563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* p4 = graph.NewNode(builder.Parameter(3), graph.start());
6573e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* p5 = graph.NewNode(builder.Parameter(4), graph.start());
6587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* cmp = graph.NewNode(js_builder.LessThanOrEqual(), p1, p2, p3,
6597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            graph.start(), graph.start());
6607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* branch = graph.NewNode(builder.Branch(), cmp, graph.start());
6617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* true_branch = graph.NewNode(builder.IfTrue(), branch);
6627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* false_branch = graph.NewNode(builder.IfFalse(), branch);
6637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* ret1 = graph.NewNode(builder.Return(), p4, graph.start(), true_branch);
6657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* ret2 = graph.NewNode(builder.Return(), p5, graph.start(), false_branch);
6667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* merge = graph.NewNode(builder.Merge(2), ret1, ret2);
6677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetEnd(graph.NewNode(builder.End(), merge));
6687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
669fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  ComputeAndVerifySchedule(13, &graph);
6707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
6717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(BuildScheduleIfSplitWithEffects) {
6747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
6757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Isolate* isolate = scope.main_isolate();
6767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
6777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder common_builder(scope.main_zone());
6787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  JSOperatorBuilder js_builder(scope.main_zone());
6792c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* op;
6807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Handle<Object> object =
6827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Handle<Object>(isolate->heap()->undefined_value(), isolate);
6831af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org  Unique<Object> unique_constant = Unique<Object>::CreateUninitialized(object);
6847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Manually transcripted code for:
6867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // function turbo_fan_test(a, b, c, y) {
6877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   if (a < b) {
6887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     return a + b - c * c - a + y;
6897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   } else {
6907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     return c * c - a;
6917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   }
6927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // }
6933e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  op = common_builder.Start(0);
6943e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n0 = graph.NewNode(op);
6953e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  USE(n0);
6967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* nil = graph.NewNode(common_builder.Dead());
6977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.End();
6987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n23 = graph.NewNode(op, nil);
6997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n23);
7007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Merge(2);
7017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n22 = graph.NewNode(op, nil, nil);
7027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n22);
7037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Return();
7047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n16 = graph.NewNode(op, nil, nil, nil);
7057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n16);
7067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Add();
7077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n15 = graph.NewNode(op, nil, nil, nil, nil, nil);
7087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n15);
7097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Subtract();
7107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n14 = graph.NewNode(op, nil, nil, nil, nil, nil);
7117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n14);
7127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Subtract();
7137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n13 = graph.NewNode(op, nil, nil, nil, nil, nil);
7147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n13);
7157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Add();
7167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n11 = graph.NewNode(op, nil, nil, nil, nil, nil);
7177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n11);
7187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
7193e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n2 = graph.NewNode(op, n0);
7207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n2);
7217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(0, n2);
7227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
7233e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n3 = graph.NewNode(op, n0);
7247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n3);
7257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(1, n3);
7267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.HeapConstant(unique_constant);
7277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n7 = graph.NewNode(op);
7287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n7);
7297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(2, n7);
7307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.LessThan();
7317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n8 = graph.NewNode(op, nil, nil, nil, nil, nil);
7327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n8);
7337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n8->ReplaceInput(0, n2);
7347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n8->ReplaceInput(1, n3);
7357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n8->ReplaceInput(2, n7);
7367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n8->ReplaceInput(3, n0);
7377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n8->ReplaceInput(4, n0);
7387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(3, n8);
7397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfTrue();
7407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n10 = graph.NewNode(op, nil);
7417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n10);
7427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Branch();
7437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n9 = graph.NewNode(op, nil, nil);
7447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n9);
7457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n9->ReplaceInput(0, n8);
7467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n9->ReplaceInput(1, n0);
7477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(0, n9);
7487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(4, n10);
7497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n13->ReplaceInput(0, n11);
7507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Multiply();
7517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n12 = graph.NewNode(op, nil, nil, nil, nil, nil);
7527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n12);
7537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
7543e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n4 = graph.NewNode(op, n0);
7557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n4);
7567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(0, n4);
7577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(1, n4);
7587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(2, n7);
7597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(3, n11);
7607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(4, n10);
7617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n13->ReplaceInput(1, n12);
7627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n13->ReplaceInput(2, n7);
7637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n13->ReplaceInput(3, n12);
7647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n13->ReplaceInput(4, n10);
7657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(0, n13);
7667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(1, n2);
7677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(2, n7);
7687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(3, n13);
7697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(4, n10);
7707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n15->ReplaceInput(0, n14);
7717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
7723e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n5 = graph.NewNode(op, n0);
7737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n5);
7747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n15->ReplaceInput(1, n5);
7757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n15->ReplaceInput(2, n7);
7767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n15->ReplaceInput(3, n14);
7777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n15->ReplaceInput(4, n10);
7787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(0, n15);
7797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(1, n15);
7807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(2, n10);
7817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n22->ReplaceInput(0, n16);
7827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Return();
7837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n21 = graph.NewNode(op, nil, nil, nil);
7847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n21);
7857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Subtract();
7867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n20 = graph.NewNode(op, nil, nil, nil, nil, nil);
7877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n20);
7887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Multiply();
7897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n19 = graph.NewNode(op, nil, nil, nil, nil, nil);
7907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n19);
7917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n19->ReplaceInput(0, n4);
7927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n19->ReplaceInput(1, n4);
7937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n19->ReplaceInput(2, n7);
7947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n19->ReplaceInput(3, n8);
7957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfFalse();
7967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n18 = graph.NewNode(op, nil);
7977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n18);
7987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n18->ReplaceInput(0, n9);
7997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n19->ReplaceInput(4, n18);
8007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(0, n19);
8017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(1, n2);
8027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(2, n7);
8037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(3, n19);
8047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(4, n18);
8057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n21->ReplaceInput(0, n20);
8067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n21->ReplaceInput(1, n20);
8077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n21->ReplaceInput(2, n18);
8087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n22->ReplaceInput(1, n21);
8097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n23->ReplaceInput(0, n22);
8107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetStart(n0);
8127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetEnd(n23);
8137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
814fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  ComputeAndVerifySchedule(20, &graph);
8157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
8167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(BuildScheduleSimpleLoop) {
8197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
8207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Isolate* isolate = scope.main_isolate();
8217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
8227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder common_builder(scope.main_zone());
8237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  JSOperatorBuilder js_builder(scope.main_zone());
8242c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* op;
8257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Handle<Object> object =
8277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Handle<Object>(isolate->heap()->undefined_value(), isolate);
8281af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org  Unique<Object> unique_constant = Unique<Object>::CreateUninitialized(object);
8297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Manually transcripted code for:
8317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // function turbo_fan_test(a, b) {
8327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   while (a < b) {
8337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     a++;
8347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   }
8357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   return a;
8367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // }
8373e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  op = common_builder.Start(0);
8383e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n0 = graph.NewNode(op);
8393e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  USE(n0);
8407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* nil = graph.NewNode(common_builder.Dead());
8417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.End();
8427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n20 = graph.NewNode(op, nil);
8437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n20);
8447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Return();
8457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n19 = graph.NewNode(op, nil, nil, nil);
8467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n19);
84742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
8487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n8 = graph.NewNode(op, nil, nil, nil);
8497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n8);
8507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
8513e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n2 = graph.NewNode(op, n0);
8527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n2);
8537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n8->ReplaceInput(0, n2);
8547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Add();
8557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n18 = graph.NewNode(op, nil, nil, nil, nil, nil);
8567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n18);
8577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.ToNumber();
8587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n16 = graph.NewNode(op, nil, nil, nil, nil);
8597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n16);
8607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(0, n8);
8617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.HeapConstant(unique_constant);
8627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n5 = graph.NewNode(op);
8637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n5);
8647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(1, n5);
8657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.LessThan();
8667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n12 = graph.NewNode(op, nil, nil, nil, nil, nil);
8677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n12);
8687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(0, n8);
86942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
8707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n9 = graph.NewNode(op, nil, nil, nil);
8717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n9);
8727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
8733e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n3 = graph.NewNode(op, n0);
8747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n3);
8757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n9->ReplaceInput(0, n3);
8767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n9->ReplaceInput(1, n9);
8777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Loop(2);
8787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n6 = graph.NewNode(op, nil, nil);
8797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n6);
8807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n6->ReplaceInput(0, n0);
8817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfTrue();
8827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n14 = graph.NewNode(op, nil);
8837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n14);
8847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Branch();
8857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n13 = graph.NewNode(op, nil, nil);
8867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n13);
8877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n13->ReplaceInput(0, n12);
8887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n13->ReplaceInput(1, n6);
8897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(0, n13);
8907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n6->ReplaceInput(1, n14);
8917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n9->ReplaceInput(2, n6);
8927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(1, n9);
8937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(2, n5);
89442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
8957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n10 = graph.NewNode(op, nil, nil, nil);
8967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n10);
8977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(0, n0);
8987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(1, n18);
8997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(2, n6);
9007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(3, n10);
9017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(4, n6);
9027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(2, n12);
9037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(3, n14);
9047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n18->ReplaceInput(0, n16);
9057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.NumberConstant(0);
9067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n17 = graph.NewNode(op);
9077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n17);
9087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n18->ReplaceInput(1, n17);
9097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n18->ReplaceInput(2, n5);
9107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n18->ReplaceInput(3, n16);
9117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n18->ReplaceInput(4, n14);
9127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n8->ReplaceInput(1, n18);
9137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n8->ReplaceInput(2, n6);
9147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n19->ReplaceInput(0, n8);
9157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n19->ReplaceInput(1, n12);
9167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfFalse();
9177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n15 = graph.NewNode(op, nil);
9187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n15);
9197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n15->ReplaceInput(0, n13);
9207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n19->ReplaceInput(2, n15);
9217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(0, n19);
9227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
9237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetStart(n0);
9247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetEnd(n20);
9257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
926fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  ComputeAndVerifySchedule(19, &graph);
9277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
9287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
9297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
9307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(BuildScheduleComplexLoops) {
9317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
9327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Isolate* isolate = scope.main_isolate();
9337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
9347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder common_builder(scope.main_zone());
9357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  JSOperatorBuilder js_builder(scope.main_zone());
9362c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* op;
9377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
9387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Handle<Object> object =
9397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Handle<Object>(isolate->heap()->undefined_value(), isolate);
9401af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org  Unique<Object> unique_constant = Unique<Object>::CreateUninitialized(object);
9417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
9427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Manually transcripted code for:
9437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // function turbo_fan_test(a, b, c) {
9447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   while (a < b) {
9457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     a++;
9467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     while (c < b) {
9477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //       c++;
9487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     }
9497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   }
9507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   while (a < b) {
9517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     a += 2;
9527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   }
9537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   return a;
9547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // }
9553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  op = common_builder.Start(0);
9563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n0 = graph.NewNode(op);
9573e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  USE(n0);
9587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* nil = graph.NewNode(common_builder.Dead());
9597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.End();
9607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n46 = graph.NewNode(op, nil);
9617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n46);
9627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Return();
9637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n45 = graph.NewNode(op, nil, nil, nil);
9647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n45);
96542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
9667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n35 = graph.NewNode(op, nil, nil, nil);
9677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n35);
96842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
9697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n9 = graph.NewNode(op, nil, nil, nil);
9707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n9);
9717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
9723e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n2 = graph.NewNode(op, n0);
9737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n2);
9747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n9->ReplaceInput(0, n2);
97542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
9767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n23 = graph.NewNode(op, nil, nil, nil);
9777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n23);
9787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Add();
9797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n20 = graph.NewNode(op, nil, nil, nil, nil, nil);
9807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n20);
9817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.ToNumber();
9827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n18 = graph.NewNode(op, nil, nil, nil, nil);
9837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n18);
9847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n18->ReplaceInput(0, n9);
9857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.HeapConstant(unique_constant);
9867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n6 = graph.NewNode(op);
9877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n6);
9887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n18->ReplaceInput(1, n6);
9897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.LessThan();
9907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n14 = graph.NewNode(op, nil, nil, nil, nil, nil);
9917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n14);
9927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(0, n9);
99342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
9947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n10 = graph.NewNode(op, nil, nil, nil);
9957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n10);
9967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
9973e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n3 = graph.NewNode(op, n0);
9987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n3);
9997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(0, n3);
100042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
10017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n24 = graph.NewNode(op, nil, nil, nil);
10027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n24);
10037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n24->ReplaceInput(0, n10);
10047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n24->ReplaceInput(1, n24);
10057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Loop(2);
10067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n21 = graph.NewNode(op, nil, nil);
10077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n21);
10087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfTrue();
10097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n16 = graph.NewNode(op, nil);
10107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n16);
10117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Branch();
10127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n15 = graph.NewNode(op, nil, nil);
10137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n15);
10147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n15->ReplaceInput(0, n14);
10157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Loop(2);
10167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n7 = graph.NewNode(op, nil, nil);
10177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n7);
10187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n7->ReplaceInput(0, n0);
10197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfFalse();
10207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n30 = graph.NewNode(op, nil);
10217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n30);
10227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Branch();
10237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n28 = graph.NewNode(op, nil, nil);
10247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n28);
10257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.LessThan();
10267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n27 = graph.NewNode(op, nil, nil, nil, nil, nil);
10277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n27);
102842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
10297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n25 = graph.NewNode(op, nil, nil, nil);
10307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n25);
103142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
10327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n11 = graph.NewNode(op, nil, nil, nil);
10337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n11);
10347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
10353e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n4 = graph.NewNode(op, n0);
10367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n4);
10377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(0, n4);
10387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(1, n25);
10397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(2, n7);
10407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n25->ReplaceInput(0, n11);
10417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Add();
10427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n32 = graph.NewNode(op, nil, nil, nil, nil, nil);
10437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n32);
10447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.ToNumber();
10457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n31 = graph.NewNode(op, nil, nil, nil, nil);
10467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n31);
10477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n31->ReplaceInput(0, n25);
10487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n31->ReplaceInput(1, n6);
10497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n31->ReplaceInput(2, n27);
10507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfTrue();
10517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n29 = graph.NewNode(op, nil);
10527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n29);
10537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n29->ReplaceInput(0, n28);
10547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n31->ReplaceInput(3, n29);
10557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n32->ReplaceInput(0, n31);
10567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.NumberConstant(0);
10577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n19 = graph.NewNode(op);
10587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n19);
10597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n32->ReplaceInput(1, n19);
10607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n32->ReplaceInput(2, n6);
10617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n32->ReplaceInput(3, n31);
10627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n32->ReplaceInput(4, n29);
10637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n25->ReplaceInput(1, n32);
10647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n25->ReplaceInput(2, n21);
10657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n27->ReplaceInput(0, n25);
10667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n27->ReplaceInput(1, n24);
10677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n27->ReplaceInput(2, n6);
106842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
10697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n26 = graph.NewNode(op, nil, nil, nil);
10707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n26);
10717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n26->ReplaceInput(0, n20);
10727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n26->ReplaceInput(1, n32);
10737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n26->ReplaceInput(2, n21);
10747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n27->ReplaceInput(3, n26);
10757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n27->ReplaceInput(4, n21);
10767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n28->ReplaceInput(0, n27);
10777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n28->ReplaceInput(1, n21);
10787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n30->ReplaceInput(0, n28);
10797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n7->ReplaceInput(1, n30);
10807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n15->ReplaceInput(1, n7);
10817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(0, n15);
10827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n21->ReplaceInput(0, n16);
10837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n21->ReplaceInput(1, n29);
10847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n24->ReplaceInput(2, n21);
10857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(1, n24);
10867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(2, n7);
10877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(1, n10);
10887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(2, n6);
108942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
10907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n12 = graph.NewNode(op, nil, nil, nil);
10917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n12);
10927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(0, n0);
10937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(1, n27);
10947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(2, n7);
10957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(3, n12);
10967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(4, n7);
10977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n18->ReplaceInput(2, n14);
10987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n18->ReplaceInput(3, n16);
10997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(0, n18);
11007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(1, n19);
11017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(2, n6);
11027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(3, n18);
11037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(4, n16);
11047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n23->ReplaceInput(0, n20);
11057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n23->ReplaceInput(1, n23);
11067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n23->ReplaceInput(2, n21);
11077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n9->ReplaceInput(1, n23);
11087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n9->ReplaceInput(2, n7);
11097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n35->ReplaceInput(0, n9);
11107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Add();
11117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n44 = graph.NewNode(op, nil, nil, nil, nil, nil);
11127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n44);
11137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n44->ReplaceInput(0, n35);
11147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.NumberConstant(0);
11157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n43 = graph.NewNode(op);
11167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n43);
11177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n44->ReplaceInput(1, n43);
11187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n44->ReplaceInput(2, n6);
11197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.LessThan();
11207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n39 = graph.NewNode(op, nil, nil, nil, nil, nil);
11217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n39);
11227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n39->ReplaceInput(0, n35);
112342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
11247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n36 = graph.NewNode(op, nil, nil, nil);
11257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n36);
11267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n36->ReplaceInput(0, n10);
11277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n36->ReplaceInput(1, n36);
11287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Loop(2);
11297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n33 = graph.NewNode(op, nil, nil);
11307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n33);
11317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfFalse();
11327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n17 = graph.NewNode(op, nil);
11337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n17);
11347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n17->ReplaceInput(0, n15);
11357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n33->ReplaceInput(0, n17);
11367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfTrue();
11377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n41 = graph.NewNode(op, nil);
11387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n41);
11397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Branch();
11407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n40 = graph.NewNode(op, nil, nil);
11417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n40);
11427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n40->ReplaceInput(0, n39);
11437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n40->ReplaceInput(1, n33);
11447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n41->ReplaceInput(0, n40);
11457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n33->ReplaceInput(1, n41);
11467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n36->ReplaceInput(2, n33);
11477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n39->ReplaceInput(1, n36);
11487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n39->ReplaceInput(2, n6);
114942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
11507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n38 = graph.NewNode(op, nil, nil, nil);
11517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n38);
11527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n38->ReplaceInput(0, n14);
11537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n38->ReplaceInput(1, n44);
11547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n38->ReplaceInput(2, n33);
11557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n39->ReplaceInput(3, n38);
11567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n39->ReplaceInput(4, n33);
11577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n44->ReplaceInput(3, n39);
11587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n44->ReplaceInput(4, n41);
11597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n35->ReplaceInput(1, n44);
11607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n35->ReplaceInput(2, n33);
11617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n45->ReplaceInput(0, n35);
11627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n45->ReplaceInput(1, n39);
11637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfFalse();
11647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n42 = graph.NewNode(op, nil);
11657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n42);
11667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n42->ReplaceInput(0, n40);
11677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n45->ReplaceInput(2, n42);
11687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n46->ReplaceInput(0, n45);
11697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetStart(n0);
11717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetEnd(n46);
11727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1173fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  ComputeAndVerifySchedule(46, &graph);
11747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
11757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(BuildScheduleBreakAndContinue) {
11787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
11797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Isolate* isolate = scope.main_isolate();
11807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
11817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder common_builder(scope.main_zone());
11827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  JSOperatorBuilder js_builder(scope.main_zone());
11832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* op;
11847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Handle<Object> object =
11867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Handle<Object>(isolate->heap()->undefined_value(), isolate);
11871af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org  Unique<Object> unique_constant = Unique<Object>::CreateUninitialized(object);
11887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Manually transcripted code for:
11907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // function turbo_fan_test(a, b, c) {
11917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   var d = 0;
11927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   while (a < b) {
11937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     a++;
11947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     while (c < b) {
11957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //       c++;
11967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //       if (d == 0) break;
11977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //       a++;
11987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     }
11997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     if (a == 1) continue;
12007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     d++;
12017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   }
12027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   return a + d;
12037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // }
12043e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  op = common_builder.Start(0);
12053e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n0 = graph.NewNode(op);
12063e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  USE(n0);
12077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* nil = graph.NewNode(common_builder.Dead());
12087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.End();
12097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n58 = graph.NewNode(op, nil);
12107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n58);
12117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Return();
12127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n57 = graph.NewNode(op, nil, nil, nil);
12137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n57);
12147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Add();
12157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n56 = graph.NewNode(op, nil, nil, nil, nil, nil);
12167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n56);
121742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
12187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n10 = graph.NewNode(op, nil, nil, nil);
12197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n10);
12207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
12213e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n2 = graph.NewNode(op, n0);
12227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n2);
12237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(0, n2);
122442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
12257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n25 = graph.NewNode(op, nil, nil, nil);
12267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n25);
12277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Add();
12287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n22 = graph.NewNode(op, nil, nil, nil, nil, nil);
12297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n22);
12307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.ToNumber();
12317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n20 = graph.NewNode(op, nil, nil, nil, nil);
12327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n20);
12337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(0, n10);
12347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.HeapConstant(unique_constant);
12357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n6 = graph.NewNode(op);
12367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n6);
12377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(1, n6);
12387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.LessThan();
12397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n16 = graph.NewNode(op, nil, nil, nil, nil, nil);
12407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n16);
12417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(0, n10);
124242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
12437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n11 = graph.NewNode(op, nil, nil, nil);
12447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n11);
12457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
12463e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n3 = graph.NewNode(op, n0);
12477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n3);
12487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(0, n3);
124942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
12507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n26 = graph.NewNode(op, nil, nil, nil);
12517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n26);
12527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n26->ReplaceInput(0, n11);
12537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n26->ReplaceInput(1, n26);
12547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Loop(2);
12557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n23 = graph.NewNode(op, nil, nil);
12567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n23);
12577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfTrue();
12587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n18 = graph.NewNode(op, nil);
12597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n18);
12607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Branch();
12617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n17 = graph.NewNode(op, nil, nil);
12627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n17);
12637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n17->ReplaceInput(0, n16);
12647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Loop(2);
12657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n8 = graph.NewNode(op, nil, nil);
12667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n8);
12677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n8->ReplaceInput(0, n0);
12687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Merge(2);
12697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n53 = graph.NewNode(op, nil, nil);
12707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n53);
12717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfTrue();
12727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n49 = graph.NewNode(op, nil);
12737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n49);
12747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Branch();
12757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n48 = graph.NewNode(op, nil, nil);
12767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n48);
12777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Equal();
12787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n47 = graph.NewNode(op, nil, nil, nil, nil, nil);
12797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n47);
12807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n47->ReplaceInput(0, n25);
12817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.NumberConstant(0);
12827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n46 = graph.NewNode(op);
12837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n46);
12847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n47->ReplaceInput(1, n46);
12857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n47->ReplaceInput(2, n6);
128642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
12877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n42 = graph.NewNode(op, nil, nil, nil);
12887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n42);
12897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.LessThan();
12907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n30 = graph.NewNode(op, nil, nil, nil, nil, nil);
12917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n30);
129242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
12937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n27 = graph.NewNode(op, nil, nil, nil);
12947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n27);
129542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
12967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n12 = graph.NewNode(op, nil, nil, nil);
12977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n12);
12987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
12993e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n4 = graph.NewNode(op, n0);
13007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n4);
13017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(0, n4);
130242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
13037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n41 = graph.NewNode(op, nil, nil, nil);
13047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n41);
13057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n41->ReplaceInput(0, n27);
13067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Add();
13077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n35 = graph.NewNode(op, nil, nil, nil, nil, nil);
13087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n35);
13097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.ToNumber();
13107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n34 = graph.NewNode(op, nil, nil, nil, nil);
13117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n34);
13127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n34->ReplaceInput(0, n27);
13137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n34->ReplaceInput(1, n6);
13147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n34->ReplaceInput(2, n30);
13157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfTrue();
13167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n32 = graph.NewNode(op, nil);
13177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n32);
13187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Branch();
13197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n31 = graph.NewNode(op, nil, nil);
13207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n31);
13217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n31->ReplaceInput(0, n30);
13227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n31->ReplaceInput(1, n23);
13237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n32->ReplaceInput(0, n31);
13247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n34->ReplaceInput(3, n32);
13257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n35->ReplaceInput(0, n34);
13267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.NumberConstant(0);
13277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n21 = graph.NewNode(op);
13287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n21);
13297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n35->ReplaceInput(1, n21);
13307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n35->ReplaceInput(2, n6);
13317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n35->ReplaceInput(3, n34);
13327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n35->ReplaceInput(4, n32);
13337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n41->ReplaceInput(1, n35);
13347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Merge(2);
13357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n40 = graph.NewNode(op, nil, nil);
13367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n40);
13377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfFalse();
13387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n33 = graph.NewNode(op, nil);
13397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n33);
13407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n33->ReplaceInput(0, n31);
13417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n40->ReplaceInput(0, n33);
13427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfTrue();
13437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n39 = graph.NewNode(op, nil);
13447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n39);
13457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Branch();
13467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n38 = graph.NewNode(op, nil, nil);
13477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n38);
13487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Equal();
13497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n37 = graph.NewNode(op, nil, nil, nil, nil, nil);
13507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n37);
135142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
13527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n28 = graph.NewNode(op, nil, nil, nil);
13537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n28);
135442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
13557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n13 = graph.NewNode(op, nil, nil, nil);
13567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n13);
13577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.NumberConstant(0);
13587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n7 = graph.NewNode(op);
13597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n7);
13607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n13->ReplaceInput(0, n7);
136142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
13627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n54 = graph.NewNode(op, nil, nil, nil);
13637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n54);
13647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n54->ReplaceInput(0, n28);
13657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Add();
13667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n52 = graph.NewNode(op, nil, nil, nil, nil, nil);
13677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n52);
13687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.ToNumber();
13697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n51 = graph.NewNode(op, nil, nil, nil, nil);
13707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n51);
13717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n51->ReplaceInput(0, n28);
13727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n51->ReplaceInput(1, n6);
13737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n51->ReplaceInput(2, n47);
13747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfFalse();
13757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n50 = graph.NewNode(op, nil);
13767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n50);
13777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n50->ReplaceInput(0, n48);
13787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n51->ReplaceInput(3, n50);
13797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n52->ReplaceInput(0, n51);
13807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n52->ReplaceInput(1, n21);
13817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n52->ReplaceInput(2, n6);
13827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n52->ReplaceInput(3, n51);
13837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n52->ReplaceInput(4, n50);
13847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n54->ReplaceInput(1, n52);
13857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n54->ReplaceInput(2, n53);
13867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n13->ReplaceInput(1, n54);
13877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n13->ReplaceInput(2, n8);
13887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n28->ReplaceInput(0, n13);
13897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n28->ReplaceInput(1, n28);
13907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n28->ReplaceInput(2, n23);
13917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n37->ReplaceInput(0, n28);
13927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.NumberConstant(0);
13937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n36 = graph.NewNode(op);
13947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n36);
13957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n37->ReplaceInput(1, n36);
13967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n37->ReplaceInput(2, n6);
13977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n37->ReplaceInput(3, n35);
13987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n37->ReplaceInput(4, n32);
13997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n38->ReplaceInput(0, n37);
14007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n38->ReplaceInput(1, n32);
14017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n39->ReplaceInput(0, n38);
14027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n40->ReplaceInput(1, n39);
14037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n41->ReplaceInput(2, n40);
14047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(1, n41);
14057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(2, n8);
14067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n27->ReplaceInput(0, n12);
14077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n27->ReplaceInput(1, n35);
14087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n27->ReplaceInput(2, n23);
14097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n30->ReplaceInput(0, n27);
14107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n30->ReplaceInput(1, n26);
14117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n30->ReplaceInput(2, n6);
141242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
14137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n29 = graph.NewNode(op, nil, nil, nil);
14147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n29);
14157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n29->ReplaceInput(0, n22);
14167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Add();
14177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n45 = graph.NewNode(op, nil, nil, nil, nil, nil);
14187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n45);
14197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.ToNumber();
14207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n44 = graph.NewNode(op, nil, nil, nil, nil);
14217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n44);
14227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n44->ReplaceInput(0, n25);
14237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n44->ReplaceInput(1, n6);
14247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n44->ReplaceInput(2, n37);
14257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfFalse();
14267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n43 = graph.NewNode(op, nil);
14277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n43);
14287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n43->ReplaceInput(0, n38);
14297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n44->ReplaceInput(3, n43);
14307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n45->ReplaceInput(0, n44);
14317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n45->ReplaceInput(1, n21);
14327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n45->ReplaceInput(2, n6);
14337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n45->ReplaceInput(3, n44);
14347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n45->ReplaceInput(4, n43);
14357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n29->ReplaceInput(1, n45);
14367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n29->ReplaceInput(2, n23);
14377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n30->ReplaceInput(3, n29);
14387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n30->ReplaceInput(4, n23);
14397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n42->ReplaceInput(0, n30);
14407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n42->ReplaceInput(1, n37);
14417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n42->ReplaceInput(2, n40);
14427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n47->ReplaceInput(3, n42);
14437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n47->ReplaceInput(4, n40);
14447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n48->ReplaceInput(0, n47);
14457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n48->ReplaceInput(1, n40);
14467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n49->ReplaceInput(0, n48);
14477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n53->ReplaceInput(0, n49);
14487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n53->ReplaceInput(1, n50);
14497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n8->ReplaceInput(1, n53);
14507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n17->ReplaceInput(1, n8);
14517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n18->ReplaceInput(0, n17);
14527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n23->ReplaceInput(0, n18);
14537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n23->ReplaceInput(1, n43);
14547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n26->ReplaceInput(2, n23);
14557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(1, n26);
14567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(2, n8);
14577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(1, n11);
14587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(2, n6);
145942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
14607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n14 = graph.NewNode(op, nil, nil, nil);
14617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n14);
14627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(0, n0);
146342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
14647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n55 = graph.NewNode(op, nil, nil, nil);
14657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n55);
14667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n55->ReplaceInput(0, n47);
14677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n55->ReplaceInput(1, n52);
14687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n55->ReplaceInput(2, n53);
14697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(1, n55);
14707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(2, n8);
14717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(3, n14);
14727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(4, n8);
14737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(2, n16);
14747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(3, n18);
14757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n22->ReplaceInput(0, n20);
14767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n22->ReplaceInput(1, n21);
14777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n22->ReplaceInput(2, n6);
14787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n22->ReplaceInput(3, n20);
14797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n22->ReplaceInput(4, n18);
14807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n25->ReplaceInput(0, n22);
14817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n25->ReplaceInput(1, n45);
14827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n25->ReplaceInput(2, n23);
14837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(1, n25);
14847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(2, n8);
14857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n56->ReplaceInput(0, n10);
14867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n56->ReplaceInput(1, n13);
14877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n56->ReplaceInput(2, n6);
14887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n56->ReplaceInput(3, n16);
14897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfFalse();
14907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n19 = graph.NewNode(op, nil);
14917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n19);
14927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n19->ReplaceInput(0, n17);
14937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n56->ReplaceInput(4, n19);
14947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n57->ReplaceInput(0, n56);
14957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n57->ReplaceInput(1, n56);
14967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n57->ReplaceInput(2, n19);
14977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n58->ReplaceInput(0, n57);
14987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
14997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetStart(n0);
15007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetEnd(n58);
15017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1502fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  ComputeAndVerifySchedule(62, &graph);
15037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
15047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(BuildScheduleSimpleLoopWithCodeMotion) {
15077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  HandleAndZoneScope scope;
15087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Isolate* isolate = scope.main_isolate();
15097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph(scope.main_zone());
15107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder common_builder(scope.main_zone());
15117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  JSOperatorBuilder js_builder(scope.main_zone());
15126313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  MachineOperatorBuilder machine_builder;
15132c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* op;
15147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Handle<Object> object =
15167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Handle<Object>(isolate->heap()->undefined_value(), isolate);
15171af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org  Unique<Object> unique_constant = Unique<Object>::CreateUninitialized(object);
15187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Manually transcripted code for:
15207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // function turbo_fan_test(a, b, c) {
15217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   while (a < b) {
15227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //     a += b + c;
15237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   }
15247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  //   return a;
15257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // }
15263e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  op = common_builder.Start(0);
15273e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n0 = graph.NewNode(op);
15283e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  USE(n0);
15297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* nil = graph.NewNode(common_builder.Dead());
15307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.End();
15317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n22 = graph.NewNode(op, nil);
15327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n22);
15337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Return();
15347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n21 = graph.NewNode(op, nil, nil, nil);
15357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n21);
153642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
15377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n9 = graph.NewNode(op, nil, nil, nil);
15387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n9);
15397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
15403e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n2 = graph.NewNode(op, n0);
15417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n2);
15427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n9->ReplaceInput(0, n2);
15437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.Add();
15447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n20 = graph.NewNode(op, nil, nil, nil, nil, nil);
15457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n20);
15467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(0, n9);
15477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = machine_builder.Int32Add();
15487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n19 = graph.NewNode(op, nil, nil);
15497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n19);
155042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
15517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n10 = graph.NewNode(op, nil, nil, nil);
15527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n10);
15537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
15543e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n3 = graph.NewNode(op, n0);
15557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n3);
15567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(0, n3);
15577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(1, n10);
15587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Loop(2);
15597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n7 = graph.NewNode(op, nil, nil);
15607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n7);
15617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n7->ReplaceInput(0, n0);
15627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfTrue();
15637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n17 = graph.NewNode(op, nil);
15647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n17);
15657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Branch();
15667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n16 = graph.NewNode(op, nil, nil);
15677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n16);
15687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.ToBoolean();
15697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n15 = graph.NewNode(op, nil, nil, nil, nil);
15707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n15);
15717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = js_builder.LessThan();
15727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n14 = graph.NewNode(op, nil, nil, nil, nil, nil);
15737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n14);
15747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(0, n9);
15757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(1, n10);
15767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.HeapConstant(unique_constant);
15777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n6 = graph.NewNode(op);
15787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n6);
15797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(2, n6);
158042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
15817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n12 = graph.NewNode(op, nil, nil, nil);
15827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n12);
15837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(0, n0);
15847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(1, n20);
15857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n12->ReplaceInput(2, n7);
15867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(3, n12);
15877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n14->ReplaceInput(4, n7);
15887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n15->ReplaceInput(0, n14);
15897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n15->ReplaceInput(1, n6);
15907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n15->ReplaceInput(2, n14);
15917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n15->ReplaceInput(3, n7);
15927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(0, n15);
15937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n16->ReplaceInput(1, n7);
15947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n17->ReplaceInput(0, n16);
15957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n7->ReplaceInput(1, n17);
15967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n10->ReplaceInput(2, n7);
15977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n19->ReplaceInput(0, n2);
159842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  op = common_builder.Phi(kMachAnyTagged, 2);
15997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n11 = graph.NewNode(op, nil, nil, nil);
16007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n11);
16017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.Parameter(0);
16023e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Node* n4 = graph.NewNode(op, n0);
16037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n4);
16047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(0, n4);
16057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(1, n11);
16067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n11->ReplaceInput(2, n7);
16077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n19->ReplaceInput(1, n3);
16087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(1, n19);
16097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(2, n6);
16107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(3, n19);
16117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n20->ReplaceInput(4, n17);
16127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n9->ReplaceInput(1, n20);
16137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n9->ReplaceInput(2, n7);
16147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n21->ReplaceInput(0, n9);
16157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n21->ReplaceInput(1, n15);
16167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  op = common_builder.IfFalse();
16177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* n18 = graph.NewNode(op, nil);
16187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  USE(n18);
16197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n18->ReplaceInput(0, n16);
16207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n21->ReplaceInput(2, n18);
16217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  n22->ReplaceInput(0, n21);
16227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
16237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetStart(n0);
16247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph.SetEnd(n22);
16257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1626fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Schedule* schedule = ComputeAndVerifySchedule(19, &graph);
16277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Make sure the integer-only add gets hoisted to a different block that the
16287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // JSAdd.
16297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK(schedule->block(n19) != schedule->block(n20));
16307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
16317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
16327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
16337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#if V8_TURBOFAN_TARGET
16347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1635fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.orgstatic Node* CreateDiamond(Graph* graph, CommonOperatorBuilder* common,
1636fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org                           Node* cond) {
1637fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* tv = graph->NewNode(common->Int32Constant(6));
1638fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* fv = graph->NewNode(common->Int32Constant(7));
1639fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* br = graph->NewNode(common->Branch(), cond, graph->start());
1640fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* t = graph->NewNode(common->IfTrue(), br);
1641fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* f = graph->NewNode(common->IfFalse(), br);
1642fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* m = graph->NewNode(common->Merge(2), t, f);
164342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  Node* phi = graph->NewNode(common->Phi(kMachAnyTagged, 2), tv, fv, m);
1644fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  return phi;
1645fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org}
1646fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1647fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1648fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.orgTEST(FloatingDiamond1) {
1649fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  HandleAndZoneScope scope;
1650fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Graph graph(scope.main_zone());
1651fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  CommonOperatorBuilder common(scope.main_zone());
1652fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1653fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* start = graph.NewNode(common.Start(1));
1654fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  graph.SetStart(start);
1655fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1656fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* p0 = graph.NewNode(common.Parameter(0), start);
1657fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* d1 = CreateDiamond(&graph, &common, p0);
1658fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* ret = graph.NewNode(common.Return(), d1, start, start);
1659fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* end = graph.NewNode(common.End(), ret, start);
1660fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1661fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  graph.SetEnd(end);
1662fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1663fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  ComputeAndVerifySchedule(13, &graph);
1664fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org}
1665fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1666fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1667fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.orgTEST(FloatingDiamond2) {
1668fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  HandleAndZoneScope scope;
1669fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Graph graph(scope.main_zone());
1670fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  CommonOperatorBuilder common(scope.main_zone());
16716313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  MachineOperatorBuilder machine;
1672fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1673fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* start = graph.NewNode(common.Start(2));
1674fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  graph.SetStart(start);
1675fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1676fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* p0 = graph.NewNode(common.Parameter(0), start);
1677fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* p1 = graph.NewNode(common.Parameter(1), start);
1678fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* d1 = CreateDiamond(&graph, &common, p0);
1679fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* d2 = CreateDiamond(&graph, &common, p1);
1680fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* add = graph.NewNode(machine.Int32Add(), d1, d2);
1681fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* ret = graph.NewNode(common.Return(), add, start, start);
1682fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* end = graph.NewNode(common.End(), ret, start);
1683fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1684fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  graph.SetEnd(end);
1685fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1686fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  ComputeAndVerifySchedule(24, &graph);
1687fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org}
1688fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1689fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1690fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.orgTEST(FloatingDiamond3) {
1691fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  HandleAndZoneScope scope;
1692fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Graph graph(scope.main_zone());
1693fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  CommonOperatorBuilder common(scope.main_zone());
16946313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  MachineOperatorBuilder machine;
1695fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1696fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* start = graph.NewNode(common.Start(2));
1697fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  graph.SetStart(start);
1698fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1699fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* p0 = graph.NewNode(common.Parameter(0), start);
1700fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* p1 = graph.NewNode(common.Parameter(1), start);
1701fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* d1 = CreateDiamond(&graph, &common, p0);
1702fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* d2 = CreateDiamond(&graph, &common, p1);
1703fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* add = graph.NewNode(machine.Int32Add(), d1, d2);
1704fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* d3 = CreateDiamond(&graph, &common, add);
1705fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* ret = graph.NewNode(common.Return(), d3, start, start);
1706fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* end = graph.NewNode(common.End(), ret, start);
1707fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1708fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  graph.SetEnd(end);
1709fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1710fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  ComputeAndVerifySchedule(33, &graph);
1711fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org}
1712fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
17137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
1714