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

Side by Side Diff: src/crankshaft/hydrogen-instructions.cc

Issue 2391043005: [crankshaft] Remove HLoadKeyedGeneric and use HCallWithDescriptor to call KeyedLoadIC. (Closed)
Patch Set: Rebasing 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/crankshaft/hydrogen-instructions.h ('k') | src/crankshaft/ia32/lithium-codegen-ia32.cc » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/crankshaft/hydrogen-instructions.h" 5 #include "src/crankshaft/hydrogen-instructions.h"
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/base/ieee754.h" 8 #include "src/base/ieee754.h"
9 #include "src/base/safe_math.h" 9 #include "src/base/safe_math.h"
10 #include "src/crankshaft/hydrogen-infer-representation.h" 10 #include "src/crankshaft/hydrogen-infer-representation.h"
(...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 case HValue::kClampToUint8: 855 case HValue::kClampToUint8:
856 case HValue::kDeoptimize: 856 case HValue::kDeoptimize:
857 case HValue::kDiv: 857 case HValue::kDiv:
858 case HValue::kForInCacheArray: 858 case HValue::kForInCacheArray:
859 case HValue::kForInPrepareMap: 859 case HValue::kForInPrepareMap:
860 case HValue::kHasInPrototypeChainAndBranch: 860 case HValue::kHasInPrototypeChainAndBranch:
861 case HValue::kInvokeFunction: 861 case HValue::kInvokeFunction:
862 case HValue::kLoadContextSlot: 862 case HValue::kLoadContextSlot:
863 case HValue::kLoadFunctionPrototype: 863 case HValue::kLoadFunctionPrototype:
864 case HValue::kLoadKeyed: 864 case HValue::kLoadKeyed:
865 case HValue::kLoadKeyedGeneric:
866 case HValue::kMathFloorOfDiv: 865 case HValue::kMathFloorOfDiv:
867 case HValue::kMaybeGrowElements: 866 case HValue::kMaybeGrowElements:
868 case HValue::kMod: 867 case HValue::kMod:
869 case HValue::kMul: 868 case HValue::kMul:
870 case HValue::kOsrEntry: 869 case HValue::kOsrEntry:
871 case HValue::kPower: 870 case HValue::kPower:
872 case HValue::kPrologue: 871 case HValue::kPrologue:
873 case HValue::kRor: 872 case HValue::kRor:
874 case HValue::kSar: 873 case HValue::kSar:
875 case HValue::kSeqStringSetChar: 874 case HValue::kSeqStringSetChar:
(...skipping 2105 matching lines...) Expand 10 before | Expand all | Expand 10 after
2981 return false; 2980 return false;
2982 } 2981 }
2983 2982
2984 if (hole_mode() == CONVERT_HOLE_TO_UNDEFINED) { 2983 if (hole_mode() == CONVERT_HOLE_TO_UNDEFINED) {
2985 return false; 2984 return false;
2986 } 2985 }
2987 2986
2988 return !UsesMustHandleHole(); 2987 return !UsesMustHandleHole();
2989 } 2988 }
2990 2989
2990 HValue* HCallWithDescriptor::Canonicalize() {
2991 if (kind() != Code::KEYED_LOAD_IC) return this;
2991 2992
2992 std::ostream& HLoadKeyedGeneric::PrintDataTo(
2993 std::ostream& os) const { // NOLINT
2994 return os << NameOf(object()) << "[" << NameOf(key()) << "]";
2995 }
2996
2997
2998 HValue* HLoadKeyedGeneric::Canonicalize() {
2999 // Recognize generic keyed loads that use property name generated 2993 // Recognize generic keyed loads that use property name generated
3000 // by for-in statement as a key and rewrite them into fast property load 2994 // by for-in statement as a key and rewrite them into fast property load
3001 // by index. 2995 // by index.
3002 if (key()->IsLoadKeyed()) { 2996 typedef LoadWithVectorDescriptor Descriptor;
3003 HLoadKeyed* key_load = HLoadKeyed::cast(key()); 2997 HValue* key = parameter(Descriptor::kName);
2998 if (key->IsLoadKeyed()) {
2999 HLoadKeyed* key_load = HLoadKeyed::cast(key);
3004 if (key_load->elements()->IsForInCacheArray()) { 3000 if (key_load->elements()->IsForInCacheArray()) {
3005 HForInCacheArray* names_cache = 3001 HForInCacheArray* names_cache =
3006 HForInCacheArray::cast(key_load->elements()); 3002 HForInCacheArray::cast(key_load->elements());
3007 3003
3008 if (names_cache->enumerable() == object()) { 3004 HValue* object = parameter(Descriptor::kReceiver);
3005 if (names_cache->enumerable() == object) {
3009 HForInCacheArray* index_cache = 3006 HForInCacheArray* index_cache =
3010 names_cache->index_cache(); 3007 names_cache->index_cache();
3011 HCheckMapValue* map_check = HCheckMapValue::New( 3008 HCheckMapValue* map_check = HCheckMapValue::New(
3012 block()->graph()->isolate(), block()->graph()->zone(), 3009 block()->graph()->isolate(), block()->graph()->zone(),
3013 block()->graph()->GetInvalidContext(), object(), 3010 block()->graph()->GetInvalidContext(), object, names_cache->map());
3014 names_cache->map());
3015 HInstruction* index = HLoadKeyed::New( 3011 HInstruction* index = HLoadKeyed::New(
3016 block()->graph()->isolate(), block()->graph()->zone(), 3012 block()->graph()->isolate(), block()->graph()->zone(),
3017 block()->graph()->GetInvalidContext(), index_cache, key_load->key(), 3013 block()->graph()->GetInvalidContext(), index_cache, key_load->key(),
3018 key_load->key(), nullptr, key_load->elements_kind()); 3014 key_load->key(), nullptr, key_load->elements_kind());
3019 map_check->InsertBefore(this); 3015 map_check->InsertBefore(this);
3020 index->InsertBefore(this); 3016 index->InsertBefore(this);
3021 return Prepend(new(block()->zone()) HLoadFieldByIndex( 3017 return Prepend(new (block()->zone()) HLoadFieldByIndex(object, index));
3022 object(), index));
3023 } 3018 }
3024 } 3019 }
3025 } 3020 }
3026
3027 return this; 3021 return this;
3028 } 3022 }
3029 3023
3030
3031 std::ostream& HStoreNamedField::PrintDataTo(std::ostream& os) const { // NOLINT 3024 std::ostream& HStoreNamedField::PrintDataTo(std::ostream& os) const { // NOLINT
3032 os << NameOf(object()) << access_ << " = " << NameOf(value()); 3025 os << NameOf(object()) << access_ << " = " << NameOf(value());
3033 if (NeedsWriteBarrier()) os << " (write-barrier)"; 3026 if (NeedsWriteBarrier()) os << " (write-barrier)";
3034 if (has_transition()) os << " (transition map " << *transition_map() << ")"; 3027 if (has_transition()) os << " (transition map " << *transition_map() << ")";
3035 return os; 3028 return os;
3036 } 3029 }
3037 3030
3038 3031
3039 std::ostream& HStoreKeyed::PrintDataTo(std::ostream& os) const { // NOLINT 3032 std::ostream& HStoreKeyed::PrintDataTo(std::ostream& os) const { // NOLINT
3040 if (!is_fixed_typed_array()) { 3033 if (!is_fixed_typed_array()) {
(...skipping 998 matching lines...) Expand 10 before | Expand all | Expand 10 after
4039 case HObjectAccess::kExternalMemory: 4032 case HObjectAccess::kExternalMemory:
4040 os << "[external-memory]"; 4033 os << "[external-memory]";
4041 break; 4034 break;
4042 } 4035 }
4043 4036
4044 return os << "@" << access.offset(); 4037 return os << "@" << access.offset();
4045 } 4038 }
4046 4039
4047 } // namespace internal 4040 } // namespace internal
4048 } // namespace v8 4041 } // namespace v8
OLDNEW
« no previous file with comments | « src/crankshaft/hydrogen-instructions.h ('k') | src/crankshaft/ia32/lithium-codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698