diff options
Diffstat (limited to 'deps/v8/src/hydrogen-check-elimination.cc')
-rw-r--r-- | deps/v8/src/hydrogen-check-elimination.cc | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/deps/v8/src/hydrogen-check-elimination.cc b/deps/v8/src/hydrogen-check-elimination.cc index 1530fe1cf5..4bdad06503 100644 --- a/deps/v8/src/hydrogen-check-elimination.cc +++ b/deps/v8/src/hydrogen-check-elimination.cc @@ -628,14 +628,23 @@ class HCheckTable : public ZoneObject { HValue* object = instr->object()->ActualValue(); HCheckTableEntry* entry = Find(object); // Can only learn more about an object that already has a known set of maps. - if (entry == NULL) return; + if (entry == NULL) { + Kill(object); + return; + } EnsureChecked(entry, object, instr); if (entry->maps_->Contains(instr->original_map())) { // If the object has the original map, it will be transitioned. UniqueSet<Map>* maps = entry->maps_->Copy(zone()); maps->Remove(instr->original_map()); maps->Add(instr->transitioned_map(), zone()); - entry->maps_ = maps; + HCheckTableEntry::State state = + (entry->state_ == HCheckTableEntry::CHECKED_STABLE && + instr->map_is_stable()) + ? HCheckTableEntry::CHECKED_STABLE + : HCheckTableEntry::CHECKED; + Kill(object); + Insert(object, NULL, maps, state); } else { // Object does not have the given map, thus the transition is redundant. instr->DeleteAndReplaceWith(object); |