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/compiler/pipeline.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <fstream>  // NOLINT(readability/streams)
8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <memory>
9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <sstream>
10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/adapters.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/platform/elapsed-timer.h"
13f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compilation-info.h"
14f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler.h"
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/ast-graph-builder.h"
16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/ast-loop-assignment-analyzer.h"
17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/basic-block-instrumentor.h"
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/branch-elimination.h"
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/bytecode-graph-builder.h"
2013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include "src/compiler/checkpoint-elimination.h"
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/code-generator.h"
22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/common-operator-reducer.h"
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/control-flow-optimizer.h"
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/dead-code-elimination.h"
25bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/compiler/effect-control-linearizer.h"
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/escape-analysis-reducer.h"
27bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/compiler/escape-analysis.h"
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/frame-elider.h"
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/graph-replay.h"
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/graph-trimmer.h"
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/graph-visualizer.h"
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/instruction-selector.h"
33bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/compiler/instruction.h"
34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/js-builtin-reducer.h"
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/js-call-reducer.h"
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/js-context-specialization.h"
37109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/compiler/js-create-lowering.h"
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/js-frame-specialization.h"
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/js-generic-lowering.h"
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/js-inlining-heuristic.h"
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/js-intrinsic-lowering.h"
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/js-native-context-specialization.h"
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/js-typed-lowering.h"
44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/jump-threading.h"
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/live-range-separator.h"
46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/load-elimination.h"
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/loop-analysis.h"
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/loop-peeling.h"
49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/compiler/loop-variable-optimizer.h"
50f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler/machine-graph-verifier.h"
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/machine-operator-reducer.h"
52bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/compiler/memory-optimizer.h"
53958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/move-optimizer.h"
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/osr.h"
55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/pipeline-statistics.h"
5613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include "src/compiler/redundancy-elimination.h"
57958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/register-allocator-verifier.h"
58bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/compiler/register-allocator.h"
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/schedule.h"
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/scheduler.h"
61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/select-lowering.h"
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/simplified-lowering.h"
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/simplified-operator-reducer.h"
64bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/compiler/simplified-operator.h"
6513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include "src/compiler/store-store-elimination.h"
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/tail-call-optimization.h"
67f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler/typed-optimization.h"
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/typer.h"
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/value-numbering-reducer.h"
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/verifier.h"
71c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/compiler/zone-stats.h"
72bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/isolate-inl.h"
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ostreams.h"
74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/parsing/parse-info.h"
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/register-configuration.h"
7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/trap-handler/trap-handler.h"
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/type-info.h"
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/utils.h"
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass PipelineData {
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // For main entry point.
87c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  PipelineData(ZoneStats* zone_stats, CompilationInfo* info,
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               PipelineStatistics* pipeline_statistics)
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : isolate_(info->isolate()),
90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        info_(info),
91bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        debug_name_(info_->GetDebugName()),
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        outer_zone_(info_->zone()),
93c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        zone_stats_(zone_stats),
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        pipeline_statistics_(pipeline_statistics),
95c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        graph_zone_scope_(zone_stats_, ZONE_NAME),
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        graph_zone_(graph_zone_scope_.zone()),
97c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        instruction_zone_scope_(zone_stats_, ZONE_NAME),
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        instruction_zone_(instruction_zone_scope_.zone()),
99c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        register_allocation_zone_scope_(zone_stats_, ZONE_NAME),
100bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        register_allocation_zone_(register_allocation_zone_scope_.zone()) {
101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    PhaseScope scope(pipeline_statistics, "init pipeline data");
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    graph_ = new (graph_zone_) Graph(graph_zone_);
103bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    source_positions_ = new (graph_zone_) SourcePositionTable(graph_);
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    simplified_ = new (graph_zone_) SimplifiedOperatorBuilder(graph_zone_);
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    machine_ = new (graph_zone_) MachineOperatorBuilder(
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        graph_zone_, MachineType::PointerRepresentation(),
107f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        InstructionSelector::SupportedMachineOperatorFlags(),
108f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        InstructionSelector::AlignmentRequirements());
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    common_ = new (graph_zone_) CommonOperatorBuilder(graph_zone_);
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_);
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    jsgraph_ = new (graph_zone_)
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        JSGraph(isolate_, graph_, common_, javascript_, simplified_, machine_);
11362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    is_asm_ = info->shared_info()->asm_function();
114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
116bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // For WASM compile entry point.
11762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  PipelineData(ZoneStats* zone_stats, CompilationInfo* info, JSGraph* jsgraph,
11862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               SourcePositionTable* source_positions,
11962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               ZoneVector<trap_handler::ProtectedInstructionData>*
12062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                   protected_instructions)
121bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      : isolate_(info->isolate()),
122bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        info_(info),
123bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        debug_name_(info_->GetDebugName()),
124c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        zone_stats_(zone_stats),
125c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        graph_zone_scope_(zone_stats_, ZONE_NAME),
12662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        graph_(jsgraph->graph()),
127bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        source_positions_(source_positions),
12862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        machine_(jsgraph->machine()),
12962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        common_(jsgraph->common()),
13062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        javascript_(jsgraph->javascript()),
13162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        jsgraph_(jsgraph),
132c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        instruction_zone_scope_(zone_stats_, ZONE_NAME),
133bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        instruction_zone_(instruction_zone_scope_.zone()),
134c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        register_allocation_zone_scope_(zone_stats_, ZONE_NAME),
13562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        register_allocation_zone_(register_allocation_zone_scope_.zone()),
13662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        protected_instructions_(protected_instructions) {
13762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    is_asm_ =
13862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        info->has_shared_info() ? info->shared_info()->asm_function() : false;
13962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
140bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // For machine graph testing entry point.
142c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  PipelineData(ZoneStats* zone_stats, CompilationInfo* info, Graph* graph,
14362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               Schedule* schedule, SourcePositionTable* source_positions)
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : isolate_(info->isolate()),
145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        info_(info),
146bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        debug_name_(info_->GetDebugName()),
147c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        zone_stats_(zone_stats),
148c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        graph_zone_scope_(zone_stats_, ZONE_NAME),
149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        graph_(graph),
15062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        source_positions_(source_positions),
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        schedule_(schedule),
152c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        instruction_zone_scope_(zone_stats_, ZONE_NAME),
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        instruction_zone_(instruction_zone_scope_.zone()),
154c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        register_allocation_zone_scope_(zone_stats_, ZONE_NAME),
15562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        register_allocation_zone_(register_allocation_zone_scope_.zone()) {
15662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    is_asm_ = false;
15762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // For register allocation testing entry point.
159c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  PipelineData(ZoneStats* zone_stats, CompilationInfo* info,
160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               InstructionSequence* sequence)
161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : isolate_(info->isolate()),
162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        info_(info),
163bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        debug_name_(info_->GetDebugName()),
164c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        zone_stats_(zone_stats),
165c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        graph_zone_scope_(zone_stats_, ZONE_NAME),
166c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        instruction_zone_scope_(zone_stats_, ZONE_NAME),
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        instruction_zone_(sequence->zone()),
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        sequence_(sequence),
169c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        register_allocation_zone_scope_(zone_stats_, ZONE_NAME),
17062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        register_allocation_zone_(register_allocation_zone_scope_.zone()) {
17162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    is_asm_ =
17262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        info->has_shared_info() ? info->shared_info()->asm_function() : false;
17362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ~PipelineData() {
176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DeleteRegisterAllocationZone();
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DeleteInstructionZone();
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DeleteGraphZone();
179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Isolate* isolate() const { return isolate_; }
182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CompilationInfo* info() const { return info_; }
183c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ZoneStats* zone_stats() const { return zone_stats_; }
184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PipelineStatistics* pipeline_statistics() { return pipeline_statistics_; }
185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool compilation_failed() const { return compilation_failed_; }
186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void set_compilation_failed() { compilation_failed_ = true; }
18762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
18862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool is_asm() const { return is_asm_; }
18962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool verify_graph() const { return verify_graph_; }
19062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void set_verify_graph(bool value) { verify_graph_ = value; }
19162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<Code> code() { return code_; }
193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void set_code(Handle<Code> code) {
194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(code_.is_null());
195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    code_ = code;
196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // RawMachineAssembler generally produces graphs which cannot be verified.
199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool MayHaveUnverifiableGraph() const { return outer_zone_ == nullptr; }
200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Zone* graph_zone() const { return graph_zone_; }
202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Graph* graph() const { return graph_; }
203bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SourcePositionTable* source_positions() const { return source_positions_; }
204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MachineOperatorBuilder* machine() const { return machine_; }
205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CommonOperatorBuilder* common() const { return common_; }
206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  JSOperatorBuilder* javascript() const { return javascript_; }
207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  JSGraph* jsgraph() const { return jsgraph_; }
208c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<Context> native_context() const {
209c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    return handle(info()->native_context(), isolate());
210c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
211c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<JSGlobalObject> global_object() const {
212c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    return handle(info()->global_object(), isolate());
213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LoopAssignmentAnalysis* loop_assignment() const { return loop_assignment_; }
216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void set_loop_assignment(LoopAssignmentAnalysis* loop_assignment) {
217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(!loop_assignment_);
218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    loop_assignment_ = loop_assignment;
219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Schedule* schedule() const { return schedule_; }
222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void set_schedule(Schedule* schedule) {
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(!schedule_);
224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    schedule_ = schedule;
225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
226bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void reset_schedule() { schedule_ = nullptr; }
227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Zone* instruction_zone() const { return instruction_zone_; }
229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  InstructionSequence* sequence() const { return sequence_; }
230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Frame* frame() const { return frame_; }
231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Zone* register_allocation_zone() const { return register_allocation_zone_; }
233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RegisterAllocationData* register_allocation_data() const {
234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return register_allocation_data_;
235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
237bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BasicBlockProfiler::Data* profiler_data() const { return profiler_data_; }
238bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void set_profiler_data(BasicBlockProfiler::Data* profiler_data) {
239bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    profiler_data_ = profiler_data;
240bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
241bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
242bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  std::string const& source_position_output() const {
243bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return source_position_output_;
244bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
245bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void set_source_position_output(std::string const& source_position_output) {
246bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    source_position_output_ = source_position_output;
247bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
248bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
24962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ZoneVector<trap_handler::ProtectedInstructionData>* protected_instructions()
25062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      const {
25162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return protected_instructions_;
25262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
25362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void DeleteGraphZone() {
255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (graph_zone_ == nullptr) return;
256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    graph_zone_scope_.Destroy();
257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    graph_zone_ = nullptr;
258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    graph_ = nullptr;
259bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    source_positions_ = nullptr;
260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    loop_assignment_ = nullptr;
261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    simplified_ = nullptr;
262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    machine_ = nullptr;
263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    common_ = nullptr;
264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    javascript_ = nullptr;
265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    jsgraph_ = nullptr;
266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    schedule_ = nullptr;
267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void DeleteInstructionZone() {
270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (instruction_zone_ == nullptr) return;
271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    instruction_zone_scope_.Destroy();
272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    instruction_zone_ = nullptr;
273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    sequence_ = nullptr;
274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    frame_ = nullptr;
275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void DeleteRegisterAllocationZone() {
278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (register_allocation_zone_ == nullptr) return;
279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    register_allocation_zone_scope_.Destroy();
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    register_allocation_zone_ = nullptr;
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    register_allocation_data_ = nullptr;
282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void InitializeInstructionSequence(const CallDescriptor* descriptor) {
285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(sequence_ == nullptr);
286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    InstructionBlocks* instruction_blocks =
287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        InstructionSequence::InstructionBlocksFor(instruction_zone(),
288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                                  schedule());
289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    sequence_ = new (instruction_zone()) InstructionSequence(
290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        info()->isolate(), instruction_zone(), instruction_blocks);
2913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    if (descriptor && descriptor->RequiresFrameAsIncoming()) {
2923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      sequence_->instruction_blocks()[0]->mark_needs_frame();
2933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    } else {
294c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      DCHECK_EQ(0u, descriptor->CalleeSavedFPRegisters());
295c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      DCHECK_EQ(0u, descriptor->CalleeSavedRegisters());
2963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
299109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void InitializeFrameData(CallDescriptor* descriptor) {
300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(frame_ == nullptr);
301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int fixed_frame_size = 0;
302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (descriptor != nullptr) {
303c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      fixed_frame_size = descriptor->CalculateFixedFrameSize();
304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
305bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    frame_ = new (instruction_zone()) Frame(fixed_frame_size);
306109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
307109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
308109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void InitializeRegisterAllocationData(const RegisterConfiguration* config,
309bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                        CallDescriptor* descriptor) {
310109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    DCHECK(register_allocation_data_ == nullptr);
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    register_allocation_data_ = new (register_allocation_zone())
312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        RegisterAllocationData(config, register_allocation_zone(), frame(),
31362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                               sequence(), debug_name());
314bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
315bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
316bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void BeginPhaseKind(const char* phase_kind_name) {
317bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    if (pipeline_statistics() != nullptr) {
318bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      pipeline_statistics()->BeginPhaseKind(phase_kind_name);
319bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
320bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
321bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
322bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void EndPhaseKind() {
323bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    if (pipeline_statistics() != nullptr) {
324bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      pipeline_statistics()->EndPhaseKind();
325bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  const char* debug_name() const { return debug_name_.get(); }
32962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
331bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Isolate* const isolate_;
332bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  CompilationInfo* const info_;
333f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  std::unique_ptr<char[]> debug_name_;
334bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Zone* outer_zone_ = nullptr;
335c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ZoneStats* const zone_stats_;
336bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineStatistics* pipeline_statistics_ = nullptr;
337bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool compilation_failed_ = false;
33862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool verify_graph_ = false;
33962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool is_asm_ = false;
340bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<Code> code_ = Handle<Code>::null();
341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // All objects in the following group of fields are allocated in graph_zone_.
343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // They are all set to nullptr when the graph_zone_ is destroyed.
344c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ZoneStats::Scope graph_zone_scope_;
345bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Zone* graph_zone_ = nullptr;
346bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Graph* graph_ = nullptr;
347bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SourcePositionTable* source_positions_ = nullptr;
348bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  LoopAssignmentAnalysis* loop_assignment_ = nullptr;
349bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  SimplifiedOperatorBuilder* simplified_ = nullptr;
350bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  MachineOperatorBuilder* machine_ = nullptr;
351bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  CommonOperatorBuilder* common_ = nullptr;
352bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSOperatorBuilder* javascript_ = nullptr;
353bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  JSGraph* jsgraph_ = nullptr;
354bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Schedule* schedule_ = nullptr;
355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // All objects in the following group of fields are allocated in
357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // instruction_zone_.  They are all set to nullptr when the instruction_zone_
358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // is
359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // destroyed.
360c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ZoneStats::Scope instruction_zone_scope_;
361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Zone* instruction_zone_;
362bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  InstructionSequence* sequence_ = nullptr;
363bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Frame* frame_ = nullptr;
364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // All objects in the following group of fields are allocated in
366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // register_allocation_zone_.  They are all set to nullptr when the zone is
367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // destroyed.
368c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ZoneStats::Scope register_allocation_zone_scope_;
369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Zone* register_allocation_zone_;
370bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  RegisterAllocationData* register_allocation_data_ = nullptr;
371bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
372bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Basic block profiling support.
373bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  BasicBlockProfiler::Data* profiler_data_ = nullptr;
374bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
375bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Source position output for --trace-turbo.
376bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  std::string source_position_output_;
377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
37862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ZoneVector<trap_handler::ProtectedInstructionData>* protected_instructions_ =
37962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      nullptr;
38062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DISALLOW_COPY_AND_ASSIGN(PipelineData);
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
384bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass PipelineImpl final {
385bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch public:
386bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  explicit PipelineImpl(PipelineData* data) : data_(data) {}
387bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
388bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Helpers for executing pipeline phases.
389bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  template <typename Phase>
390bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void Run();
391bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  template <typename Phase, typename Arg0>
392bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void Run(Arg0 arg_0);
393bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  template <typename Phase, typename Arg0, typename Arg1>
394bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void Run(Arg0 arg_0, Arg1 arg_1);
395bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
396bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Run the graph creation and initial optimization passes.
397bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool CreateGraph();
398bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
399bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Run the concurrent optimization passes.
400bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool OptimizeGraph(Linkage* linkage);
401bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
402bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Perform the actual code generation and return handle to a code object.
403bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<Code> GenerateCode(Linkage* linkage);
404bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
405c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  bool ScheduleAndSelectInstructions(Linkage* linkage, bool trim_graph);
406bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void RunPrintAndVerify(const char* phase, bool untyped = false);
407bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<Code> ScheduleAndGenerateCode(CallDescriptor* call_descriptor);
408bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void AllocateRegisters(const RegisterConfiguration* config,
409bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                         CallDescriptor* descriptor, bool run_verifier);
410bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
411bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  CompilationInfo* info() const;
412bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Isolate* isolate() const;
413bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
414bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineData* const data_;
415bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace {
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct TurboCfgFile : public std::ofstream {
420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit TurboCfgFile(Isolate* isolate)
421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      : std::ofstream(isolate->GetTurboCfgFileName().c_str(),
422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                      std::ios_base::app) {}
423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
425bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochstruct TurboJsonFile : public std::ofstream {
426bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  TurboJsonFile(CompilationInfo* info, std::ios_base::openmode mode)
427bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      : std::ofstream(GetVisualizerLogFileName(info, nullptr, "json").get(),
428bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                      mode) {}
429bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid TraceSchedule(CompilationInfo* info, Schedule* schedule) {
432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FLAG_trace_turbo) {
433bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    AllowHandleDereference allow_deref;
434bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    TurboJsonFile json_of(info, std::ios_base::app);
435bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    json_of << "{\"name\":\"Schedule\",\"type\":\"schedule\",\"data\":\"";
436bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    std::stringstream schedule_stream;
437bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    schedule_stream << *schedule;
438bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    std::string schedule_string(schedule_stream.str());
439bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    for (const auto& c : schedule_string) {
440bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      json_of << AsEscapedUC16ForJSON(c);
441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
442bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    json_of << "\"},\n";
443bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
444bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (FLAG_trace_turbo_graph || FLAG_trace_turbo_scheduler) {
445bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    AllowHandleDereference allow_deref;
446f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    CodeTracer::Scope tracing_scope(info->isolate()->GetCodeTracer());
447f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    OFStream os(tracing_scope.file());
448bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    os << "-- Schedule --------------------------------------\n" << *schedule;
449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass SourcePositionWrapper final : public Reducer {
454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SourcePositionWrapper(Reducer* reducer, SourcePositionTable* table)
456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : reducer_(reducer), table_(table) {}
457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ~SourcePositionWrapper() final {}
458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Reduction Reduce(Node* node) final {
460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SourcePosition const pos = table_->GetSourcePosition(node);
461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SourcePositionTable::Scope position(table_, pos);
462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return reducer_->Reduce(node);
463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Finalize() final { reducer_->Finalize(); }
466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Reducer* const reducer_;
469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SourcePositionTable* const table_;
470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(SourcePositionWrapper);
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass JSGraphReducer final : public GraphReducer {
476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSGraphReducer(JSGraph* jsgraph, Zone* zone)
478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : GraphReducer(zone, jsgraph->graph(), jsgraph->Dead()) {}
479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ~JSGraphReducer() final {}
480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid AddReducer(PipelineData* data, GraphReducer* graph_reducer,
484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                Reducer* reducer) {
485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (data->info()->is_source_positions_enabled()) {
486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    void* const buffer = data->graph_zone()->New(sizeof(SourcePositionWrapper));
487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SourcePositionWrapper* const wrapper =
488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        new (buffer) SourcePositionWrapper(reducer, data->source_positions());
489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    graph_reducer->AddReducer(wrapper);
490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    graph_reducer->AddReducer(reducer);
492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass PipelineRunScope {
497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PipelineRunScope(PipelineData* data, const char* phase_name)
499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      : phase_scope_(
500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            phase_name == nullptr ? nullptr : data->pipeline_statistics(),
501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            phase_name),
502c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        zone_scope_(data->zone_stats(), ZONE_NAME) {}
503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Zone* zone() { return zone_scope_.zone(); }
505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PhaseScope phase_scope_;
508c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ZoneStats::Scope zone_scope_;
509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
511bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochPipelineStatistics* CreatePipelineStatistics(CompilationInfo* info,
512c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                             ZoneStats* zone_stats) {
513bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineStatistics* pipeline_statistics = nullptr;
514bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
51513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) {
516c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    pipeline_statistics = new PipelineStatistics(info, zone_stats);
517bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    pipeline_statistics->BeginPhaseKind("initializing");
518bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
519bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
520bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (FLAG_trace_turbo) {
521bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    TurboJsonFile json_of(info, std::ios_base::trunc);
522bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<Script> script = info->script();
523f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    std::unique_ptr<char[]> function_name = info->GetDebugName();
524bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    int pos = info->shared_info()->start_position();
525bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    json_of << "{\"function\":\"" << function_name.get()
526bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch            << "\", \"sourcePosition\":" << pos << ", \"source\":\"";
52713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Isolate* isolate = info->isolate();
52813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    if (!script->IsUndefined(isolate) &&
52913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        !script->source()->IsUndefined(isolate)) {
530bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      DisallowHeapAllocation no_allocation;
531bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      int start = info->shared_info()->start_position();
532bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      int len = info->shared_info()->end_position() - start;
533bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      String::SubStringRange source(String::cast(script->source()), start, len);
534bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      for (const auto& c : source) {
535bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        json_of << AsEscapedUC16ForJSON(c);
536bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      }
537bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
538bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    json_of << "\",\n\"phases\":[";
539bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
540bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
541bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return pipeline_statistics;
542bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
543bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace
545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
546bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass PipelineCompilationJob final : public CompilationJob {
547bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch public:
54862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  PipelineCompilationJob(ParseInfo* parse_info, Handle<JSFunction> function)
549bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      // Note that the CompilationInfo is not initialized at the time we pass it
550bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      // to the CompilationJob constructor, but it is not dereferenced there.
55162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      : CompilationJob(parse_info->isolate(), &info_, "TurboFan"),
55262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        parse_info_(parse_info),
55362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        zone_stats_(parse_info->isolate()->allocator()),
55462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        info_(parse_info_.get()->zone(), parse_info_.get(), function),
555c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        pipeline_statistics_(CreatePipelineStatistics(info(), &zone_stats_)),
556c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        data_(&zone_stats_, info(), pipeline_statistics_.get()),
557bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        pipeline_(&data_),
558bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        linkage_(nullptr) {}
559bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
560bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch protected:
561f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Status PrepareJobImpl() final;
562f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Status ExecuteJobImpl() final;
563f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Status FinalizeJobImpl() final;
564bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
565bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch private:
56662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::unique_ptr<ParseInfo> parse_info_;
567c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ZoneStats zone_stats_;
568bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  CompilationInfo info_;
569f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  std::unique_ptr<PipelineStatistics> pipeline_statistics_;
570bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineData data_;
571bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineImpl pipeline_;
572bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Linkage* linkage_;
573f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
574f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DISALLOW_COPY_AND_ASSIGN(PipelineCompilationJob);
575bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
576bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
577f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochPipelineCompilationJob::Status PipelineCompilationJob::PrepareJobImpl() {
578bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (info()->shared_info()->asm_function()) {
57962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (info()->osr_frame() && !info()->is_optimizing_from_bytecode()) {
58062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      info()->MarkAsFrameSpecializing();
58162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
582bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    info()->MarkAsFunctionContextSpecializing();
583bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  } else {
584bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    if (!FLAG_always_opt) {
585bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      info()->MarkAsBailoutOnUninitialized();
586bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
58762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (FLAG_turbo_loop_peeling) {
58862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      info()->MarkAsLoopPeelingEnabled();
589f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
590bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
59162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (info()->is_optimizing_from_bytecode() ||
59262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      !info()->shared_info()->asm_function()) {
593bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    info()->MarkAsDeoptimizationEnabled();
594f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if (FLAG_inline_accessors) {
595f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      info()->MarkAsAccessorInliningEnabled();
596f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
59762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (info()->closure()->feedback_vector_cell()->map() ==
59862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        isolate()->heap()->one_closure_cell_map()) {
59962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      info()->MarkAsFunctionContextSpecializing();
60062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
601c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
602c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (!info()->is_optimizing_from_bytecode()) {
603bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    if (!Compiler::EnsureDeoptimizationSupport(info())) return FAILED;
60462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else if (FLAG_turbo_inlining) {
60562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    info()->MarkAsInliningEnabled();
606bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
607bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
60862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  linkage_ = new (info()->zone())
60962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Linkage(Linkage::ComputeIncoming(info()->zone(), info()));
610bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
611bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (!pipeline_.CreateGraph()) {
612bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    if (isolate()->has_pending_exception()) return FAILED;  // Stack overflowed.
613bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return AbortOptimization(kGraphBuildingFailed);
614bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
615bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
616bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return SUCCEEDED;
617bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
618bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
619f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochPipelineCompilationJob::Status PipelineCompilationJob::ExecuteJobImpl() {
620bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (!pipeline_.OptimizeGraph(linkage_)) return FAILED;
621bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return SUCCEEDED;
622bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
623bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
624f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochPipelineCompilationJob::Status PipelineCompilationJob::FinalizeJobImpl() {
625bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<Code> code = pipeline_.GenerateCode(linkage_);
626bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (code.is_null()) {
627bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    if (info()->bailout_reason() == kNoReason) {
628bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      return AbortOptimization(kCodeGenerationFailed);
629bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
630bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return FAILED;
631bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
632bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  info()->dependencies()->Commit(code);
633bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  info()->SetCode(code);
634bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (info()->is_deoptimization_enabled()) {
635bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    info()->context()->native_context()->AddOptimizedCode(*code);
636bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    RegisterWeakObjectsInOptimizedCode(code);
637bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
638bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return SUCCEEDED;
639bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
640bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
641bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass PipelineWasmCompilationJob final : public CompilationJob {
642bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch public:
64362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  explicit PipelineWasmCompilationJob(
64462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      CompilationInfo* info, JSGraph* jsgraph, CallDescriptor* descriptor,
64562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      SourcePositionTable* source_positions,
64662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      ZoneVector<trap_handler::ProtectedInstructionData>* protected_insts,
64762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      bool allow_signalling_nan)
648f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      : CompilationJob(info->isolate(), info, "TurboFan",
649f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                       State::kReadyToExecute),
650c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        zone_stats_(info->isolate()->allocator()),
65162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        data_(&zone_stats_, info, jsgraph, source_positions, protected_insts),
652bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        pipeline_(&data_),
65362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        linkage_(descriptor),
65462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        allow_signalling_nan_(allow_signalling_nan) {}
655bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
656bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch protected:
657f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Status PrepareJobImpl() final;
658f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Status ExecuteJobImpl() final;
659f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Status FinalizeJobImpl() final;
660bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
661bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch private:
662c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ZoneStats zone_stats_;
663bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineData data_;
664bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineImpl pipeline_;
665bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Linkage linkage_;
66662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool allow_signalling_nan_;
667bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
668bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
669bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochPipelineWasmCompilationJob::Status
670f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochPipelineWasmCompilationJob::PrepareJobImpl() {
671f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  UNREACHABLE();  // Prepare should always be skipped for WasmCompilationJob.
672bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return SUCCEEDED;
673bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
674bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
675bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochPipelineWasmCompilationJob::Status
676f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochPipelineWasmCompilationJob::ExecuteJobImpl() {
677bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (FLAG_trace_turbo) {
678bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    TurboJsonFile json_of(info(), std::ios_base::trunc);
679bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    json_of << "{\"function\":\"" << info()->GetDebugName().get()
680bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch            << "\", \"source\":\"\",\n\"phases\":[";
681bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
682bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
683bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  pipeline_.RunPrintAndVerify("Machine", true);
68462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (FLAG_wasm_opt) {
68562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    PipelineData* data = &data_;
68662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    PipelineRunScope scope(data, "WASM optimization");
68762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    JSGraphReducer graph_reducer(data->jsgraph(), scope.zone());
68862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(),
68962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                              data->common());
69062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    ValueNumberingReducer value_numbering(scope.zone(), data->graph()->zone());
69162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    MachineOperatorReducer machine_reducer(data->jsgraph(),
69262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                           allow_signalling_nan_);
69362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    CommonOperatorReducer common_reducer(&graph_reducer, data->graph(),
69462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                         data->common(), data->machine());
69562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    AddReducer(data, &graph_reducer, &dead_code_elimination);
69662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    AddReducer(data, &graph_reducer, &value_numbering);
69762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    AddReducer(data, &graph_reducer, &machine_reducer);
69862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    AddReducer(data, &graph_reducer, &common_reducer);
69962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    graph_reducer.ReduceGraph();
70062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    pipeline_.RunPrintAndVerify("Optimized Machine", true);
70162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
702bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
703c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (!pipeline_.ScheduleAndSelectInstructions(&linkage_, true)) return FAILED;
704bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return SUCCEEDED;
705bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
706bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
707bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochPipelineWasmCompilationJob::Status
708f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochPipelineWasmCompilationJob::FinalizeJobImpl() {
709bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  pipeline_.GenerateCode(&linkage_);
710bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return SUCCEEDED;
711bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <typename Phase>
714bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid PipelineImpl::Run() {
715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PipelineRunScope scope(this->data_, Phase::phase_name());
716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Phase phase;
717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  phase.Run(this->data_, scope.zone());
718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <typename Phase, typename Arg0>
721bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid PipelineImpl::Run(Arg0 arg_0) {
722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PipelineRunScope scope(this->data_, Phase::phase_name());
723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Phase phase;
724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  phase.Run(this->data_, scope.zone(), arg_0);
725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
727bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochtemplate <typename Phase, typename Arg0, typename Arg1>
728bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid PipelineImpl::Run(Arg0 arg_0, Arg1 arg_1) {
729bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineRunScope scope(this->data_, Phase::phase_name());
730bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Phase phase;
731bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  phase.Run(this->data_, scope.zone(), arg_0, arg_1);
732bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct LoopAssignmentAnalysisPhase {
735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "loop assignment analysis"; }
736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
738bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    if (!data->info()->is_optimizing_from_bytecode()) {
739bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      AstLoopAssignmentAnalyzer analyzer(data->graph_zone(), data->info());
740bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      LoopAssignmentAnalysis* loop_assignment = analyzer.Analyze();
741bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      data->set_loop_assignment(loop_assignment);
742bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct GraphBuilderPhase {
748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "graph builder"; }
749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    bool succeeded = false;
752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
753bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    if (data->info()->is_optimizing_from_bytecode()) {
75462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      // Bytecode graph builder assumes deoptimziation is enabled.
75562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      DCHECK(data->info()->is_deoptimization_enabled());
75662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      BytecodeGraphBuilder graph_builder(
75762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          temp_zone, data->info()->shared_info(),
75862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          handle(data->info()->closure()->feedback_vector()),
75962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          data->info()->osr_ast_id(), data->jsgraph(), 1.0f,
76062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          data->source_positions());
761109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      succeeded = graph_builder.CreateGraph();
762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    } else {
763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AstGraphBuilderWithPositions graph_builder(
764c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          temp_zone, data->info(), data->jsgraph(), 1.0f,
76562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          data->loop_assignment(), data->source_positions());
766f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      succeeded = graph_builder.CreateGraph();
767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!succeeded) {
770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      data->set_compilation_failed();
771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct InliningPhase {
777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* phase_name() { return "inlining"; }
778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(),
782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              data->common());
78362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    CheckpointElimination checkpoint_elimination(&graph_reducer);
784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CommonOperatorReducer common_reducer(&graph_reducer, data->graph(),
785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                         data->common(), data->machine());
786f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    JSCallReducer::Flags call_reducer_flags = JSCallReducer::kNoFlags;
787f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    if (data->info()->is_deoptimization_enabled()) {
788f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      call_reducer_flags |= JSCallReducer::kDeoptimizationEnabled;
789f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
790f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    JSCallReducer call_reducer(&graph_reducer, data->jsgraph(),
79162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                               call_reducer_flags, data->native_context(),
79262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                               data->info()->dependencies());
793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSContextSpecialization context_specialization(
794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        &graph_reducer, data->jsgraph(),
795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        data->info()->is_function_context_specializing()
796f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            ? handle(data->info()->context())
797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            : MaybeHandle<Context>());
798c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    JSFrameSpecialization frame_specialization(
799c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        &graph_reducer, data->info()->osr_frame(), data->jsgraph());
800109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    JSNativeContextSpecialization::Flags flags =
801109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        JSNativeContextSpecialization::kNoFlags;
802f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if (data->info()->is_accessor_inlining_enabled()) {
803f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      flags |= JSNativeContextSpecialization::kAccessorInliningEnabled;
804f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
805109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    if (data->info()->is_bailout_on_uninitialized()) {
806109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      flags |= JSNativeContextSpecialization::kBailoutOnUninitialized;
807109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
808109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    if (data->info()->is_deoptimization_enabled()) {
809109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      flags |= JSNativeContextSpecialization::kDeoptimizationEnabled;
810109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSNativeContextSpecialization native_context_specialization(
812109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        &graph_reducer, data->jsgraph(), flags, data->native_context(),
813109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        data->info()->dependencies(), temp_zone);
814c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    JSInliningHeuristic inlining(
815c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        &graph_reducer, data->info()->is_inlining_enabled()
816c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                            ? JSInliningHeuristic::kGeneralInlining
817c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                            : JSInliningHeuristic::kRestrictedInlining,
818c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        temp_zone, data->info(), data->jsgraph(), data->source_positions());
819f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSIntrinsicLowering intrinsic_lowering(
820f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        &graph_reducer, data->jsgraph(),
821f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        data->info()->is_deoptimization_enabled()
822f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch            ? JSIntrinsicLowering::kDeoptimizationEnabled
823f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch            : JSIntrinsicLowering::kDeoptimizationDisabled);
824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &dead_code_elimination);
82562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    AddReducer(data, &graph_reducer, &checkpoint_elimination);
826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &common_reducer);
827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (data->info()->is_frame_specializing()) {
828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AddReducer(data, &graph_reducer, &frame_specialization);
829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &native_context_specialization);
831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &context_specialization);
832f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AddReducer(data, &graph_reducer, &intrinsic_lowering);
833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &call_reducer);
834f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    AddReducer(data, &graph_reducer, &inlining);
835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    graph_reducer.ReduceGraph();
836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct TyperPhase {
841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* phase_name() { return "typer"; }
842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone, Typer* typer) {
844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    NodeVector roots(temp_zone);
845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    data->jsgraph()->GetCachedNodes(&roots);
846f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    LoopVariableOptimizer induction_vars(data->jsgraph()->graph(),
847f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                         data->common(), temp_zone);
848f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if (FLAG_turbo_loop_variable) induction_vars.Run();
849f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    typer->Run(roots, &induction_vars);
850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
853bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochstruct UntyperPhase {
854bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const char* phase_name() { return "untyper"; }
855bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
856bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
857bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    class RemoveTypeReducer final : public Reducer {
858bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch     public:
859bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Reduction Reduce(Node* node) final {
860bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        if (NodeProperties::IsTyped(node)) {
861bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          NodeProperties::RemoveType(node);
862bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          return Changed(node);
863bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        }
864bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        return NoChange();
865bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      }
866bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    };
867bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
868c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    NodeVector roots(temp_zone);
869c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    data->jsgraph()->GetCachedNodes(&roots);
870c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    for (Node* node : roots) {
871c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      NodeProperties::RemoveType(node);
872c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
873c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
874bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
875bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    RemoveTypeReducer remove_type_reducer;
876bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    AddReducer(data, &graph_reducer, &remove_type_reducer);
877bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    graph_reducer.ReduceGraph();
878bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
879bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
880bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct OsrDeconstructionPhase {
882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* phase_name() { return "OSR deconstruction"; }
883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
885c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    GraphTrimmer trimmer(temp_zone, data->graph());
886c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    NodeVector roots(temp_zone);
887c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    data->jsgraph()->GetCachedNodes(&roots);
888c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    trimmer.TrimGraph(roots.begin(), roots.end());
889c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    OsrHelper osr_helper(data->info());
891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    osr_helper.Deconstruct(data->jsgraph(), data->common(), temp_zone);
892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct TypedLoweringPhase {
897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "typed lowering"; }
898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(),
902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              data->common());
903f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSBuiltinReducer builtin_reducer(
904f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        &graph_reducer, data->jsgraph(),
905f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        data->info()->is_deoptimization_enabled()
906f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch            ? JSBuiltinReducer::kDeoptimizationEnabled
907f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch            : JSBuiltinReducer::kNoFlags,
908c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        data->info()->dependencies(), data->native_context());
90962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<FeedbackVector> feedback_vector(
91062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        data->info()->closure()->feedback_vector());
911109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    JSCreateLowering create_lowering(
912109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        &graph_reducer, data->info()->dependencies(), data->jsgraph(),
91362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        feedback_vector, data->native_context(), temp_zone);
914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSTypedLowering::Flags typed_lowering_flags = JSTypedLowering::kNoFlags;
915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (data->info()->is_deoptimization_enabled()) {
916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      typed_lowering_flags |= JSTypedLowering::kDeoptimizationEnabled;
917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSTypedLowering typed_lowering(&graph_reducer, data->info()->dependencies(),
919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   typed_lowering_flags, data->jsgraph(),
920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   temp_zone);
921f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    TypedOptimization typed_optimization(
922f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        &graph_reducer, data->info()->dependencies(),
923f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        data->info()->is_deoptimization_enabled()
924f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            ? TypedOptimization::kDeoptimizationEnabled
925f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            : TypedOptimization::kNoFlags,
926f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        data->jsgraph());
92713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimplifiedOperatorReducer simple_reducer(&graph_reducer, data->jsgraph());
92813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    CheckpointElimination checkpoint_elimination(&graph_reducer);
929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CommonOperatorReducer common_reducer(&graph_reducer, data->graph(),
930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                         data->common(), data->machine());
931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &dead_code_elimination);
932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &builtin_reducer);
933109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    if (data->info()->is_deoptimization_enabled()) {
934109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      AddReducer(data, &graph_reducer, &create_lowering);
935109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
936f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    AddReducer(data, &graph_reducer, &typed_optimization);
937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &typed_lowering);
9383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    AddReducer(data, &graph_reducer, &simple_reducer);
93913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    AddReducer(data, &graph_reducer, &checkpoint_elimination);
940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &common_reducer);
941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    graph_reducer.ReduceGraph();
942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct EscapeAnalysisPhase {
947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* phase_name() { return "escape analysis"; }
948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EscapeAnalysis escape_analysis(data->graph(), data->jsgraph()->common(),
951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   temp_zone);
95262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (!escape_analysis.Run()) return;
953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EscapeAnalysisReducer escape_reducer(&graph_reducer, data->jsgraph(),
955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                         &escape_analysis, temp_zone);
956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &escape_reducer);
957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    graph_reducer.ReduceGraph();
958c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    if (escape_reducer.compilation_failed()) {
959c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      data->set_compilation_failed();
960c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      return;
961c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
962109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    escape_reducer.VerifyReplacement();
963958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
965958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
96662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct SimplifiedLoweringPhase {
96762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static const char* phase_name() { return "simplified lowering"; }
968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SimplifiedLowering lowering(data->jsgraph(), temp_zone,
971f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                data->source_positions());
972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    lowering.LowerAllNodes();
973bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
974bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
975109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
976f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct LoopPeelingPhase {
977f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static const char* phase_name() { return "loop peeling"; }
978f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
979f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
980f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    GraphTrimmer trimmer(temp_zone, data->graph());
981f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    NodeVector roots(temp_zone);
982f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    data->jsgraph()->GetCachedNodes(&roots);
983f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    trimmer.TrimGraph(roots.begin(), roots.end());
984f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
985f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    LoopTree* loop_tree =
986f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        LoopFinder::BuildLoopTree(data->jsgraph()->graph(), temp_zone);
987f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    LoopPeeler::PeelInnerLoopsOfTree(data->graph(), data->common(), loop_tree,
988f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                     temp_zone);
989f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
990f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
991f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
992f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct LoopExitEliminationPhase {
993f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static const char* phase_name() { return "loop exit elimination"; }
994f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
995f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
996f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    LoopPeeler::EliminateLoopExits(data->graph(), temp_zone);
997f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
998f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
999f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
100062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct ConcurrentOptimizationPrepPhase {
100162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static const char* phase_name() {
100262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return "concurrent optimization preparation";
100362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
100462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
100562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
100662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // Make sure we cache these code stubs.
100762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    data->jsgraph()->CEntryStubConstant(1);
100862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    data->jsgraph()->CEntryStubConstant(2);
100962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    data->jsgraph()->CEntryStubConstant(3);
101062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
101162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // This is needed for escape analysis.
101262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    NodeProperties::SetType(data->jsgraph()->FalseConstant(), Type::Boolean());
101362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    NodeProperties::SetType(data->jsgraph()->TrueConstant(), Type::Boolean());
101462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
101562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
101662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1017f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct GenericLoweringPhase {
1018f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static const char* phase_name() { return "generic lowering"; }
1019f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1020f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
1021f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
1022f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSGenericLowering generic_lowering(data->jsgraph());
1023f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AddReducer(data, &graph_reducer, &generic_lowering);
1024f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    graph_reducer.ReduceGraph();
1025f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
1026f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
1027f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1028bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochstruct EarlyOptimizationPhase {
1029bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const char* phase_name() { return "early optimization"; }
1030109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1031bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
1032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
1033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(),
1034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              data->common());
103513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    SimplifiedOperatorReducer simple_reducer(&graph_reducer, data->jsgraph());
103613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    RedundancyElimination redundancy_elimination(&graph_reducer, temp_zone);
1037f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ValueNumberingReducer value_numbering(temp_zone, data->graph()->zone());
1038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    MachineOperatorReducer machine_reducer(data->jsgraph());
1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CommonOperatorReducer common_reducer(&graph_reducer, data->graph(),
1040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                         data->common(), data->machine());
1041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &dead_code_elimination);
1042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &simple_reducer);
104313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    AddReducer(data, &graph_reducer, &redundancy_elimination);
1044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &value_numbering);
1045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &machine_reducer);
1046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &common_reducer);
1047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    graph_reducer.ReduceGraph();
1048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct ControlFlowOptimizationPhase {
1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* phase_name() { return "control flow optimization"; }
1053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
1055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    ControlFlowOptimizer optimizer(data->graph(), data->common(),
1056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   data->machine(), temp_zone);
1057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    optimizer.Optimize();
1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
1060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1061bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochstruct EffectControlLinearizationPhase {
1062bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const char* phase_name() { return "effect linearization"; }
1063bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1064bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
1065bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // The scheduler requires the graphs to be trimmed, so trim now.
1066bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // TODO(jarin) Remove the trimming once the scheduler can handle untrimmed
1067bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // graphs.
1068bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    GraphTrimmer trimmer(temp_zone, data->graph());
1069bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    NodeVector roots(temp_zone);
1070bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    data->jsgraph()->GetCachedNodes(&roots);
1071bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    trimmer.TrimGraph(roots.begin(), roots.end());
1072bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1073bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // Schedule the graph without node splitting so that we can
1074bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // fix the effect and control flow for nodes with low-level side
1075bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // effects (such as changing representation to tagged or
1076bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // 'floating' allocation regions.)
1077bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Schedule* schedule = Scheduler::ComputeSchedule(temp_zone, data->graph(),
1078bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                                    Scheduler::kNoFlags);
1079bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    if (FLAG_turbo_verify) ScheduleVerifier::Run(schedule);
1080bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    TraceSchedule(data->info(), schedule);
1081bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1082bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // Post-pass for wiring the control/effects
1083bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // - connect allocating representation changes into the control&effect
1084bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    //   chains and lower them,
1085bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // - get rid of the region markers,
1086bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // - introduce effect phis and rewire effects to get SSA again.
1087c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    EffectControlLinearizer linearizer(data->jsgraph(), schedule, temp_zone,
1088c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                       data->source_positions());
1089bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    linearizer.Run();
1090bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
1091bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
1092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1093f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// The store-store elimination greatly benefits from doing a common operator
1094f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// reducer and dead code elimination just before it, to eliminate conditional
1095f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// deopts with a constant condition.
1096f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1097f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct DeadCodeEliminationPhase {
1098f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static const char* phase_name() { return "dead code elimination"; }
1099f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
1101f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
1102f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(),
1103f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                              data->common());
1104f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CommonOperatorReducer common_reducer(&graph_reducer, data->graph(),
1105f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                         data->common(), data->machine());
1106f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AddReducer(data, &graph_reducer, &dead_code_elimination);
1107f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AddReducer(data, &graph_reducer, &common_reducer);
1108f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    graph_reducer.ReduceGraph();
1109f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
1110f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
1111f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
111213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochstruct StoreStoreEliminationPhase {
1113f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static const char* phase_name() { return "store-store elimination"; }
111413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
111513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
1116f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    GraphTrimmer trimmer(temp_zone, data->graph());
1117f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    NodeVector roots(temp_zone);
1118f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    data->jsgraph()->GetCachedNodes(&roots);
1119f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    trimmer.TrimGraph(roots.begin(), roots.end());
1120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1121f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    StoreStoreElimination::Run(data->jsgraph(), temp_zone);
1122f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
1123f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
1124f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1125f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct LoadEliminationPhase {
1126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static const char* phase_name() { return "load elimination"; }
1127f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
1129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
1130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    BranchElimination branch_condition_elimination(&graph_reducer,
1131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                                   data->jsgraph(), temp_zone);
1132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(),
1133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                              data->common());
1134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    RedundancyElimination redundancy_elimination(&graph_reducer, temp_zone);
1135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    LoadElimination load_elimination(&graph_reducer, data->jsgraph(),
1136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                     temp_zone);
1137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ValueNumberingReducer value_numbering(temp_zone, data->graph()->zone());
1138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CommonOperatorReducer common_reducer(&graph_reducer, data->graph(),
1139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                         data->common(), data->machine());
1140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AddReducer(data, &graph_reducer, &branch_condition_elimination);
1141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AddReducer(data, &graph_reducer, &dead_code_elimination);
1142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AddReducer(data, &graph_reducer, &redundancy_elimination);
1143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AddReducer(data, &graph_reducer, &load_elimination);
1144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AddReducer(data, &graph_reducer, &value_numbering);
1145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AddReducer(data, &graph_reducer, &common_reducer);
1146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    graph_reducer.ReduceGraph();
114713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
114813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch};
114913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1150bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochstruct MemoryOptimizationPhase {
1151bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const char* phase_name() { return "memory optimization"; }
1152bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1153bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
115413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // The memory optimizer requires the graphs to be trimmed, so trim now.
115513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    GraphTrimmer trimmer(temp_zone, data->graph());
115613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    NodeVector roots(temp_zone);
115713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    data->jsgraph()->GetCachedNodes(&roots);
115813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    trimmer.TrimGraph(roots.begin(), roots.end());
115913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
116013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // Optimize allocations and load/store operations.
1161bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    MemoryOptimizer optimizer(data->jsgraph(), temp_zone);
1162bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    optimizer.Optimize();
1163bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
1164bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
1165bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1166bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochstruct LateOptimizationPhase {
1167bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const char* phase_name() { return "late optimization"; }
1168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
1171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    BranchElimination branch_condition_elimination(&graph_reducer,
1172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                                   data->jsgraph(), temp_zone);
1173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(),
1174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              data->common());
1175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ValueNumberingReducer value_numbering(temp_zone, data->graph()->zone());
1176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    MachineOperatorReducer machine_reducer(data->jsgraph());
1177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CommonOperatorReducer common_reducer(&graph_reducer, data->graph(),
1178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                         data->common(), data->machine());
1179bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SelectLowering select_lowering(data->jsgraph()->graph(),
1180bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                   data->jsgraph()->common());
1181bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    TailCallOptimization tco(data->common(), data->graph());
1182f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AddReducer(data, &graph_reducer, &branch_condition_elimination);
1183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &dead_code_elimination);
1184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &value_numbering);
1185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &machine_reducer);
1186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AddReducer(data, &graph_reducer, &common_reducer);
1187bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    AddReducer(data, &graph_reducer, &select_lowering);
1188bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    AddReducer(data, &graph_reducer, &tco);
1189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    graph_reducer.ReduceGraph();
1190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct EarlyGraphTrimmingPhase {
1194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* phase_name() { return "early graph trimming"; }
1195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    GraphTrimmer trimmer(temp_zone, data->graph());
1197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    NodeVector roots(temp_zone);
1198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    data->jsgraph()->GetCachedNodes(&roots);
1199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    trimmer.TrimGraph(roots.begin(), roots.end());
1200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct LateGraphTrimmingPhase {
1205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* phase_name() { return "late graph trimming"; }
1206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
1207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    GraphTrimmer trimmer(temp_zone, data->graph());
1208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    NodeVector roots(temp_zone);
1209c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    if (data->jsgraph()) {
1210c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      data->jsgraph()->GetCachedNodes(&roots);
1211c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
1212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    trimmer.TrimGraph(roots.begin(), roots.end());
1213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct ComputeSchedulePhase {
1218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "scheduling"; }
1219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Schedule* schedule = Scheduler::ComputeSchedule(
1222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        temp_zone, data->graph(), data->info()->is_splitting_enabled()
1223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                      ? Scheduler::kSplitNodes
1224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                      : Scheduler::kNoFlags);
1225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (FLAG_turbo_verify) ScheduleVerifier::Run(schedule);
1226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    data->set_schedule(schedule);
1227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct InstructionSelectionPhase {
1232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "select instructions"; }
1233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone, Linkage* linkage) {
1235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionSelector selector(
1236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        temp_zone, data->graph()->NodeCount(), linkage, data->sequence(),
1237109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        data->schedule(), data->source_positions(), data->frame(),
1238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        data->info()->is_source_positions_enabled()
1239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            ? InstructionSelector::kAllSourcePositions
1240f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            : InstructionSelector::kCallSourcePositions,
1241f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        InstructionSelector::SupportedFeatures(),
1242f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        FLAG_turbo_instruction_scheduling
1243f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            ? InstructionSelector::kEnableScheduling
1244f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            : InstructionSelector::kDisableScheduling,
1245f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        data->info()->will_serialize()
1246f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            ? InstructionSelector::kEnableSerialization
1247f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            : InstructionSelector::kDisableSerialization);
1248f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    if (!selector.SelectInstructions()) {
1249f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      data->set_compilation_failed();
1250f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
1251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct MeetRegisterConstraintsPhase {
1256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "meet register constraints"; }
1257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    ConstraintBuilder builder(data->register_allocation_data());
1260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    builder.MeetRegisterConstraints();
1261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct ResolvePhisPhase {
1266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "resolve phis"; }
1267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    ConstraintBuilder builder(data->register_allocation_data());
1270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    builder.ResolvePhis();
1271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct BuildLiveRangesPhase {
1276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "build live ranges"; }
1277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LiveRangeBuilder builder(data->register_allocation_data(), temp_zone);
1280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    builder.BuildLiveRanges();
1281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
1283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct SplinterLiveRangesPhase {
1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* phase_name() { return "splinter live ranges"; }
1287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
1289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LiveRangeSeparator live_range_splinterer(data->register_allocation_data(),
1290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                             temp_zone);
1291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    live_range_splinterer.Splinter();
1292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename RegAllocator>
1297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct AllocateGeneralRegistersPhase {
1298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "allocate general registers"; }
1299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RegAllocator allocator(data->register_allocation_data(), GENERAL_REGISTERS,
1302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           temp_zone);
1303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    allocator.AllocateRegisters();
1304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename RegAllocator>
1308bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochstruct AllocateFPRegistersPhase {
1309bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  static const char* phase_name() {
1310bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return "allocate floating point registers";
1311bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
1312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1314bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    RegAllocator allocator(data->register_allocation_data(), FP_REGISTERS,
1315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           temp_zone);
1316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    allocator.AllocateRegisters();
1317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct MergeSplintersPhase {
1322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* phase_name() { return "merge splintered ranges"; }
1323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Run(PipelineData* pipeline_data, Zone* temp_zone) {
1324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RegisterAllocationData* data = pipeline_data->register_allocation_data();
1325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LiveRangeMerger live_range_merger(data, temp_zone);
1326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    live_range_merger.Merge();
1327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
1329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct LocateSpillSlotsPhase {
1332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* phase_name() { return "locate spill slots"; }
1333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SpillSlotLocator locator(data->register_allocation_data());
1336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    locator.LocateSpillSlots();
1337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
1339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct AssignSpillSlotsPhase {
1342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* phase_name() { return "assign spill slots"; }
1343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
1345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    OperandAssigner assigner(data->register_allocation_data());
1346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    assigner.AssignSpillSlots();
1347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct CommitAssignmentPhase {
1352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "commit assignment"; }
1353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    OperandAssigner assigner(data->register_allocation_data());
1356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    assigner.CommitAssignment();
1357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct PopulateReferenceMapsPhase {
1362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "populate pointer maps"; }
1363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    ReferenceMapPopulator populator(data->register_allocation_data());
1366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    populator.PopulateReferenceMaps();
1367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct ConnectRangesPhase {
1372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "connect ranges"; }
1373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LiveRangeConnector connector(data->register_allocation_data());
1376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    connector.ConnectRanges(temp_zone);
1377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct ResolveControlFlowPhase {
1382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "resolve control flow"; }
1383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LiveRangeConnector connector(data->register_allocation_data());
1386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    connector.ResolveControlFlow(temp_zone);
1387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct OptimizeMovesPhase {
1392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "optimize moves"; }
1393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone) {
1395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    MoveOptimizer move_optimizer(temp_zone, data->sequence());
1396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    move_optimizer.Run();
1397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct FrameElisionPhase {
1402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const char* phase_name() { return "frame elision"; }
1403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone) {
1405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FrameElider(data->sequence()).Run();
1406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
1408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct JumpThreadingPhase {
1411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "jump threading"; }
1412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1413109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone, bool frame_at_start) {
1414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    ZoneVector<RpoNumber> result(temp_zone);
1415109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    if (JumpThreading::ComputeForwarding(temp_zone, result, data->sequence(),
1416109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                         frame_at_start)) {
1417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      JumpThreading::ApplyForwarding(result, data->sequence());
1418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct GenerateCodePhase {
1424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return "generate code"; }
1425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone, Linkage* linkage) {
1427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    CodeGenerator generator(data->frame(), linkage, data->sequence(),
1428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                            data->info());
1429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    data->set_code(generator.GenerateCode());
1430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct PrintGraphPhase {
1435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return nullptr; }
1436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Run(PipelineData* data, Zone* temp_zone, const char* phase) {
1438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    CompilationInfo* info = data->info();
1439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Graph* graph = data->graph();
1440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    {  // Print JSON.
1442bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      AllowHandleDereference allow_deref;
1443bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      TurboJsonFile json_of(info, std::ios_base::app);
1444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      json_of << "{\"name\":\"" << phase << "\",\"type\":\"graph\",\"data\":"
1445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              << AsJSON(*graph, data->source_positions()) << "},\n";
1446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (FLAG_trace_turbo_graph) {  // Simple textual RPO.
1449bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      AllowHandleDereference allow_deref;
1450f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      CodeTracer::Scope tracing_scope(info->isolate()->GetCodeTracer());
1451f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      OFStream os(tracing_scope.file());
1452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      os << "-- Graph after " << phase << " -- " << std::endl;
1453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      os << AsRPO(*graph);
1454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct VerifyGraphPhase {
1460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const char* phase_name() { return nullptr; }
1461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1462bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void Run(PipelineData* data, Zone* temp_zone, const bool untyped,
1463bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch           bool values_only = false) {
1464bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Verifier::Run(data->graph(), !untyped ? Verifier::TYPED : Verifier::UNTYPED,
1465bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                  values_only ? Verifier::kValuesOnly : Verifier::kAll);
1466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1469bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid PipelineImpl::RunPrintAndVerify(const char* phase, bool untyped) {
1470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_trace_turbo) {
1471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Run<PrintGraphPhase>(phase);
1472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FLAG_turbo_verify) {
1474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Run<VerifyGraphPhase>(untyped);
1475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1478bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochbool PipelineImpl::CreateGraph() {
1479bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineData* data = this->data_;
1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1481bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  data->BeginPhaseKind("graph creation");
1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_trace_turbo) {
1484f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer());
1485f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    OFStream os(tracing_scope.file());
1486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os << "---------------------------------------------------\n"
1487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch       << "Begin compiling method " << info()->GetDebugName().get()
1488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier       << " using Turbofan" << std::endl;
1489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    TurboCfgFile tcf(isolate());
1490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    tcf << AsC1VCompilation(info());
1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1493bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  data->source_positions()->AddDecorator();
1494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_loop_assignment_analysis) {
1496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Run<LoopAssignmentAnalysisPhase>();
1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Run<GraphBuilderPhase>();
1500bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (data->compilation_failed()) {
1501bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    data->EndPhaseKind();
1502bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return false;
1503bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
1504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  RunPrintAndVerify("Initial untyped", true);
1505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Perform OSR deconstruction.
1507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (info()->is_osr()) {
1508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Run<OsrDeconstructionPhase>();
1509c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1510c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Run<UntyperPhase>();
1511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RunPrintAndVerify("OSR deconstruction", true);
1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Perform function context specialization and inlining (if enabled).
1515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Run<InliningPhase>();
1516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunPrintAndVerify("Inlined", true);
1517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Remove dead->live edges from the graph.
1519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Run<EarlyGraphTrimmingPhase>();
1520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunPrintAndVerify("Early trimmed", true);
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_print_turbo_replay) {
1523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    // Print a replay of the initial graph.
1524bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    GraphReplayPrinter::PrintReplay(data->graph());
1525bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
1526bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1527bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Run the type-sensitive lowerings and optimizations on the graph.
1528bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  {
1529c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // Determine the Typer operation flags.
1530c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Typer::Flags flags = Typer::kNoFlags;
1531c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    if (is_sloppy(info()->shared_info()->language_mode()) &&
153262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        info()->shared_info()->IsUserJavaScript()) {
1533c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // Sloppy mode functions always have an Object for this.
1534c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      flags |= Typer::kThisIsReceiver;
1535c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
1536c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    if (IsClassConstructor(info()->shared_info()->kind())) {
1537c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // Class constructors cannot be [[Call]]ed.
1538c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      flags |= Typer::kNewTargetIsReceiver;
1539c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
1540c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1541bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // Type the graph and keep the Typer running on newly created nodes within
1542bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // this scope; the Typer is automatically unlinked from the Graph once we
1543bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    // leave this scope below.
1544c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Typer typer(isolate(), flags, data->graph());
1545bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Run<TyperPhase>(&typer);
1546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    RunPrintAndVerify("Typed");
1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1548bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    data->BeginPhaseKind("lowering");
1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    // Lower JSOperators where we can determine types.
1551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Run<TypedLoweringPhase>();
1552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    RunPrintAndVerify("Lowered typed");
155362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
1554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
155562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Do some hacky things to prepare for the optimization phase.
155662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // (caching handles, etc.).
155762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Run<ConcurrentOptimizationPrepPhase>();
1558f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
155962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  data->EndPhaseKind();
1560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
156162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return true;
156262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
1563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
156462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool PipelineImpl::OptimizeGraph(Linkage* linkage) {
156562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  PipelineData* data = this->data_;
156662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
156762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (data->info()->is_loop_peeling_enabled()) {
156862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Run<LoopPeelingPhase>();
156962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    RunPrintAndVerify("Loops peeled", true);
157062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else {
157162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Run<LoopExitEliminationPhase>();
157262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    RunPrintAndVerify("Loop exits eliminated", true);
157362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
157462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
157562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!data->is_asm()) {
157662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (FLAG_turbo_load_elimination) {
157762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Run<LoadEliminationPhase>();
157862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      RunPrintAndVerify("Load eliminated");
157962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
158062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
158162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (FLAG_turbo_escape) {
158262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Run<EscapeAnalysisPhase>();
158362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      if (data->compilation_failed()) {
158462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        info()->AbortOptimization(kCyclicObjectStateDetectedInEscapeAnalysis);
158562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        data->EndPhaseKind();
158662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        return false;
1587c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      }
158862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      RunPrintAndVerify("Escape Analysed");
1589f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
1590bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
159262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Perform simplified lowering. This has to run w/o the Typer decorator,
159362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // because we cannot compute meaningful types anyways, and the computed types
159462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // might even conflict with the representation/truncation logic.
159562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Run<SimplifiedLoweringPhase>();
159662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  RunPrintAndVerify("Simplified lowering", true);
1597f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1598bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#ifdef DEBUG
1599bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // From now on it is invalid to look at types on the nodes, because:
1600bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  //
1601bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  //  (a) The remaining passes (might) run concurrent to the main thread and
1602bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  //      therefore must not access the Heap or the Isolate in an uncontrolled
1603bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  //      way (as done by the type system), and
1604bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  //  (b) the types on the nodes might not make sense after representation
1605bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  //      selection due to the way we handle truncations; if we'd want to look
1606bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  //      at types afterwards we'd essentially need to re-type (large portions
1607bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  //      of) the graph.
1608bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  //
1609bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // In order to catch bugs related to type access after this point we remove
1610bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // the types from the nodes at this point (currently only in Debug builds).
1611bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Run<UntyperPhase>();
1612bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  RunPrintAndVerify("Untyped", true);
1613bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#endif
1614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1615f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Run generic lowering pass.
1616f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Run<GenericLoweringPhase>();
1617f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  RunPrintAndVerify("Generic lowering", true);
161813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1619bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  data->BeginPhaseKind("block building");
1620bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1621f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Run early optimization pass.
1622f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Run<EarlyOptimizationPhase>();
1623f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  RunPrintAndVerify("Early optimized", true);
1624f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1625bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Run<EffectControlLinearizationPhase>();
1626bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  RunPrintAndVerify("Effect and control linearized", true);
1627bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1628f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Run<DeadCodeEliminationPhase>();
1629f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  RunPrintAndVerify("Dead code elimination", true);
1630f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
163113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (FLAG_turbo_store_elimination) {
163213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Run<StoreStoreEliminationPhase>();
163313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    RunPrintAndVerify("Store-store elimination", true);
163413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
163513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1636bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Optimize control flow.
1637bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (FLAG_turbo_cf_optimization) {
1638bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Run<ControlFlowOptimizationPhase>();
1639bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    RunPrintAndVerify("Control flow optimized", true);
1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1642bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Optimize memory access and allocation operations.
1643bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Run<MemoryOptimizationPhase>();
1644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // TODO(jarin, rossberg): Remove UNTYPED once machine typing works.
1645bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  RunPrintAndVerify("Memory optimized", true);
1646bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1647bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Lower changes that have been inserted before.
1648bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Run<LateOptimizationPhase>();
1649bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // TODO(jarin, rossberg): Remove UNTYPED once machine typing works.
1650bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  RunPrintAndVerify("Late optimized", true);
1651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1652bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  data->source_positions()->RemoveDecorator();
1653109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1654c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return ScheduleAndSelectInstructions(linkage, true);
1655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Code> Pipeline::GenerateCodeForCodeStub(Isolate* isolate,
1658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               CallDescriptor* call_descriptor,
1659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               Graph* graph, Schedule* schedule,
1660109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                               Code::Flags flags,
1661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               const char* debug_name) {
1662bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  CompilationInfo info(CStrVector(debug_name), isolate, graph->zone(), flags);
1663f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (isolate->serializer_enabled()) info.PrepareForSerializing();
1664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Construct a pipeline for scheduling and code generation.
1666c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ZoneStats zone_stats(isolate->allocator());
166762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  SourcePositionTable source_positions(graph);
166862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  PipelineData data(&zone_stats, &info, graph, schedule, &source_positions);
166962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  data.set_verify_graph(FLAG_verify_csa);
1670f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  std::unique_ptr<PipelineStatistics> pipeline_statistics;
167113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) {
1672c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    pipeline_statistics.reset(new PipelineStatistics(&info, &zone_stats));
1673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    pipeline_statistics->BeginPhaseKind("stub codegen");
1674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1676bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineImpl pipeline(&data);
1677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_NOT_NULL(data.schedule());
1678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_trace_turbo) {
168013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    {
168162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      CodeTracer::Scope tracing_scope(isolate->GetCodeTracer());
168262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      OFStream os(tracing_scope.file());
168362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      os << "---------------------------------------------------\n"
168462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         << "Begin compiling " << debug_name << " using Turbofan" << std::endl;
168562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
168662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    {
168713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      TurboJsonFile json_of(&info, std::ios_base::trunc);
168813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      json_of << "{\"function\":\"" << info.GetDebugName().get()
168913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              << "\", \"source\":\"\",\n\"phases\":[";
169013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    }
1691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    pipeline.Run<PrintGraphPhase>("Machine");
1692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1694bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  pipeline.Run<VerifyGraphPhase>(false, true);
1695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return pipeline.ScheduleAndGenerateCode(call_descriptor);
1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1698bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// static
1699bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochHandle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info) {
1700c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ZoneStats zone_stats(info->isolate()->allocator());
1701f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  std::unique_ptr<PipelineStatistics> pipeline_statistics(
1702c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      CreatePipelineStatistics(info, &zone_stats));
1703c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  PipelineData data(&zone_stats, info, pipeline_statistics.get());
1704bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineImpl pipeline(&data);
1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1706bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Linkage linkage(Linkage::ComputeIncoming(data.instruction_zone(), info));
1707bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1708bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (!pipeline.CreateGraph()) return Handle<Code>::null();
1709bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (!pipeline.OptimizeGraph(&linkage)) return Handle<Code>::null();
1710bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return pipeline.GenerateCode(&linkage);
1711bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
1712bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1713bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// static
1714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info,
1715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                              Graph* graph,
1716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                              Schedule* schedule) {
1717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CallDescriptor* call_descriptor =
1718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Linkage::ComputeIncoming(info->zone(), info);
1719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return GenerateCodeForTesting(info, call_descriptor, graph, schedule);
1720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1722bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// static
172362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Code> Pipeline::GenerateCodeForTesting(
172462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    CompilationInfo* info, CallDescriptor* call_descriptor, Graph* graph,
172562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Schedule* schedule, SourcePositionTable* source_positions) {
1726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Construct a pipeline for scheduling and code generation.
1727c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ZoneStats zone_stats(info->isolate()->allocator());
172862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // TODO(wasm): Refactor code generation to check for non-existing source
172962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // table, then remove this conditional allocation.
173062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!source_positions)
173162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    source_positions = new (info->zone()) SourcePositionTable(graph);
173262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  PipelineData data(&zone_stats, info, graph, schedule, source_positions);
1733f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  std::unique_ptr<PipelineStatistics> pipeline_statistics;
173413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) {
1735c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    pipeline_statistics.reset(new PipelineStatistics(info, &zone_stats));
1736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    pipeline_statistics->BeginPhaseKind("test codegen");
1737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1739bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineImpl pipeline(&data);
1740bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1741bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (FLAG_trace_turbo) {
1742bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    TurboJsonFile json_of(info, std::ios_base::trunc);
1743bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    json_of << "{\"function\":\"" << info->GetDebugName().get()
1744bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch            << "\", \"source\":\"\",\n\"phases\":[";
1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1746bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // TODO(rossberg): Should this really be untyped?
1747bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  pipeline.RunPrintAndVerify("Machine", true);
1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return pipeline.ScheduleAndGenerateCode(call_descriptor);
1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1752bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// static
175362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCompilationJob* Pipeline::NewCompilationJob(Handle<JSFunction> function,
175462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                            bool has_script) {
175562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<SharedFunctionInfo> shared = handle(function->shared());
175662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ParseInfo* parse_info;
175762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!has_script) {
175862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    parse_info = ParseInfo::AllocateWithoutScript(shared);
175962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else {
176062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    parse_info = new ParseInfo(shared);
176162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
176262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return new PipelineCompilationJob(parse_info, function);
1763bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
1764bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1765bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// static
1766bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochCompilationJob* Pipeline::NewWasmCompilationJob(
176762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    CompilationInfo* info, JSGraph* jsgraph, CallDescriptor* descriptor,
176862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    SourcePositionTable* source_positions,
176962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    ZoneVector<trap_handler::ProtectedInstructionData>* protected_instructions,
177062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    bool allow_signalling_nan) {
177162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return new PipelineWasmCompilationJob(
177262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      info, jsgraph, descriptor, source_positions, protected_instructions,
177362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      allow_signalling_nan);
1774bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool Pipeline::AllocateRegistersForTesting(const RegisterConfiguration* config,
1777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                           InstructionSequence* sequence,
1778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                           bool run_verifier) {
1779bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  CompilationInfo info(ArrayVector("testing"), sequence->isolate(),
1780f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                       sequence->zone(), Code::ComputeFlags(Code::STUB));
1781c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ZoneStats zone_stats(sequence->isolate()->allocator());
1782c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  PipelineData data(&zone_stats, &info, sequence);
1783bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineImpl pipeline(&data);
1784109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  pipeline.data_->InitializeFrameData(nullptr);
1785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  pipeline.AllocateRegisters(config, nullptr, run_verifier);
1786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return !data.compilation_failed();
1787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1789c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochbool PipelineImpl::ScheduleAndSelectInstructions(Linkage* linkage,
1790c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                 bool trim_graph) {
1791bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  CallDescriptor* call_descriptor = linkage->GetIncomingDescriptor();
1792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PipelineData* data = this->data_;
1793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK_NOT_NULL(data->graph());
1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1796c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (trim_graph) {
1797c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Run<LateGraphTrimmingPhase>();
1798c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    RunPrintAndVerify("Late trimmed", true);
1799c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
1800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (data->schedule() == nullptr) Run<ComputeSchedulePhase>();
1801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TraceSchedule(data->info(), data->schedule());
1802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_turbo_profiling) {
1804bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    data->set_profiler_data(BasicBlockInstrumentor::Instrument(
1805bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        info(), data->graph(), data->schedule()));
1806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
180862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool verify_stub_graph = data->verify_graph();
180962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (verify_stub_graph ||
181062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      (FLAG_turbo_verify_machine_graph != nullptr &&
181162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch       (!strcmp(FLAG_turbo_verify_machine_graph, "*") ||
181262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        !strcmp(FLAG_turbo_verify_machine_graph, data->debug_name())))) {
181362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (FLAG_trace_verify_csa) {
181462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      AllowHandleDereference allow_deref;
181562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      CompilationInfo* info = data->info();
181662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      CodeTracer::Scope tracing_scope(info->isolate()->GetCodeTracer());
181762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      OFStream os(tracing_scope.file());
181862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      os << "--------------------------------------------------\n"
181962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         << "--- Verifying " << data->debug_name() << " generated by TurboFan\n"
182062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         << "--------------------------------------------------\n"
182162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         << *data->schedule()
182262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         << "--------------------------------------------------\n"
182362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         << "--- End of " << data->debug_name() << " generated by TurboFan\n"
182462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         << "--------------------------------------------------\n";
182562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
1826c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Zone temp_zone(data->isolate()->allocator(), ZONE_NAME);
1827f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    MachineGraphVerifier::Run(data->graph(), data->schedule(), linkage,
182862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                              data->info()->IsStub(), data->debug_name(),
1829f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                              &temp_zone);
1830f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
1831f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
18323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  data->InitializeInstructionSequence(call_descriptor);
1833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1834109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  data->InitializeFrameData(call_descriptor);
1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Select and schedule instructions covering the scheduled graph.
1836bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Run<InstructionSelectionPhase>(linkage);
1837f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (data->compilation_failed()) {
1838f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    info()->AbortOptimization(kCodeGenerationFailed);
1839f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    data->EndPhaseKind();
1840f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return false;
1841f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
1842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) {
1844bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    AllowHandleDereference allow_deref;
1845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    TurboCfgFile tcf(isolate());
1846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    tcf << AsC1V("CodeGen", data->schedule(), data->source_positions(),
1847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                 data->sequence());
1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FLAG_trace_turbo) {
1851bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    std::ostringstream source_position_output;
1852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Output source position information before the graph is deleted.
1853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    data_->source_positions()->Print(source_position_output);
1854bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    data_->set_source_position_output(source_position_output.str());
1855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  data->DeleteGraphZone();
1858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1859bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  data->BeginPhaseKind("register allocation");
1860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool run_verifier = FLAG_turbo_verify_allocation;
1862109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Allocate registers.
186413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  AllocateRegisters(RegisterConfiguration::Turbofan(), call_descriptor,
186513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                    run_verifier);
18663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Run<FrameElisionPhase>();
1867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (data->compilation_failed()) {
1868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    info()->AbortOptimization(kNotEnoughVirtualRegistersRegalloc);
1869bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    data->EndPhaseKind();
1870bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return false;
1871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1873109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // TODO(mtrofin): move this off to the register allocator.
1874109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool generate_frame_at_start =
18753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      data_->sequence()->instruction_blocks().front()->must_construct_frame();
1876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Optimimize jumps.
1877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_turbo_jt) {
1878109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Run<JumpThreadingPhase>(generate_frame_at_start);
1879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1881bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  data->EndPhaseKind();
1882bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1883bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return true;
1884bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
1885bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1886bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochHandle<Code> PipelineImpl::GenerateCode(Linkage* linkage) {
1887bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineData* data = this->data_;
1888bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1889bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  data->BeginPhaseKind("code generation");
1890bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Generate final machine code.
1892bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Run<GenerateCodePhase>(linkage);
1893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> code = data->code();
1895bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (data->profiler_data()) {
1896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if ENABLE_DISASSEMBLER
1897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    std::ostringstream os;
1898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    code->Disassemble(nullptr, os);
1899bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    data->profiler_data()->SetCode(&os);
1900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  info()->SetCode(code);
1904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::internal::CodeGenerator::PrintCode(code, info());
1905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FLAG_trace_turbo) {
1907bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    TurboJsonFile json_of(info(), std::ios_base::app);
1908bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    json_of << "{\"name\":\"disassembly\",\"type\":\"disassembly\",\"data\":\"";
1909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if ENABLE_DISASSEMBLER
1910bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    std::stringstream disassembly_stream;
1911bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    code->Disassemble(nullptr, disassembly_stream);
1912bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    std::string disassembly_string(disassembly_stream.str());
1913bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    for (const auto& c : disassembly_string) {
1914bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      json_of << AsEscapedUC16ForJSON(c);
1915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1916bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#endif  // ENABLE_DISASSEMBLER
1917bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    json_of << "\"}\n],\n";
1918bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    json_of << "\"nodePositions\":";
1919bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    json_of << data->source_position_output();
1920bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    json_of << "}";
1921bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1922f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer());
1923f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    OFStream os(tracing_scope.file());
1924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    os << "---------------------------------------------------\n"
1925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch       << "Finished compiling method " << info()->GetDebugName().get()
1926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch       << " using Turbofan" << std::endl;
1927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return code;
1930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1932bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochHandle<Code> PipelineImpl::ScheduleAndGenerateCode(
1933bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    CallDescriptor* call_descriptor) {
1934bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Linkage linkage(call_descriptor);
1935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1936bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Schedule the graph, perform instruction selection and register allocation.
1937c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (!ScheduleAndSelectInstructions(&linkage, false)) return Handle<Code>();
1938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1939bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Generate the final machine code.
1940bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return GenerateCode(&linkage);
1941bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
1942bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1943bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid PipelineImpl::AllocateRegisters(const RegisterConfiguration* config,
1944bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                     CallDescriptor* descriptor,
1945bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                     bool run_verifier) {
1946bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  PipelineData* data = this->data_;
1947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Don't track usage for this zone in compiler stats.
1948f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  std::unique_ptr<Zone> verifier_zone;
1949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  RegisterAllocatorVerifier* verifier = nullptr;
1950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (run_verifier) {
1951c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    verifier_zone.reset(new Zone(isolate()->allocator(), ZONE_NAME));
1952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    verifier = new (verifier_zone.get()) RegisterAllocatorVerifier(
1953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        verifier_zone.get(), config, data->sequence());
1954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifdef DEBUG
19573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  data_->sequence()->ValidateEdgeSplitForm();
1958bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  data_->sequence()->ValidateDeferredBlockEntryPaths();
19593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  data_->sequence()->ValidateDeferredBlockExitPaths();
1960958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1962bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  data->InitializeRegisterAllocationData(config, descriptor);
1963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (info()->is_osr()) {
1964f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AllowHandleDereference allow_deref;
1965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    OsrHelper osr_helper(info());
1966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    osr_helper.SetupFrame(data->frame());
1967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Run<MeetRegisterConstraintsPhase>();
1970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Run<ResolvePhisPhase>();
1971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Run<BuildLiveRangesPhase>();
1972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_trace_turbo_graph) {
1973bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    AllowHandleDereference allow_deref;
1974f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer());
1975f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    OFStream os(tracing_scope.file());
1976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os << "----- Instruction sequence before register allocation -----\n"
1977bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch       << PrintableInstructionSequence({config, data->sequence()});
1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (verifier != nullptr) {
1980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(!data->register_allocation_data()->ExistsUseWithoutDefinition());
1981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(data->register_allocation_data()
1982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              ->RangesDefinedInDeferredStayInDeferred());
1983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FLAG_turbo_preprocess_ranges) {
1986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Run<SplinterLiveRangesPhase>();
1987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
198913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Run<AllocateGeneralRegistersPhase<LinearScanAllocator>>();
199013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Run<AllocateFPRegistersPhase<LinearScanAllocator>>();
1991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FLAG_turbo_preprocess_ranges) {
1993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Run<MergeSplintersPhase>();
1994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Run<AssignSpillSlotsPhase>();
1997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Run<CommitAssignmentPhase>();
1999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Run<PopulateReferenceMapsPhase>();
2000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Run<ConnectRangesPhase>();
2001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Run<ResolveControlFlowPhase>();
2002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_turbo_move_optimization) {
2003958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Run<OptimizeMovesPhase>();
2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
20063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Run<LocateSpillSlotsPhase>();
20073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_trace_turbo_graph) {
2009bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    AllowHandleDereference allow_deref;
2010f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer());
2011f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    OFStream os(tracing_scope.file());
2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os << "----- Instruction sequence after register allocation -----\n"
2013bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch       << PrintableInstructionSequence({config, data->sequence()});
2014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (verifier != nullptr) {
2017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    verifier->VerifyAssignment();
2018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    verifier->VerifyGapMoves();
2019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) {
2022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    TurboCfgFile tcf(data->isolate());
2023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    tcf << AsC1VRegisterAllocationData("CodeGen",
2024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       data->register_allocation_data());
2025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->DeleteRegisterAllocationZone();
2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2030bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochCompilationInfo* PipelineImpl::info() const { return data_->info(); }
2031bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2032bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochIsolate* PipelineImpl::isolate() const { return info()->isolate(); }
2033109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
2035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
2036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
2037