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 
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 Reducer {
24  public:
25   // Flags that control the mode of operation.
26   enum Flag {
27     kNoFlags = 0u,
28     kDeoptimizationEnabled = 1u << 0,
29   };
30   typedef base::Flags<Flag> Flags;
31 
JSCallReducer(JSGraph * jsgraph,Flags flags,MaybeHandle<Context> native_context)32   JSCallReducer(JSGraph* jsgraph, Flags flags,
33                 MaybeHandle<Context> native_context)
34       : jsgraph_(jsgraph), flags_(flags), native_context_(native_context) {}
35 
36   Reduction Reduce(Node* node) final;
37 
38  private:
39   Reduction ReduceArrayConstructor(Node* node);
40   Reduction ReduceNumberConstructor(Node* node);
41   Reduction ReduceFunctionPrototypeApply(Node* node);
42   Reduction ReduceFunctionPrototypeCall(Node* node);
43   Reduction ReduceJSCallConstruct(Node* node);
44   Reduction ReduceJSCallFunction(Node* node);
45 
46   MaybeHandle<Context> GetNativeContext(Node* node);
47 
48   Graph* graph() const;
flags()49   Flags flags() const { return flags_; }
jsgraph()50   JSGraph* jsgraph() const { return jsgraph_; }
51   Isolate* isolate() const;
native_context()52   MaybeHandle<Context> native_context() const { return native_context_; }
53   CommonOperatorBuilder* common() const;
54   JSOperatorBuilder* javascript() const;
55 
56   JSGraph* const jsgraph_;
57   Flags const flags_;
58   MaybeHandle<Context> const native_context_;
59 };
60 
61 DEFINE_OPERATORS_FOR_FLAGS(JSCallReducer::Flags)
62 
63 }  // namespace compiler
64 }  // namespace internal
65 }  // namespace v8
66 
67 #endif  // V8_COMPILER_JS_CALL_REDUCER_H_
68