1// Copyright 2014 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef V8_COMPILER_JS_CONTEXT_SPECIALIZATION_H_ 6#define V8_COMPILER_JS_CONTEXT_SPECIALIZATION_H_ 7 8#include "src/compiler/graph-reducer.h" 9#include "src/handles/maybe-handles.h" 10 11namespace v8 { 12namespace internal { 13namespace compiler { 14 15// Forward declarations. 16class JSGraph; 17class JSOperatorBuilder; 18 19// Pair of a context and its distance from some point of reference. 20struct OuterContext { 21 OuterContext() = default; 22 OuterContext(Handle<Context> context_, size_t distance_) 23 : context(context_), distance(distance_) {} 24 25 Handle<Context> context; 26 size_t distance = 0; 27}; 28 29// Specializes a given JSGraph to a given context, potentially constant folding 30// some {LoadContext} nodes or strength reducing some {StoreContext} nodes. 31// Additionally, constant-folds the function parameter if {closure} is given, 32// and constant-folds import.meta loads if the corresponding object already 33// exists. 34// 35// The context can be the incoming function context or any outer context 36// thereof, as indicated by {outer}'s {distance}. 37class V8_EXPORT_PRIVATE JSContextSpecialization final : public AdvancedReducer { 38 public: 39 JSContextSpecialization(Editor* editor, JSGraph* jsgraph, 40 JSHeapBroker* broker, Maybe<OuterContext> outer, 41 MaybeHandle<JSFunction> closure) 42 : AdvancedReducer(editor), 43 jsgraph_(jsgraph), 44 outer_(outer), 45 closure_(closure), 46 broker_(broker) {} 47 JSContextSpecialization(const JSContextSpecialization&) = delete; 48 JSContextSpecialization& operator=(const JSContextSpecialization&) = delete; 49 50 const char* reducer_name() const override { 51 return "JSContextSpecialization"; 52 } 53 54 Reduction Reduce(Node* node) final; 55 56 private: 57 Reduction ReduceParameter(Node* node); 58 Reduction ReduceJSLoadContext(Node* node); 59 Reduction ReduceJSStoreContext(Node* node); 60 Reduction ReduceJSGetImportMeta(Node* node); 61 62 Reduction SimplifyJSStoreContext(Node* node, Node* new_context, 63 size_t new_depth); 64 Reduction SimplifyJSLoadContext(Node* node, Node* new_context, 65 size_t new_depth); 66 67 Isolate* isolate() const; 68 JSGraph* jsgraph() const { return jsgraph_; } 69 Maybe<OuterContext> outer() const { return outer_; } 70 MaybeHandle<JSFunction> closure() const { return closure_; } 71 JSHeapBroker* broker() const { return broker_; } 72 73 JSGraph* const jsgraph_; 74 Maybe<OuterContext> outer_; 75 MaybeHandle<JSFunction> closure_; 76 JSHeapBroker* const broker_; 77}; 78 79} // namespace compiler 80} // namespace internal 81} // namespace v8 82 83#endif // V8_COMPILER_JS_CONTEXT_SPECIALIZATION_H_ 84