| Index: src/compiler/pipeline.cc
|
| diff --git a/src/compiler/pipeline.cc b/src/compiler/pipeline.cc
|
| index aec27c4f3c9089934de96558c912977ddcf61f43..ee36f859417f6319b3baafe1c3ce3c09e1a61ddc 100644
|
| --- a/src/compiler/pipeline.cc
|
| +++ b/src/compiler/pipeline.cc
|
| @@ -111,6 +111,7 @@ class PipelineData {
|
| javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_);
|
| jsgraph_ = new (graph_zone_)
|
| JSGraph(isolate_, graph_, common_, javascript_, simplified_, machine_);
|
| + is_asm_ = info->shared_info()->asm_function();
|
| }
|
|
|
| // For WASM compile entry point.
|
| @@ -133,7 +134,10 @@ class PipelineData {
|
| instruction_zone_(instruction_zone_scope_.zone()),
|
| register_allocation_zone_scope_(zone_stats_, ZONE_NAME),
|
| register_allocation_zone_(register_allocation_zone_scope_.zone()),
|
| - protected_instructions_(protected_instructions) {}
|
| + protected_instructions_(protected_instructions) {
|
| + is_asm_ =
|
| + info->has_shared_info() ? info->shared_info()->asm_function() : false;
|
| + }
|
|
|
| // For machine graph testing entry point.
|
| PipelineData(ZoneStats* zone_stats, CompilationInfo* info, Graph* graph,
|
| @@ -149,8 +153,9 @@ class PipelineData {
|
| instruction_zone_scope_(zone_stats_, ZONE_NAME),
|
| instruction_zone_(instruction_zone_scope_.zone()),
|
| register_allocation_zone_scope_(zone_stats_, ZONE_NAME),
|
| - register_allocation_zone_(register_allocation_zone_scope_.zone()) {}
|
| -
|
| + register_allocation_zone_(register_allocation_zone_scope_.zone()) {
|
| + is_asm_ = false;
|
| + }
|
| // For register allocation testing entry point.
|
| PipelineData(ZoneStats* zone_stats, CompilationInfo* info,
|
| InstructionSequence* sequence)
|
| @@ -163,7 +168,10 @@ class PipelineData {
|
| instruction_zone_(sequence->zone()),
|
| sequence_(sequence),
|
| register_allocation_zone_scope_(zone_stats_, ZONE_NAME),
|
| - register_allocation_zone_(register_allocation_zone_scope_.zone()) {}
|
| + register_allocation_zone_(register_allocation_zone_scope_.zone()) {
|
| + is_asm_ =
|
| + info->has_shared_info() ? info->shared_info()->asm_function() : false;
|
| + }
|
|
|
| ~PipelineData() {
|
| DeleteRegisterAllocationZone();
|
| @@ -178,6 +186,7 @@ class PipelineData {
|
| bool compilation_failed() const { return compilation_failed_; }
|
| void set_compilation_failed() { compilation_failed_ = true; }
|
|
|
| + bool is_asm() const { return is_asm_; }
|
| bool verify_graph() const { return verify_graph_; }
|
| void set_verify_graph(bool value) { verify_graph_ = value; }
|
|
|
| @@ -328,6 +337,7 @@ class PipelineData {
|
| PipelineStatistics* pipeline_statistics_ = nullptr;
|
| bool compilation_failed_ = false;
|
| bool verify_graph_ = false;
|
| + bool is_asm_ = false;
|
| Handle<Code> code_ = Handle<Code>::null();
|
|
|
| // All objects in the following group of fields are allocated in graph_zone_.
|
| @@ -979,14 +989,20 @@ struct LoopExitEliminationPhase {
|
| }
|
| };
|
|
|
| -struct GenericLoweringPrepPhase {
|
| - static const char* phase_name() { return "generic lowering prep"; }
|
| +struct ConcurrentOptimizationPrepPhase {
|
| + static const char* phase_name() {
|
| + return "concurrent optimization preparation";
|
| + }
|
|
|
| void Run(PipelineData* data, Zone* temp_zone) {
|
| // Make sure we cache these code stubs.
|
| data->jsgraph()->CEntryStubConstant(1);
|
| data->jsgraph()->CEntryStubConstant(2);
|
| data->jsgraph()->CEntryStubConstant(3);
|
| +
|
| + // This is needed for escape analysis.
|
| + NodeProperties::SetType(data->jsgraph()->FalseConstant(), Type::Boolean());
|
| + NodeProperties::SetType(data->jsgraph()->TrueConstant(), Type::Boolean());
|
| }
|
| };
|
|
|
| @@ -1540,21 +1556,12 @@ bool PipelineImpl::CreateGraph() {
|
| Run<LoadEliminationPhase>();
|
| RunPrintAndVerify("Load eliminated");
|
| }
|
| -
|
| - if (FLAG_turbo_escape) {
|
| - Run<EscapeAnalysisPhase>();
|
| - if (data->compilation_failed()) {
|
| - info()->AbortOptimization(kCyclicObjectStateDetectedInEscapeAnalysis);
|
| - data->EndPhaseKind();
|
| - return false;
|
| - }
|
| - RunPrintAndVerify("Escape Analysed");
|
| - }
|
| }
|
| }
|
|
|
| - // Do some hacky things to prepare generic lowering.
|
| - Run<GenericLoweringPrepPhase>();
|
| + // Do some hacky things to prepare for the optimization phase.
|
| + // (caching handles, etc.).
|
| + Run<ConcurrentOptimizationPrepPhase>();
|
|
|
| data->EndPhaseKind();
|
|
|
| @@ -1564,6 +1571,18 @@ bool PipelineImpl::CreateGraph() {
|
| bool PipelineImpl::OptimizeGraph(Linkage* linkage) {
|
| PipelineData* data = this->data_;
|
|
|
| + if (!data->is_asm()) {
|
| + if (FLAG_turbo_escape) {
|
| + Run<EscapeAnalysisPhase>();
|
| + if (data->compilation_failed()) {
|
| + info()->AbortOptimization(kCyclicObjectStateDetectedInEscapeAnalysis);
|
| + data->EndPhaseKind();
|
| + return false;
|
| + }
|
| + RunPrintAndVerify("Escape Analysed");
|
| + }
|
| + }
|
| +
|
| // Perform simplified lowering. This has to run w/o the Typer decorator,
|
| // because we cannot compute meaningful types anyways, and the computed types
|
| // might even conflict with the representation/truncation logic.
|
|
|