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