V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
js-call-reducer.h
1 // 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_CALL_REDUCER_H_
6 #define V8_COMPILER_JS_CALL_REDUCER_H_
7 
8 #include "src/base/flags.h"
9 #include "src/compiler/frame-states.h"
10 #include "src/compiler/graph-reducer.h"
11 #include "src/deoptimize-reason.h"
12 
13 namespace v8 {
14 namespace internal {
15 
16 // Forward declarations.
17 class Factory;
18 class JSGlobalProxy;
19 class VectorSlotPair;
20 
21 namespace compiler {
22 
23 // Forward declarations.
24 class CallFrequency;
25 class CommonOperatorBuilder;
26 class CompilationDependencies;
27 struct FieldAccess;
28 class JSGraph;
29 class JSHeapBroker;
30 class JSOperatorBuilder;
31 class SimplifiedOperatorBuilder;
32 
33 // Performs strength reduction on {JSConstruct} and {JSCall} nodes,
34 // which might allow inlining or other optimizations to be performed afterwards.
35 class V8_EXPORT_PRIVATE JSCallReducer final : public AdvancedReducer {
36  public:
37  // Flags that control the mode of operation.
38  enum Flag { kNoFlags = 0u, kBailoutOnUninitialized = 1u << 0 };
39  typedef base::Flags<Flag> Flags;
40 
41  JSCallReducer(Editor* editor, JSGraph* jsgraph, JSHeapBroker* broker,
42  Flags flags, CompilationDependencies* dependencies)
43  : AdvancedReducer(editor),
44  jsgraph_(jsgraph),
45  broker_(broker),
46  flags_(flags),
47  dependencies_(dependencies) {}
48 
49  const char* reducer_name() const override { return "JSCallReducer"; }
50 
51  Reduction Reduce(Node* node) final;
52 
53  // Processes the waitlist gathered while the reducer was running,
54  // and does a final attempt to reduce the nodes in the waitlist.
55  void Finalize() final;
56 
57  private:
58  Reduction ReduceArrayConstructor(Node* node);
59  Reduction ReduceBooleanConstructor(Node* node);
60  Reduction ReduceCallApiFunction(Node* node,
61  const SharedFunctionInfoRef& shared);
62  Reduction ReduceFunctionPrototypeApply(Node* node);
63  Reduction ReduceFunctionPrototypeBind(Node* node);
64  Reduction ReduceFunctionPrototypeCall(Node* node);
65  Reduction ReduceFunctionPrototypeHasInstance(Node* node);
66  Reduction ReduceObjectConstructor(Node* node);
67  Reduction ReduceObjectGetPrototype(Node* node, Node* object);
68  Reduction ReduceObjectGetPrototypeOf(Node* node);
69  Reduction ReduceObjectIs(Node* node);
70  Reduction ReduceObjectPrototypeGetProto(Node* node);
71  Reduction ReduceObjectPrototypeHasOwnProperty(Node* node);
72  Reduction ReduceObjectPrototypeIsPrototypeOf(Node* node);
73  Reduction ReduceObjectCreate(Node* node);
74  Reduction ReduceReflectApply(Node* node);
75  Reduction ReduceReflectConstruct(Node* node);
76  Reduction ReduceReflectGet(Node* node);
77  Reduction ReduceReflectGetPrototypeOf(Node* node);
78  Reduction ReduceReflectHas(Node* node);
79  Reduction ReduceArrayForEach(Node* node, const SharedFunctionInfoRef& shared);
80  enum class ArrayReduceDirection { kLeft, kRight };
81  Reduction ReduceArrayReduce(Node* node, ArrayReduceDirection direction,
82  const SharedFunctionInfoRef& shared);
83  Reduction ReduceArrayMap(Node* node, const SharedFunctionInfoRef& shared);
84  Reduction ReduceArrayFilter(Node* node, const SharedFunctionInfoRef& shared);
85  enum class ArrayFindVariant { kFind, kFindIndex };
86  Reduction ReduceArrayFind(Node* node, ArrayFindVariant variant,
87  const SharedFunctionInfoRef& shared);
88  Reduction ReduceArrayEvery(Node* node, const SharedFunctionInfoRef& shared);
89  enum class SearchVariant { kIncludes, kIndexOf };
90  Reduction ReduceArrayIndexOfIncludes(SearchVariant search_variant,
91  Node* node);
92  Reduction ReduceArraySome(Node* node, const SharedFunctionInfoRef& shared);
93  Reduction ReduceArrayPrototypePush(Node* node);
94  Reduction ReduceArrayPrototypePop(Node* node);
95  Reduction ReduceArrayPrototypeShift(Node* node);
96  Reduction ReduceArrayPrototypeSlice(Node* node);
97  Reduction ReduceArrayIsArray(Node* node);
98  enum class ArrayIteratorKind { kArray, kTypedArray };
99  Reduction ReduceArrayIterator(Node* node, IterationKind kind);
100  Reduction ReduceArrayIteratorPrototypeNext(Node* node);
101  Reduction ReduceFastArrayIteratorNext(InstanceType type, Node* node,
102  IterationKind kind);
103 
104  Reduction ReduceCallOrConstructWithArrayLikeOrSpread(
105  Node* node, int arity, CallFrequency const& frequency,
106  VectorSlotPair const& feedback);
107  Reduction ReduceJSConstruct(Node* node);
108  Reduction ReduceJSConstructWithArrayLike(Node* node);
109  Reduction ReduceJSConstructWithSpread(Node* node);
110  Reduction ReduceJSCall(Node* node);
111  Reduction ReduceJSCall(Node* node, const SharedFunctionInfoRef& shared);
112  Reduction ReduceJSCallWithArrayLike(Node* node);
113  Reduction ReduceJSCallWithSpread(Node* node);
114  Reduction ReduceRegExpPrototypeTest(Node* node);
115  Reduction ReduceReturnReceiver(Node* node);
116  Reduction ReduceStringPrototypeIndexOf(Node* node);
117  Reduction ReduceStringPrototypeSubstring(Node* node);
118  Reduction ReduceStringPrototypeSlice(Node* node);
119  Reduction ReduceStringPrototypeSubstr(Node* node);
120  Reduction ReduceStringPrototypeStringAt(
121  const Operator* string_access_operator, Node* node);
122  Reduction ReduceStringPrototypeCharAt(Node* node);
123 
124 #ifdef V8_INTL_SUPPORT
125  Reduction ReduceStringPrototypeToLowerCaseIntl(Node* node);
126  Reduction ReduceStringPrototypeToUpperCaseIntl(Node* node);
127 #endif // V8_INTL_SUPPORT
128 
129  Reduction ReduceStringFromCharCode(Node* node);
130  Reduction ReduceStringFromCodePoint(Node* node);
131  Reduction ReduceStringPrototypeIterator(Node* node);
132  Reduction ReduceStringIteratorPrototypeNext(Node* node);
133  Reduction ReduceStringPrototypeConcat(Node* node);
134 
135  Reduction ReducePromiseConstructor(Node* node);
136  Reduction ReducePromiseInternalConstructor(Node* node);
137  Reduction ReducePromiseInternalReject(Node* node);
138  Reduction ReducePromiseInternalResolve(Node* node);
139  Reduction ReducePromisePrototypeCatch(Node* node);
140  Reduction ReducePromisePrototypeFinally(Node* node);
141  Reduction ReducePromisePrototypeThen(Node* node);
142  Reduction ReducePromiseResolveTrampoline(Node* node);
143 
144  Reduction ReduceTypedArrayConstructor(Node* node,
145  const SharedFunctionInfoRef& shared);
146  Reduction ReduceTypedArrayPrototypeToStringTag(Node* node);
147 
148  Reduction ReduceSoftDeoptimize(Node* node, DeoptimizeReason reason);
149 
150  Reduction ReduceMathUnary(Node* node, const Operator* op);
151  Reduction ReduceMathBinary(Node* node, const Operator* op);
152  Reduction ReduceMathImul(Node* node);
153  Reduction ReduceMathClz32(Node* node);
154  Reduction ReduceMathMinMax(Node* node, const Operator* op, Node* empty_value);
155 
156  Reduction ReduceNumberIsFinite(Node* node);
157  Reduction ReduceNumberIsInteger(Node* node);
158  Reduction ReduceNumberIsSafeInteger(Node* node);
159  Reduction ReduceNumberIsNaN(Node* node);
160 
161  Reduction ReduceGlobalIsFinite(Node* node);
162  Reduction ReduceGlobalIsNaN(Node* node);
163 
164  Reduction ReduceMapPrototypeHas(Node* node);
165  Reduction ReduceMapPrototypeGet(Node* node);
166  Reduction ReduceCollectionIteration(Node* node,
167  CollectionKind collection_kind,
168  IterationKind iteration_kind);
169  Reduction ReduceCollectionPrototypeSize(Node* node,
170  CollectionKind collection_kind);
171  Reduction ReduceCollectionIteratorPrototypeNext(
172  Node* node, int entry_size, Handle<HeapObject> empty_collection,
173  InstanceType collection_iterator_instance_type_first,
174  InstanceType collection_iterator_instance_type_last);
175 
176  Reduction ReduceArrayBufferIsView(Node* node);
177  Reduction ReduceArrayBufferViewAccessor(Node* node,
178  InstanceType instance_type,
179  FieldAccess const& access);
180 
181  enum class DataViewAccess { kGet, kSet };
182  Reduction ReduceDataViewAccess(Node* node, DataViewAccess access,
183  ExternalArrayType element_type);
184 
185  Reduction ReduceDatePrototypeGetTime(Node* node);
186  Reduction ReduceDateNow(Node* node);
187  Reduction ReduceNumberParseInt(Node* node);
188 
189  Reduction ReduceNumberConstructor(Node* node);
190 
191  // Returns the updated {to} node, and updates control and effect along the
192  // way.
193  Node* DoFilterPostCallbackWork(ElementsKind kind, Node** control,
194  Node** effect, Node* a, Node* to,
195  Node* element, Node* callback_value);
196 
197  // If {fncallback} is not callable, throw a TypeError.
198  // {control} is altered, and new nodes {check_fail} and {check_throw} are
199  // returned. {check_fail} is the control branch where IsCallable failed,
200  // and {check_throw} is the call to throw a TypeError in that
201  // branch.
202  void WireInCallbackIsCallableCheck(Node* fncallback, Node* context,
203  Node* check_frame_state, Node* effect,
204  Node** control, Node** check_fail,
205  Node** check_throw);
206  void RewirePostCallbackExceptionEdges(Node* check_throw, Node* on_exception,
207  Node* effect, Node** check_fail,
208  Node** control);
209 
210  // Begin the central loop of a higher-order array builtin. A Loop is wired
211  // into {control}, an EffectPhi into {effect}, and the array index {k} is
212  // threaded into a Phi, which is returned. It's helpful to save the
213  // value of {control} as the loop node, and of {effect} as the corresponding
214  // EffectPhi after function return.
215  Node* WireInLoopStart(Node* k, Node** control, Node** effect);
216  void WireInLoopEnd(Node* loop, Node* eloop, Node* vloop, Node* k,
217  Node* control, Node* effect);
218 
219  // Load receiver[k], first bounding k by receiver array length.
220  // k is thusly changed, and the effect is changed as well.
221  Node* SafeLoadElement(ElementsKind kind, Node* receiver, Node* control,
222  Node** effect, Node** k,
223  const VectorSlotPair& feedback);
224 
225  Node* CreateArtificialFrameState(Node* node, Node* outer_frame_state,
226  int parameter_count, BailoutId bailout_id,
227  FrameStateType frame_state_type,
228  const SharedFunctionInfoRef& shared,
229  Node* context = nullptr);
230 
231  Graph* graph() const;
232  JSGraph* jsgraph() const { return jsgraph_; }
233  JSHeapBroker* broker() const { return broker_; }
234  Isolate* isolate() const;
235  Factory* factory() const;
236  NativeContextRef native_context() const { return broker()->native_context(); }
237  CommonOperatorBuilder* common() const;
238  JSOperatorBuilder* javascript() const;
239  SimplifiedOperatorBuilder* simplified() const;
240  Flags flags() const { return flags_; }
241  CompilationDependencies* dependencies() const { return dependencies_; }
242 
243  JSGraph* const jsgraph_;
244  JSHeapBroker* const broker_;
245  Flags const flags_;
246  CompilationDependencies* const dependencies_;
247  std::set<Node*> waitlist_;
248 };
249 
250 } // namespace compiler
251 } // namespace internal
252 } // namespace v8
253 
254 #endif // V8_COMPILER_JS_CALL_REDUCER_H_
Definition: libplatform.h:13