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