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