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