Line data Source code
1 : // 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 : #include "src/compiler/js-graph.h"
6 :
7 : #include "src/code-factory.h"
8 : #include "src/compiler/node-properties.h"
9 : #include "src/compiler/typer.h"
10 : #include "src/objects-inl.h"
11 :
12 : namespace v8 {
13 : namespace internal {
14 : namespace compiler {
15 :
16 : #define GET_CACHED_FIELD(ptr, expr) (*(ptr)) ? *(ptr) : (*(ptr) = (expr))
17 :
18 : #define DEFINE_GETTER(name, expr) \
19 : Node* JSGraph::name() { return GET_CACHED_FIELD(&name##_, expr); }
20 :
21 883696 : Node* JSGraph::CEntryStubConstant(int result_size, SaveFPRegsMode save_doubles,
22 : ArgvMode argv_mode, bool builtin_exit_frame) {
23 883696 : if (save_doubles == kDontSaveFPRegs && argv_mode == kArgvOnStack) {
24 : DCHECK(result_size >= 1 && result_size <= 3);
25 883696 : if (!builtin_exit_frame) {
26 : Node** ptr = nullptr;
27 880778 : if (result_size == 1) {
28 879839 : ptr = &CEntryStub1Constant_;
29 939 : } else if (result_size == 2) {
30 939 : ptr = &CEntryStub2Constant_;
31 : } else {
32 : DCHECK_EQ(3, result_size);
33 0 : ptr = &CEntryStub3Constant_;
34 : }
35 1345644 : return GET_CACHED_FIELD(ptr, HeapConstant(CodeFactory::CEntry(
36 : isolate(), result_size, save_doubles,
37 : argv_mode, builtin_exit_frame)));
38 : }
39 : Node** ptr = builtin_exit_frame ? &CEntryStub1WithBuiltinExitFrameConstant_
40 2918 : : &CEntryStub1Constant_;
41 5192 : return GET_CACHED_FIELD(ptr, HeapConstant(CodeFactory::CEntry(
42 : isolate(), result_size, save_doubles,
43 : argv_mode, builtin_exit_frame)));
44 : }
45 0 : return HeapConstant(CodeFactory::CEntry(isolate(), result_size, save_doubles,
46 0 : argv_mode, builtin_exit_frame));
47 : }
48 :
49 892426 : Node* JSGraph::Constant(Handle<Object> value) {
50 : // Dereference the handle to determine if a number constant or other
51 : // canonicalized node can be used.
52 892426 : if (value->IsNumber()) {
53 81371 : return Constant(value->Number());
54 811055 : } else if (value->IsUndefined(isolate())) {
55 1525 : return UndefinedConstant();
56 809530 : } else if (value->IsTrue(isolate())) {
57 19 : return TrueConstant();
58 809511 : } else if (value->IsFalse(isolate())) {
59 93 : return FalseConstant();
60 809418 : } else if (value->IsNull(isolate())) {
61 102 : return NullConstant();
62 809316 : } else if (value->IsTheHole(isolate())) {
63 5 : return TheHoleConstant();
64 : } else {
65 809311 : return HeapConstant(Handle<HeapObject>::cast(value));
66 : }
67 : }
68 :
69 1014397 : Node* JSGraph::Constant(const ObjectRef& ref) {
70 1014397 : if (ref.IsSmi()) return Constant(ref.AsSmi());
71 : OddballType oddball_type =
72 1000867 : ref.AsHeapObject().GetHeapObjectType().oddball_type();
73 1000869 : if (ref.IsHeapNumber()) {
74 4439 : return Constant(ref.AsHeapNumber().value());
75 996429 : } else if (oddball_type == OddballType::kUndefined) {
76 : DCHECK(ref.object().equals(isolate()->factory()->undefined_value()));
77 2496 : return UndefinedConstant();
78 993933 : } else if (oddball_type == OddballType::kNull) {
79 : DCHECK(ref.object().equals(isolate()->factory()->null_value()));
80 195 : return NullConstant();
81 993738 : } else if (oddball_type == OddballType::kHole) {
82 : DCHECK(ref.object().equals(isolate()->factory()->the_hole_value()));
83 2509 : return TheHoleConstant();
84 991229 : } else if (oddball_type == OddballType::kBoolean) {
85 191363 : if (ref.object().equals(isolate()->factory()->true_value())) {
86 63748 : return TrueConstant();
87 : } else {
88 : DCHECK(ref.object().equals(isolate()->factory()->false_value()));
89 127615 : return FalseConstant();
90 : }
91 : } else {
92 799866 : return HeapConstant(ref.AsHeapObject().object());
93 : }
94 : }
95 :
96 3214317 : Node* JSGraph::Constant(double value) {
97 3916382 : if (bit_cast<int64_t>(value) == bit_cast<int64_t>(0.0)) return ZeroConstant();
98 2747890 : if (bit_cast<int64_t>(value) == bit_cast<int64_t>(1.0)) return OneConstant();
99 2276613 : return NumberConstant(value);
100 : }
101 :
102 3357880 : Node* JSGraph::NumberConstant(double value) {
103 : Node** loc = cache_.FindNumberConstant(value);
104 3357879 : if (*loc == nullptr) {
105 5245525 : *loc = graph()->NewNode(common()->NumberConstant(value));
106 : }
107 3357882 : return *loc;
108 : }
109 :
110 12971030 : Node* JSGraph::HeapConstant(Handle<HeapObject> value) {
111 12971030 : Node** loc = cache_.FindHeapConstant(value);
112 12971025 : if (*loc == nullptr) {
113 14412859 : *loc = graph()->NewNode(common()->HeapConstant(value));
114 : }
115 12971044 : return *loc;
116 : }
117 :
118 4724594 : void JSGraph::GetCachedNodes(NodeVector* nodes) {
119 4724594 : cache_.GetCachedNodes(nodes);
120 : #define DO_CACHED_FIELD(name) \
121 : if (name##_) nodes->push_back(name##_);
122 :
123 4724599 : CACHED_GLOBAL_LIST(DO_CACHED_FIELD)
124 4724592 : CACHED_CENTRY_LIST(DO_CACHED_FIELD)
125 : #undef DO_CACHED_FIELD
126 4724594 : }
127 :
128 419311 : DEFINE_GETTER(AllocateInYoungGenerationStubConstant,
129 : HeapConstant(BUILTIN_CODE(isolate(), AllocateInYoungGeneration)))
130 :
131 1257 : DEFINE_GETTER(AllocateInOldGenerationStubConstant,
132 : HeapConstant(BUILTIN_CODE(isolate(), AllocateInOldGeneration)))
133 :
134 429 : DEFINE_GETTER(ArrayConstructorStubConstant,
135 : HeapConstant(BUILTIN_CODE(isolate(), ArrayConstructorImpl)))
136 :
137 72941 : DEFINE_GETTER(BigIntMapConstant, HeapConstant(factory()->bigint_map()))
138 :
139 122 : DEFINE_GETTER(BooleanMapConstant, HeapConstant(factory()->boolean_map()))
140 :
141 87 : DEFINE_GETTER(ToNumberBuiltinConstant,
142 : HeapConstant(BUILTIN_CODE(isolate(), ToNumber)))
143 :
144 159714 : DEFINE_GETTER(EmptyFixedArrayConstant,
145 : HeapConstant(factory()->empty_fixed_array()))
146 :
147 76017 : DEFINE_GETTER(EmptyStringConstant, HeapConstant(factory()->empty_string()))
148 :
149 3237 : DEFINE_GETTER(FixedArrayMapConstant, HeapConstant(factory()->fixed_array_map()))
150 :
151 2493 : DEFINE_GETTER(PropertyArrayMapConstant,
152 : HeapConstant(factory()->property_array_map()))
153 :
154 54 : DEFINE_GETTER(FixedDoubleArrayMapConstant,
155 : HeapConstant(factory()->fixed_double_array_map()))
156 :
157 245489 : DEFINE_GETTER(HeapNumberMapConstant, HeapConstant(factory()->heap_number_map()))
158 :
159 17509247 : DEFINE_GETTER(OptimizedOutConstant, HeapConstant(factory()->optimized_out()))
160 :
161 17480 : DEFINE_GETTER(StaleRegisterConstant, HeapConstant(factory()->stale_register()))
162 :
163 2209149 : DEFINE_GETTER(UndefinedConstant, HeapConstant(factory()->undefined_value()))
164 :
165 515436 : DEFINE_GETTER(TheHoleConstant, HeapConstant(factory()->the_hole_value()))
166 :
167 1506573 : DEFINE_GETTER(TrueConstant, HeapConstant(factory()->true_value()))
168 :
169 1594061 : DEFINE_GETTER(FalseConstant, HeapConstant(factory()->false_value()))
170 :
171 43604 : DEFINE_GETTER(NullConstant, HeapConstant(factory()->null_value()))
172 :
173 1829755 : DEFINE_GETTER(ZeroConstant, NumberConstant(0.0))
174 :
175 418138 : DEFINE_GETTER(OneConstant, NumberConstant(1.0))
176 :
177 296 : DEFINE_GETTER(MinusOneConstant, NumberConstant(-1.0))
178 :
179 1493 : DEFINE_GETTER(NaNConstant,
180 : NumberConstant(std::numeric_limits<double>::quiet_NaN()))
181 :
182 23213 : DEFINE_GETTER(EmptyStateValues,
183 : graph()->NewNode(common()->StateValues(0,
184 : SparseInputMask::Dense())))
185 :
186 5786035 : DEFINE_GETTER(SingleDeadTypedStateValues,
187 : graph()->NewNode(common()->TypedStateValues(
188 : new (graph()->zone()->New(sizeof(ZoneVector<MachineType>)))
189 : ZoneVector<MachineType>(0, graph()->zone()),
190 : SparseInputMask(SparseInputMask::kEndMarker << 1))))
191 :
192 : #undef DEFINE_GETTER
193 : #undef GET_CACHED_FIELD
194 :
195 : } // namespace compiler
196 : } // namespace internal
197 122036 : } // namespace v8
|