Chromium Code Reviews| Index: src/hydrogen-instructions.h |
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
| index 011b4080e59999f30b5ce56a40341b7628b325d4..0b5476b6585fb4ee521b904c6c024f34e2effe59 100644 |
| --- a/src/hydrogen-instructions.h |
| +++ b/src/hydrogen-instructions.h |
| @@ -5702,7 +5702,7 @@ inline bool StoringValueNeedsWriteBarrier(HValue* value) { |
| inline bool ReceiverObjectNeedsWriteBarrier(HValue* object, |
| HValue* value, |
| - HValue* new_space_dominator) { |
| + HValue* dominator) { |
| while (object->IsInnerAllocatedObject()) { |
| object = HInnerAllocatedObject::cast(object)->base_object(); |
| } |
| @@ -5714,26 +5714,25 @@ inline bool ReceiverObjectNeedsWriteBarrier(HValue* object, |
| // Stores to external references require no write barriers |
| return false; |
| } |
| - if (object != new_space_dominator) return true; |
| - if (object->IsAllocate()) { |
| - // Stores to new space allocations require no write barriers if the object |
| - // is the new space dominator. |
| + // We definitely need a write barrier unless the object is the allocation |
| + // dominator. |
| + if (object == dominator && object->IsAllocate()) { |
| + // Stores to new space allocations require no write barriers. |
| if (HAllocate::cast(object)->IsNewSpaceAllocation()) { |
| return false; |
| } |
| - // Storing a map or an immortal immovable object requires no write barriers |
| - // if the object is the new space dominator. |
| - if (value->IsConstant() && |
| - (HConstant::cast(value)->IsMap() || |
| - HConstant::cast(value)->ImmortalImmovable())) { |
| + // Stores to old space allocations require no write barriers if the value is |
| + // provably not in new space. |
| + if (value->IsConstant() && HConstant::cast(value)->NotInNewSpace()) { |
| return false; |
| } |
| - // Likewise we don't need a write barrier if we store a value that |
| - // originates from the same allocation (via allocation folding). |
| while (value->IsInnerAllocatedObject()) { |
|
Hannes Payer (out of office)
2014/05/19 09:43:45
Please add a comment what is going on here.
|
| value = HInnerAllocatedObject::cast(value)->base_object(); |
| } |
| - return object != value; |
| + if (value->IsAllocate() && |
| + !HAllocate::cast(value)->IsNewSpaceAllocation()) { |
| + return false; |
| + } |
| } |
| return true; |
| } |