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

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

Issue 2443893002: [turbofan] Fix deopt loop in out-of-bounds string element access. (Closed)
Patch Set: REBASE Created 4 years, 1 month 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 | « no previous file | test/mjsunit/compiler/deopt-string-outofbounds.js » ('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 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"
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 Node* receiver = NodeProperties::GetValueInput(node, 0); 675 Node* receiver = NodeProperties::GetValueInput(node, 0);
676 Node* effect = NodeProperties::GetEffectInput(node); 676 Node* effect = NodeProperties::GetEffectInput(node);
677 Node* control = NodeProperties::GetControlInput(node); 677 Node* control = NodeProperties::GetControlInput(node);
678 678
679 // Optimize access for constant {receiver}. 679 // Optimize access for constant {receiver}.
680 HeapObjectMatcher mreceiver(receiver); 680 HeapObjectMatcher mreceiver(receiver);
681 if (mreceiver.HasValue() && mreceiver.Value()->IsString()) { 681 if (mreceiver.HasValue() && mreceiver.Value()->IsString()) {
682 Handle<String> string = Handle<String>::cast(mreceiver.Value()); 682 Handle<String> string = Handle<String>::cast(mreceiver.Value());
683 683
684 // We can only assume that the {index} is a valid array index if the IC 684 // We can only assume that the {index} is a valid array index if the IC
685 // is in element access mode, otherwise there's no guard for the bounds 685 // is in element access mode and not MEGAMORPHIC, otherwise there's no
686 // check below. 686 // guard for the bounds check below.
687 if (nexus.GetKeyType() == ELEMENT) { 687 if (nexus.ic_state() != MEGAMORPHIC && nexus.GetKeyType() == ELEMENT) {
688 // Strings are immutable in JavaScript. 688 // Strings are immutable in JavaScript.
689 if (access_mode == AccessMode::kStore) return NoChange(); 689 if (access_mode == AccessMode::kStore) return NoChange();
690 690
691 // Ensure that {index} is less than {receiver} length. 691 // Ensure that {index} is less than {receiver} length.
692 Node* length = jsgraph()->Constant(string->length()); 692 Node* length = jsgraph()->Constant(string->length());
693 index = effect = graph()->NewNode(simplified()->CheckBounds(), index, 693 index = effect = graph()->NewNode(simplified()->CheckBounds(), index,
694 length, effect, control); 694 length, effect, control);
695 695
696 // Load the character from the {receiver}. 696 // Load the character from the {receiver}.
697 value = graph()->NewNode(simplified()->StringCharCodeAt(), receiver, 697 value = graph()->NewNode(simplified()->StringCharCodeAt(), receiver,
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
753 // Check if we have feedback for a named access. 753 // Check if we have feedback for a named access.
754 if (Name* name = nexus.FindFirstName()) { 754 if (Name* name = nexus.FindFirstName()) {
755 return ReduceNamedAccess(node, value, receiver_maps, 755 return ReduceNamedAccess(node, value, receiver_maps,
756 handle(name, isolate()), access_mode, 756 handle(name, isolate()), access_mode,
757 language_mode, index); 757 language_mode, index);
758 } else if (nexus.GetKeyType() != ELEMENT) { 758 } else if (nexus.GetKeyType() != ELEMENT) {
759 // The KeyedLoad/StoreIC has seen non-element accesses, so we cannot assume 759 // The KeyedLoad/StoreIC has seen non-element accesses, so we cannot assume
760 // that the {index} is a valid array index, thus we just let the IC continue 760 // that the {index} is a valid array index, thus we just let the IC continue
761 // to deal with this load/store. 761 // to deal with this load/store.
762 return NoChange(); 762 return NoChange();
763 } else if (nexus.ic_state() == MEGAMORPHIC) {
764 // The KeyedLoad/StoreIC uses the MEGAMORPHIC state to guard the assumption
765 // that a numeric {index} is within the valid bounds for {receiver}, i.e.
766 // it transitions to MEGAMORPHIC once it sees an out-of-bounds access. Thus
767 // we cannot continue here if the IC state is MEGAMORPHIC.
768 return NoChange();
763 } 769 }
764 770
765 // Try to lower the element access based on the {receiver_maps}. 771 // Try to lower the element access based on the {receiver_maps}.
766 return ReduceElementAccess(node, index, value, receiver_maps, access_mode, 772 return ReduceElementAccess(node, index, value, receiver_maps, access_mode,
767 language_mode, store_mode); 773 language_mode, store_mode);
768 } 774 }
769 775
770 Reduction JSNativeContextSpecialization::ReduceSoftDeoptimize( 776 Reduction JSNativeContextSpecialization::ReduceSoftDeoptimize(
771 Node* node, DeoptimizeReason reason) { 777 Node* node, DeoptimizeReason reason) {
772 Node* effect = NodeProperties::GetEffectInput(node); 778 Node* effect = NodeProperties::GetEffectInput(node);
(...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after
1529 return jsgraph()->javascript(); 1535 return jsgraph()->javascript();
1530 } 1536 }
1531 1537
1532 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { 1538 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const {
1533 return jsgraph()->simplified(); 1539 return jsgraph()->simplified();
1534 } 1540 }
1535 1541
1536 } // namespace compiler 1542 } // namespace compiler
1537 } // namespace internal 1543 } // namespace internal
1538 } // namespace v8 1544 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/compiler/deopt-string-outofbounds.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698