[turbofan] Move Map#{has,get} to JSCallReducer
Bug: v8:7340, v8:7250 Change-Id: Ibeddeb86928cce33a8622e3ec2d72ad1743028dd Reviewed-on: https://chromium-review.googlesource.com/966290 Commit-Queue: Sigurd Schneider <sigurds@chromium.org> Reviewed-by: Benedikt Meurer <bmeurer@chromium.org> Cr-Commit-Position: refs/heads/master@{#51998}
This commit is contained in:
parent
59ca2ab4b2
commit
82ad20c3ea
@ -684,76 +684,6 @@ Reduction JSBuiltinReducer::ReduceGlobalIsNaN(Node* node) {
|
||||
return NoChange();
|
||||
}
|
||||
|
||||
Reduction JSBuiltinReducer::ReduceMapGet(Node* node) {
|
||||
// We only optimize if we have target, receiver and key parameters.
|
||||
if (node->op()->ValueInputCount() != 3) return NoChange();
|
||||
Node* receiver = NodeProperties::GetValueInput(node, 1);
|
||||
Node* effect = NodeProperties::GetEffectInput(node);
|
||||
Node* control = NodeProperties::GetControlInput(node);
|
||||
Node* key = NodeProperties::GetValueInput(node, 2);
|
||||
|
||||
if (!NodeProperties::HasInstanceTypeWitness(receiver, effect, JS_MAP_TYPE))
|
||||
return NoChange();
|
||||
|
||||
Node* table = effect = graph()->NewNode(
|
||||
simplified()->LoadField(AccessBuilder::ForJSCollectionTable()), receiver,
|
||||
effect, control);
|
||||
|
||||
Node* entry = effect = graph()->NewNode(
|
||||
simplified()->FindOrderedHashMapEntry(), table, key, effect, control);
|
||||
|
||||
Node* check = graph()->NewNode(simplified()->NumberEqual(), entry,
|
||||
jsgraph()->MinusOneConstant());
|
||||
|
||||
Node* branch = graph()->NewNode(common()->Branch(), check, control);
|
||||
|
||||
// Key not found.
|
||||
Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
|
||||
Node* etrue = effect;
|
||||
Node* vtrue = jsgraph()->UndefinedConstant();
|
||||
|
||||
// Key found.
|
||||
Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
|
||||
Node* efalse = effect;
|
||||
Node* vfalse = efalse = graph()->NewNode(
|
||||
simplified()->LoadElement(AccessBuilder::ForOrderedHashMapEntryValue()),
|
||||
table, entry, efalse, if_false);
|
||||
|
||||
control = graph()->NewNode(common()->Merge(2), if_true, if_false);
|
||||
Node* value = graph()->NewNode(
|
||||
common()->Phi(MachineRepresentation::kTagged, 2), vtrue, vfalse, control);
|
||||
effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control);
|
||||
|
||||
ReplaceWithValue(node, value, effect, control);
|
||||
return Replace(value);
|
||||
}
|
||||
|
||||
Reduction JSBuiltinReducer::ReduceMapHas(Node* node) {
|
||||
// We only optimize if we have target, receiver and key parameters.
|
||||
if (node->op()->ValueInputCount() != 3) return NoChange();
|
||||
Node* receiver = NodeProperties::GetValueInput(node, 1);
|
||||
Node* effect = NodeProperties::GetEffectInput(node);
|
||||
Node* control = NodeProperties::GetControlInput(node);
|
||||
Node* key = NodeProperties::GetValueInput(node, 2);
|
||||
|
||||
if (!NodeProperties::HasInstanceTypeWitness(receiver, effect, JS_MAP_TYPE))
|
||||
return NoChange();
|
||||
|
||||
Node* table = effect = graph()->NewNode(
|
||||
simplified()->LoadField(AccessBuilder::ForJSCollectionTable()), receiver,
|
||||
effect, control);
|
||||
|
||||
Node* index = effect = graph()->NewNode(
|
||||
simplified()->FindOrderedHashMapEntry(), table, key, effect, control);
|
||||
|
||||
Node* value = graph()->NewNode(simplified()->NumberEqual(), index,
|
||||
jsgraph()->MinusOneConstant());
|
||||
value = graph()->NewNode(simplified()->BooleanNot(), value);
|
||||
|
||||
ReplaceWithValue(node, value, effect, control);
|
||||
return Replace(value);
|
||||
}
|
||||
|
||||
// ES6 section 20.1.2.5 Number.isSafeInteger ( number )
|
||||
Reduction JSBuiltinReducer::ReduceNumberIsSafeInteger(Node* node) {
|
||||
JSCallReduction r(node);
|
||||
@ -934,12 +864,6 @@ Reduction JSBuiltinReducer::Reduce(Node* node) {
|
||||
case kMapEntries:
|
||||
return ReduceCollectionIterator(
|
||||
node, JS_MAP_TYPE, Context::MAP_KEY_VALUE_ITERATOR_MAP_INDEX);
|
||||
case kMapGet:
|
||||
reduction = ReduceMapGet(node);
|
||||
break;
|
||||
case kMapHas:
|
||||
reduction = ReduceMapHas(node);
|
||||
break;
|
||||
case kMapKeys:
|
||||
return ReduceCollectionIterator(node, JS_MAP_TYPE,
|
||||
Context::MAP_KEY_ITERATOR_MAP_INDEX);
|
||||
|
@ -55,8 +55,6 @@ class V8_EXPORT_PRIVATE JSBuiltinReducer final
|
||||
Reduction ReduceDateGetTime(Node* node);
|
||||
Reduction ReduceGlobalIsFinite(Node* node);
|
||||
Reduction ReduceGlobalIsNaN(Node* node);
|
||||
Reduction ReduceMapHas(Node* node);
|
||||
Reduction ReduceMapGet(Node* node);
|
||||
Reduction ReduceNumberIsSafeInteger(Node* node);
|
||||
Reduction ReduceNumberParseInt(Node* node);
|
||||
Reduction ReduceObjectCreate(Node* node);
|
||||
|
@ -3430,6 +3430,10 @@ Reduction JSCallReducer::ReduceJSCall(Node* node,
|
||||
return ReduceNumberIsInteger(node);
|
||||
case Builtins::kNumberIsNaN:
|
||||
return ReduceNumberIsNaN(node);
|
||||
case Builtins::kMapPrototypeGet:
|
||||
return ReduceMapPrototypeGet(node);
|
||||
case Builtins::kMapPrototypeHas:
|
||||
return ReduceMapPrototypeHas(node);
|
||||
case Builtins::kReturnReceiver:
|
||||
return ReduceReturnReceiver(node);
|
||||
case Builtins::kStringPrototypeIndexOf:
|
||||
@ -5924,6 +5928,76 @@ Reduction JSCallReducer::ReduceNumberIsNaN(Node* node) {
|
||||
return Replace(value);
|
||||
}
|
||||
|
||||
Reduction JSCallReducer::ReduceMapPrototypeGet(Node* node) {
|
||||
// We only optimize if we have target, receiver and key parameters.
|
||||
if (node->op()->ValueInputCount() != 3) return NoChange();
|
||||
Node* receiver = NodeProperties::GetValueInput(node, 1);
|
||||
Node* effect = NodeProperties::GetEffectInput(node);
|
||||
Node* control = NodeProperties::GetControlInput(node);
|
||||
Node* key = NodeProperties::GetValueInput(node, 2);
|
||||
|
||||
if (!NodeProperties::HasInstanceTypeWitness(receiver, effect, JS_MAP_TYPE))
|
||||
return NoChange();
|
||||
|
||||
Node* table = effect = graph()->NewNode(
|
||||
simplified()->LoadField(AccessBuilder::ForJSCollectionTable()), receiver,
|
||||
effect, control);
|
||||
|
||||
Node* entry = effect = graph()->NewNode(
|
||||
simplified()->FindOrderedHashMapEntry(), table, key, effect, control);
|
||||
|
||||
Node* check = graph()->NewNode(simplified()->NumberEqual(), entry,
|
||||
jsgraph()->MinusOneConstant());
|
||||
|
||||
Node* branch = graph()->NewNode(common()->Branch(), check, control);
|
||||
|
||||
// Key not found.
|
||||
Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
|
||||
Node* etrue = effect;
|
||||
Node* vtrue = jsgraph()->UndefinedConstant();
|
||||
|
||||
// Key found.
|
||||
Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
|
||||
Node* efalse = effect;
|
||||
Node* vfalse = efalse = graph()->NewNode(
|
||||
simplified()->LoadElement(AccessBuilder::ForOrderedHashMapEntryValue()),
|
||||
table, entry, efalse, if_false);
|
||||
|
||||
control = graph()->NewNode(common()->Merge(2), if_true, if_false);
|
||||
Node* value = graph()->NewNode(
|
||||
common()->Phi(MachineRepresentation::kTagged, 2), vtrue, vfalse, control);
|
||||
effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control);
|
||||
|
||||
ReplaceWithValue(node, value, effect, control);
|
||||
return Replace(value);
|
||||
}
|
||||
|
||||
Reduction JSCallReducer::ReduceMapPrototypeHas(Node* node) {
|
||||
// We only optimize if we have target, receiver and key parameters.
|
||||
if (node->op()->ValueInputCount() != 3) return NoChange();
|
||||
Node* receiver = NodeProperties::GetValueInput(node, 1);
|
||||
Node* effect = NodeProperties::GetEffectInput(node);
|
||||
Node* control = NodeProperties::GetControlInput(node);
|
||||
Node* key = NodeProperties::GetValueInput(node, 2);
|
||||
|
||||
if (!NodeProperties::HasInstanceTypeWitness(receiver, effect, JS_MAP_TYPE))
|
||||
return NoChange();
|
||||
|
||||
Node* table = effect = graph()->NewNode(
|
||||
simplified()->LoadField(AccessBuilder::ForJSCollectionTable()), receiver,
|
||||
effect, control);
|
||||
|
||||
Node* index = effect = graph()->NewNode(
|
||||
simplified()->FindOrderedHashMapEntry(), table, key, effect, control);
|
||||
|
||||
Node* value = graph()->NewNode(simplified()->NumberEqual(), index,
|
||||
jsgraph()->MinusOneConstant());
|
||||
value = graph()->NewNode(simplified()->BooleanNot(), value);
|
||||
|
||||
ReplaceWithValue(node, value, effect, control);
|
||||
return Replace(value);
|
||||
}
|
||||
|
||||
Graph* JSCallReducer::graph() const { return jsgraph()->graph(); }
|
||||
|
||||
Isolate* JSCallReducer::isolate() const { return jsgraph()->isolate(); }
|
||||
|
@ -154,6 +154,9 @@ class V8_EXPORT_PRIVATE JSCallReducer final : public AdvancedReducer {
|
||||
Reduction ReduceNumberIsInteger(Node* node);
|
||||
Reduction ReduceNumberIsNaN(Node* node);
|
||||
|
||||
Reduction ReduceMapPrototypeHas(Node* node);
|
||||
Reduction ReduceMapPrototypeGet(Node* node);
|
||||
|
||||
// Returns the updated {to} node, and updates control and effect along the
|
||||
// way.
|
||||
Node* DoFilterPostCallbackWork(ElementsKind kind, Node** control,
|
||||
|
Loading…
Reference in New Issue
Block a user