| Index: src/hydrogen-check-elimination.cc
|
| diff --git a/src/hydrogen-check-elimination.cc b/src/hydrogen-check-elimination.cc
|
| index c4e24e246edf6fafa2d18d4d673232931e1622cd..f3c5cbe151e3e7e1615834bf3834927158e03f78 100644
|
| --- a/src/hydrogen-check-elimination.cc
|
| +++ b/src/hydrogen-check-elimination.cc
|
| @@ -451,7 +451,15 @@ class HCheckTable : public ZoneObject {
|
|
|
| void ReduceStoreNamedField(HStoreNamedField* instr) {
|
| HValue* object = instr->object()->ActualValue();
|
| - if (instr->access().IsMap()) {
|
| + if (instr->has_transition()) {
|
| + // This store transitions the object to a new map.
|
| + Kill(object);
|
| + HConstant* c_transition = HConstant::cast(instr->transition());
|
| + HCheckTableEntry::State state = c_transition->HasStableMapValue()
|
| + ? HCheckTableEntry::CHECKED_STABLE
|
| + : HCheckTableEntry::CHECKED;
|
| + Insert(object, NULL, c_transition->MapValue(), state);
|
| + } else if (instr->access().IsMap()) {
|
| // This is a store directly to the map field of the object.
|
| Kill(object);
|
| if (!instr->value()->IsConstant()) return;
|
| @@ -706,7 +714,7 @@ class HCheckMapsEffects : public ZoneObject {
|
| switch (instr->opcode()) {
|
| case HValue::kStoreNamedField: {
|
| HStoreNamedField* store = HStoreNamedField::cast(instr);
|
| - if (store->access().IsMap()) {
|
| + if (store->access().IsMap() || store->has_transition()) {
|
| objects_.Add(store->object(), zone);
|
| }
|
| break;
|
|
|