blob: 4251d72fc4f716856851c63fb25ac31e17aff741 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 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_NATIVE_CONTEXT_SPECIALIZATION_H_
6#define V8_COMPILER_JS_NATIVE_CONTEXT_SPECIALIZATION_H_
7
8#include "src/base/flags.h"
9#include "src/compiler/graph-reducer.h"
10
11namespace v8 {
12namespace internal {
13
14// Forward declarations.
15class CompilationDependencies;
16class Factory;
17class FeedbackNexus;
18class TypeCache;
19
20
21namespace compiler {
22
23// Forward declarations.
24enum class AccessMode;
25class CommonOperatorBuilder;
26class JSGraph;
27class JSOperatorBuilder;
28class MachineOperatorBuilder;
29class SimplifiedOperatorBuilder;
30
31
32// Specializes a given JSGraph to a given native context, potentially constant
33// folding some {LoadGlobal} nodes or strength reducing some {StoreGlobal}
34// nodes. And also specializes {LoadNamed} and {StoreNamed} nodes according
35// to type feedback (if available).
36class JSNativeContextSpecialization final : public AdvancedReducer {
37 public:
38 // Flags that control the mode of operation.
39 enum Flag {
40 kNoFlags = 0u,
Ben Murdoch097c5b22016-05-18 11:27:45 +010041 kBailoutOnUninitialized = 1u << 0,
42 kDeoptimizationEnabled = 1u << 1,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000043 };
44 typedef base::Flags<Flag> Flags;
45
46 JSNativeContextSpecialization(Editor* editor, JSGraph* jsgraph, Flags flags,
47 MaybeHandle<Context> native_context,
48 CompilationDependencies* dependencies,
49 Zone* zone);
50
51 Reduction Reduce(Node* node) final;
52
53 private:
Ben Murdoch097c5b22016-05-18 11:27:45 +010054 Reduction ReduceJSLoadContext(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000055 Reduction ReduceJSLoadNamed(Node* node);
56 Reduction ReduceJSStoreNamed(Node* node);
57 Reduction ReduceJSLoadProperty(Node* node);
58 Reduction ReduceJSStoreProperty(Node* node);
59
60 Reduction ReduceElementAccess(Node* node, Node* index, Node* value,
61 MapHandleList const& receiver_maps,
62 AccessMode access_mode,
63 LanguageMode language_mode,
64 KeyedAccessStoreMode store_mode);
65 Reduction ReduceKeyedAccess(Node* node, Node* index, Node* value,
66 FeedbackNexus const& nexus,
67 AccessMode access_mode,
68 LanguageMode language_mode,
69 KeyedAccessStoreMode store_mode);
70 Reduction ReduceNamedAccess(Node* node, Node* value,
Ben Murdoch097c5b22016-05-18 11:27:45 +010071 FeedbackNexus const& nexus, Handle<Name> name,
72 AccessMode access_mode,
73 LanguageMode language_mode);
74 Reduction ReduceNamedAccess(Node* node, Node* value,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000075 MapHandleList const& receiver_maps,
76 Handle<Name> name, AccessMode access_mode,
77 LanguageMode language_mode,
78 Node* index = nullptr);
79
Ben Murdoch097c5b22016-05-18 11:27:45 +010080 Reduction ReduceSoftDeoptimize(Node* node);
81
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000082 // Adds stability dependencies on all prototypes of every class in
83 // {receiver_type} up to (and including) the {holder}.
84 void AssumePrototypesStable(Type* receiver_type,
85 Handle<Context> native_context,
86 Handle<JSObject> holder);
87
88 // Assuming that {if_projection} is either IfTrue or IfFalse, adds a hint on
89 // the dominating Branch that {if_projection} is the unlikely (deferred) case.
90 void MarkAsDeferred(Node* if_projection);
91
92 // Retrieve the native context from the given {node} if known.
93 MaybeHandle<Context> GetNativeContext(Node* node);
94
95 Graph* graph() const;
96 JSGraph* jsgraph() const { return jsgraph_; }
97 Isolate* isolate() const;
98 Factory* factory() const;
99 CommonOperatorBuilder* common() const;
100 JSOperatorBuilder* javascript() const;
101 SimplifiedOperatorBuilder* simplified() const;
102 MachineOperatorBuilder* machine() const;
103 Flags flags() const { return flags_; }
104 MaybeHandle<Context> native_context() const { return native_context_; }
105 CompilationDependencies* dependencies() const { return dependencies_; }
106 Zone* zone() const { return zone_; }
107
108 JSGraph* const jsgraph_;
109 Flags const flags_;
110 MaybeHandle<Context> native_context_;
111 CompilationDependencies* const dependencies_;
112 Zone* const zone_;
113 TypeCache const& type_cache_;
114
115 DISALLOW_COPY_AND_ASSIGN(JSNativeContextSpecialization);
116};
117
118DEFINE_OPERATORS_FOR_FLAGS(JSNativeContextSpecialization::Flags)
119
120} // namespace compiler
121} // namespace internal
122} // namespace v8
123
124#endif // V8_COMPILER_JS_NATIVE_CONTEXT_SPECIALIZATION_H_