Revision: 12037
Author: [email protected]
Date: Wed Jul 11 00:59:58 2012
Log: Re-land "Removed one copy-n-paste clone of
HGraphBuilder::BuildStoreNamed."
The previous CL used the wrong map in some cases, leading to a wrong
decision
regarding monomorphic usage and therefore some performance regressions.
Review URL: https://chromiumcodereview.appspot.com/10694129
http://code.google.com/p/v8/source/detail?r=12037
Modified:
/branches/bleeding_edge/src/hydrogen.cc
/branches/bleeding_edge/src/hydrogen.h
=======================================
--- /branches/bleeding_edge/src/hydrogen.cc Tue Jul 10 04:01:29 2012
+++ /branches/bleeding_edge/src/hydrogen.cc Wed Jul 11 00:59:58 2012
@@ -4792,7 +4792,10 @@
CHECK_ALIVE(VisitForValue(value));
HValue* value = Pop();
HInstruction* store;
- CHECK_ALIVE(store = BuildStoreNamed(literal, value, property));
+ CHECK_ALIVE(store = BuildStoreNamed(literal,
+ value,
+
property->GetReceiverType(),
+ property->key()));
AddInstruction(store);
if (store->HasObservableSideEffects()) AddSimulate(key->id());
} else {
@@ -5030,14 +5033,13 @@
HInstruction* HGraphBuilder::BuildStoreNamed(HValue* object,
HValue* value,
- ObjectLiteral::Property*
prop) {
- Literal* key = prop->key()->AsLiteral();
- Handle<String> name = Handle<String>::cast(key->handle());
+ Handle<Map> type,
+ Expression* key) {
+ Handle<String> name = Handle<String>::cast(key->AsLiteral()->handle());
ASSERT(!name.is_null());
LookupResult lookup(isolate());
- Handle<Map> type = prop->GetReceiverType();
- bool is_monomorphic = prop->IsMonomorphic() &&
+ bool is_monomorphic = !type.is_null() &&
ComputeLoadStoreField(type, name, &lookup, true);
return is_monomorphic
@@ -5045,28 +5047,6 @@
true) // Needs smi and map check.
: BuildStoreNamedGeneric(object, name, value);
}
-
-
-HInstruction* HGraphBuilder::BuildStoreNamed(HValue* object,
- HValue* value,
- Expression* expr) {
- Property* prop = (expr->AsProperty() != NULL)
- ? expr->AsProperty()
- : expr->AsAssignment()->target()->AsProperty();
- Literal* key = prop->key()->AsLiteral();
- Handle<String> name = Handle<String>::cast(key->handle());
- ASSERT(!name.is_null());
-
- LookupResult lookup(isolate());
- SmallMapList* types = expr->GetReceiverTypes();
- bool is_monomorphic = expr->IsMonomorphic() &&
- ComputeLoadStoreField(types->first(), name, &lookup, true);
-
- return is_monomorphic
- ? BuildStoreNamedField(object, name, value, types->first(), &lookup,
- true) // Needs smi and map check.
- : BuildStoreNamedGeneric(object, name, value);
-}
void HGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr,
@@ -5220,7 +5200,10 @@
SmallMapList* types = expr->GetReceiverTypes();
if (expr->IsMonomorphic()) {
- CHECK_ALIVE(instr = BuildStoreNamed(object, value, expr));
+ CHECK_ALIVE(instr = BuildStoreNamed(object,
+ value,
+ types->first(),
+ prop->key()));
} else if (types != NULL && types->length() > 1) {
HandlePolymorphicStoreNamedField(expr, object, value, types, name);
@@ -5380,10 +5363,11 @@
CHECK_ALIVE(VisitForValue(prop->obj()));
HValue* obj = Top();
- HInstruction* load = NULL;
+ Handle<Map> map;
+ HInstruction* load;
if (prop->IsMonomorphic()) {
Handle<String> name = prop->key()->AsLiteral()->AsPropertyName();
- Handle<Map> map = prop->GetReceiverTypes()->first();
+ map = prop->GetReceiverTypes()->first();
load = BuildLoadNamed(obj, prop, map, name);
} else {
load = BuildLoadNamedGeneric(obj, prop);
@@ -5400,7 +5384,7 @@
if (instr->HasObservableSideEffects()) AddSimulate(operation->id());
HInstruction* store;
- CHECK_ALIVE(store = BuildStoreNamed(obj, instr, prop));
+ CHECK_ALIVE(store = BuildStoreNamed(obj, instr, map, prop->key()));
AddInstruction(store);
// Drop the simulated receiver and value. Return the value.
Drop(2);
@@ -7786,10 +7770,11 @@
CHECK_ALIVE(VisitForValue(prop->obj()));
HValue* obj = Top();
- HInstruction* load = NULL;
+ Handle<Map> map;
+ HInstruction* load;
if (prop->IsMonomorphic()) {
Handle<String> name = prop->key()->AsLiteral()->AsPropertyName();
- Handle<Map> map = prop->GetReceiverTypes()->first();
+ map = prop->GetReceiverTypes()->first();
load = BuildLoadNamed(obj, prop, map, name);
} else {
load = BuildLoadNamedGeneric(obj, prop);
@@ -7801,7 +7786,7 @@
input = Pop();
HInstruction* store;
- CHECK_ALIVE(store = BuildStoreNamed(obj, after, prop));
+ CHECK_ALIVE(store = BuildStoreNamed(obj, after, map, prop->key()));
AddInstruction(store);
// Overwrite the receiver in the bailout environment with the result
=======================================
--- /branches/bleeding_edge/src/hydrogen.h Tue Jul 10 02:15:03 2012
+++ /branches/bleeding_edge/src/hydrogen.h Wed Jul 11 00:59:58 2012
@@ -1149,10 +1149,8 @@
Handle<String> name);
HInstruction* BuildStoreNamed(HValue* object,
HValue* value,
- Expression* expr);
- HInstruction* BuildStoreNamed(HValue* object,
- HValue* value,
- ObjectLiteral::Property* prop);
+ Handle<Map> type,
+ Expression* key);
HInstruction* BuildStoreNamedField(HValue* object,
Handle<String> name,
HValue* value,
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev