1109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 2109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// found in the LICENSE file. 4109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 5109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#ifndef V8_COMPILER_JS_CREATE_LOWERING_H_ 6109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define V8_COMPILER_JS_CREATE_LOWERING_H_ 7109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 8c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/base/compiler-specific.h" 9109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/compiler/graph-reducer.h" 10c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/globals.h" 11109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 12109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochnamespace v8 { 13109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochnamespace internal { 14109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 15109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// Forward declarations. 16109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass AllocationSiteUsageContext; 17109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass CompilationDependencies; 18109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass Factory; 19109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 20109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 21109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochnamespace compiler { 22109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 23109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// Forward declarations. 24109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass CommonOperatorBuilder; 25109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSGraph; 26109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSOperatorBuilder; 27109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass MachineOperatorBuilder; 28109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass SimplifiedOperatorBuilder; 29109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 30109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 31109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// Lowers JSCreate-level operators to fast (inline) allocations. 32c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass V8_EXPORT_PRIVATE JSCreateLowering final 33c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch : public NON_EXPORTED_BASE(AdvancedReducer) { 34109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 35109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch JSCreateLowering(Editor* editor, CompilationDependencies* dependencies, 3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch JSGraph* jsgraph, 3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MaybeHandle<FeedbackVector> feedback_vector, 38c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Context> native_context, Zone* zone) 39109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch : AdvancedReducer(editor), 40109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch dependencies_(dependencies), 41109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch jsgraph_(jsgraph), 4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch feedback_vector_(feedback_vector), 43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch native_context_(native_context), 44109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch zone_(zone) {} 45109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch ~JSCreateLowering() final {} 46109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 47109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Reduction Reduce(Node* node) final; 48109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 49109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 50109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Reduction ReduceJSCreate(Node* node); 51109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Reduction ReduceJSCreateArguments(Node* node); 52109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Reduction ReduceJSCreateArray(Node* node); 53109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Reduction ReduceJSCreateIterResultObject(Node* node); 54c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Reduction ReduceJSCreateKeyValueArray(Node* node); 55109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Reduction ReduceJSCreateLiteral(Node* node); 56109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Reduction ReduceJSCreateFunctionContext(Node* node); 57109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Reduction ReduceJSCreateWithContext(Node* node); 58109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Reduction ReduceJSCreateCatchContext(Node* node); 59109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Reduction ReduceJSCreateBlockContext(Node* node); 60109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Reduction ReduceNewArray(Node* node, Node* length, int capacity, 61109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<AllocationSite> site); 62109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 63109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* AllocateArguments(Node* effect, Node* control, Node* frame_state); 64109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* AllocateRestArguments(Node* effect, Node* control, Node* frame_state, 65109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int start_index); 66109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* AllocateAliasedArguments(Node* effect, Node* control, Node* frame_state, 67109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* context, Handle<SharedFunctionInfo>, 68109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch bool* has_aliased_arguments); 69109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* AllocateElements(Node* effect, Node* control, 70109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch ElementsKind elements_kind, int capacity, 71109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PretenureFlag pretenure); 72109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* AllocateFastLiteral(Node* effect, Node* control, 73109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<JSObject> boilerplate, 74109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch AllocationSiteUsageContext* site_context); 75109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* AllocateFastLiteralElements(Node* effect, Node* control, 76109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<JSObject> boilerplate, 77109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PretenureFlag pretenure, 78109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch AllocationSiteUsageContext* site_context); 79109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 80f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Reduction ReduceNewArrayToStubCall(Node* node, Handle<AllocationSite> site); 81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Infers the FeedbackVector to use for a given {node}. 8362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MaybeHandle<FeedbackVector> GetSpecializationFeedbackVector(Node* node); 84109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 85109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Factory* factory() const; 86109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Graph* graph() const; 87109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch JSGraph* jsgraph() const { return jsgraph_; } 88109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate() const; 89c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Context> native_context() const { return native_context_; } 90109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch JSOperatorBuilder* javascript() const; 91109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch CommonOperatorBuilder* common() const; 92109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch SimplifiedOperatorBuilder* simplified() const; 93109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MachineOperatorBuilder* machine() const; 94109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch CompilationDependencies* dependencies() const { return dependencies_; } 95109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Zone* zone() const { return zone_; } 96109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 97109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch CompilationDependencies* const dependencies_; 98109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch JSGraph* const jsgraph_; 9962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MaybeHandle<FeedbackVector> const feedback_vector_; 100c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Context> const native_context_; 101109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Zone* const zone_; 102109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 103109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 104109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} // namespace compiler 105109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} // namespace internal 106109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} // namespace v8 107109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 108109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#endif // V8_COMPILER_JS_CREATE_LOWERING_H_ 109