blob: fe5545a04d8d5f2096b06d8c38104018e906ffec [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2014 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_GRAPH_H_
6#define V8_COMPILER_JS_GRAPH_H_
7
8#include "src/compiler/common-node-cache.h"
9#include "src/compiler/common-operator.h"
10#include "src/compiler/graph.h"
11#include "src/compiler/js-operator.h"
12#include "src/compiler/machine-operator.h"
13#include "src/compiler/node-properties.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000014#include "src/isolate.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000015
16namespace v8 {
17namespace internal {
18namespace compiler {
19
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000020class SimplifiedOperatorBuilder;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000021class Typer;
22
23// Implements a facade on a Graph, enhancing the graph with JS-specific
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000024// notions, including various builders for operators, canonicalized global
Ben Murdochb8a8cc12014-11-26 15:28:44 +000025// constants, and various helper methods.
26class JSGraph : public ZoneObject {
27 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000028 JSGraph(Isolate* isolate, Graph* graph, CommonOperatorBuilder* common,
29 JSOperatorBuilder* javascript, SimplifiedOperatorBuilder* simplified,
30 MachineOperatorBuilder* machine)
31 : isolate_(isolate),
32 graph_(graph),
Ben Murdochb8a8cc12014-11-26 15:28:44 +000033 common_(common),
34 javascript_(javascript),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000035 simplified_(simplified),
Ben Murdochb8a8cc12014-11-26 15:28:44 +000036 machine_(machine),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000037 cache_(zone()) {
38 for (int i = 0; i < kNumCachedNodes; i++) cached_nodes_[i] = nullptr;
39 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000040
41 // Canonicalized global constants.
Ben Murdochc5610432016-08-08 18:44:38 +010042 Node* AllocateInNewSpaceStubConstant();
43 Node* AllocateInOldSpaceStubConstant();
Ben Murdoch61f157c2016-09-16 13:49:30 +010044 Node* ToNumberBuiltinConstant();
Emily Bernierd0a1eb72015-03-24 16:35:39 -040045 Node* CEntryStubConstant(int result_size);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046 Node* EmptyFixedArrayConstant();
Ben Murdoch61f157c2016-09-16 13:49:30 +010047 Node* EmptyLiteralsArrayConstant();
Ben Murdochc5610432016-08-08 18:44:38 +010048 Node* HeapNumberMapConstant();
Ben Murdochda12d292016-06-02 14:46:10 +010049 Node* OptimizedOutConstant();
Ben Murdochc5610432016-08-08 18:44:38 +010050 Node* StaleRegisterConstant();
Ben Murdochb8a8cc12014-11-26 15:28:44 +000051 Node* UndefinedConstant();
52 Node* TheHoleConstant();
53 Node* TrueConstant();
54 Node* FalseConstant();
55 Node* NullConstant();
56 Node* ZeroConstant();
57 Node* OneConstant();
58 Node* NaNConstant();
59
Ben Murdochb8a8cc12014-11-26 15:28:44 +000060 // Creates a HeapConstant node, possibly canonicalized, and may access the
61 // heap to inspect the object.
Emily Bernierd0a1eb72015-03-24 16:35:39 -040062 Node* HeapConstant(Handle<HeapObject> value);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000063
64 // Creates a Constant node of the appropriate type for the given object.
65 // Accesses the heap to inspect the object and determine whether one of the
66 // canonicalized globals or a number constant should be returned.
67 Node* Constant(Handle<Object> value);
68
69 // Creates a NumberConstant node, usually canonicalized.
70 Node* Constant(double value);
71
72 // Creates a NumberConstant node, usually canonicalized.
73 Node* Constant(int32_t value);
74
75 // Creates a Int32Constant node, usually canonicalized.
76 Node* Int32Constant(int32_t value);
77 Node* Uint32Constant(uint32_t value) {
78 return Int32Constant(bit_cast<int32_t>(value));
79 }
80
Emily Bernierd0a1eb72015-03-24 16:35:39 -040081 // Creates a HeapConstant node for either true or false.
82 Node* BooleanConstant(bool is_true) {
83 return is_true ? TrueConstant() : FalseConstant();
84 }
85
86 // Creates a Int64Constant node, usually canonicalized.
87 Node* Int64Constant(int64_t value);
88 Node* Uint64Constant(uint64_t value) {
89 return Int64Constant(bit_cast<int64_t>(value));
90 }
91
92 // Creates a Int32Constant/Int64Constant node, depending on the word size of
93 // the target machine.
94 // TODO(turbofan): Code using Int32Constant/Int64Constant to store pointer
95 // constants is probably not serializable.
96 Node* IntPtrConstant(intptr_t value) {
97 return machine()->Is32() ? Int32Constant(static_cast<int32_t>(value))
98 : Int64Constant(static_cast<int64_t>(value));
99 }
100 template <typename T>
101 Node* PointerConstant(T* value) {
102 return IntPtrConstant(bit_cast<intptr_t>(value));
103 }
104
Ben Murdochc5610432016-08-08 18:44:38 +0100105 Node* RelocatableInt32Constant(int32_t value, RelocInfo::Mode rmode);
106 Node* RelocatableInt64Constant(int64_t value, RelocInfo::Mode rmode);
107 Node* RelocatableIntPtrConstant(intptr_t value, RelocInfo::Mode rmode);
108
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400109 // Creates a Float32Constant node, usually canonicalized.
110 Node* Float32Constant(float value);
111
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000112 // Creates a Float64Constant node, usually canonicalized.
113 Node* Float64Constant(double value);
114
115 // Creates an ExternalConstant node, usually canonicalized.
116 Node* ExternalConstant(ExternalReference ref);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117 Node* ExternalConstant(Runtime::FunctionId function_id);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000118
119 Node* SmiConstant(int32_t immediate) {
120 DCHECK(Smi::IsValid(immediate));
121 return Constant(immediate);
122 }
123
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400124 // Creates a dummy Constant node, used to satisfy calling conventions of
125 // stubs and runtime functions that do not require a context.
126 Node* NoContextConstant() { return ZeroConstant(); }
127
Ben Murdoch61f157c2016-09-16 13:49:30 +0100128 // Creates an empty StateValues node, used when we don't have any concrete
129 // values for a certain part of the frame state.
130 Node* EmptyStateValues();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000131
132 // Create a control node that serves as dependency for dead nodes.
133 Node* Dead();
134
135 CommonOperatorBuilder* common() const { return common_; }
136 JSOperatorBuilder* javascript() const { return javascript_; }
137 SimplifiedOperatorBuilder* simplified() const { return simplified_; }
138 MachineOperatorBuilder* machine() const { return machine_; }
139 Graph* graph() const { return graph_; }
140 Zone* zone() const { return graph()->zone(); }
141 Isolate* isolate() const { return isolate_; }
142 Factory* factory() const { return isolate()->factory(); }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400143
144 void GetCachedNodes(NodeVector* nodes);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000145
146 private:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000147 enum CachedNode {
Ben Murdochc5610432016-08-08 18:44:38 +0100148 kAllocateInNewSpaceStubConstant,
149 kAllocateInOldSpaceStubConstant,
Ben Murdoch61f157c2016-09-16 13:49:30 +0100150 kToNumberBuiltinConstant,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000151 kCEntryStubConstant,
152 kEmptyFixedArrayConstant,
Ben Murdoch61f157c2016-09-16 13:49:30 +0100153 kEmptyLiteralsArrayConstant,
Ben Murdochc5610432016-08-08 18:44:38 +0100154 kHeapNumberMapConstant,
Ben Murdochda12d292016-06-02 14:46:10 +0100155 kOptimizedOutConstant,
Ben Murdochc5610432016-08-08 18:44:38 +0100156 kStaleRegisterConstant,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000157 kUndefinedConstant,
158 kTheHoleConstant,
159 kTrueConstant,
160 kFalseConstant,
161 kNullConstant,
162 kZeroConstant,
163 kOneConstant,
164 kNaNConstant,
Ben Murdoch61f157c2016-09-16 13:49:30 +0100165 kEmptyStateValues,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000166 kDead,
167 kNumCachedNodes // Must remain last.
168 };
169
170 Isolate* isolate_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000171 Graph* graph_;
172 CommonOperatorBuilder* common_;
173 JSOperatorBuilder* javascript_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000174 SimplifiedOperatorBuilder* simplified_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000175 MachineOperatorBuilder* machine_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000176 CommonNodeCache cache_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000177 Node* cached_nodes_[kNumCachedNodes];
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000178
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000179 Node* NumberConstant(double value);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000180
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400181 DISALLOW_COPY_AND_ASSIGN(JSGraph);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000182};
183
184} // namespace compiler
185} // namespace internal
186} // namespace v8
187
188#endif