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/graph-reducer.h"
10 
11 namespace v8 {
12 namespace internal {
13 namespace compiler {
14 
15 // Forward declarations.
16 class CommonOperatorBuilder;
17 class JSGraph;
18 class JSOperatorBuilder;
19 class SimplifiedOperatorBuilder;
20 
21 // Performs strength reduction on {JSCallConstruct} and {JSCallFunction} nodes,
22 // which might allow inlining or other optimizations to be performed afterwards.
23 class JSCallReducer final : public AdvancedReducer {
24  public:
25   // Flags that control the mode of operation.
26   enum Flag {
27     kNoFlags = 0u,
28     kBailoutOnUninitialized = 1u << 0,
29     kDeoptimizationEnabled = 1u << 1
30   };
31   typedef base::Flags<Flag> Flags;
32 
JSCallReducer(Editor * editor,JSGraph * jsgraph,Flags flags,Handle<Context> native_context)33   JSCallReducer(Editor* editor, JSGraph* jsgraph, Flags flags,
34                 Handle<Context> native_context)
35       : AdvancedReducer(editor),
36         jsgraph_(jsgraph),
37         flags_(flags),
38         native_context_(native_context) {}
39 
40   Reduction Reduce(Node* node) final;
41 
42  private:
43   Reduction ReduceArrayConstructor(Node* node);
44   Reduction ReduceNumberConstructor(Node* node);
45   Reduction ReduceFunctionPrototypeApply(Node* node);
46   Reduction ReduceFunctionPrototypeCall(Node* node);
47   Reduction ReduceObjectPrototypeGetProto(Node* node);
48   Reduction ReduceJSCallConstruct(Node* node);
49   Reduction ReduceJSCallFunction(Node* node);
50 
51   Graph* graph() const;
flags()52   Flags flags() const { return flags_; }
jsgraph()53   JSGraph* jsgraph() const { return jsgraph_; }
54   Isolate* isolate() const;
native_context()55   Handle<Context> native_context() const { return native_context_; }
56   CommonOperatorBuilder* common() const;
57   JSOperatorBuilder* javascript() const;
58   SimplifiedOperatorBuilder* simplified() const;
59 
60   JSGraph* const jsgraph_;
61   Flags const flags_;
62   Handle<Context> const native_context_;
63 };
64 
65 DEFINE_OPERATORS_FOR_FLAGS(JSCallReducer::Flags)
66 
67 }  // namespace compiler
68 }  // namespace internal
69 }  // namespace v8
70 
71 #endif  // V8_COMPILER_JS_CALL_REDUCER_H_
72