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

Side by Side Diff: src/hydrogen.cc

Issue 1321993004: Vector ICs: ObjectLiteral refactoring for Oracle feedback (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE, turned off flag. Created 5 years, 3 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/full-codegen/x64/full-codegen-x64.cc ('k') | src/type-info.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/hydrogen.h" 5 #include "src/hydrogen.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/allocation-site-scopes.h" 9 #include "src/allocation-site-scopes.h"
10 #include "src/ast-numbering.h" 10 #include "src/ast-numbering.h"
(...skipping 5876 matching lines...) Expand 10 before | Expand all | Expand 10 after
5887 Add<HConstant>(constant_properties), 5887 Add<HConstant>(constant_properties),
5888 Add<HConstant>(flags)); 5888 Add<HConstant>(flags));
5889 5889
5890 Runtime::FunctionId function_id = Runtime::kCreateObjectLiteral; 5890 Runtime::FunctionId function_id = Runtime::kCreateObjectLiteral;
5891 literal = Add<HCallRuntime>(Runtime::FunctionForId(function_id), 4); 5891 literal = Add<HCallRuntime>(Runtime::FunctionForId(function_id), 4);
5892 } 5892 }
5893 5893
5894 // The object is expected in the bailout environment during computation 5894 // The object is expected in the bailout environment during computation
5895 // of the property values and is the value of the entire expression. 5895 // of the property values and is the value of the entire expression.
5896 Push(literal); 5896 Push(literal);
5897 int store_slot_index = 0;
5898 for (int i = 0; i < expr->properties()->length(); i++) { 5897 for (int i = 0; i < expr->properties()->length(); i++) {
5899 ObjectLiteral::Property* property = expr->properties()->at(i); 5898 ObjectLiteral::Property* property = expr->properties()->at(i);
5900 if (property->is_computed_name()) return Bailout(kComputedPropertyName); 5899 if (property->is_computed_name()) return Bailout(kComputedPropertyName);
5901 if (property->IsCompileTimeValue()) continue; 5900 if (property->IsCompileTimeValue()) continue;
5902 5901
5903 Literal* key = property->key()->AsLiteral(); 5902 Literal* key = property->key()->AsLiteral();
5904 Expression* value = property->value(); 5903 Expression* value = property->value();
5905 5904
5906 switch (property->kind()) { 5905 switch (property->kind()) {
5907 case ObjectLiteral::Property::MATERIALIZED_LITERAL: 5906 case ObjectLiteral::Property::MATERIALIZED_LITERAL:
5908 DCHECK(!CompileTimeValue::IsCompileTimeValue(value)); 5907 DCHECK(!CompileTimeValue::IsCompileTimeValue(value));
5909 // Fall through. 5908 // Fall through.
5910 case ObjectLiteral::Property::COMPUTED: 5909 case ObjectLiteral::Property::COMPUTED:
5911 // It is safe to use [[Put]] here because the boilerplate already 5910 // It is safe to use [[Put]] here because the boilerplate already
5912 // contains computed properties with an uninitialized value. 5911 // contains computed properties with an uninitialized value.
5913 if (key->value()->IsInternalizedString()) { 5912 if (key->value()->IsInternalizedString()) {
5914 if (property->emit_store()) { 5913 if (property->emit_store()) {
5915 CHECK_ALIVE(VisitForValue(value)); 5914 CHECK_ALIVE(VisitForValue(value));
5916 HValue* value = Pop(); 5915 HValue* value = Pop();
5917 5916
5918 Handle<Map> map = property->GetReceiverType(); 5917 Handle<Map> map = property->GetReceiverType();
5919 Handle<String> name = key->AsPropertyName(); 5918 Handle<String> name = key->AsPropertyName();
5920 HValue* store; 5919 HValue* store;
5921 FeedbackVectorICSlot slot = expr->GetNthSlot(store_slot_index++); 5920 FeedbackVectorICSlot slot = property->GetSlot();
5922 if (map.is_null()) { 5921 if (map.is_null()) {
5923 // If we don't know the monomorphic type, do a generic store. 5922 // If we don't know the monomorphic type, do a generic store.
5924 CHECK_ALIVE(store = BuildNamedGeneric(STORE, NULL, slot, literal, 5923 CHECK_ALIVE(store = BuildNamedGeneric(STORE, NULL, slot, literal,
5925 name, value)); 5924 name, value));
5926 } else { 5925 } else {
5927 PropertyAccessInfo info(this, STORE, map, name); 5926 PropertyAccessInfo info(this, STORE, map, name);
5928 if (info.CanAccessMonomorphic()) { 5927 if (info.CanAccessMonomorphic()) {
5929 HValue* checked_literal = Add<HCheckMaps>(literal, map); 5928 HValue* checked_literal = Add<HCheckMaps>(literal, map);
5930 DCHECK(!info.IsAccessorConstant()); 5929 DCHECK(!info.IsAccessorConstant());
5931 store = BuildMonomorphicAccess( 5930 store = BuildMonomorphicAccess(
5932 &info, literal, checked_literal, value, 5931 &info, literal, checked_literal, value,
5933 BailoutId::None(), BailoutId::None()); 5932 BailoutId::None(), BailoutId::None());
5934 } else { 5933 } else {
5935 CHECK_ALIVE(store = BuildNamedGeneric(STORE, NULL, slot, 5934 CHECK_ALIVE(store = BuildNamedGeneric(STORE, NULL, slot,
5936 literal, name, value)); 5935 literal, name, value));
5937 } 5936 }
5938 } 5937 }
5939 if (store->IsInstruction()) { 5938 if (store->IsInstruction()) {
5940 AddInstruction(HInstruction::cast(store)); 5939 AddInstruction(HInstruction::cast(store));
5941 } 5940 }
5942 DCHECK(store->HasObservableSideEffects()); 5941 DCHECK(store->HasObservableSideEffects());
5943 Add<HSimulate>(key->id(), REMOVABLE_SIMULATE); 5942 Add<HSimulate>(key->id(), REMOVABLE_SIMULATE);
5944 5943
5945 // Add [[HomeObject]] to function literals. 5944 // Add [[HomeObject]] to function literals.
5946 if (FunctionLiteral::NeedsHomeObject(property->value())) { 5945 if (FunctionLiteral::NeedsHomeObject(property->value())) {
5947 Handle<Symbol> sym = isolate()->factory()->home_object_symbol(); 5946 Handle<Symbol> sym = isolate()->factory()->home_object_symbol();
5948 HInstruction* store_home = BuildNamedGeneric( 5947 HInstruction* store_home = BuildNamedGeneric(
5949 STORE, NULL, expr->GetNthSlot(store_slot_index++), value, sym, 5948 STORE, NULL, property->GetSlot(1), value, sym, literal);
5950 literal);
5951 AddInstruction(store_home); 5949 AddInstruction(store_home);
5952 DCHECK(store_home->HasObservableSideEffects()); 5950 DCHECK(store_home->HasObservableSideEffects());
5953 Add<HSimulate>(property->value()->id(), REMOVABLE_SIMULATE); 5951 Add<HSimulate>(property->value()->id(), REMOVABLE_SIMULATE);
5954 } 5952 }
5955 } else { 5953 } else {
5956 CHECK_ALIVE(VisitForEffect(value)); 5954 CHECK_ALIVE(VisitForEffect(value));
5957 } 5955 }
5958 break; 5956 break;
5959 } 5957 }
5960 // Fall through. 5958 // Fall through.
5961 case ObjectLiteral::Property::PROTOTYPE: 5959 case ObjectLiteral::Property::PROTOTYPE:
5962 case ObjectLiteral::Property::SETTER: 5960 case ObjectLiteral::Property::SETTER:
5963 case ObjectLiteral::Property::GETTER: 5961 case ObjectLiteral::Property::GETTER:
5964 return Bailout(kObjectLiteralWithComplexProperty); 5962 return Bailout(kObjectLiteralWithComplexProperty);
5965 default: UNREACHABLE(); 5963 default: UNREACHABLE();
5966 } 5964 }
5967 } 5965 }
5968 5966
5969 // Crankshaft may not consume all the slots because it doesn't emit accessors.
5970 DCHECK(!FLAG_vector_stores || store_slot_index <= expr->slot_count());
5971
5972 if (expr->has_function()) { 5967 if (expr->has_function()) {
5973 // Return the result of the transformation to fast properties 5968 // Return the result of the transformation to fast properties
5974 // instead of the original since this operation changes the map 5969 // instead of the original since this operation changes the map
5975 // of the object. This makes sure that the original object won't 5970 // of the object. This makes sure that the original object won't
5976 // be used by other optimized code before it is transformed 5971 // be used by other optimized code before it is transformed
5977 // (e.g. because of code motion). 5972 // (e.g. because of code motion).
5978 HToFastProperties* result = Add<HToFastProperties>(Pop()); 5973 HToFastProperties* result = Add<HToFastProperties>(Pop());
5979 return ast_context()->ReturnValue(result); 5974 return ast_context()->ReturnValue(result);
5980 } else { 5975 } else {
5981 return ast_context()->ReturnValue(Pop()); 5976 return ast_context()->ReturnValue(Pop());
(...skipping 7575 matching lines...) Expand 10 before | Expand all | Expand 10 after
13557 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13552 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13558 } 13553 }
13559 13554
13560 #ifdef DEBUG 13555 #ifdef DEBUG
13561 graph_->Verify(false); // No full verify. 13556 graph_->Verify(false); // No full verify.
13562 #endif 13557 #endif
13563 } 13558 }
13564 13559
13565 } // namespace internal 13560 } // namespace internal
13566 } // namespace v8 13561 } // namespace v8
OLDNEW
« no previous file with comments | « src/full-codegen/x64/full-codegen-x64.cc ('k') | src/type-info.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698