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

Side by Side Diff: src/hydrogen.cc

Issue 1093413002: VectorICs: support converting keyed loads into named loads in crankshaft. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/hydrogen.h" 5 #include "src/hydrogen.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/v8.h" 9 #include "src/v8.h"
10 10
(...skipping 6950 matching lines...) Expand 10 before | Expand all | Expand 10 after
6961 6961
6962 HInstruction* HOptimizedGraphBuilder::BuildNamedGeneric( 6962 HInstruction* HOptimizedGraphBuilder::BuildNamedGeneric(
6963 PropertyAccessType access_type, Expression* expr, HValue* object, 6963 PropertyAccessType access_type, Expression* expr, HValue* object,
6964 Handle<String> name, HValue* value, bool is_uninitialized) { 6964 Handle<String> name, HValue* value, bool is_uninitialized) {
6965 if (is_uninitialized) { 6965 if (is_uninitialized) {
6966 Add<HDeoptimize>( 6966 Add<HDeoptimize>(
6967 Deoptimizer::kInsufficientTypeFeedbackForGenericNamedAccess, 6967 Deoptimizer::kInsufficientTypeFeedbackForGenericNamedAccess,
6968 Deoptimizer::SOFT); 6968 Deoptimizer::SOFT);
6969 } 6969 }
6970 if (access_type == LOAD) { 6970 if (access_type == LOAD) {
6971 HLoadNamedGeneric* result =
6972 New<HLoadNamedGeneric>(object, name, PREMONOMORPHIC);
6973 if (FLAG_vector_ics) { 6971 if (FLAG_vector_ics) {
6974 Handle<TypeFeedbackVector> vector = 6972 Handle<TypeFeedbackVector> vector =
6975 handle(current_feedback_vector(), isolate()); 6973 handle(current_feedback_vector(), isolate());
6976 FeedbackVectorICSlot slot = expr->AsProperty()->PropertyFeedbackSlot(); 6974 FeedbackVectorICSlot slot = expr->AsProperty()->PropertyFeedbackSlot();
6975
6976 if (!expr->AsProperty()->key()->IsPropertyName()) {
6977 // It's possible that a keyed load of a constant string was converted
6978 // to a named load. Here, at the last minute, we need to make sure to
6979 // use a generic Keyed Load if we are using the type vector, because
6980 // it has to share information with full code.
6981 HConstant* key = Add<HConstant>(name);
6982 HLoadKeyedGeneric* result =
6983 New<HLoadKeyedGeneric>(object, key, PREMONOMORPHIC);
6984 result->SetVectorAndSlot(vector, slot);
6985 return result;
6986 }
6987
6988 HLoadNamedGeneric* result =
6989 New<HLoadNamedGeneric>(object, name, PREMONOMORPHIC);
6977 result->SetVectorAndSlot(vector, slot); 6990 result->SetVectorAndSlot(vector, slot);
6991 return result;
6978 } 6992 }
6979 return result; 6993 return New<HLoadNamedGeneric>(object, name, PREMONOMORPHIC);
6980 } else { 6994 } else {
6981 return New<HStoreNamedGeneric>(object, name, value, 6995 return New<HStoreNamedGeneric>(object, name, value,
6982 function_language_mode(), PREMONOMORPHIC); 6996 function_language_mode(), PREMONOMORPHIC);
6983 } 6997 }
6984 } 6998 }
6985 6999
6986 7000
6987 7001
6988 HInstruction* HOptimizedGraphBuilder::BuildKeyedGeneric( 7002 HInstruction* HOptimizedGraphBuilder::BuildKeyedGeneric(
6989 PropertyAccessType access_type, 7003 PropertyAccessType access_type,
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
7272 Deoptimizer::kUnknownMapInPolymorphicElementAccess); 7286 Deoptimizer::kUnknownMapInPolymorphicElementAccess);
7273 set_current_block(join); 7287 set_current_block(join);
7274 return access_type == STORE ? val : Pop(); 7288 return access_type == STORE ? val : Pop();
7275 } 7289 }
7276 7290
7277 7291
7278 HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess( 7292 HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess(
7279 HValue* obj, HValue* key, HValue* val, Expression* expr, BailoutId ast_id, 7293 HValue* obj, HValue* key, HValue* val, Expression* expr, BailoutId ast_id,
7280 BailoutId return_id, PropertyAccessType access_type, 7294 BailoutId return_id, PropertyAccessType access_type,
7281 bool* has_side_effects) { 7295 bool* has_side_effects) {
7282 // TODO(mvstanton): This optimization causes trouble for vector-based 7296 if (key->ActualValue()->IsConstant()) {
7283 // KeyedLoadICs, turn it off for now.
7284 if (!FLAG_vector_ics && key->ActualValue()->IsConstant()) {
7285 Handle<Object> constant = 7297 Handle<Object> constant =
7286 HConstant::cast(key->ActualValue())->handle(isolate()); 7298 HConstant::cast(key->ActualValue())->handle(isolate());
7287 uint32_t array_index; 7299 uint32_t array_index;
7288 if (constant->IsString() && 7300 if (constant->IsString() &&
7289 !Handle<String>::cast(constant)->AsArrayIndex(&array_index)) { 7301 !Handle<String>::cast(constant)->AsArrayIndex(&array_index)) {
7290 if (!constant->IsUniqueName()) { 7302 if (!constant->IsUniqueName()) {
7291 constant = isolate()->factory()->InternalizeString( 7303 constant = isolate()->factory()->InternalizeString(
7292 Handle<String>::cast(constant)); 7304 Handle<String>::cast(constant));
7293 } 7305 }
7294 HInstruction* instr = 7306 HInstruction* instr =
(...skipping 5740 matching lines...) Expand 10 before | Expand all | Expand 10 after
13035 if (ShouldProduceTraceOutput()) { 13047 if (ShouldProduceTraceOutput()) {
13036 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13048 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13037 } 13049 }
13038 13050
13039 #ifdef DEBUG 13051 #ifdef DEBUG
13040 graph_->Verify(false); // No full verify. 13052 graph_->Verify(false); // No full verify.
13041 #endif 13053 #endif
13042 } 13054 }
13043 13055
13044 } } // namespace v8::internal 13056 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698