| Index: src/hydrogen-instructions.cc
 | 
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
 | 
| index 36d1e11edab37c49aea9aa725866799eb28b83c6..60a6912654fe50b3533a470a1df8a540d145b37d 100644
 | 
| --- a/src/hydrogen-instructions.cc
 | 
| +++ b/src/hydrogen-instructions.cc
 | 
| @@ -1584,10 +1584,10 @@ void HCheckMaps::SetSideEffectDominator(GVNFlag side_effect,
 | 
|    // for which the map is known.
 | 
|    if (HasNoUses() && dominator->IsStoreNamedField()) {
 | 
|      HStoreNamedField* store = HStoreNamedField::cast(dominator);
 | 
| -    Handle<Map> map = store->transition();
 | 
| -    if (map.is_null() || store->object() != value()) return;
 | 
| +    UniqueValueId map_unique_id = store->transition_unique_id();
 | 
| +    if (!map_unique_id.IsInitialized() || store->object() != value()) return;
 | 
|      for (int i = 0; i < map_set()->length(); i++) {
 | 
| -      if (map.is_identical_to(map_set()->at(i))) {
 | 
| +      if (map_unique_id == map_unique_ids_.at(i)) {
 | 
|          DeleteAndReplaceWith(NULL);
 | 
|          return;
 | 
|        }
 | 
| @@ -2047,6 +2047,7 @@ static bool IsInteger32(double value) {
 | 
|  
 | 
|  HConstant::HConstant(Handle<Object> handle, Representation r)
 | 
|    : handle_(handle),
 | 
| +    unique_id_(),
 | 
|      has_int32_value_(false),
 | 
|      has_double_value_(false),
 | 
|      is_internalized_string_(false),
 | 
| @@ -2075,11 +2076,13 @@ HConstant::HConstant(Handle<Object> handle, Representation r)
 | 
|  
 | 
|  
 | 
|  HConstant::HConstant(Handle<Object> handle,
 | 
| +                     UniqueValueId unique_id,
 | 
|                       Representation r,
 | 
|                       HType type,
 | 
|                       bool is_internalize_string,
 | 
|                       bool boolean_value)
 | 
|      : handle_(handle),
 | 
| +      unique_id_(unique_id),
 | 
|        has_int32_value_(false),
 | 
|        has_double_value_(false),
 | 
|        is_internalized_string_(is_internalize_string),
 | 
| @@ -2095,7 +2098,9 @@ HConstant::HConstant(Handle<Object> handle,
 | 
|  HConstant::HConstant(int32_t integer_value,
 | 
|                       Representation r,
 | 
|                       Handle<Object> optional_handle)
 | 
| -    : has_int32_value_(true),
 | 
| +    : handle_(optional_handle),
 | 
| +      unique_id_(),
 | 
| +      has_int32_value_(true),
 | 
|        has_double_value_(true),
 | 
|        is_internalized_string_(false),
 | 
|        boolean_value_(integer_value != 0),
 | 
| @@ -2108,7 +2113,9 @@ HConstant::HConstant(int32_t integer_value,
 | 
|  HConstant::HConstant(double double_value,
 | 
|                       Representation r,
 | 
|                       Handle<Object> optional_handle)
 | 
| -    : has_int32_value_(IsInteger32(double_value)),
 | 
| +    : handle_(optional_handle),
 | 
| +      unique_id_(),
 | 
| +      has_int32_value_(IsInteger32(double_value)),
 | 
|        has_double_value_(true),
 | 
|        is_internalized_string_(false),
 | 
|        boolean_value_(double_value != 0 && !isnan(double_value)),
 | 
| @@ -2133,8 +2140,12 @@ HConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const {
 | 
|    if (has_int32_value_) return new(zone) HConstant(int32_value_, r, handle_);
 | 
|    if (has_double_value_) return new(zone) HConstant(double_value_, r, handle_);
 | 
|    ASSERT(!handle_.is_null());
 | 
| -  return new(zone) HConstant(
 | 
| -      handle_, r, type_from_value_, is_internalized_string_, boolean_value_);
 | 
| +  return new(zone) HConstant(handle_,
 | 
| +                             unique_id_,
 | 
| +                             r,
 | 
| +                             type_from_value_,
 | 
| +                             is_internalized_string_,
 | 
| +                             boolean_value_);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -2459,6 +2470,8 @@ HLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* context,
 | 
|                                                         Zone* zone)
 | 
|      : types_(Min(types->length(), kMaxLoadPolymorphism), zone),
 | 
|        name_(name),
 | 
| +      types_unique_ids_(0, zone),
 | 
| +      name_unique_id_(),
 | 
|        need_generic_(false) {
 | 
|    SetOperandAt(0, context);
 | 
|    SetOperandAt(1, object);
 | 
| @@ -2525,15 +2538,39 @@ HLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* context,
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void HCheckMaps::FinalizeUniqueValueId() {
 | 
| +  if (!map_unique_ids_.is_empty()) return;
 | 
| +  Zone* zone = block()->zone();
 | 
| +  map_unique_ids_.Initialize(map_set_.length(), zone);
 | 
| +  for (int i = 0; i < map_set_.length(); i++) {
 | 
| +    map_unique_ids_.Add(UniqueValueId(map_set_.at(i)), zone);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void HLoadNamedFieldPolymorphic::FinalizeUniqueValueId() {
 | 
| +  if (!types_unique_ids_.is_empty()) return;
 | 
| +  Zone* zone = block()->zone();
 | 
| +  types_unique_ids_.Initialize(types_.length(), zone);
 | 
| +  for (int i = 0; i < types_.length(); i++) {
 | 
| +    types_unique_ids_.Add(UniqueValueId(types_.at(i)), zone);
 | 
| +  }
 | 
| +  name_unique_id_ = UniqueValueId(name_);
 | 
| +}
 | 
| +
 | 
| +
 | 
|  bool HLoadNamedFieldPolymorphic::DataEquals(HValue* value) {
 | 
| +  ASSERT_EQ(types_.length(), types_unique_ids_.length());
 | 
|    HLoadNamedFieldPolymorphic* other = HLoadNamedFieldPolymorphic::cast(value);
 | 
| -  if (types_.length() != other->types()->length()) return false;
 | 
| -  if (!name_.is_identical_to(other->name())) return false;
 | 
| +  if (name_unique_id_ != other->name_unique_id_) return false;
 | 
| +  if (types_unique_ids_.length() != other->types_unique_ids_.length()) {
 | 
| +    return false;
 | 
| +  }
 | 
|    if (need_generic_ != other->need_generic_) return false;
 | 
| -  for (int i = 0; i < types_.length(); i++) {
 | 
| +  for (int i = 0; i < types_unique_ids_.length(); i++) {
 | 
|      bool found = false;
 | 
| -    for (int j = 0; j < types_.length(); j++) {
 | 
| -      if (types_.at(j).is_identical_to(other->types()->at(i))) {
 | 
| +    for (int j = 0; j < types_unique_ids_.length(); j++) {
 | 
| +      if (types_unique_ids_.at(j) == other->types_unique_ids_.at(i)) {
 | 
|          found = true;
 | 
|          break;
 | 
|        }
 | 
| 
 |