Revision: 16028
Author:   [email protected]
Date:     Fri Aug  2 04:24:55 2013
Log:      Store transition on HStoreNamedField as HConstant.

This allows optimization passes that run in the parallel compiler thread
to use the map that a store transitions to for further analysis even
though the map handle cannot be dereferenced.

[email protected]

Review URL: https://codereview.chromium.org/21560002
http://code.google.com/p/v8/source/detail?r=16028

Modified:
 /branches/bleeding_edge/src/arm/lithium-arm.cc
 /branches/bleeding_edge/src/arm/lithium-arm.h
 /branches/bleeding_edge/src/hydrogen-instructions.cc
 /branches/bleeding_edge/src/hydrogen-instructions.h
 /branches/bleeding_edge/src/hydrogen.cc
 /branches/bleeding_edge/src/ia32/lithium-ia32.cc
 /branches/bleeding_edge/src/ia32/lithium-ia32.h
 /branches/bleeding_edge/src/mips/lithium-mips.cc
 /branches/bleeding_edge/src/mips/lithium-mips.h
 /branches/bleeding_edge/src/x64/lithium-x64.cc
 /branches/bleeding_edge/src/x64/lithium-x64.h

=======================================
--- /branches/bleeding_edge/src/arm/lithium-arm.cc      Fri Aug  2 04:17:26 2013
+++ /branches/bleeding_edge/src/arm/lithium-arm.cc      Fri Aug  2 04:24:55 2013
@@ -2311,7 +2311,7 @@
 LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
   bool is_in_object = instr->access().IsInobject();
   bool needs_write_barrier = instr->NeedsWriteBarrier();
-  bool needs_write_barrier_for_map = !instr->transition().is_null() &&
+  bool needs_write_barrier_for_map = instr->has_transition() &&
       instr->NeedsWriteBarrierForMap();

   LOperand* obj;
=======================================
--- /branches/bleeding_edge/src/arm/lithium-arm.h       Fri Aug  2 02:53:11 2013
+++ /branches/bleeding_edge/src/arm/lithium-arm.h       Fri Aug  2 04:24:55 2013
@@ -2150,7 +2150,7 @@

   virtual void PrintDataTo(StringStream* stream);

-  Handle<Map> transition() const { return hydrogen()->transition(); }
+  Handle<Map> transition() const { return hydrogen()->transition_map(); }
   Representation representation() const {
     return hydrogen()->field_representation();
   }
=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.cc Fri Aug 2 04:17:26 2013 +++ /branches/bleeding_edge/src/hydrogen-instructions.cc Fri Aug 2 04:24:55 2013
@@ -1389,10 +1389,10 @@
   // for which the map is known.
   if (HasNoUses() && dominator->IsStoreNamedField()) {
     HStoreNamedField* store = HStoreNamedField::cast(dominator);
-    UniqueValueId map_unique_id = store->transition_unique_id();
- if (!map_unique_id.IsInitialized() || store->object() != value()) return;
+    if (!store->has_transition() || store->object() != value()) return;
+    HConstant* transition = HConstant::cast(store->transition());
     for (int i = 0; i < map_set()->length(); i++) {
-      if (map_unique_id == map_unique_ids_.at(i)) {
+      if (transition->UniqueValueIdsMatch(map_unique_ids_.at(i))) {
         DeleteAndReplaceWith(NULL);
         return;
       }
@@ -3160,8 +3160,8 @@
   if (NeedsWriteBarrier()) {
     stream->Add(" (write-barrier)");
   }
-  if (!transition().is_null()) {
-    stream->Add(" (transition map %p)", *transition());
+  if (has_transition()) {
+    stream->Add(" (transition map %p)", *transition_map());
   }
 }

=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.h Fri Aug 2 04:17:26 2013 +++ /branches/bleeding_edge/src/hydrogen-instructions.h Fri Aug 2 04:24:55 2013
@@ -5971,7 +5971,7 @@
 };


-class HStoreNamedField: public HTemplateInstruction<2> {
+class HStoreNamedField: public HTemplateInstruction<3> {
  public:
   DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*,
                                  HObjectAccess, HValue*);
@@ -6003,24 +6003,37 @@
     return write_barrier_mode_ == SKIP_WRITE_BARRIER;
   }

-  HValue* object() { return OperandAt(0); }
-  HValue* value() { return OperandAt(1); }
+  HValue* object() const { return OperandAt(0); }
+  HValue* value() const { return OperandAt(1); }
+  HValue* transition() const { return OperandAt(2); }

   HObjectAccess access() const { return access_; }
-  Handle<Map> transition() const { return transition_; }
- UniqueValueId transition_unique_id() const { return transition_unique_id_; }
-  void SetTransition(Handle<Map> map, CompilationInfo* info) {
-    ASSERT(transition_.is_null());  // Only set once.
+  HValue* new_space_dominator() const { return new_space_dominator_; }
+
+  bool has_transition() const {
+    return transition() != object();
+  }
+
+  Handle<Map> transition_map() const {
+    if (has_transition()) {
+      return Handle<Map>::cast(HConstant::cast(transition())->handle());
+    } else {
+      return Handle<Map>();
+    }
+  }
+
+  void SetTransition(HConstant* map_constant, CompilationInfo* info) {
+    ASSERT(!has_transition());  // Only set once.
+    Handle<Map> map = Handle<Map>::cast(map_constant->handle());
     if (map->CanBeDeprecated()) {
map->AddDependentCompilationInfo(DependentCode::kTransitionGroup, info);
     }
-    transition_ = map;
+    SetOperandAt(2, map_constant);
   }
-  HValue* new_space_dominator() const { return new_space_dominator_; }

   bool NeedsWriteBarrier() {
ASSERT(!(FLAG_track_double_fields && field_representation().IsDouble()) ||
-           transition_.is_null());
+           !has_transition());
     if (IsSkipWriteBarrier()) return false;
     if (field_representation().IsDouble()) return false;
     if (field_representation().IsSmi()) return false;
@@ -6034,10 +6047,6 @@
     if (IsSkipWriteBarrier()) return false;
return ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator());
   }
-
-  virtual void FinalizeUniqueValueId() {
-    transition_unique_id_ = UniqueValueId(transition_);
-  }

   Representation field_representation() const {
     return access_.representation();
@@ -6048,18 +6057,15 @@
                    HObjectAccess access,
                    HValue* val)
       : access_(access),
-        transition_(),
-        transition_unique_id_(),
         new_space_dominator_(NULL),
         write_barrier_mode_(UPDATE_WRITE_BARRIER) {
     SetOperandAt(0, obj);
     SetOperandAt(1, val);
+    SetOperandAt(2, obj);
     access.SetGVNFlags(this, true);
   }

   HObjectAccess access_;
-  Handle<Map> transition_;
-  UniqueValueId transition_unique_id_;
   HValue* new_space_dominator_;
   WriteBarrierMode write_barrier_mode_;
 };
