Revert "Removed one copy-n-paste clone of HGraphBuilder::BuildStoreNamed."
authorsvenpanne@chromium.org <svenpanne@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 10 Jul 2012 09:15:03 +0000 (09:15 +0000)
committersvenpanne@chromium.org <svenpanne@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 10 Jul 2012 09:15:03 +0000 (09:15 +0000)
It inadvertently introduced some performance regressions, e.g. for the
'richards' benchmark.

Review URL: https://chromiumcodereview.appspot.com/10704127

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12023 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/ast.h
src/hydrogen.cc
src/hydrogen.h

index 592e449..156b879 100644 (file)
--- a/src/ast.h
+++ b/src/ast.h
@@ -1325,6 +1325,7 @@ class ObjectLiteral: public MaterializedLiteral {
 
     // Type feedback information.
     void RecordTypeFeedback(TypeFeedbackOracle* oracle);
+    bool IsMonomorphic() { return !receiver_type_.is_null(); }
     Handle<Map> GetReceiverType() { return receiver_type_; }
 
     bool IsCompileTimeValue();
@@ -1528,11 +1529,6 @@ class Property: public Expression {
   void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* zone);
   virtual bool IsMonomorphic() { return is_monomorphic_; }
   virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; }
-
-  Handle<Map> GetReceiverType() {
-    return IsMonomorphic() ? GetReceiverTypes()->first() : Handle<Map>();
-  }
-
   bool IsArrayLength() { return is_array_length_; }
   bool IsUninitialized() { return is_uninitialized_; }
 
index 86445f6..539b48a 100644 (file)
@@ -4778,10 +4778,7 @@ void HGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
             CHECK_ALIVE(VisitForValue(value));
             HValue* value = Pop();
             HInstruction* store;
-            CHECK_ALIVE(store = BuildStoreNamed(literal,
-                                                value,
-                                                property->GetReceiverType(),
-                                                property->key()));
+            CHECK_ALIVE(store = BuildStoreNamed(literal, value, property));
             AddInstruction(store);
             if (store->HasObservableSideEffects()) AddSimulate(key->id());
           } else {
@@ -5019,13 +5016,14 @@ HInstruction* HGraphBuilder::BuildStoreNamedGeneric(HValue* object,
 
 HInstruction* HGraphBuilder::BuildStoreNamed(HValue* object,
                                              HValue* value,
-                                             Handle<Map> type,
-                                             Expression* key) {
-  Handle<String> name = Handle<String>::cast(key->AsLiteral()->handle());
+                                             ObjectLiteral::Property* prop) {
+  Literal* key = prop->key()->AsLiteral();
+  Handle<String> name = Handle<String>::cast(key->handle());
   ASSERT(!name.is_null());
 
   LookupResult lookup(isolate());
-  bool is_monomorphic = !type.is_null() &&
+  Handle<Map> type = prop->GetReceiverType();
+  bool is_monomorphic = prop->IsMonomorphic() &&
       ComputeLoadStoreField(type, name, &lookup, true);
 
   return is_monomorphic
@@ -5035,6 +5033,28 @@ HInstruction* HGraphBuilder::BuildStoreNamed(HValue* object,
 }
 
 
+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,
                                                     HValue* object,
                                                     SmallMapList* types,
@@ -5186,12 +5206,7 @@ void HGraphBuilder::HandlePropertyAssignment(Assignment* expr) {
 
     SmallMapList* types = expr->GetReceiverTypes();
     if (expr->IsMonomorphic()) {
-      CHECK(expr->AsProperty() == NULL);
-      Property* prop = expr->AsAssignment()->target()->AsProperty();
-      CHECK_ALIVE(instr = BuildStoreNamed(object,
-                                          value,
-                                          prop->GetReceiverType(),
-                                          prop->key()));
+      CHECK_ALIVE(instr = BuildStoreNamed(object, value, expr));
 
     } else if (types != NULL && types->length() > 1) {
       HandlePolymorphicStoreNamedField(expr, object, value, types, name);
@@ -5371,10 +5386,7 @@ void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) {
       if (instr->HasObservableSideEffects()) AddSimulate(operation->id());
 
       HInstruction* store;
-      CHECK_ALIVE(store = BuildStoreNamed(obj,
-                                          instr,
-                                          prop->GetReceiverType(),
-                                          prop->key()));
+      CHECK_ALIVE(store = BuildStoreNamed(obj, instr, prop));
       AddInstruction(store);
       // Drop the simulated receiver and value.  Return the value.
       Drop(2);
@@ -7775,10 +7787,7 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) {
       input = Pop();
 
       HInstruction* store;
-      CHECK_ALIVE(store = BuildStoreNamed(obj,
-                                          after,
-                                          prop->GetReceiverType(),
-                                          prop->key()));
+      CHECK_ALIVE(store = BuildStoreNamed(obj, after, prop));
       AddInstruction(store);
 
       // Overwrite the receiver in the bailout environment with the result
index 539cfe3..ac19db7 100644 (file)
@@ -1149,8 +1149,10 @@ class HGraphBuilder: public AstVisitor {
                                Handle<String> name);
   HInstruction* BuildStoreNamed(HValue* object,
                                 HValue* value,
-                                Handle<Map> type,
-                                Expression* key);
+                                Expression* expr);
+  HInstruction* BuildStoreNamed(HValue* object,
+                                HValue* value,
+                                ObjectLiteral::Property* prop);
   HInstruction* BuildStoreNamedField(HValue* object,
                                      Handle<String> name,
                                      HValue* value,