| Index: src/hydrogen-instructions.h
|
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
|
| index 011b4080e59999f30b5ce56a40341b7628b325d4..d9cb511d00fbadc97f905d9fcc8cceeeb3281974 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,27 @@ 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
|
| + // a constant 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).
|
| + // Stores to old space allocations require no write barriers if the value is
|
| + // an old space allocation.
|
| while (value->IsInnerAllocatedObject()) {
|
| value = HInnerAllocatedObject::cast(value)->base_object();
|
| }
|
| - return object != value;
|
| + if (value->IsAllocate() &&
|
| + !HAllocate::cast(value)->IsNewSpaceAllocation()) {
|
| + return false;
|
| + }
|
| }
|
| return true;
|
| }
|
|
|