1// Copyright 2016 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_CREATE_LOWERING_H_
6#define V8_COMPILER_JS_CREATE_LOWERING_H_
7
8#include "src/base/compiler-specific.h"
9#include "src/common/globals.h"
10#include "src/compiler/graph-reducer.h"
11
12namespace v8 {
13namespace internal {
14
15// Forward declarations.
16class AllocationSiteUsageContext;
17class Factory;
18class JSRegExp;
19
20namespace compiler {
21
22// Forward declarations.
23class CommonOperatorBuilder;
24class CompilationDependencies;
25class FrameState;
26class JSGraph;
27class JSOperatorBuilder;
28class MachineOperatorBuilder;
29class SimplifiedOperatorBuilder;
30class SlackTrackingPrediction;
31
32// Lowers JSCreate-level operators to fast (inline) allocations.
33class V8_EXPORT_PRIVATE JSCreateLowering final
34    : public NON_EXPORTED_BASE(AdvancedReducer) {
35 public:
36  JSCreateLowering(Editor* editor, CompilationDependencies* dependencies,
37                   JSGraph* jsgraph, JSHeapBroker* broker, Zone* zone)
38      : AdvancedReducer(editor),
39        dependencies_(dependencies),
40        jsgraph_(jsgraph),
41        broker_(broker),
42        zone_(zone) {}
43  ~JSCreateLowering() final = default;
44
45  const char* reducer_name() const override { return "JSCreateLowering"; }
46
47  Reduction Reduce(Node* node) final;
48
49 private:
50  Reduction ReduceJSCreate(Node* node);
51  Reduction ReduceJSCreateArguments(Node* node);
52  Reduction ReduceJSCreateArray(Node* node);
53  Reduction ReduceJSCreateArrayIterator(Node* node);
54  Reduction ReduceJSCreateAsyncFunctionObject(Node* node);
55  Reduction ReduceJSCreateCollectionIterator(Node* node);
56  Reduction ReduceJSCreateBoundFunction(Node* node);
57  Reduction ReduceJSCreateClosure(Node* node);
58  Reduction ReduceJSCreateIterResultObject(Node* node);
59  Reduction ReduceJSCreateStringIterator(Node* node);
60  Reduction ReduceJSCreateKeyValueArray(Node* node);
61  Reduction ReduceJSCreatePromise(Node* node);
62  Reduction ReduceJSCreateLiteralArrayOrObject(Node* node);
63  Reduction ReduceJSCreateEmptyLiteralObject(Node* node);
64  Reduction ReduceJSCreateEmptyLiteralArray(Node* node);
65  Reduction ReduceJSCreateLiteralRegExp(Node* node);
66  Reduction ReduceJSCreateFunctionContext(Node* node);
67  Reduction ReduceJSCreateWithContext(Node* node);
68  Reduction ReduceJSCreateCatchContext(Node* node);
69  Reduction ReduceJSCreateBlockContext(Node* node);
70  Reduction ReduceJSCreateGeneratorObject(Node* node);
71  Reduction ReduceJSGetTemplateObject(Node* node);
72  Reduction ReduceNewArray(
73      Node* node, Node* length, MapRef initial_map, ElementsKind elements_kind,
74      AllocationType allocation,
75      const SlackTrackingPrediction& slack_tracking_prediction);
76  Reduction ReduceNewArray(
77      Node* node, Node* length, int capacity, MapRef initial_map,
78      ElementsKind elements_kind, AllocationType allocation,
79      const SlackTrackingPrediction& slack_tracking_prediction);
80  Reduction ReduceNewArray(
81      Node* node, std::vector<Node*> values, MapRef initial_map,
82      ElementsKind elements_kind, AllocationType allocation,
83      const SlackTrackingPrediction& slack_tracking_prediction);
84  Reduction ReduceJSCreateObject(Node* node);
85
86  // The following functions all return nullptr iff there are too many arguments
87  // for inline allocation.
88  Node* TryAllocateArguments(Node* effect, Node* control,
89                             FrameState frame_state);
90  Node* TryAllocateRestArguments(Node* effect, Node* control,
91                                 FrameState frame_state, int start_index);
92  Node* TryAllocateAliasedArguments(Node* effect, Node* control,
93                                    FrameState frame_state, Node* context,
94                                    const SharedFunctionInfoRef& shared,
95                                    bool* has_aliased_arguments);
96  Node* TryAllocateAliasedArguments(Node* effect, Node* control, Node* context,
97                                    Node* arguments_length,
98                                    const SharedFunctionInfoRef& shared,
99                                    bool* has_aliased_arguments);
100  base::Optional<Node*> TryAllocateFastLiteral(Node* effect, Node* control,
101                                               JSObjectRef boilerplate,
102                                               AllocationType allocation,
103                                               int max_depth,
104                                               int* max_properties);
105  base::Optional<Node*> TryAllocateFastLiteralElements(
106      Node* effect, Node* control, JSObjectRef boilerplate,
107      AllocationType allocation, int max_depth, int* max_properties);
108
109  Node* AllocateElements(Node* effect, Node* control,
110                         ElementsKind elements_kind, int capacity,
111                         AllocationType allocation);
112  Node* AllocateElements(Node* effect, Node* control,
113                         ElementsKind elements_kind, Node* capacity_and_length);
114  Node* AllocateElements(Node* effect, Node* control,
115                         ElementsKind elements_kind,
116                         std::vector<Node*> const& values,
117                         AllocationType allocation);
118  Node* AllocateLiteralRegExp(Node* effect, Node* control,
119                              RegExpBoilerplateDescriptionRef boilerplate);
120
121  Factory* factory() const;
122  Graph* graph() const;
123  JSGraph* jsgraph() const { return jsgraph_; }
124  NativeContextRef native_context() const;
125  CommonOperatorBuilder* common() const;
126  SimplifiedOperatorBuilder* simplified() const;
127  CompilationDependencies* dependencies() const { return dependencies_; }
128  JSHeapBroker* broker() const { return broker_; }
129  Zone* zone() const { return zone_; }
130
131  CompilationDependencies* const dependencies_;
132  JSGraph* const jsgraph_;
133  JSHeapBroker* const broker_;
134  Zone* const zone_;
135};
136
137}  // namespace compiler
138}  // namespace internal
139}  // namespace v8
140
141#endif  // V8_COMPILER_JS_CREATE_LOWERING_H_
142