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

Side by Side Diff: src/code-stub-assembler.cc

Issue 2370693002: [compiler] Properly guard the speculative optimizations for instanceof. (Closed)
Patch Set: Fix registers on arm/arm64. Created 4 years, 2 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
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/code-stubs.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 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 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/code-stub-assembler.h" 5 #include "src/code-stub-assembler.h"
6 #include "src/code-factory.h" 6 #include "src/code-factory.h"
7 #include "src/frames-inl.h" 7 #include "src/frames-inl.h"
8 #include "src/frames.h" 8 #include "src/frames.h"
9 #include "src/ic/handler-configuration.h" 9 #include "src/ic/handler-configuration.h"
10 #include "src/ic/stub-cache.h" 10 #include "src/ic/stub-cache.h"
(...skipping 3868 matching lines...) Expand 10 before | Expand all | Expand 10 after
3879 3879
3880 var_holder.Bind(proto); 3880 var_holder.Bind(proto);
3881 var_holder_map.Bind(map); 3881 var_holder_map.Bind(map);
3882 var_holder_instance_type.Bind(instance_type); 3882 var_holder_instance_type.Bind(instance_type);
3883 Goto(&loop); 3883 Goto(&loop);
3884 } 3884 }
3885 } 3885 }
3886 } 3886 }
3887 3887
3888 Node* CodeStubAssembler::OrdinaryHasInstance(Node* context, Node* callable, 3888 Node* CodeStubAssembler::OrdinaryHasInstance(Node* context, Node* callable,
3889 Node* object) { 3889 Node* object,
3890 VectorSlotPair feedback) {
3890 Variable var_result(this, MachineRepresentation::kTagged); 3891 Variable var_result(this, MachineRepresentation::kTagged);
3891 Label return_false(this), return_true(this), 3892 Label return_false(this), return_true(this),
3892 return_runtime(this, Label::kDeferred), return_result(this); 3893 return_runtime(this, Label::kDeferred), return_result(this);
3893 3894
3894 // Goto runtime if {object} is a Smi. 3895 // Goto runtime if {object} is a Smi.
3895 GotoIf(WordIsSmi(object), &return_runtime); 3896 GotoIf(WordIsSmi(object), &return_runtime);
3896 3897
3897 // Load map of {object}. 3898 // Load map of {object}.
3898 Node* object_map = LoadMap(object); 3899 Node* object_map = LoadMap(object);
3899 3900
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
4004 4005
4005 Bind(&return_false); 4006 Bind(&return_false);
4006 StoreRoot(Heap::kInstanceofCacheAnswerRootIndex, BooleanConstant(false)); 4007 StoreRoot(Heap::kInstanceofCacheAnswerRootIndex, BooleanConstant(false));
4007 var_result.Bind(BooleanConstant(false)); 4008 var_result.Bind(BooleanConstant(false));
4008 Goto(&return_result); 4009 Goto(&return_result);
4009 4010
4010 Bind(&return_runtime); 4011 Bind(&return_runtime);
4011 { 4012 {
4012 // Invalidate the global instanceof cache. 4013 // Invalidate the global instanceof cache.
4013 StoreRoot(Heap::kInstanceofCacheFunctionRootIndex, SmiConstant(0)); 4014 StoreRoot(Heap::kInstanceofCacheFunctionRootIndex, SmiConstant(0));
4015
4016 // Record megamorphic {feedback} if requested; we use this feedback to
4017 // guard a bunch of speculative optimizations in TurboFand (and Crankshaft)
4018 // that just deoptimize in case of funny inputs to instanceof.
4019 if (feedback.IsValid()) {
4020 Node* megamorphic_sentinel =
4021 HeapConstant(TypeFeedbackVector::MegamorphicSentinel(isolate()));
4022 StoreFixedArrayElement(feedback.vector(), feedback.index(),
4023 megamorphic_sentinel, SKIP_WRITE_BARRIER);
4024 }
4025
4014 // Fallback to the runtime implementation. 4026 // Fallback to the runtime implementation.
4015 var_result.Bind( 4027 var_result.Bind(
4016 CallRuntime(Runtime::kOrdinaryHasInstance, context, callable, object)); 4028 CallRuntime(Runtime::kOrdinaryHasInstance, context, callable, object));
4017 } 4029 }
4018 Goto(&return_result); 4030 Goto(&return_result);
4019 4031
4020 Bind(&return_result); 4032 Bind(&return_result);
4021 return var_result.value(); 4033 return var_result.value();
4022 } 4034 }
4023 4035
(...skipping 1615 matching lines...) Expand 10 before | Expand all | Expand 10 after
5639 Heap::kTheHoleValueRootIndex); 5651 Heap::kTheHoleValueRootIndex);
5640 5652
5641 // Store the WeakCell in the feedback vector. 5653 // Store the WeakCell in the feedback vector.
5642 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, 5654 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER,
5643 CodeStubAssembler::SMI_PARAMETERS); 5655 CodeStubAssembler::SMI_PARAMETERS);
5644 return cell; 5656 return cell;
5645 } 5657 }
5646 5658
5647 } // namespace internal 5659 } // namespace internal
5648 } // namespace v8 5660 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/code-stubs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698