| Index: src/compiler/node-properties.cc
|
| diff --git a/src/compiler/node-properties.cc b/src/compiler/node-properties.cc
|
| index 1292ce2d10a5c86f8a5c1ffc1c0bc6c89b389c8f..a45f7f7a79f712c37ce30b780d950e388fde4041 100644
|
| --- a/src/compiler/node-properties.cc
|
| +++ b/src/compiler/node-properties.cc
|
| @@ -333,23 +333,26 @@ bool NodeProperties::IsSame(Node* a, Node* b) {
|
| }
|
|
|
| // static
|
| -bool NodeProperties::InferReceiverMaps(Node* receiver, Node* effect,
|
| - ZoneHandleSet<Map>* maps_return) {
|
| +NodeProperties::InferReceiverMapsResult NodeProperties::InferReceiverMaps(
|
| + Node* receiver, Node* effect, ZoneHandleSet<Map>* maps_return) {
|
| HeapObjectMatcher m(receiver);
|
| if (m.HasValue()) {
|
| Handle<Map> receiver_map(m.Value()->map());
|
| if (receiver_map->is_stable()) {
|
| + // The {receiver_map} is only reliable when we install a stability
|
| + // code dependency.
|
| *maps_return = ZoneHandleSet<Map>(receiver_map);
|
| - return true;
|
| + return kUnreliableReceiverMaps;
|
| }
|
| }
|
| + InferReceiverMapsResult result = kReliableReceiverMaps;
|
| while (true) {
|
| switch (effect->opcode()) {
|
| case IrOpcode::kCheckMaps: {
|
| Node* const object = GetValueInput(effect, 0);
|
| if (IsSame(receiver, object)) {
|
| *maps_return = CheckMapsParametersOf(effect->op()).maps();
|
| - return true;
|
| + return result;
|
| }
|
| break;
|
| }
|
| @@ -365,12 +368,12 @@ bool NodeProperties::InferReceiverMaps(Node* receiver, Node* effect,
|
| if (initial_map->constructor_or_backpointer() ==
|
| *mtarget.Value()) {
|
| *maps_return = ZoneHandleSet<Map>(initial_map);
|
| - return true;
|
| + return result;
|
| }
|
| }
|
| }
|
| // We reached the allocation of the {receiver}.
|
| - return false;
|
| + return kNoReceiverMaps;
|
| }
|
| break;
|
| }
|
| @@ -385,12 +388,12 @@ bool NodeProperties::InferReceiverMaps(Node* receiver, Node* effect,
|
| HeapObjectMatcher m(value);
|
| if (m.HasValue()) {
|
| *maps_return = ZoneHandleSet<Map>(Handle<Map>::cast(m.Value()));
|
| - return true;
|
| + return result;
|
| }
|
| }
|
| // Without alias analysis we cannot tell whether this
|
| // StoreField[map] affects {receiver} or not.
|
| - return false;
|
| + result = kUnreliableReceiverMaps;
|
| }
|
| break;
|
| }
|
| @@ -403,10 +406,14 @@ bool NodeProperties::InferReceiverMaps(Node* receiver, Node* effect,
|
| }
|
| default: {
|
| DCHECK_EQ(1, effect->op()->EffectOutputCount());
|
| - if (effect->op()->EffectInputCount() != 1 ||
|
| - !effect->op()->HasProperty(Operator::kNoWrite)) {
|
| + if (effect->op()->EffectInputCount() != 1) {
|
| // Didn't find any appropriate CheckMaps node.
|
| - return false;
|
| + return kNoReceiverMaps;
|
| + }
|
| + if (!effect->op()->HasProperty(Operator::kNoWrite)) {
|
| + // Without alias/escape analysis we cannot tell whether this
|
| + // {effect} affects {receiver} or not.
|
| + result = kUnreliableReceiverMaps;
|
| }
|
| break;
|
| }
|
|
|