| Index: src/hydrogen-instructions.h
|
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
|
| index 52e3ba0ef8d6898b55e30edefd616a430b6a24b3..23dbbd289c6c5d5a9e07697368e9fba6ab05e22d 100644
|
| --- a/src/hydrogen-instructions.h
|
| +++ b/src/hydrogen-instructions.h
|
| @@ -2638,9 +2638,6 @@ class HUnaryMathOperation V8_FINAL : public HTemplateInstruction<2> {
|
| case kMathPowHalf:
|
| case kMathLog:
|
| case kMathExp:
|
| - case kMathSin:
|
| - case kMathCos:
|
| - case kMathTan:
|
| return Representation::Double();
|
| case kMathAbs:
|
| return representation();
|
| @@ -2685,9 +2682,6 @@ class HUnaryMathOperation V8_FINAL : public HTemplateInstruction<2> {
|
| SetGVNFlag(kChangesNewSpacePromotion);
|
| break;
|
| case kMathLog:
|
| - case kMathSin:
|
| - case kMathCos:
|
| - case kMathTan:
|
| set_representation(Representation::Double());
|
| // These operations use the TranscendentalCache, so they may allocate.
|
| SetGVNFlag(kChangesNewSpacePromotion);
|
| @@ -5609,21 +5603,21 @@ class HStoreCodeEntry V8_FINAL: public HTemplateInstruction<2> {
|
| };
|
|
|
|
|
| -class HInnerAllocatedObject V8_FINAL: public HTemplateInstruction<1> {
|
| +class HInnerAllocatedObject V8_FINAL : public HTemplateInstruction<2> {
|
| public:
|
| static HInnerAllocatedObject* New(Zone* zone,
|
| HValue* context,
|
| HValue* value,
|
| - int offset,
|
| + HValue* offset,
|
| HType type = HType::Tagged()) {
|
| return new(zone) HInnerAllocatedObject(value, offset, type);
|
| }
|
|
|
| HValue* base_object() { return OperandAt(0); }
|
| - int offset() { return offset_; }
|
| + HValue* offset() { return OperandAt(1); }
|
|
|
| virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
|
| - return Representation::Tagged();
|
| + return index == 0 ? Representation::Tagged() : Representation::Integer32();
|
| }
|
|
|
| virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
|
| @@ -5631,15 +5625,16 @@ class HInnerAllocatedObject V8_FINAL: public HTemplateInstruction<1> {
|
| DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject)
|
|
|
| private:
|
| - HInnerAllocatedObject(HValue* value, int offset, HType type = HType::Tagged())
|
| - : HTemplateInstruction<1>(type), offset_(offset) {
|
| + HInnerAllocatedObject(HValue* value,
|
| + HValue* offset,
|
| + HType type = HType::Tagged())
|
| + : HTemplateInstruction<2>(type) {
|
| ASSERT(value->IsAllocate());
|
| SetOperandAt(0, value);
|
| + SetOperandAt(1, offset);
|
| set_type(type);
|
| set_representation(Representation::Tagged());
|
| }
|
| -
|
| - int offset_;
|
| };
|
|
|
|
|
| @@ -5651,11 +5646,10 @@ inline bool StoringValueNeedsWriteBarrier(HValue* value) {
|
|
|
|
|
| inline bool ReceiverObjectNeedsWriteBarrier(HValue* object,
|
| + HValue* value,
|
| HValue* new_space_dominator) {
|
| - if (object->IsInnerAllocatedObject()) {
|
| - return ReceiverObjectNeedsWriteBarrier(
|
| - HInnerAllocatedObject::cast(object)->base_object(),
|
| - new_space_dominator);
|
| + while (object->IsInnerAllocatedObject()) {
|
| + object = HInnerAllocatedObject::cast(object)->base_object();
|
| }
|
| if (object->IsConstant() && HConstant::cast(object)->IsCell()) {
|
| return false;
|
| @@ -5667,7 +5661,17 @@ inline bool ReceiverObjectNeedsWriteBarrier(HValue* object,
|
| }
|
| if (object != new_space_dominator) return true;
|
| if (object->IsAllocate()) {
|
| - return !HAllocate::cast(object)->IsNewSpaceAllocation();
|
| + // Stores to new space allocations require no write barriers if the object
|
| + // is the new space dominator.
|
| + if (HAllocate::cast(object)->IsNewSpaceAllocation()) {
|
| + 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()) {
|
| + value = HInnerAllocatedObject::cast(value)->base_object();
|
| + }
|
| + return object != value;
|
| }
|
| return true;
|
| }
|
| @@ -5951,10 +5955,7 @@ class HObjectAccess V8_FINAL {
|
| ? Representation::Smi() : Representation::Tagged());
|
| }
|
|
|
| - static HObjectAccess ForAllocationSiteOffset(int offset) {
|
| - ASSERT(offset >= HeapObject::kHeaderSize && offset < AllocationSite::kSize);
|
| - return HObjectAccess(kInobject, offset);
|
| - }
|
| + static HObjectAccess ForAllocationSiteOffset(int offset);
|
|
|
| static HObjectAccess ForAllocationSiteList() {
|
| return HObjectAccess(kExternalMemory, 0, Representation::Tagged());
|
| @@ -6588,12 +6589,14 @@ class HStoreNamedField V8_FINAL : public HTemplateInstruction<3> {
|
| if (field_representation().IsInteger32()) return false;
|
| if (field_representation().IsExternal()) return false;
|
| return StoringValueNeedsWriteBarrier(value()) &&
|
| - ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator());
|
| + ReceiverObjectNeedsWriteBarrier(object(), value(),
|
| + new_space_dominator());
|
| }
|
|
|
| bool NeedsWriteBarrierForMap() {
|
| if (IsSkipWriteBarrier()) return false;
|
| - return ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator());
|
| + return ReceiverObjectNeedsWriteBarrier(object(), transition(),
|
| + new_space_dominator());
|
| }
|
|
|
| Representation field_representation() const {
|
| @@ -6755,7 +6758,8 @@ class HStoreKeyed V8_FINAL
|
| return false;
|
| } else {
|
| return StoringValueNeedsWriteBarrier(value()) &&
|
| - ReceiverObjectNeedsWriteBarrier(elements(), new_space_dominator());
|
| + ReceiverObjectNeedsWriteBarrier(elements(), value(),
|
| + new_space_dominator());
|
| }
|
| }
|
|
|
|
|