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