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