Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Side by Side Diff: src/compiler/js-native-context-specialization.cc

Issue 2803853005: Inline Array.prototype.forEach in TurboFan (Closed)
Patch Set: Review feedback Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/js-native-context-specialization.h" 5 #include "src/compiler/js-native-context-specialization.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/code-factory.h" 8 #include "src/code-factory.h"
9 #include "src/compilation-dependencies.h" 9 #include "src/compilation-dependencies.h"
10 #include "src/compiler/access-builder.h" 10 #include "src/compiler/access-builder.h"
11 #include "src/compiler/access-info.h" 11 #include "src/compiler/access-info.h"
12 #include "src/compiler/frame-states.h"
12 #include "src/compiler/js-graph.h" 13 #include "src/compiler/js-graph.h"
13 #include "src/compiler/js-operator.h" 14 #include "src/compiler/js-operator.h"
14 #include "src/compiler/linkage.h" 15 #include "src/compiler/linkage.h"
15 #include "src/compiler/node-matchers.h" 16 #include "src/compiler/node-matchers.h"
16 #include "src/compiler/type-cache.h" 17 #include "src/compiler/type-cache.h"
17 #include "src/feedback-vector.h" 18 #include "src/feedback-vector.h"
18 #include "src/field-index-inl.h" 19 #include "src/field-index-inl.h"
19 #include "src/isolate-inl.h" 20 #include "src/isolate-inl.h"
20 21
21 namespace v8 { 22 namespace v8 {
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 160
160 return NoChange(); 161 return NoChange();
161 } 162 }
162 163
163 Reduction JSNativeContextSpecialization::ReduceJSInstanceOf(Node* node) { 164 Reduction JSNativeContextSpecialization::ReduceJSInstanceOf(Node* node) {
164 DCHECK_EQ(IrOpcode::kJSInstanceOf, node->opcode()); 165 DCHECK_EQ(IrOpcode::kJSInstanceOf, node->opcode());
165 Node* object = NodeProperties::GetValueInput(node, 0); 166 Node* object = NodeProperties::GetValueInput(node, 0);
166 Node* constructor = NodeProperties::GetValueInput(node, 1); 167 Node* constructor = NodeProperties::GetValueInput(node, 1);
167 Node* context = NodeProperties::GetContextInput(node); 168 Node* context = NodeProperties::GetContextInput(node);
168 Node* effect = NodeProperties::GetEffectInput(node); 169 Node* effect = NodeProperties::GetEffectInput(node);
170 Node* outer_frame_state = NodeProperties::GetFrameStateInput(node);
169 Node* control = NodeProperties::GetControlInput(node); 171 Node* control = NodeProperties::GetControlInput(node);
170 172
171 // Check if the right hand side is a known {receiver}. 173 // Check if the right hand side is a known {receiver}.
172 HeapObjectMatcher m(constructor); 174 HeapObjectMatcher m(constructor);
173 if (!m.HasValue() || !m.Value()->IsJSObject()) return NoChange(); 175 if (!m.HasValue() || !m.Value()->IsJSObject()) return NoChange();
174 Handle<JSObject> receiver = Handle<JSObject>::cast(m.Value()); 176 Handle<JSObject> receiver = Handle<JSObject>::cast(m.Value());
175 Handle<Map> receiver_map(receiver->map(), isolate()); 177 Handle<Map> receiver_map(receiver->map(), isolate());
176 178
177 // Compute property access info for @@hasInstance on {receiver}. 179 // Compute property access info for @@hasInstance on {receiver}.
178 PropertyAccessInfo access_info; 180 PropertyAccessInfo access_info;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 FieldIndex field_index = access_info.field_index(); 230 FieldIndex field_index = access_info.field_index();
229 constant = JSObject::FastPropertyAt(holder, Representation::Tagged(), 231 constant = JSObject::FastPropertyAt(holder, Representation::Tagged(),
230 field_index); 232 field_index);
231 } 233 }
232 DCHECK(constant->IsCallable()); 234 DCHECK(constant->IsCallable());
233 235
234 // Monomorphic property access. 236 // Monomorphic property access.
235 effect = BuildCheckMaps(constructor, effect, control, 237 effect = BuildCheckMaps(constructor, effect, control,
236 access_info.receiver_maps()); 238 access_info.receiver_maps());
237 239
240 Node* frame_state;
241 std::tie(frame_state, effect) = CreateStubBuiltinContinuationFrameState(
242 jsgraph(), Builtins::kToBooleanLazyDeoptContinuation, context, nullptr,
243 0, effect, control, outer_frame_state, DONT_CREATE_CHECKPOINT);
244
238 // Call the @@hasInstance handler. 245 // Call the @@hasInstance handler.
239 Node* target = jsgraph()->Constant(constant); 246 Node* target = jsgraph()->Constant(constant);
240 node->InsertInput(graph()->zone(), 0, target); 247 node->InsertInput(graph()->zone(), 0, target);
241 node->ReplaceInput(1, constructor); 248 node->ReplaceInput(1, constructor);
242 node->ReplaceInput(2, object); 249 node->ReplaceInput(2, object);
250 node->ReplaceInput(4, frame_state);
243 node->ReplaceInput(5, effect); 251 node->ReplaceInput(5, effect);
244 NodeProperties::ChangeOp( 252 NodeProperties::ChangeOp(
245 node, 253 node,
246 javascript()->Call(3, 0.0f, VectorSlotPair(), 254 javascript()->Call(3, 0.0f, VectorSlotPair(),
247 ConvertReceiverMode::kNotNullOrUndefined)); 255 ConvertReceiverMode::kNotNullOrUndefined));
248 256
249 // Rewire the value uses of {node} to ToBoolean conversion of the result. 257 // Rewire the value uses of {node} to ToBoolean conversion of the result.
250 Node* value = graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), 258 Node* value = graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny),
251 node, context); 259 node, context);
252 for (Edge edge : node->use_edges()) { 260 for (Edge edge : node->use_edges()) {
(...skipping 2318 matching lines...) Expand 10 before | Expand all | Expand 10 after
2571 return jsgraph()->javascript(); 2579 return jsgraph()->javascript();
2572 } 2580 }
2573 2581
2574 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { 2582 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const {
2575 return jsgraph()->simplified(); 2583 return jsgraph()->simplified();
2576 } 2584 }
2577 2585
2578 } // namespace compiler 2586 } // namespace compiler
2579 } // namespace internal 2587 } // namespace internal
2580 } // namespace v8 2588 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698