| Index: src/hydrogen-instructions.cc
|
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
|
| index e7ad219964b3946b35e81dbd76011d7e8ff2133f..c984f0fe625fa7a619c199bbacd3b8dc02e02c0b 100644
|
| --- a/src/hydrogen-instructions.cc
|
| +++ b/src/hydrogen-instructions.cc
|
| @@ -1542,6 +1542,11 @@ void HCheckInstanceType::GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag) {
|
| }
|
|
|
|
|
| +static bool IsMapAccess(HObjectAccess access) {
|
| + return access.IsInobject() && access.offset() == JSObject::kMapOffset;
|
| +}
|
| +
|
| +
|
| void HCheckMaps::HandleSideEffectDominator(GVNFlag side_effect,
|
| HValue* dominator) {
|
| ASSERT(side_effect == kChangesMaps);
|
| @@ -1550,8 +1555,12 @@ void HCheckMaps::HandleSideEffectDominator(GVNFlag side_effect,
|
| // for which the map is known.
|
| if (HasNoUses() && dominator->IsStoreNamedField()) {
|
| HStoreNamedField* store = HStoreNamedField::cast(dominator);
|
| - if (!store->has_transition() || store->object() != value()) return;
|
| - HConstant* transition = HConstant::cast(store->transition());
|
| + if (!IsMapAccess(store->access()) ||
|
| + store->object() != value() ||
|
| + !store->value()->IsConstant()) {
|
| + return;
|
| + }
|
| + HConstant* transition = HConstant::cast(store->value());
|
| if (map_set_.Contains(transition->GetUnique())) {
|
| DeleteAndReplaceWith(NULL);
|
| return;
|
| @@ -3258,9 +3267,6 @@ void HStoreNamedField::PrintDataTo(StringStream* stream) {
|
| if (NeedsWriteBarrier()) {
|
| stream->Add(" (write-barrier)");
|
| }
|
| - if (has_transition()) {
|
| - stream->Add(" (transition map %p)", *transition_map());
|
| - }
|
| }
|
|
|
|
|
| @@ -4300,6 +4306,11 @@ HObjectAccess HObjectAccess::ForJSArrayOffset(int offset) {
|
| }
|
|
|
|
|
| +HObjectAccess HObjectAccess::ForBackingStore() {
|
| + return HObjectAccess(kBackingStorePointer, JSObject::kPropertiesOffset);
|
| +}
|
| +
|
| +
|
| HObjectAccess HObjectAccess::ForBackingStoreOffset(int offset,
|
| Representation representation) {
|
| ASSERT(offset >= 0);
|
| @@ -4377,6 +4388,10 @@ void HObjectAccess::SetGVNFlags(HValue *instr, bool is_store) {
|
| instr->SetGVNFlag(is_store
|
| ? kChangesBackingStoreFields : kDependsOnBackingStoreFields);
|
| break;
|
| + case kBackingStorePointer:
|
| + instr->SetGVNFlag(is_store
|
| + ? kChangesBackingStore : kDependsOnBackingStore);
|
| + break;
|
| case kElementsPointer:
|
| instr->SetGVNFlag(is_store
|
| ? kChangesElementsPointer : kDependsOnElementsPointer);
|
| @@ -4420,6 +4435,12 @@ void HObjectAccess::PrintTo(StringStream* stream) {
|
| }
|
| stream->Add("[backing-store]");
|
| break;
|
| + case kBackingStorePointer:
|
| + if (!name_.is_null()) {
|
| + stream->Add(String::cast(*name_)->ToCString().get());
|
| + }
|
| + stream->Add("[backing-store-pointer]");
|
| + break;
|
| case kExternalMemory:
|
| stream->Add("[external-memory]");
|
| break;
|
|
|