=======================================
--- /branches/bleeding_edge/src/hydrogen.cc     Fri Aug  2 04:17:26 2013
+++ /branches/bleeding_edge/src/hydrogen.cc     Fri Aug  2 04:24:55 2013
@@ -4506,7 +4506,8 @@

   if (transition_to_field) {
     Handle<Map> transition(lookup->GetTransitionMapFromMap(*map));
-    instr->SetTransition(transition, top_info());
+    HConstant* transition_constant = Add<HConstant>(transition);
+    instr->SetTransition(transition_constant, top_info());
     // TODO(fschneider): Record the new map type of the object in the IR to
     // enable elimination of redundant checks after the transition store.
     instr->SetGVNFlag(kChangesMaps);
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-ia32.cc Fri Aug 2 04:17:26 2013 +++ /branches/bleeding_edge/src/ia32/lithium-ia32.cc Fri Aug 2 04:24:55 2013
@@ -2407,7 +2407,7 @@
   bool is_external_location = instr->access().IsExternalMemory() &&
       instr->access().offset() == 0;
   bool needs_write_barrier = instr->NeedsWriteBarrier();
-  bool needs_write_barrier_for_map = !instr->transition().is_null() &&
+  bool needs_write_barrier_for_map = instr->has_transition() &&
       instr->NeedsWriteBarrierForMap();

   LOperand* obj;
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-ia32.h     Fri Aug  2 02:53:11 2013
+++ /branches/bleeding_edge/src/ia32/lithium-ia32.h     Fri Aug  2 04:24:55 2013
@@ -2236,7 +2236,7 @@

   virtual void PrintDataTo(StringStream* stream);

-  Handle<Map> transition() const { return hydrogen()->transition(); }
+  Handle<Map> transition() const { return hydrogen()->transition_map(); }
   Representation representation() const {
     return hydrogen()->field_representation();
   }
=======================================
--- /branches/bleeding_edge/src/mips/lithium-mips.cc Fri Aug 2 04:17:26 2013 +++ /branches/bleeding_edge/src/mips/lithium-mips.cc Fri Aug 2 04:24:55 2013
@@ -2234,7 +2234,7 @@
 LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
   bool is_in_object = instr->access().IsInobject();
   bool needs_write_barrier = instr->NeedsWriteBarrier();
-  bool needs_write_barrier_for_map = !instr->transition().is_null() &&
+  bool needs_write_barrier_for_map = instr->has_transition() &&
       instr->NeedsWriteBarrierForMap();

   LOperand* obj;
=======================================
--- /branches/bleeding_edge/src/mips/lithium-mips.h     Fri Aug  2 02:53:11 2013
+++ /branches/bleeding_edge/src/mips/lithium-mips.h     Fri Aug  2 04:24:55 2013
@@ -2128,7 +2128,7 @@

   virtual void PrintDataTo(StringStream* stream);

-  Handle<Map> transition() const { return hydrogen()->transition(); }
+  Handle<Map> transition() const { return hydrogen()->transition_map(); }
   Representation representation() const {
     return hydrogen()->field_representation();
   }
=======================================
--- /branches/bleeding_edge/src/x64/lithium-x64.cc      Fri Aug  2 04:17:26 2013
+++ /branches/bleeding_edge/src/x64/lithium-x64.cc      Fri Aug  2 04:24:55 2013
@@ -2222,7 +2222,7 @@
   bool is_external_location = instr->access().IsExternalMemory() &&
       instr->access().offset() == 0;
   bool needs_write_barrier = instr->NeedsWriteBarrier();
-  bool needs_write_barrier_for_map = !instr->transition().is_null() &&
+  bool needs_write_barrier_for_map = instr->has_transition() &&
       instr->NeedsWriteBarrierForMap();

   LOperand* obj;
=======================================
--- /branches/bleeding_edge/src/x64/lithium-x64.h       Fri Aug  2 02:53:11 2013
+++ /branches/bleeding_edge/src/x64/lithium-x64.h       Fri Aug  2 04:24:55 2013
@@ -2066,7 +2066,7 @@

   virtual void PrintDataTo(StringStream* stream);

-  Handle<Map> transition() const { return hydrogen()->transition(); }
+  Handle<Map> transition() const { return hydrogen()->transition_map(); }
   Representation representation() const {
     return hydrogen()->field_representation();
   }

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to