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 14 // Forward declarations. 15 class CompilationDependencies; 16 class Factory; 17 18 namespace compiler { 19 20 // Forward declarations. 21 class CommonOperatorBuilder; 22 class JSGraph; 23 class JSOperatorBuilder; 24 class SimplifiedOperatorBuilder; 25 26 // Performs strength reduction on {JSConstruct} and {JSCall} nodes, 27 // which might allow inlining or other optimizations to be performed afterwards. 28 class JSCallReducer final : public AdvancedReducer { 29 public: 30 // Flags that control the mode of operation. 31 enum Flag { 32 kNoFlags = 0u, 33 kDeoptimizationEnabled = 1u << 0, 34 }; 35 typedef base::Flags<Flag> Flags; 36 JSCallReducer(Editor * editor,JSGraph * jsgraph,Flags flags,Handle<Context> native_context,CompilationDependencies * dependencies)37 JSCallReducer(Editor* editor, JSGraph* jsgraph, Flags flags, 38 Handle<Context> native_context, 39 CompilationDependencies* dependencies) 40 : AdvancedReducer(editor), 41 jsgraph_(jsgraph), 42 flags_(flags), 43 native_context_(native_context), 44 dependencies_(dependencies) {} 45 46 Reduction Reduce(Node* node) final; 47 48 private: 49 Reduction ReduceArrayConstructor(Node* node); 50 Reduction ReduceCallApiFunction( 51 Node* node, Node* target, 52 Handle<FunctionTemplateInfo> function_template_info); 53 Reduction ReduceNumberConstructor(Node* node); 54 Reduction ReduceFunctionPrototypeApply(Node* node); 55 Reduction ReduceFunctionPrototypeCall(Node* node); 56 Reduction ReduceFunctionPrototypeHasInstance(Node* node); 57 Reduction ReduceObjectPrototypeGetProto(Node* node); 58 Reduction ReduceSpreadCall(Node* node, int arity); 59 Reduction ReduceJSConstruct(Node* node); 60 Reduction ReduceJSConstructWithSpread(Node* node); 61 Reduction ReduceJSCall(Node* node); 62 Reduction ReduceJSCallWithSpread(Node* node); 63 64 enum HolderLookup { kHolderNotFound, kHolderIsReceiver, kHolderFound }; 65 66 HolderLookup LookupHolder(Handle<JSObject> object, 67 Handle<FunctionTemplateInfo> function_template_info, 68 Handle<JSObject>* holder); 69 70 Graph* graph() const; flags()71 Flags flags() const { return flags_; } jsgraph()72 JSGraph* jsgraph() const { return jsgraph_; } 73 Isolate* isolate() const; 74 Factory* factory() const; native_context()75 Handle<Context> native_context() const { return native_context_; } 76 CommonOperatorBuilder* common() const; 77 JSOperatorBuilder* javascript() const; 78 SimplifiedOperatorBuilder* simplified() const; dependencies()79 CompilationDependencies* dependencies() const { return dependencies_; } 80 81 JSGraph* const jsgraph_; 82 Flags const flags_; 83 Handle<Context> const native_context_; 84 CompilationDependencies* const dependencies_; 85 }; 86 87 DEFINE_OPERATORS_FOR_FLAGS(JSCallReducer::Flags) 88 89 } // namespace compiler 90 } // namespace internal 91 } // namespace v8 92 93 #endif // V8_COMPILER_JS_CALL_REDUCER_H_ 94