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

Reply via email to