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

Side by Side Diff: src/crankshaft/hydrogen.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/arm64/lithium-codegen-arm64.cc ('k') | src/crankshaft/hydrogen-instructions.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 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/crankshaft/hydrogen.h" 5 #include "src/crankshaft/hydrogen.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <sstream> 8 #include <sstream>
9 9
10 #include "src/allocation-site-scopes.h" 10 #include "src/allocation-site-scopes.h"
(...skipping 5580 matching lines...) Expand 10 before | Expand all | Expand 10 after
5591 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate()); 5591 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate());
5592 5592
5593 HValue* vector_value = Add<HConstant>(vector); 5593 HValue* vector_value = Add<HConstant>(vector);
5594 HValue* slot_value = 5594 HValue* slot_value =
5595 Add<HConstant>(vector->GetIndex(expr->VariableFeedbackSlot())); 5595 Add<HConstant>(vector->GetIndex(expr->VariableFeedbackSlot()));
5596 Callable callable = CodeFactory::LoadGlobalICInOptimizedCode( 5596 Callable callable = CodeFactory::LoadGlobalICInOptimizedCode(
5597 isolate(), ast_context()->typeof_mode()); 5597 isolate(), ast_context()->typeof_mode());
5598 HValue* stub = Add<HConstant>(callable.code()); 5598 HValue* stub = Add<HConstant>(callable.code());
5599 HValue* values[] = {slot_value, vector_value}; 5599 HValue* values[] = {slot_value, vector_value};
5600 HCallWithDescriptor* instr = New<HCallWithDescriptor>( 5600 HCallWithDescriptor* instr = New<HCallWithDescriptor>(
5601 stub, 0, callable.descriptor(), ArrayVector(values)); 5601 Code::LOAD_GLOBAL_IC, stub, 0, callable.descriptor(),
5602 ArrayVector(values));
5602 return ast_context()->ReturnInstruction(instr, expr->id()); 5603 return ast_context()->ReturnInstruction(instr, expr->id());
5603 } 5604 }
5604 } 5605 }
5605 5606
5606 case VariableLocation::PARAMETER: 5607 case VariableLocation::PARAMETER:
5607 case VariableLocation::LOCAL: { 5608 case VariableLocation::LOCAL: {
5608 HValue* value = LookupAndMakeLive(variable); 5609 HValue* value = LookupAndMakeLive(variable);
5609 if (value == graph()->GetConstantHole()) { 5610 if (value == graph()->GetConstantHole()) {
5610 DCHECK(IsDeclaredVariableMode(variable->mode()) && 5611 DCHECK(IsDeclaredVariableMode(variable->mode()) &&
5611 variable->mode() != VAR); 5612 variable->mode() != VAR);
(...skipping 1177 matching lines...) Expand 10 before | Expand all | Expand 10 after
6789 Handle<TypeFeedbackVector> vector = 6790 Handle<TypeFeedbackVector> vector =
6790 handle(current_feedback_vector(), isolate()); 6791 handle(current_feedback_vector(), isolate());
6791 HValue* name = Add<HConstant>(var->name()); 6792 HValue* name = Add<HConstant>(var->name());
6792 HValue* vector_value = Add<HConstant>(vector); 6793 HValue* vector_value = Add<HConstant>(vector);
6793 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot)); 6794 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot));
6794 Callable callable = CodeFactory::StoreICInOptimizedCode( 6795 Callable callable = CodeFactory::StoreICInOptimizedCode(
6795 isolate(), function_language_mode()); 6796 isolate(), function_language_mode());
6796 HValue* stub = Add<HConstant>(callable.code()); 6797 HValue* stub = Add<HConstant>(callable.code());
6797 HValue* values[] = {global_object, name, value, slot_value, vector_value}; 6798 HValue* values[] = {global_object, name, value, slot_value, vector_value};
6798 HCallWithDescriptor* instr = Add<HCallWithDescriptor>( 6799 HCallWithDescriptor* instr = Add<HCallWithDescriptor>(
6799 stub, 0, callable.descriptor(), ArrayVector(values)); 6800 Code::STORE_IC, stub, 0, callable.descriptor(), ArrayVector(values));
6800 USE(instr); 6801 USE(instr);
6801 DCHECK(instr->HasObservableSideEffects()); 6802 DCHECK(instr->HasObservableSideEffects());
6802 Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); 6803 Add<HSimulate>(ast_id, REMOVABLE_SIMULATE);
6803 } 6804 }
6804 } 6805 }
6805 6806
6806 6807
6807 void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { 6808 void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) {
6808 Expression* target = expr->target(); 6809 Expression* target = expr->target();
6809 VariableProxy* proxy = target->AsVariableProxy(); 6810 VariableProxy* proxy = target->AsVariableProxy();
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
7101 HValue* vector_value = Add<HConstant>(vector); 7102 HValue* vector_value = Add<HConstant>(vector);
7102 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot)); 7103 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot));
7103 7104
7104 if (access_type == LOAD) { 7105 if (access_type == LOAD) {
7105 HValue* values[] = {object, key, slot_value, vector_value}; 7106 HValue* values[] = {object, key, slot_value, vector_value};
7106 if (!expr->AsProperty()->key()->IsPropertyName()) { 7107 if (!expr->AsProperty()->key()->IsPropertyName()) {
7107 // It's possible that a keyed load of a constant string was converted 7108 // It's possible that a keyed load of a constant string was converted
7108 // to a named load. Here, at the last minute, we need to make sure to 7109 // to a named load. Here, at the last minute, we need to make sure to
7109 // use a generic Keyed Load if we are using the type vector, because 7110 // use a generic Keyed Load if we are using the type vector, because
7110 // it has to share information with full code. 7111 // it has to share information with full code.
7111 HLoadKeyedGeneric* result = 7112 Callable callable = CodeFactory::KeyedLoadICInOptimizedCode(isolate());
7112 New<HLoadKeyedGeneric>(object, key, vector, slot); 7113 HValue* stub = Add<HConstant>(callable.code());
7114 HCallWithDescriptor* result =
7115 New<HCallWithDescriptor>(Code::KEYED_LOAD_IC, stub, 0,
7116 callable.descriptor(), ArrayVector(values));
7113 return result; 7117 return result;
7114 } 7118 }
7115
7116 Callable callable = CodeFactory::LoadICInOptimizedCode(isolate()); 7119 Callable callable = CodeFactory::LoadICInOptimizedCode(isolate());
7117 HValue* stub = Add<HConstant>(callable.code()); 7120 HValue* stub = Add<HConstant>(callable.code());
7118 HCallWithDescriptor* result = New<HCallWithDescriptor>( 7121 HCallWithDescriptor* result = New<HCallWithDescriptor>(
7119 stub, 0, callable.descriptor(), ArrayVector(values)); 7122 Code::LOAD_IC, stub, 0, callable.descriptor(), ArrayVector(values));
7120 return result; 7123 return result;
7121 7124
7122 } else { 7125 } else {
7123 HValue* values[] = {object, key, value, slot_value, vector_value}; 7126 HValue* values[] = {object, key, value, slot_value, vector_value};
7124 if (vector->GetKind(slot) == FeedbackVectorSlotKind::KEYED_STORE_IC) { 7127 if (vector->GetKind(slot) == FeedbackVectorSlotKind::KEYED_STORE_IC) {
7125 // It's possible that a keyed store of a constant string was converted 7128 // It's possible that a keyed store of a constant string was converted
7126 // to a named store. Here, at the last minute, we need to make sure to 7129 // to a named store. Here, at the last minute, we need to make sure to
7127 // use a generic Keyed Store if we are using the type vector, because 7130 // use a generic Keyed Store if we are using the type vector, because
7128 // it has to share information with full code. 7131 // it has to share information with full code.
7129 Callable callable = CodeFactory::KeyedStoreICInOptimizedCode( 7132 Callable callable = CodeFactory::KeyedStoreICInOptimizedCode(
7130 isolate(), function_language_mode()); 7133 isolate(), function_language_mode());
7131 HValue* stub = Add<HConstant>(callable.code()); 7134 HValue* stub = Add<HConstant>(callable.code());
7132 HCallWithDescriptor* result = New<HCallWithDescriptor>( 7135 HCallWithDescriptor* result =
7133 stub, 0, callable.descriptor(), ArrayVector(values)); 7136 New<HCallWithDescriptor>(Code::KEYED_STORE_IC, stub, 0,
7137 callable.descriptor(), ArrayVector(values));
7134 return result; 7138 return result;
7135 } 7139 }
7136 Callable callable = CodeFactory::StoreICInOptimizedCode( 7140 Callable callable = CodeFactory::StoreICInOptimizedCode(
7137 isolate(), function_language_mode()); 7141 isolate(), function_language_mode());
7138 HValue* stub = Add<HConstant>(callable.code()); 7142 HValue* stub = Add<HConstant>(callable.code());
7139 HCallWithDescriptor* result = New<HCallWithDescriptor>( 7143 HCallWithDescriptor* result = New<HCallWithDescriptor>(
7140 stub, 0, callable.descriptor(), ArrayVector(values)); 7144 Code::STORE_IC, stub, 0, callable.descriptor(), ArrayVector(values));
7141 return result; 7145 return result;
7142 } 7146 }
7143 } 7147 }
7144 7148
7145 7149
7146 HInstruction* HOptimizedGraphBuilder::BuildKeyedGeneric( 7150 HInstruction* HOptimizedGraphBuilder::BuildKeyedGeneric(
7147 PropertyAccessType access_type, Expression* expr, FeedbackVectorSlot slot, 7151 PropertyAccessType access_type, Expression* expr, FeedbackVectorSlot slot,
7148 HValue* object, HValue* key, HValue* value) { 7152 HValue* object, HValue* key, HValue* value) {
7149 Handle<TypeFeedbackVector> vector = 7153 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate());
7150 handle(current_feedback_vector(), isolate()); 7154 HValue* vector_value = Add<HConstant>(vector);
7155 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot));
7156
7151 if (access_type == LOAD) { 7157 if (access_type == LOAD) {
7152 HLoadKeyedGeneric* result = 7158 HValue* values[] = {object, key, slot_value, vector_value};
7153 New<HLoadKeyedGeneric>(object, key, vector, slot); 7159
7160 Callable callable = CodeFactory::KeyedLoadICInOptimizedCode(isolate());
7161 HValue* stub = Add<HConstant>(callable.code());
7162 HCallWithDescriptor* result =
7163 New<HCallWithDescriptor>(Code::KEYED_LOAD_IC, stub, 0,
7164 callable.descriptor(), ArrayVector(values));
7154 return result; 7165 return result;
7155 } else { 7166 } else {
7156 HValue* vector_value = Add<HConstant>(vector);
7157 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot));
7158 HValue* values[] = {object, key, value, slot_value, vector_value}; 7167 HValue* values[] = {object, key, value, slot_value, vector_value};
7159 7168
7160 Callable callable = CodeFactory::KeyedStoreICInOptimizedCode( 7169 Callable callable = CodeFactory::KeyedStoreICInOptimizedCode(
7161 isolate(), function_language_mode()); 7170 isolate(), function_language_mode());
7162 HValue* stub = Add<HConstant>(callable.code()); 7171 HValue* stub = Add<HConstant>(callable.code());
7163 HCallWithDescriptor* result = New<HCallWithDescriptor>( 7172 HCallWithDescriptor* result =
7164 stub, 0, callable.descriptor(), ArrayVector(values)); 7173 New<HCallWithDescriptor>(Code::KEYED_STORE_IC, stub, 0,
7174 callable.descriptor(), ArrayVector(values));
7165 return result; 7175 return result;
7166 } 7176 }
7167 } 7177 }
7168 7178
7169 7179
7170 LoadKeyedHoleMode HOptimizedGraphBuilder::BuildKeyedHoleMode(Handle<Map> map) { 7180 LoadKeyedHoleMode HOptimizedGraphBuilder::BuildKeyedHoleMode(Handle<Map> map) {
7171 // Loads from a "stock" fast holey double arrays can elide the hole check. 7181 // Loads from a "stock" fast holey double arrays can elide the hole check.
7172 // Loads from a "stock" fast holey array can convert the hole to undefined 7182 // Loads from a "stock" fast holey array can convert the hole to undefined
7173 // with impunity. 7183 // with impunity.
7174 LoadKeyedHoleMode load_mode = NEVER_RETURN_HOLE; 7184 LoadKeyedHoleMode load_mode = NEVER_RETURN_HOLE;
(...skipping 6102 matching lines...) Expand 10 before | Expand all | Expand 10 after
13277 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13287 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13278 } 13288 }
13279 13289
13280 #ifdef DEBUG 13290 #ifdef DEBUG
13281 graph_->Verify(false); // No full verify. 13291 graph_->Verify(false); // No full verify.
13282 #endif 13292 #endif
13283 } 13293 }
13284 13294
13285 } // namespace internal 13295 } // namespace internal
13286 } // namespace v8 13296 } // namespace v8
OLDNEW
« no previous file with comments | « src/crankshaft/arm64/lithium-codegen-arm64.cc ('k') | src/crankshaft/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698