| Index: src/hydrogen-instructions.h | 
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h | 
| index bd1dd403a79cbd397b2a9c56a48a590c71443216..cf3efc68567ce34a235596a61d675ea166e9139f 100644 | 
| --- a/src/hydrogen-instructions.h | 
| +++ b/src/hydrogen-instructions.h | 
| @@ -5211,15 +5211,23 @@ class HStoreContextSlot: public HTemplateInstruction<2> { | 
|  | 
| class HLoadNamedField: public HTemplateInstruction<2> { | 
| public: | 
| -  HLoadNamedField(HValue* object, bool is_in_object, int offset, | 
| -                  HValue* typecheck = NULL) | 
| +  HLoadNamedField(HValue* object, bool is_in_object, StorageType storage_type, | 
| +                  int offset, HValue* typecheck = NULL) | 
| : is_in_object_(is_in_object), | 
| +        storage_type_(storage_type), | 
| offset_(offset) { | 
| ASSERT(object != NULL); | 
| SetOperandAt(0, object); | 
| SetOperandAt(1, typecheck != NULL ? typecheck : object); | 
|  | 
| -    set_representation(Representation::Tagged()); | 
| +    if (FLAG_track_fields && storage_type == SMI) { | 
| +      set_type(HType::Smi()); | 
| +      set_representation(Representation::Tagged()); | 
| +    } else if (FLAG_track_double_fields && storage_type == DOUBLE) { | 
| +      set_representation(Representation::Double()); | 
| +    } else { | 
| +      set_representation(Representation::Tagged()); | 
| +    } | 
| SetFlag(kUseGVN); | 
| SetGVNFlag(kDependsOnMaps); | 
| if (is_in_object) { | 
| @@ -5232,8 +5240,9 @@ class HLoadNamedField: public HTemplateInstruction<2> { | 
| static HLoadNamedField* NewArrayLength(Zone* zone, HValue* object, | 
| HValue* typecheck, | 
| HType type = HType::Tagged()) { | 
| +    StorageType storage = type.IsSmi() ? SMI : TAGGED; | 
| HLoadNamedField* result = new(zone) HLoadNamedField( | 
| -        object, true, JSArray::kLengthOffset, typecheck); | 
| +        object, true, storage, JSArray::kLengthOffset, typecheck); | 
| result->set_type(type); | 
| result->SetGVNFlag(kDependsOnArrayLengths); | 
| result->ClearGVNFlag(kDependsOnInobjectFields); | 
| @@ -5248,6 +5257,7 @@ class HLoadNamedField: public HTemplateInstruction<2> { | 
|  | 
| bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); } | 
| bool is_in_object() const { return is_in_object_; } | 
| +  StorageType storage_type() const { return storage_type_; } | 
| int offset() const { return offset_; } | 
|  | 
| virtual Representation RequiredInputRepresentation(int index) { | 
| @@ -5267,6 +5277,7 @@ class HLoadNamedField: public HTemplateInstruction<2> { | 
| virtual bool IsDeletable() const { return true; } | 
|  | 
| bool is_in_object_; | 
| +  StorageType storage_type_; | 
| int offset_; | 
| }; | 
|  | 
| @@ -5564,9 +5575,11 @@ class HStoreNamedField: public HTemplateInstruction<2> { | 
| Handle<String> name, | 
| HValue* val, | 
| bool in_object, | 
| +                   StorageType storage, | 
| int offset) | 
| : name_(name), | 
| is_in_object_(in_object), | 
| +        storage_(storage), | 
| offset_(offset), | 
| transition_unique_id_(), | 
| new_space_dominator_(NULL) { | 
| @@ -5584,6 +5597,12 @@ class HStoreNamedField: public HTemplateInstruction<2> { | 
| DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) | 
|  | 
| virtual Representation RequiredInputRepresentation(int index) { | 
| +    // if (FLAG_track_double_fields && index == 1 && storage_ == DOUBLE) { | 
| +    //   return Representation::Double(); | 
| +    // } else | 
| +    if (FLAG_track_fields && index == 1 && storage_ == SMI) { | 
| +      return Representation::Integer32(); | 
| +    } | 
| return Representation::Tagged(); | 
| } | 
| virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator) { | 
| @@ -5604,7 +5623,9 @@ class HStoreNamedField: public HTemplateInstruction<2> { | 
| HValue* new_space_dominator() const { return new_space_dominator_; } | 
|  | 
| bool NeedsWriteBarrier() { | 
| -    return StoringValueNeedsWriteBarrier(value()) && | 
| +    return (storage_ != SMI || !FLAG_track_fields) && | 
| +        // (storage_ != DOUBLE || !FLAG_track_double_fields) && | 
| +        StoringValueNeedsWriteBarrier(value()) && | 
| ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator()); | 
| } | 
|  | 
| @@ -5616,9 +5637,14 @@ class HStoreNamedField: public HTemplateInstruction<2> { | 
| transition_unique_id_ = UniqueValueId(transition_); | 
| } | 
|  | 
| +  StorageType storage_type() const { | 
| +    return storage_; | 
| +  } | 
| + | 
| private: | 
| Handle<String> name_; | 
| bool is_in_object_; | 
| +  StorageType storage_; | 
| int offset_; | 
| Handle<Map> transition_; | 
| UniqueValueId transition_unique_id_; | 
|  |