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

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

Issue 2474013002: [turbofan] CheckBounds cannot be used within asm.js. (Closed)
Patch Set: 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 | src/compiler/node-matchers.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 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 670 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 and not MEGAMORPHIC, otherwise there's no 685 // is in element access mode and not MEGAMORPHIC, otherwise there's no
686 // guard for the bounds check below. 686 // guard for the bounds check below.
687 if (nexus.ic_state() != MEGAMORPHIC && 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 // Properly deal with constant {index}.
692 Node* length = jsgraph()->Constant(string->length()); 692 NumberMatcher mindex(index);
693 index = effect = graph()->NewNode(simplified()->CheckBounds(), index, 693 if (mindex.IsInteger() && mindex.IsInRange(0.0, string->length() - 1)) {
694 length, effect, control); 694 // Constant-fold the {index} access to {string}.
695 Node* value =
696 jsgraph()->Constant(string->Get(static_cast<int>(mindex.Value())));
697 ReplaceWithValue(node, value, effect, control);
698 return Replace(value);
699 } else if (flags() & kDeoptimizationEnabled) {
700 // Ensure that {index} is less than {receiver} length.
701 Node* length = jsgraph()->Constant(string->length());
702 index = effect = graph()->NewNode(simplified()->CheckBounds(), index,
703 length, effect, control);
695 704
696 // Load the character from the {receiver}. 705 // Load the character from the {receiver}.
697 value = graph()->NewNode(simplified()->StringCharCodeAt(), receiver, 706 value = graph()->NewNode(simplified()->StringCharCodeAt(), receiver,
698 index, control); 707 index, control);
699 708
700 // Return it as a single character string. 709 // Return it as a single character string.
701 value = graph()->NewNode(simplified()->StringFromCharCode(), value); 710 value = graph()->NewNode(simplified()->StringFromCharCode(), value);
702 ReplaceWithValue(node, value, effect, control); 711 ReplaceWithValue(node, value, effect, control);
703 return Replace(value); 712 return Replace(value);
713 }
704 } 714 }
705 } 715 }
706 716
707 // Check if the {nexus} reports type feedback for the IC. 717 // Check if the {nexus} reports type feedback for the IC.
708 if (nexus.IsUninitialized()) { 718 if (nexus.IsUninitialized()) {
709 if ((flags() & kDeoptimizationEnabled) && 719 if ((flags() & kDeoptimizationEnabled) &&
710 (flags() & kBailoutOnUninitialized)) { 720 (flags() & kBailoutOnUninitialized)) {
711 return ReduceSoftDeoptimize( 721 return ReduceSoftDeoptimize(
712 node, 722 node,
713 DeoptimizeReason::kInsufficientTypeFeedbackForGenericKeyedAccess); 723 DeoptimizeReason::kInsufficientTypeFeedbackForGenericKeyedAccess);
(...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after
1623 return jsgraph()->javascript(); 1633 return jsgraph()->javascript();
1624 } 1634 }
1625 1635
1626 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { 1636 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const {
1627 return jsgraph()->simplified(); 1637 return jsgraph()->simplified();
1628 } 1638 }
1629 1639
1630 } // namespace compiler 1640 } // namespace compiler
1631 } // namespace internal 1641 } // namespace internal
1632 } // namespace v8 1642 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/compiler/node-matchers.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698