summaryrefslogtreecommitdiff
path: root/chromium/v8/src/compiler/node-properties.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/v8/src/compiler/node-properties.cc')
-rw-r--r--chromium/v8/src/compiler/node-properties.cc29
1 files changed, 18 insertions, 11 deletions
diff --git a/chromium/v8/src/compiler/node-properties.cc b/chromium/v8/src/compiler/node-properties.cc
index e559844cbfa..9243a08583b 100644
--- a/chromium/v8/src/compiler/node-properties.cc
+++ b/chromium/v8/src/compiler/node-properties.cc
@@ -330,23 +330,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;
}
@@ -362,12 +365,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;
}
@@ -382,12 +385,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;
}
@@ -400,10 +403,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;
}