1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/cctest.h"
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/common-operator.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/generic-node-inl.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/generic-node.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/graph.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/graph-visualizer.h"
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/js-operator.h"
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/machine-operator.h"
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/node.h"
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/operator.h"
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/schedule.h"
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/scheduler.h"
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/verifier.h"
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::internal;
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::internal::compiler;
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TODO(titzer): pull RPO tests out to their own file.
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct TestLoop {
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int count;
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock** nodes;
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* header() { return nodes[0]; }
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* last() { return nodes[count - 1]; }
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ~TestLoop() { delete[] nodes; }
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic TestLoop* CreateLoop(Schedule* schedule, int count) {
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestLoop* loop = new TestLoop();
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  loop->count = count;
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  loop->nodes = new BasicBlock* [count];
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < count; i++) {
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    loop->nodes[i] = schedule->NewBasicBlock();
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i > 0) schedule->AddSuccessor(loop->nodes[i - 1], loop->nodes[i]);
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule->AddSuccessor(loop->nodes[count - 1], loop->nodes[0]);
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return loop;
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void CheckRPONumbers(BasicBlockVector* order, int expected,
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            bool loops_allowed) {
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(expected, static_cast<int>(order->size()));
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < static_cast<int>(order->size()); i++) {
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(order->at(i)->rpo_number_ == i);
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!loops_allowed) CHECK_LT(order->at(i)->loop_end_, 0);
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void CheckLoopContains(BasicBlock** blocks, int body_size) {
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* header = blocks[0];
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_GT(header->loop_end_, 0);
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(body_size, (header->loop_end_ - header->rpo_number_));
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < body_size; i++) {
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int num = blocks[i]->rpo_number_;
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(num >= header->rpo_number_ && num < header->loop_end_);
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(header->LoopContains(blocks[i]));
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(header->IsLoopHeader() || blocks[i]->loop_header_ == header);
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic int GetScheduledNodeCount(Schedule* schedule) {
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int node_count = 0;
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (BasicBlockVectorIter i = schedule->rpo_order()->begin();
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       i != schedule->rpo_order()->end(); ++i) {
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* block = *i;
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (BasicBlock::const_iterator j = block->begin(); j != block->end();
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         ++j) {
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ++node_count;
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock::Control control = block->control_;
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (control != BasicBlock::kNone) {
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ++node_count;
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return node_count;
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic Schedule* ComputeAndVerifySchedule(int expected, Graph* graph) {
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_trace_turbo) {
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    OFStream os(stdout);
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os << AsDOT(*graph);
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule* schedule = Scheduler::ComputeSchedule(graph);
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_trace_turbo_scheduler) {
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    OFStream os(stdout);
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os << *schedule << endl;
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ScheduleVerifier::Run(schedule);
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(expected, GetScheduledNodeCount(schedule));
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return schedule;
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPODegenerate1) {
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckRPONumbers(order, 1, false);
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(schedule.start(), order->at(0));
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPODegenerate2) {
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddGoto(schedule.start(), schedule.end());
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckRPONumbers(order, 2, false);
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(schedule.start(), order->at(0));
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(schedule.end(), order->at(1));
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLine) {
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < 10; i++) {
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Schedule schedule(scope.main_zone());
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* last = schedule.start();
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int j = 0; j < i; j++) {
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlock* block = schedule.NewBasicBlock();
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddGoto(last, block);
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      last = block;
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CheckRPONumbers(order, 1 + i, false);
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Schedule::BasicBlocks blocks(schedule.all_blocks());
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (Schedule::BasicBlocks::iterator iter = blocks.begin();
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         iter != blocks.end(); ++iter) {
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlock* block = *iter;
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (block->rpo_number_ >= 0 && block->SuccessorCount() == 1) {
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK(block->rpo_number_ + 1 == block->SuccessorAt(0)->rpo_number_);
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOSelfLoop) {
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(schedule.start(), schedule.start());
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckRPONumbers(order, 1, true);
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* loop[] = {schedule.start()};
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop, 1);
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOEntryLoop) {
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(schedule.start(), schedule.end());
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(schedule.end(), schedule.start());
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckRPONumbers(order, 2, true);
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* loop[] = {schedule.start(), schedule.end()};
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop, 2);
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOEndLoop) {
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 2));
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(schedule.start(), loop1->header());
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckRPONumbers(order, 3, true);
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop1->nodes, loop1->count);
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOEndLoopNested) {
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 2));
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(schedule.start(), loop1->header());
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(loop1->last(), schedule.start());
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckRPONumbers(order, 3, true);
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop1->nodes, loop1->count);
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPODiamond) {
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* A = schedule.start();
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* B = schedule.NewBasicBlock();
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* C = schedule.NewBasicBlock();
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* D = schedule.end();
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(A, B);
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(A, C);
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(B, D);
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(C, D);
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckRPONumbers(order, 4, false);
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, A->rpo_number_);
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK((B->rpo_number_ == 1 && C->rpo_number_ == 2) ||
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (B->rpo_number_ == 2 && C->rpo_number_ == 1));
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(3, D->rpo_number_);
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoop1) {
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* A = schedule.start();
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* B = schedule.NewBasicBlock();
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* C = schedule.NewBasicBlock();
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* D = schedule.end();
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(A, B);
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(B, C);
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(C, B);
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(C, D);
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckRPONumbers(order, 4, true);
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* loop[] = {B, C};
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop, 2);
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoop2) {
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* A = schedule.start();
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* B = schedule.NewBasicBlock();
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* C = schedule.NewBasicBlock();
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* D = schedule.end();
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(A, B);
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(B, C);
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(C, B);
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(B, D);
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckRPONumbers(order, 4, true);
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* loop[] = {B, C};
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop, 2);
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoopN) {
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < 11; i++) {
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Schedule schedule(scope.main_zone());
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* A = schedule.start();
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* B = schedule.NewBasicBlock();
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* C = schedule.NewBasicBlock();
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* D = schedule.NewBasicBlock();
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* E = schedule.NewBasicBlock();
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* F = schedule.NewBasicBlock();
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* G = schedule.end();
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    schedule.AddSuccessor(A, B);
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    schedule.AddSuccessor(B, C);
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    schedule.AddSuccessor(C, D);
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    schedule.AddSuccessor(D, E);
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    schedule.AddSuccessor(E, F);
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    schedule.AddSuccessor(F, B);
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    schedule.AddSuccessor(B, G);
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Throw in extra backedges from time to time.
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i == 1) schedule.AddSuccessor(B, B);
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i == 2) schedule.AddSuccessor(C, B);
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i == 3) schedule.AddSuccessor(D, B);
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i == 4) schedule.AddSuccessor(E, B);
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i == 5) schedule.AddSuccessor(F, B);
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Throw in extra loop exits from time to time.
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i == 6) schedule.AddSuccessor(B, G);
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i == 7) schedule.AddSuccessor(C, G);
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i == 8) schedule.AddSuccessor(D, G);
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i == 9) schedule.AddSuccessor(E, G);
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i == 10) schedule.AddSuccessor(F, G);
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CheckRPONumbers(order, 7, true);
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* loop[] = {B, C, D, E, F};
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CheckLoopContains(loop, 5);
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoopNest1) {
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* A = schedule.start();
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* B = schedule.NewBasicBlock();
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* C = schedule.NewBasicBlock();
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* D = schedule.NewBasicBlock();
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* E = schedule.NewBasicBlock();
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* F = schedule.end();
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(A, B);
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(B, C);
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(C, D);
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(D, C);
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(D, E);
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(E, B);
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(E, F);
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckRPONumbers(order, 6, true);
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* loop1[] = {B, C, D, E};
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop1, 4);
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* loop2[] = {C, D};
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop2, 2);
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoopNest2) {
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* A = schedule.start();
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* B = schedule.NewBasicBlock();
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* C = schedule.NewBasicBlock();
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* D = schedule.NewBasicBlock();
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* E = schedule.NewBasicBlock();
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* F = schedule.NewBasicBlock();
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* G = schedule.NewBasicBlock();
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* H = schedule.end();
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(A, B);
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(B, C);
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(C, D);
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(D, E);
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(E, F);
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(F, G);
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(G, H);
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(E, D);
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(F, C);
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(G, B);
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckRPONumbers(order, 8, true);
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* loop1[] = {B, C, D, E, F, G};
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop1, 6);
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* loop2[] = {C, D, E, F};
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop2, 4);
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* loop3[] = {D, E};
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop3, 2);
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoopFollow1) {
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1));
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1));
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* A = schedule.start();
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* E = schedule.end();
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(A, loop1->header());
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(loop1->header(), loop2->header());
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(loop2->last(), E);
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop1->nodes, loop1->count);
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size()));
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop1->nodes, loop1->count);
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop2->nodes, loop2->count);
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoopFollow2) {
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1));
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1));
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* A = schedule.start();
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* S = schedule.NewBasicBlock();
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* E = schedule.end();
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(A, loop1->header());
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(loop1->header(), S);
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(S, loop2->header());
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(loop2->last(), E);
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop1->nodes, loop1->count);
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size()));
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop1->nodes, loop1->count);
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop2->nodes, loop2->count);
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoopFollowN) {
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int size = 1; size < 5; size++) {
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int exit = 0; exit < size; exit++) {
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Schedule schedule(scope.main_zone());
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size));
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SmartPointer<TestLoop> loop2(CreateLoop(&schedule, size));
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlock* A = schedule.start();
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlock* E = schedule.end();
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(A, loop1->header());
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(loop1->nodes[exit], loop2->header());
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(loop2->nodes[exit], E);
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CheckLoopContains(loop1->nodes, loop1->count);
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size()));
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CheckLoopContains(loop1->nodes, loop1->count);
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CheckLoopContains(loop2->nodes, loop2->count);
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPONestedLoopFollow1) {
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SmartPointer<TestLoop> loop1(CreateLoop(&schedule, 1));
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SmartPointer<TestLoop> loop2(CreateLoop(&schedule, 1));
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* A = schedule.start();
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* B = schedule.NewBasicBlock();
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* C = schedule.NewBasicBlock();
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* E = schedule.end();
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(A, B);
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(B, loop1->header());
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(loop1->header(), loop2->header());
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(loop2->last(), C);
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(C, E);
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(C, B);
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop1->nodes, loop1->count);
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(schedule.BasicBlockCount(), static_cast<int>(order->size()));
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop1->nodes, loop1->count);
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop2->nodes, loop2->count);
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* loop3[] = {B, loop1->nodes[0], loop2->nodes[0], C};
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop3, 4);
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoopBackedges1) {
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int size = 8;
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < size; i++) {
489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int j = 0; j < size; j++) {
490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Schedule schedule(scope.main_zone());
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlock* A = schedule.start();
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlock* E = schedule.end();
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size));
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(A, loop1->header());
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(loop1->last(), E);
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(loop1->nodes[i], loop1->header());
499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(loop1->nodes[j], E);
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CheckRPONumbers(order, schedule.BasicBlockCount(), true);
503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CheckLoopContains(loop1->nodes, loop1->count);
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoopOutedges1) {
510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int size = 8;
513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < size; i++) {
514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int j = 0; j < size; j++) {
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Schedule schedule(scope.main_zone());
516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlock* A = schedule.start();
517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlock* D = schedule.NewBasicBlock();
518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlock* E = schedule.end();
519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size));
521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(A, loop1->header());
522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(loop1->last(), E);
523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(loop1->nodes[i], loop1->header());
525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(loop1->nodes[j], D);
526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(D, E);
527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CheckRPONumbers(order, schedule.BasicBlockCount(), true);
530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CheckLoopContains(loop1->nodes, loop1->count);
531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoopOutedges2) {
537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int size = 8;
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < size; i++) {
541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Schedule schedule(scope.main_zone());
542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* A = schedule.start();
543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* E = schedule.end();
544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size));
546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    schedule.AddSuccessor(A, loop1->header());
547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    schedule.AddSuccessor(loop1->last(), E);
548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int j = 0; j < size; j++) {
550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlock* O = schedule.NewBasicBlock();
551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(loop1->nodes[j], O);
552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(O, E);
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CheckRPONumbers(order, schedule.BasicBlockCount(), true);
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CheckLoopContains(loop1->nodes, loop1->count);
558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoopOutloops1) {
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int size = 8;
566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < size; i++) {
567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Schedule schedule(scope.main_zone());
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* A = schedule.start();
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlock* E = schedule.end();
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SmartPointer<TestLoop> loop1(CreateLoop(&schedule, size));
571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    schedule.AddSuccessor(A, loop1->header());
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    schedule.AddSuccessor(loop1->last(), E);
573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestLoop** loopN = new TestLoop* [size];
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int j = 0; j < size; j++) {
576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      loopN[j] = CreateLoop(&schedule, 2);
577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(loop1->nodes[j], loopN[j]->header());
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      schedule.AddSuccessor(loopN[j]->last(), E);
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CheckRPONumbers(order, schedule.BasicBlockCount(), true);
583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CheckLoopContains(loop1->nodes, loop1->count);
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int j = 0; j < size; j++) {
586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CheckLoopContains(loopN[j]->nodes, loopN[j]->count);
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      delete loopN[j];
588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    delete[] loopN;
590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RPOLoopMultibackedge) {
595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule schedule(scope.main_zone());
597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* A = schedule.start();
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* B = schedule.NewBasicBlock();
600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* C = schedule.NewBasicBlock();
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* D = schedule.end();
602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* E = schedule.NewBasicBlock();
603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(A, B);
605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(B, C);
606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(B, D);
607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(B, E);
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(C, B);
609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(D, B);
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  schedule.AddSuccessor(E, B);
611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&schedule);
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckRPONumbers(order, 5, true);
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlock* loop1[] = {B, C, D, E};
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckLoopContains(loop1, 4);
617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BuildScheduleEmpty) {
621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Graph graph(scope.main_zone());
623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CommonOperatorBuilder builder(scope.main_zone());
624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetStart(graph.NewNode(builder.Start(0)));
625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetEnd(graph.NewNode(builder.End(), graph.start()));
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(Scheduler::ComputeSchedule(&graph));
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BuildScheduleOneParameter) {
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Graph graph(scope.main_zone());
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CommonOperatorBuilder builder(scope.main_zone());
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetStart(graph.NewNode(builder.Start(0)));
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p1 = graph.NewNode(builder.Parameter(0), graph.start());
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ret = graph.NewNode(builder.Return(), p1, graph.start(), graph.start());
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetEnd(graph.NewNode(builder.End(), ret));
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(Scheduler::ComputeSchedule(&graph));
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BuildScheduleIfSplit) {
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Graph graph(scope.main_zone());
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CommonOperatorBuilder builder(scope.main_zone());
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSOperatorBuilder js_builder(scope.main_zone());
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetStart(graph.NewNode(builder.Start(3)));
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p1 = graph.NewNode(builder.Parameter(0), graph.start());
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p2 = graph.NewNode(builder.Parameter(1), graph.start());
655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p3 = graph.NewNode(builder.Parameter(2), graph.start());
656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p4 = graph.NewNode(builder.Parameter(3), graph.start());
657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p5 = graph.NewNode(builder.Parameter(4), graph.start());
658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* cmp = graph.NewNode(js_builder.LessThanOrEqual(), p1, p2, p3,
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            graph.start(), graph.start());
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* branch = graph.NewNode(builder.Branch(), cmp, graph.start());
661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* true_branch = graph.NewNode(builder.IfTrue(), branch);
662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* false_branch = graph.NewNode(builder.IfFalse(), branch);
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ret1 = graph.NewNode(builder.Return(), p4, graph.start(), true_branch);
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ret2 = graph.NewNode(builder.Return(), p5, graph.start(), false_branch);
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* merge = graph.NewNode(builder.Merge(2), ret1, ret2);
667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetEnd(graph.NewNode(builder.End(), merge));
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ComputeAndVerifySchedule(13, &graph);
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BuildScheduleIfSplitWithEffects) {
674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = scope.main_isolate();
676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Graph graph(scope.main_zone());
677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CommonOperatorBuilder common_builder(scope.main_zone());
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSOperatorBuilder js_builder(scope.main_zone());
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op;
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> object =
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<Object>(isolate->heap()->undefined_value(), isolate);
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Object> unique_constant = Unique<Object>::CreateUninitialized(object);
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Manually transcripted code for:
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // function turbo_fan_test(a, b, c, y) {
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   if (a < b) {
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     return a + b - c * c - a + y;
689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   } else {
690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     return c * c - a;
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   }
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // }
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Start(0);
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(op);
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n0);
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* nil = graph.NewNode(common_builder.Dead());
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.End();
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n23 = graph.NewNode(op, nil);
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n23);
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Merge(2);
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n22 = graph.NewNode(op, nil, nil);
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n22);
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Return();
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n16 = graph.NewNode(op, nil, nil, nil);
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n16);
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Add();
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n15 = graph.NewNode(op, nil, nil, nil, nil, nil);
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n15);
709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Subtract();
710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n14 = graph.NewNode(op, nil, nil, nil, nil, nil);
711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n14);
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Subtract();
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n13 = graph.NewNode(op, nil, nil, nil, nil, nil);
714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n13);
715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Add();
716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n11 = graph.NewNode(op, nil, nil, nil, nil, nil);
717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n11);
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(op, n0);
720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n2);
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(0, n2);
722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(op, n0);
724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n3);
725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(1, n3);
726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.HeapConstant(unique_constant);
727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n7 = graph.NewNode(op);
728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n7);
729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(2, n7);
730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.LessThan();
731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n8 = graph.NewNode(op, nil, nil, nil, nil, nil);
732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n8);
733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n8->ReplaceInput(0, n2);
734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n8->ReplaceInput(1, n3);
735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n8->ReplaceInput(2, n7);
736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n8->ReplaceInput(3, n0);
737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n8->ReplaceInput(4, n0);
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(3, n8);
739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfTrue();
740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n10 = graph.NewNode(op, nil);
741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n10);
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Branch();
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n9 = graph.NewNode(op, nil, nil);
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n9);
745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n9->ReplaceInput(0, n8);
746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n9->ReplaceInput(1, n0);
747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(0, n9);
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(4, n10);
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n13->ReplaceInput(0, n11);
750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Multiply();
751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n12 = graph.NewNode(op, nil, nil, nil, nil, nil);
752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n12);
753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n4 = graph.NewNode(op, n0);
755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n4);
756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(0, n4);
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(1, n4);
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(2, n7);
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(3, n11);
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(4, n10);
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n13->ReplaceInput(1, n12);
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n13->ReplaceInput(2, n7);
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n13->ReplaceInput(3, n12);
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n13->ReplaceInput(4, n10);
765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(0, n13);
766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(1, n2);
767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(2, n7);
768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(3, n13);
769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(4, n10);
770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n15->ReplaceInput(0, n14);
771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n5 = graph.NewNode(op, n0);
773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n5);
774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n15->ReplaceInput(1, n5);
775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n15->ReplaceInput(2, n7);
776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n15->ReplaceInput(3, n14);
777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n15->ReplaceInput(4, n10);
778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(0, n15);
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(1, n15);
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(2, n10);
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n22->ReplaceInput(0, n16);
782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Return();
783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n21 = graph.NewNode(op, nil, nil, nil);
784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n21);
785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Subtract();
786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n20 = graph.NewNode(op, nil, nil, nil, nil, nil);
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n20);
788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Multiply();
789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n19 = graph.NewNode(op, nil, nil, nil, nil, nil);
790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n19);
791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n19->ReplaceInput(0, n4);
792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n19->ReplaceInput(1, n4);
793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n19->ReplaceInput(2, n7);
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n19->ReplaceInput(3, n8);
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfFalse();
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n18 = graph.NewNode(op, nil);
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n18);
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n18->ReplaceInput(0, n9);
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n19->ReplaceInput(4, n18);
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(0, n19);
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(1, n2);
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(2, n7);
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(3, n19);
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(4, n18);
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n21->ReplaceInput(0, n20);
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n21->ReplaceInput(1, n20);
807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n21->ReplaceInput(2, n18);
808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n22->ReplaceInput(1, n21);
809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n23->ReplaceInput(0, n22);
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetStart(n0);
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetEnd(n23);
813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ComputeAndVerifySchedule(20, &graph);
815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BuildScheduleSimpleLoop) {
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = scope.main_isolate();
821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Graph graph(scope.main_zone());
822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CommonOperatorBuilder common_builder(scope.main_zone());
823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSOperatorBuilder js_builder(scope.main_zone());
824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op;
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> object =
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<Object>(isolate->heap()->undefined_value(), isolate);
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Object> unique_constant = Unique<Object>::CreateUninitialized(object);
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Manually transcripted code for:
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // function turbo_fan_test(a, b) {
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   while (a < b) {
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     a++;
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   }
835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   return a;
836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // }
837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Start(0);
838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(op);
839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n0);
840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* nil = graph.NewNode(common_builder.Dead());
841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.End();
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n20 = graph.NewNode(op, nil);
843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n20);
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Return();
845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n19 = graph.NewNode(op, nil, nil, nil);
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n19);
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n8 = graph.NewNode(op, nil, nil, nil);
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n8);
850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(op, n0);
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n2);
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n8->ReplaceInput(0, n2);
854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Add();
855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n18 = graph.NewNode(op, nil, nil, nil, nil, nil);
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n18);
857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.ToNumber();
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n16 = graph.NewNode(op, nil, nil, nil, nil);
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n16);
860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(0, n8);
861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.HeapConstant(unique_constant);
862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n5 = graph.NewNode(op);
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n5);
864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(1, n5);
865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.LessThan();
866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n12 = graph.NewNode(op, nil, nil, nil, nil, nil);
867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n12);
868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(0, n8);
869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n9 = graph.NewNode(op, nil, nil, nil);
871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n9);
872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(op, n0);
874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n3);
875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n9->ReplaceInput(0, n3);
876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n9->ReplaceInput(1, n9);
877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Loop(2);
878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n6 = graph.NewNode(op, nil, nil);
879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n6);
880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n6->ReplaceInput(0, n0);
881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfTrue();
882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n14 = graph.NewNode(op, nil);
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n14);
884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Branch();
885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n13 = graph.NewNode(op, nil, nil);
886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n13);
887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n13->ReplaceInput(0, n12);
888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n13->ReplaceInput(1, n6);
889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(0, n13);
890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n6->ReplaceInput(1, n14);
891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n9->ReplaceInput(2, n6);
892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(1, n9);
893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(2, n5);
894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n10 = graph.NewNode(op, nil, nil, nil);
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n10);
897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(0, n0);
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(1, n18);
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(2, n6);
900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(3, n10);
901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(4, n6);
902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(2, n12);
903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(3, n14);
904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n18->ReplaceInput(0, n16);
905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.NumberConstant(0);
906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n17 = graph.NewNode(op);
907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n17);
908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n18->ReplaceInput(1, n17);
909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n18->ReplaceInput(2, n5);
910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n18->ReplaceInput(3, n16);
911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n18->ReplaceInput(4, n14);
912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n8->ReplaceInput(1, n18);
913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n8->ReplaceInput(2, n6);
914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n19->ReplaceInput(0, n8);
915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n19->ReplaceInput(1, n12);
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfFalse();
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n15 = graph.NewNode(op, nil);
918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n15);
919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n15->ReplaceInput(0, n13);
920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n19->ReplaceInput(2, n15);
921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(0, n19);
922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetStart(n0);
924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetEnd(n20);
925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ComputeAndVerifySchedule(19, &graph);
927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BuildScheduleComplexLoops) {
931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = scope.main_isolate();
933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Graph graph(scope.main_zone());
934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CommonOperatorBuilder common_builder(scope.main_zone());
935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSOperatorBuilder js_builder(scope.main_zone());
936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op;
937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> object =
939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<Object>(isolate->heap()->undefined_value(), isolate);
940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Object> unique_constant = Unique<Object>::CreateUninitialized(object);
941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Manually transcripted code for:
943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // function turbo_fan_test(a, b, c) {
944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   while (a < b) {
945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     a++;
946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     while (c < b) {
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //       c++;
948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     }
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   }
950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   while (a < b) {
951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     a += 2;
952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   }
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   return a;
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // }
955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Start(0);
956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(op);
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n0);
958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* nil = graph.NewNode(common_builder.Dead());
959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.End();
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n46 = graph.NewNode(op, nil);
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n46);
962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Return();
963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n45 = graph.NewNode(op, nil, nil, nil);
964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n45);
965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n35 = graph.NewNode(op, nil, nil, nil);
967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n35);
968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n9 = graph.NewNode(op, nil, nil, nil);
970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n9);
971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(op, n0);
973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n2);
974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n9->ReplaceInput(0, n2);
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n23 = graph.NewNode(op, nil, nil, nil);
977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n23);
978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Add();
979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n20 = graph.NewNode(op, nil, nil, nil, nil, nil);
980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n20);
981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.ToNumber();
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n18 = graph.NewNode(op, nil, nil, nil, nil);
983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n18);
984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n18->ReplaceInput(0, n9);
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.HeapConstant(unique_constant);
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n6 = graph.NewNode(op);
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n6);
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n18->ReplaceInput(1, n6);
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.LessThan();
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n14 = graph.NewNode(op, nil, nil, nil, nil, nil);
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n14);
992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(0, n9);
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n10 = graph.NewNode(op, nil, nil, nil);
995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n10);
996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(op, n0);
998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n3);
999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(0, n3);
1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n24 = graph.NewNode(op, nil, nil, nil);
1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n24);
1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n24->ReplaceInput(0, n10);
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n24->ReplaceInput(1, n24);
1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Loop(2);
1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n21 = graph.NewNode(op, nil, nil);
1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n21);
1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfTrue();
1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n16 = graph.NewNode(op, nil);
1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n16);
1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Branch();
1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n15 = graph.NewNode(op, nil, nil);
1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n15);
1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n15->ReplaceInput(0, n14);
1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Loop(2);
1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n7 = graph.NewNode(op, nil, nil);
1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n7);
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n7->ReplaceInput(0, n0);
1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfFalse();
1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n30 = graph.NewNode(op, nil);
1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n30);
1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Branch();
1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n28 = graph.NewNode(op, nil, nil);
1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n28);
1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.LessThan();
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n27 = graph.NewNode(op, nil, nil, nil, nil, nil);
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n27);
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n25 = graph.NewNode(op, nil, nil, nil);
1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n25);
1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n11 = graph.NewNode(op, nil, nil, nil);
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n11);
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n4 = graph.NewNode(op, n0);
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n4);
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(0, n4);
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(1, n25);
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(2, n7);
1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n25->ReplaceInput(0, n11);
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Add();
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n32 = graph.NewNode(op, nil, nil, nil, nil, nil);
1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n32);
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.ToNumber();
1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n31 = graph.NewNode(op, nil, nil, nil, nil);
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n31);
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n31->ReplaceInput(0, n25);
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n31->ReplaceInput(1, n6);
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n31->ReplaceInput(2, n27);
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfTrue();
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n29 = graph.NewNode(op, nil);
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n29);
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n29->ReplaceInput(0, n28);
1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n31->ReplaceInput(3, n29);
1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n32->ReplaceInput(0, n31);
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.NumberConstant(0);
1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n19 = graph.NewNode(op);
1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n19);
1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n32->ReplaceInput(1, n19);
1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n32->ReplaceInput(2, n6);
1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n32->ReplaceInput(3, n31);
1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n32->ReplaceInput(4, n29);
1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n25->ReplaceInput(1, n32);
1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n25->ReplaceInput(2, n21);
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n27->ReplaceInput(0, n25);
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n27->ReplaceInput(1, n24);
1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n27->ReplaceInput(2, n6);
1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n26 = graph.NewNode(op, nil, nil, nil);
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n26);
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n26->ReplaceInput(0, n20);
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n26->ReplaceInput(1, n32);
1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n26->ReplaceInput(2, n21);
1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n27->ReplaceInput(3, n26);
1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n27->ReplaceInput(4, n21);
1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n28->ReplaceInput(0, n27);
1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n28->ReplaceInput(1, n21);
1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n30->ReplaceInput(0, n28);
1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n7->ReplaceInput(1, n30);
1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n15->ReplaceInput(1, n7);
1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(0, n15);
1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n21->ReplaceInput(0, n16);
1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n21->ReplaceInput(1, n29);
1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n24->ReplaceInput(2, n21);
1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(1, n24);
1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(2, n7);
1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(1, n10);
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(2, n6);
1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n12 = graph.NewNode(op, nil, nil, nil);
1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n12);
1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(0, n0);
1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(1, n27);
1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(2, n7);
1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(3, n12);
1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(4, n7);
1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n18->ReplaceInput(2, n14);
1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n18->ReplaceInput(3, n16);
1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(0, n18);
1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(1, n19);
1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(2, n6);
1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(3, n18);
1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(4, n16);
1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n23->ReplaceInput(0, n20);
1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n23->ReplaceInput(1, n23);
1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n23->ReplaceInput(2, n21);
1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n9->ReplaceInput(1, n23);
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n9->ReplaceInput(2, n7);
1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n35->ReplaceInput(0, n9);
1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Add();
1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n44 = graph.NewNode(op, nil, nil, nil, nil, nil);
1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n44);
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n44->ReplaceInput(0, n35);
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.NumberConstant(0);
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n43 = graph.NewNode(op);
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n43);
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n44->ReplaceInput(1, n43);
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n44->ReplaceInput(2, n6);
1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.LessThan();
1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n39 = graph.NewNode(op, nil, nil, nil, nil, nil);
1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n39);
1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n39->ReplaceInput(0, n35);
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n36 = graph.NewNode(op, nil, nil, nil);
1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n36);
1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n36->ReplaceInput(0, n10);
1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n36->ReplaceInput(1, n36);
1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Loop(2);
1129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n33 = graph.NewNode(op, nil, nil);
1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n33);
1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfFalse();
1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n17 = graph.NewNode(op, nil);
1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n17);
1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n17->ReplaceInput(0, n15);
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n33->ReplaceInput(0, n17);
1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfTrue();
1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n41 = graph.NewNode(op, nil);
1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n41);
1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Branch();
1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n40 = graph.NewNode(op, nil, nil);
1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n40);
1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n40->ReplaceInput(0, n39);
1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n40->ReplaceInput(1, n33);
1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n41->ReplaceInput(0, n40);
1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n33->ReplaceInput(1, n41);
1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n36->ReplaceInput(2, n33);
1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n39->ReplaceInput(1, n36);
1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n39->ReplaceInput(2, n6);
1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n38 = graph.NewNode(op, nil, nil, nil);
1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n38);
1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n38->ReplaceInput(0, n14);
1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n38->ReplaceInput(1, n44);
1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n38->ReplaceInput(2, n33);
1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n39->ReplaceInput(3, n38);
1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n39->ReplaceInput(4, n33);
1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n44->ReplaceInput(3, n39);
1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n44->ReplaceInput(4, n41);
1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n35->ReplaceInput(1, n44);
1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n35->ReplaceInput(2, n33);
1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n45->ReplaceInput(0, n35);
1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n45->ReplaceInput(1, n39);
1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfFalse();
1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n42 = graph.NewNode(op, nil);
1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n42);
1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n42->ReplaceInput(0, n40);
1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n45->ReplaceInput(2, n42);
1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n46->ReplaceInput(0, n45);
1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetStart(n0);
1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetEnd(n46);
1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ComputeAndVerifySchedule(46, &graph);
1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BuildScheduleBreakAndContinue) {
1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = scope.main_isolate();
1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Graph graph(scope.main_zone());
1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CommonOperatorBuilder common_builder(scope.main_zone());
1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSOperatorBuilder js_builder(scope.main_zone());
1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op;
1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> object =
1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<Object>(isolate->heap()->undefined_value(), isolate);
1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Object> unique_constant = Unique<Object>::CreateUninitialized(object);
1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Manually transcripted code for:
1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // function turbo_fan_test(a, b, c) {
1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   var d = 0;
1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   while (a < b) {
1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     a++;
1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     while (c < b) {
1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //       c++;
1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //       if (d == 0) break;
1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //       a++;
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     }
1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     if (a == 1) continue;
1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     d++;
1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   }
1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   return a + d;
1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // }
1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Start(0);
1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(op);
1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n0);
1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* nil = graph.NewNode(common_builder.Dead());
1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.End();
1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n58 = graph.NewNode(op, nil);
1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n58);
1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Return();
1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n57 = graph.NewNode(op, nil, nil, nil);
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n57);
1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Add();
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n56 = graph.NewNode(op, nil, nil, nil, nil, nil);
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n56);
1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n10 = graph.NewNode(op, nil, nil, nil);
1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n10);
1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(op, n0);
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n2);
1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(0, n2);
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n25 = graph.NewNode(op, nil, nil, nil);
1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n25);
1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Add();
1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n22 = graph.NewNode(op, nil, nil, nil, nil, nil);
1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n22);
1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.ToNumber();
1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n20 = graph.NewNode(op, nil, nil, nil, nil);
1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n20);
1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(0, n10);
1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.HeapConstant(unique_constant);
1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n6 = graph.NewNode(op);
1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n6);
1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(1, n6);
1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.LessThan();
1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n16 = graph.NewNode(op, nil, nil, nil, nil, nil);
1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n16);
1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(0, n10);
1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n11 = graph.NewNode(op, nil, nil, nil);
1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n11);
1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(op, n0);
1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n3);
1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(0, n3);
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n26 = graph.NewNode(op, nil, nil, nil);
1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n26);
1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n26->ReplaceInput(0, n11);
1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n26->ReplaceInput(1, n26);
1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Loop(2);
1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n23 = graph.NewNode(op, nil, nil);
1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n23);
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfTrue();
1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n18 = graph.NewNode(op, nil);
1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n18);
1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Branch();
1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n17 = graph.NewNode(op, nil, nil);
1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n17);
1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n17->ReplaceInput(0, n16);
1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Loop(2);
1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n8 = graph.NewNode(op, nil, nil);
1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n8);
1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n8->ReplaceInput(0, n0);
1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Merge(2);
1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n53 = graph.NewNode(op, nil, nil);
1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n53);
1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfTrue();
1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n49 = graph.NewNode(op, nil);
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n49);
1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Branch();
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n48 = graph.NewNode(op, nil, nil);
1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n48);
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Equal();
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n47 = graph.NewNode(op, nil, nil, nil, nil, nil);
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n47);
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n47->ReplaceInput(0, n25);
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.NumberConstant(0);
1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n46 = graph.NewNode(op);
1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n46);
1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n47->ReplaceInput(1, n46);
1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n47->ReplaceInput(2, n6);
1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n42 = graph.NewNode(op, nil, nil, nil);
1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n42);
1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.LessThan();
1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n30 = graph.NewNode(op, nil, nil, nil, nil, nil);
1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n30);
1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n27 = graph.NewNode(op, nil, nil, nil);
1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n27);
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n12 = graph.NewNode(op, nil, nil, nil);
1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n12);
1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n4 = graph.NewNode(op, n0);
1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n4);
1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(0, n4);
1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n41 = graph.NewNode(op, nil, nil, nil);
1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n41);
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n41->ReplaceInput(0, n27);
1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Add();
1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n35 = graph.NewNode(op, nil, nil, nil, nil, nil);
1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n35);
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.ToNumber();
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n34 = graph.NewNode(op, nil, nil, nil, nil);
1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n34);
1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n34->ReplaceInput(0, n27);
1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n34->ReplaceInput(1, n6);
1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n34->ReplaceInput(2, n30);
1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfTrue();
1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n32 = graph.NewNode(op, nil);
1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n32);
1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Branch();
1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n31 = graph.NewNode(op, nil, nil);
1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n31);
1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n31->ReplaceInput(0, n30);
1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n31->ReplaceInput(1, n23);
1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n32->ReplaceInput(0, n31);
1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n34->ReplaceInput(3, n32);
1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n35->ReplaceInput(0, n34);
1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.NumberConstant(0);
1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n21 = graph.NewNode(op);
1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n21);
1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n35->ReplaceInput(1, n21);
1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n35->ReplaceInput(2, n6);
1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n35->ReplaceInput(3, n34);
1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n35->ReplaceInput(4, n32);
1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n41->ReplaceInput(1, n35);
1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Merge(2);
1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n40 = graph.NewNode(op, nil, nil);
1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n40);
1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfFalse();
1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n33 = graph.NewNode(op, nil);
1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n33);
1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n33->ReplaceInput(0, n31);
1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n40->ReplaceInput(0, n33);
1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfTrue();
1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n39 = graph.NewNode(op, nil);
1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n39);
1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Branch();
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n38 = graph.NewNode(op, nil, nil);
1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n38);
1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Equal();
1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n37 = graph.NewNode(op, nil, nil, nil, nil, nil);
1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n37);
1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n28 = graph.NewNode(op, nil, nil, nil);
1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n28);
1354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n13 = graph.NewNode(op, nil, nil, nil);
1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n13);
1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.NumberConstant(0);
1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n7 = graph.NewNode(op);
1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n7);
1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n13->ReplaceInput(0, n7);
1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n54 = graph.NewNode(op, nil, nil, nil);
1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n54);
1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n54->ReplaceInput(0, n28);
1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Add();
1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n52 = graph.NewNode(op, nil, nil, nil, nil, nil);
1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n52);
1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.ToNumber();
1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n51 = graph.NewNode(op, nil, nil, nil, nil);
1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n51);
1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n51->ReplaceInput(0, n28);
1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n51->ReplaceInput(1, n6);
1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n51->ReplaceInput(2, n47);
1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfFalse();
1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n50 = graph.NewNode(op, nil);
1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n50);
1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n50->ReplaceInput(0, n48);
1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n51->ReplaceInput(3, n50);
1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n52->ReplaceInput(0, n51);
1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n52->ReplaceInput(1, n21);
1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n52->ReplaceInput(2, n6);
1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n52->ReplaceInput(3, n51);
1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n52->ReplaceInput(4, n50);
1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n54->ReplaceInput(1, n52);
1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n54->ReplaceInput(2, n53);
1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n13->ReplaceInput(1, n54);
1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n13->ReplaceInput(2, n8);
1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n28->ReplaceInput(0, n13);
1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n28->ReplaceInput(1, n28);
1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n28->ReplaceInput(2, n23);
1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n37->ReplaceInput(0, n28);
1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.NumberConstant(0);
1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n36 = graph.NewNode(op);
1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n36);
1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n37->ReplaceInput(1, n36);
1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n37->ReplaceInput(2, n6);
1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n37->ReplaceInput(3, n35);
1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n37->ReplaceInput(4, n32);
1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n38->ReplaceInput(0, n37);
1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n38->ReplaceInput(1, n32);
1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n39->ReplaceInput(0, n38);
1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n40->ReplaceInput(1, n39);
1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n41->ReplaceInput(2, n40);
1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(1, n41);
1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(2, n8);
1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n27->ReplaceInput(0, n12);
1407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n27->ReplaceInput(1, n35);
1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n27->ReplaceInput(2, n23);
1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n30->ReplaceInput(0, n27);
1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n30->ReplaceInput(1, n26);
1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n30->ReplaceInput(2, n6);
1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n29 = graph.NewNode(op, nil, nil, nil);
1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n29);
1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n29->ReplaceInput(0, n22);
1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Add();
1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n45 = graph.NewNode(op, nil, nil, nil, nil, nil);
1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n45);
1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.ToNumber();
1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n44 = graph.NewNode(op, nil, nil, nil, nil);
1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n44);
1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n44->ReplaceInput(0, n25);
1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n44->ReplaceInput(1, n6);
1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n44->ReplaceInput(2, n37);
1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfFalse();
1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n43 = graph.NewNode(op, nil);
1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n43);
1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n43->ReplaceInput(0, n38);
1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n44->ReplaceInput(3, n43);
1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n45->ReplaceInput(0, n44);
1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n45->ReplaceInput(1, n21);
1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n45->ReplaceInput(2, n6);
1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n45->ReplaceInput(3, n44);
1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n45->ReplaceInput(4, n43);
1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n29->ReplaceInput(1, n45);
1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n29->ReplaceInput(2, n23);
1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n30->ReplaceInput(3, n29);
1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n30->ReplaceInput(4, n23);
1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n42->ReplaceInput(0, n30);
1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n42->ReplaceInput(1, n37);
1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n42->ReplaceInput(2, n40);
1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n47->ReplaceInput(3, n42);
1443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n47->ReplaceInput(4, n40);
1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n48->ReplaceInput(0, n47);
1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n48->ReplaceInput(1, n40);
1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n49->ReplaceInput(0, n48);
1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n53->ReplaceInput(0, n49);
1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n53->ReplaceInput(1, n50);
1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n8->ReplaceInput(1, n53);
1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n17->ReplaceInput(1, n8);
1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n18->ReplaceInput(0, n17);
1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n23->ReplaceInput(0, n18);
1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n23->ReplaceInput(1, n43);
1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n26->ReplaceInput(2, n23);
1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(1, n26);
1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(2, n8);
1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(1, n11);
1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(2, n6);
1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n14 = graph.NewNode(op, nil, nil, nil);
1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n14);
1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(0, n0);
1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n55 = graph.NewNode(op, nil, nil, nil);
1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n55);
1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n55->ReplaceInput(0, n47);
1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n55->ReplaceInput(1, n52);
1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n55->ReplaceInput(2, n53);
1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(1, n55);
1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(2, n8);
1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(3, n14);
1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(4, n8);
1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(2, n16);
1474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(3, n18);
1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n22->ReplaceInput(0, n20);
1476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n22->ReplaceInput(1, n21);
1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n22->ReplaceInput(2, n6);
1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n22->ReplaceInput(3, n20);
1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n22->ReplaceInput(4, n18);
1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n25->ReplaceInput(0, n22);
1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n25->ReplaceInput(1, n45);
1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n25->ReplaceInput(2, n23);
1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(1, n25);
1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(2, n8);
1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n56->ReplaceInput(0, n10);
1486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n56->ReplaceInput(1, n13);
1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n56->ReplaceInput(2, n6);
1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n56->ReplaceInput(3, n16);
1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfFalse();
1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n19 = graph.NewNode(op, nil);
1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n19);
1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n19->ReplaceInput(0, n17);
1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n56->ReplaceInput(4, n19);
1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n57->ReplaceInput(0, n56);
1495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n57->ReplaceInput(1, n56);
1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n57->ReplaceInput(2, n19);
1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n58->ReplaceInput(0, n57);
1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetStart(n0);
1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetEnd(n58);
1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ComputeAndVerifySchedule(62, &graph);
1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BuildScheduleSimpleLoopWithCodeMotion) {
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = scope.main_isolate();
1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Graph graph(scope.main_zone());
1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CommonOperatorBuilder common_builder(scope.main_zone());
1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSOperatorBuilder js_builder(scope.main_zone());
1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine_builder;
1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op;
1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> object =
1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<Object>(isolate->heap()->undefined_value(), isolate);
1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Object> unique_constant = Unique<Object>::CreateUninitialized(object);
1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Manually transcripted code for:
1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // function turbo_fan_test(a, b, c) {
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   while (a < b) {
1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //     a += b + c;
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   }
1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //   return a;
1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // }
1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Start(0);
1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(op);
1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n0);
1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* nil = graph.NewNode(common_builder.Dead());
1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.End();
1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n22 = graph.NewNode(op, nil);
1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n22);
1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Return();
1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n21 = graph.NewNode(op, nil, nil, nil);
1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n21);
1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n9 = graph.NewNode(op, nil, nil, nil);
1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n9);
1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
1540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(op, n0);
1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n2);
1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n9->ReplaceInput(0, n2);
1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.Add();
1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n20 = graph.NewNode(op, nil, nil, nil, nil, nil);
1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n20);
1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(0, n9);
1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = machine_builder.Int32Add();
1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n19 = graph.NewNode(op, nil, nil);
1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n19);
1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n10 = graph.NewNode(op, nil, nil, nil);
1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n10);
1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(op, n0);
1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n3);
1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(0, n3);
1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(1, n10);
1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Loop(2);
1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n7 = graph.NewNode(op, nil, nil);
1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n7);
1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n7->ReplaceInput(0, n0);
1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfTrue();
1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n17 = graph.NewNode(op, nil);
1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n17);
1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Branch();
1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n16 = graph.NewNode(op, nil, nil);
1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n16);
1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.ToBoolean();
1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n15 = graph.NewNode(op, nil, nil, nil, nil);
1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n15);
1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = js_builder.LessThan();
1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n14 = graph.NewNode(op, nil, nil, nil, nil, nil);
1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n14);
1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(0, n9);
1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(1, n10);
1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.HeapConstant(unique_constant);
1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n6 = graph.NewNode(op);
1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n6);
1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(2, n6);
1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n12 = graph.NewNode(op, nil, nil, nil);
1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n12);
1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(0, n0);
1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(1, n20);
1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n12->ReplaceInput(2, n7);
1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(3, n12);
1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n14->ReplaceInput(4, n7);
1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n15->ReplaceInput(0, n14);
1589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n15->ReplaceInput(1, n6);
1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n15->ReplaceInput(2, n14);
1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n15->ReplaceInput(3, n7);
1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(0, n15);
1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n16->ReplaceInput(1, n7);
1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n17->ReplaceInput(0, n16);
1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n7->ReplaceInput(1, n17);
1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n10->ReplaceInput(2, n7);
1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n19->ReplaceInput(0, n2);
1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Phi(kMachAnyTagged, 2);
1599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n11 = graph.NewNode(op, nil, nil, nil);
1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n11);
1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.Parameter(0);
1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n4 = graph.NewNode(op, n0);
1603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n4);
1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(0, n4);
1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(1, n11);
1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n11->ReplaceInput(2, n7);
1607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n19->ReplaceInput(1, n3);
1608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(1, n19);
1609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(2, n6);
1610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(3, n19);
1611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n20->ReplaceInput(4, n17);
1612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n9->ReplaceInput(1, n20);
1613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n9->ReplaceInput(2, n7);
1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n21->ReplaceInput(0, n9);
1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n21->ReplaceInput(1, n15);
1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  op = common_builder.IfFalse();
1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n18 = graph.NewNode(op, nil);
1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n18);
1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n18->ReplaceInput(0, n16);
1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n21->ReplaceInput(2, n18);
1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n22->ReplaceInput(0, n21);
1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetStart(n0);
1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetEnd(n22);
1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Schedule* schedule = ComputeAndVerifySchedule(19, &graph);
1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make sure the integer-only add gets hoisted to a different block that the
1628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // JSAdd.
1629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(schedule->block(n19) != schedule->block(n20));
1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TURBOFAN_TARGET
1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic Node* CreateDiamond(Graph* graph, CommonOperatorBuilder* common,
1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Node* cond) {
1637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* tv = graph->NewNode(common->Int32Constant(6));
1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* fv = graph->NewNode(common->Int32Constant(7));
1639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* br = graph->NewNode(common->Branch(), cond, graph->start());
1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* t = graph->NewNode(common->IfTrue(), br);
1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* f = graph->NewNode(common->IfFalse(), br);
1642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* m = graph->NewNode(common->Merge(2), t, f);
1643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* phi = graph->NewNode(common->Phi(kMachAnyTagged, 2), tv, fv, m);
1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return phi;
1645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(FloatingDiamond1) {
1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Graph graph(scope.main_zone());
1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CommonOperatorBuilder common(scope.main_zone());
1652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* start = graph.NewNode(common.Start(1));
1654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetStart(start);
1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p0 = graph.NewNode(common.Parameter(0), start);
1657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* d1 = CreateDiamond(&graph, &common, p0);
1658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ret = graph.NewNode(common.Return(), d1, start, start);
1659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* end = graph.NewNode(common.End(), ret, start);
1660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetEnd(end);
1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ComputeAndVerifySchedule(13, &graph);
1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(FloatingDiamond2) {
1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Graph graph(scope.main_zone());
1670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CommonOperatorBuilder common(scope.main_zone());
1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine;
1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* start = graph.NewNode(common.Start(2));
1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetStart(start);
1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p0 = graph.NewNode(common.Parameter(0), start);
1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p1 = graph.NewNode(common.Parameter(1), start);
1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* d1 = CreateDiamond(&graph, &common, p0);
1679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* d2 = CreateDiamond(&graph, &common, p1);
1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* add = graph.NewNode(machine.Int32Add(), d1, d2);
1681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ret = graph.NewNode(common.Return(), add, start, start);
1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* end = graph.NewNode(common.End(), ret, start);
1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetEnd(end);
1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ComputeAndVerifySchedule(24, &graph);
1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(FloatingDiamond3) {
1691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleAndZoneScope scope;
1692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Graph graph(scope.main_zone());
1693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CommonOperatorBuilder common(scope.main_zone());
1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine;
1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* start = graph.NewNode(common.Start(2));
1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetStart(start);
1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p0 = graph.NewNode(common.Parameter(0), start);
1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p1 = graph.NewNode(common.Parameter(1), start);
1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* d1 = CreateDiamond(&graph, &common, p0);
1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* d2 = CreateDiamond(&graph, &common, p1);
1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* add = graph.NewNode(machine.Int32Add(), d1, d2);
1704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* d3 = CreateDiamond(&graph, &common, add);
1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ret = graph.NewNode(common.Return(), d3, start, start);
1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* end = graph.NewNode(common.End(), ret, start);
1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph.SetEnd(end);
1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ComputeAndVerifySchedule(33, &graph);
1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
1714