Index: src/compiler/js-call-reducer.cc |
diff --git a/src/compiler/js-call-reducer.cc b/src/compiler/js-call-reducer.cc |
index 5080c7a734879a945821cf629278cb04e88654ca..f80d4c1afce148d462551642cebebb773dabf288 100644 |
--- a/src/compiler/js-call-reducer.cc |
+++ b/src/compiler/js-call-reducer.cc |
@@ -264,30 +264,6 @@ Reduction JSCallReducer::ReduceFunctionPrototypeHasInstance(Node* node) { |
namespace { |
-// TODO(turbofan): Share with similar functionality in JSInliningHeuristic |
-// and JSNativeContextSpecialization, i.e. move to NodeProperties helper?! |
-MaybeHandle<Map> InferReceiverMap(Node* node) { |
- Node* receiver = NodeProperties::GetValueInput(node, 1); |
- Node* effect = NodeProperties::GetEffectInput(node); |
- // Check if the {node} is dominated by a CheckMaps with a single map |
- // for the {receiver}, and if so use that map for the lowering below. |
- for (Node* dominator = effect;;) { |
- if (dominator->opcode() == IrOpcode::kCheckMaps && |
- NodeProperties::IsSame(dominator->InputAt(0), receiver)) { |
- if (dominator->op()->ValueInputCount() == 2) { |
- HeapObjectMatcher m(dominator->InputAt(1)); |
- if (m.HasValue()) return Handle<Map>::cast(m.Value()); |
- } |
- return MaybeHandle<Map>(); |
- } |
- if (dominator->op()->EffectInputCount() != 1) { |
- // Didn't find any appropriate CheckMaps node. |
- return MaybeHandle<Map>(); |
- } |
- dominator = NodeProperties::GetEffectInput(dominator); |
- } |
-} |
- |
bool CanInlineApiCall(Isolate* isolate, Node* node, |
Handle<FunctionTemplateInfo> function_template_info) { |
DCHECK(node->opcode() == IrOpcode::kJSCall); |
@@ -344,19 +320,27 @@ JSCallReducer::HolderLookup JSCallReducer::LookupHolder( |
// ES6 section B.2.2.1.1 get Object.prototype.__proto__ |
Reduction JSCallReducer::ReduceObjectPrototypeGetProto(Node* node) { |
DCHECK_EQ(IrOpcode::kJSCall, node->opcode()); |
+ Node* receiver = NodeProperties::GetValueInput(node, 1); |
+ Node* effect = NodeProperties::GetEffectInput(node); |
// Try to determine the {receiver} map. |
- Handle<Map> receiver_map; |
- if (InferReceiverMap(node).ToHandle(&receiver_map)) { |
- // Check if we can constant-fold the {receiver} map. |
- if (!receiver_map->IsJSProxyMap() && |
- !receiver_map->has_hidden_prototype() && |
- !receiver_map->is_access_check_needed()) { |
- Handle<Object> receiver_prototype(receiver_map->prototype(), isolate()); |
- Node* value = jsgraph()->Constant(receiver_prototype); |
- ReplaceWithValue(node, value); |
- return Replace(value); |
+ ZoneHandleSet<Map> receiver_maps; |
+ if (NodeProperties::InferReceiverMaps(receiver, effect, &receiver_maps)) { |
+ Handle<Object> receiver_prototype(receiver_maps[0]->prototype(), isolate()); |
+ |
+ // Check if we can constant-fold the {receiver_prototype}. |
+ for (size_t i = 0; i < receiver_maps.size(); ++i) { |
+ Handle<Map> const receiver_map = receiver_maps[i]; |
+ if (receiver_map->IsJSProxyMap() || |
+ receiver_map->has_hidden_prototype() || |
+ receiver_map->is_access_check_needed() || |
+ receiver_map->prototype() != *receiver_prototype) { |
+ return NoChange(); |
+ } |
} |
+ Node* value = jsgraph()->Constant(receiver_prototype); |
+ ReplaceWithValue(node, value); |
+ return Replace(value); |
} |
return NoChange(); |