Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index decc62705b28808de6ca0f78b66fc503421dbc5e..48bb3fce9e8c92e0f043b548e99efc6aa8d7ab5a 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -206,6 +206,7 @@ class LChunkBuilder; |
V(Calls) \ |
V(InobjectFields) \ |
V(BackingStoreFields) \ |
+ V(DoubleFields) \ |
V(ElementsKind) \ |
V(ElementsPointer) \ |
V(ArrayElements) \ |
@@ -5207,11 +5208,16 @@ class HLoadNamedField: public HTemplateInstruction<2> { |
set_representation(Representation::Tagged()); |
} |
SetFlag(kUseGVN); |
- SetGVNFlag(kDependsOnMaps); |
- if (is_in_object) { |
+ if (FLAG_track_double_fields && representation().IsDouble()) { |
+ ASSERT(is_in_object); |
+ ASSERT(offset == HeapNumber::kValueOffset); |
+ SetGVNFlag(kDependsOnDoubleFields); |
+ } else if (is_in_object) { |
SetGVNFlag(kDependsOnInobjectFields); |
+ SetGVNFlag(kDependsOnMaps); |
} else { |
SetGVNFlag(kDependsOnBackingStoreFields); |
+ SetGVNFlag(kDependsOnMaps); |
} |
} |
@@ -5551,7 +5557,7 @@ class HLoadKeyedGeneric: public HTemplateInstruction<3> { |
class HStoreNamedField: public HTemplateInstruction<2> { |
public: |
HStoreNamedField(HValue* obj, |
- Handle<String> name, |
+ Handle<Name> name, |
HValue* val, |
bool in_object, |
Representation field_representation, |
@@ -5565,18 +5571,25 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
SetOperandAt(0, obj); |
SetOperandAt(1, val); |
SetFlag(kTrackSideEffectDominators); |
- SetGVNFlag(kDependsOnNewSpacePromotion); |
- if (is_in_object_) { |
+ if (FLAG_track_double_fields && field_representation.IsDouble()) { |
+ SetGVNFlag(kChangesDoubleFields); |
+ } else if (is_in_object_) { |
SetGVNFlag(kChangesInobjectFields); |
+ SetGVNFlag(kDependsOnNewSpacePromotion); |
} else { |
SetGVNFlag(kChangesBackingStoreFields); |
+ SetGVNFlag(kDependsOnNewSpacePromotion); |
} |
} |
DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) |
virtual Representation RequiredInputRepresentation(int index) { |
- if (FLAG_track_fields && index == 1 && field_representation_.IsSmi()) { |
+ if (FLAG_track_double_fields && |
+ index == 1 && field_representation_.IsDouble()) { |
+ return field_representation_; |
+ } else if (FLAG_track_fields && |
+ index == 1 && field_representation_.IsSmi()) { |
return Representation::Integer32(); |
} |
return Representation::Tagged(); |
@@ -5590,7 +5603,7 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
HValue* object() { return OperandAt(0); } |
HValue* value() { return OperandAt(1); } |
- Handle<String> name() const { return name_; } |
+ Handle<Name> name() const { return name_; } |
bool is_in_object() const { return is_in_object_; } |
int offset() const { return offset_; } |
Handle<Map> transition() const { return transition_; } |
@@ -5599,7 +5612,11 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
HValue* new_space_dominator() const { return new_space_dominator_; } |
bool NeedsWriteBarrier() { |
+ ASSERT(!(FLAG_track_double_fields && field_representation_.IsDouble()) || |
+ transition_.is_null()); |
return (!FLAG_track_fields || !field_representation_.IsSmi()) && |
+ // If there is a transition, a new storage object needs to be allocated. |
+ !(FLAG_track_double_fields && field_representation_.IsDouble()) && |
StoringValueNeedsWriteBarrier(value()) && |
ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator()); |
} |
@@ -5617,7 +5634,7 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
} |
private: |
- Handle<String> name_; |
+ Handle<Name> name_; |
bool is_in_object_; |
Representation field_representation_; |
int offset_; |
@@ -6106,12 +6123,14 @@ class HObjectLiteral: public HMaterializedLiteral<1> { |
bool fast_elements, |
int literal_index, |
int depth, |
+ bool may_store_doubles, |
bool has_function) |
: HMaterializedLiteral<1>(literal_index, depth), |
constant_properties_(constant_properties), |
constant_properties_length_(constant_properties->length()), |
literals_(literals), |
fast_elements_(fast_elements), |
+ may_store_doubles_(may_store_doubles), |
has_function_(has_function) { |
SetOperandAt(0, context); |
SetGVNFlag(kChangesNewSpacePromotion); |
@@ -6126,6 +6145,7 @@ class HObjectLiteral: public HMaterializedLiteral<1> { |
} |
Handle<FixedArray> literals() const { return literals_; } |
bool fast_elements() const { return fast_elements_; } |
+ bool may_store_doubles() const { return may_store_doubles_; } |
bool has_function() const { return has_function_; } |
virtual Representation RequiredInputRepresentation(int index) { |
@@ -6140,6 +6160,7 @@ class HObjectLiteral: public HMaterializedLiteral<1> { |
int constant_properties_length_; |
Handle<FixedArray> literals_; |
bool fast_elements_ : 1; |
+ bool may_store_doubles_ : 1; |
bool has_function_ : 1; |
}; |