Revision: 6120
Author: [email protected]
Date: Sat Dec 25 06:14:16 2010
Log: Don't emit a write barrier when storing a known old space value.

Review URL: http://codereview.chromium.org/6072009
http://code.google.com/p/v8/source/detail?r=6120

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

=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.h Wed Dec 22 07:43:32 2010 +++ /branches/bleeding_edge/src/hydrogen-instructions.h Sat Dec 25 06:14:16 2010
@@ -1768,6 +1768,8 @@
   HConstant(Handle<Object> handle, Representation r);

   Handle<Object> handle() const { return handle_; }
+
+  bool InOldSpace() const { return !Heap::InNewSpace(*handle_); }

   virtual bool EmitAtUses() const { return !representation().IsDouble(); }
   virtual void PrintDataTo(StringStream* stream) const;
@@ -2687,6 +2689,12 @@
 };


+static inline bool StoringValueNeedsWriteBarrier(HValue* value) {
+  return !value->type().IsSmi() &&
+      !(value->IsConstant() && HConstant::cast(value)->InOldSpace());
+}
+
+
 class HStoreNamed: public HBinaryOperation {
  public:
   HStoreNamed(HValue* obj, Handle<Object> name, HValue* val)
@@ -2703,6 +2711,10 @@
   Handle<Object> name() const { return name_; }
   HValue* value() const { return OperandAt(1); }
   void set_value(HValue* value) { SetOperandAt(1, value); }
+
+  bool NeedsWriteBarrier() const {
+    return StoringValueNeedsWriteBarrier(value());
+  }

   DECLARE_INSTRUCTION(StoreNamed)

@@ -2783,6 +2795,10 @@
   HValue* object() const { return OperandAt(0); }
   HValue* key() const { return OperandAt(1); }
   HValue* value() const { return OperandAt(2); }
+
+  bool NeedsWriteBarrier() const {
+    return StoringValueNeedsWriteBarrier(value());
+  }

   DECLARE_INSTRUCTION(StoreKeyed)

@@ -2802,10 +2818,6 @@
       : HStoreKeyed(obj, key, val) {
     SetFlag(kChangesArrayElements);
   }
-
-  bool NeedsWriteBarrier() const {
-    return !value()->type().IsSmi();
-  }

   virtual Representation RequiredInputRepresentation(int index) const {
     // The key is supposed to be Integer32.
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-ia32.cc Wed Dec 22 07:43:32 2010 +++ /branches/bleeding_edge/src/ia32/lithium-ia32.cc Sat Dec 25 06:14:16 2010
@@ -1939,7 +1939,7 @@


 LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
-  bool needs_write_barrier = !instr->value()->type().IsSmi();
+  bool needs_write_barrier = instr->NeedsWriteBarrier();

   LOperand* obj = needs_write_barrier
       ? UseTempRegister(instr->object())

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to