Commit c2a3d24b authored by Benedikt Meurer's avatar Benedikt Meurer Committed by Commit Bot

[turbofan] Only symbols can be strictly equal to symbols.

For strict equality `a === b` with Symbol feedback we need to check only
one side via CheckSymbol, since the resulting comparison can only be
true if both sides are symbols. For consistency with the receivers case
we check the left side, so CheckSymbol(a). This significantly reduces
the number of CheckSymbol operations in optimized code for the ARES-6
Air benchmark.

Bug: v8:6344
Change-Id: I50420f8d862fec31214b7e86b17919edcfc1f23e
Reviewed-on: https://chromium-review.googlesource.com/1213173
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Commit-Queue: Georg Neis <neis@chromium.org>
Reviewed-by: 's avatarGeorg Neis <neis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#55731}
parent c3dce78c
...@@ -137,15 +137,20 @@ class JSBinopReduction final { ...@@ -137,15 +137,20 @@ class JSBinopReduction final {
} }
} }
// Inserts a CheckSymbol for the left input.
void CheckLeftInputToSymbol() {
Node* left_input = graph()->NewNode(simplified()->CheckSymbol(), left(),
effect(), control());
node_->ReplaceInput(0, left_input);
update_effect(left_input);
}
// Checks that both inputs are Symbol, and if we don't know // Checks that both inputs are Symbol, and if we don't know
// statically that one side is already a Symbol, insert a // statically that one side is already a Symbol, insert a
// CheckSymbol node. // CheckSymbol node.
void CheckInputsToSymbol() { void CheckInputsToSymbol() {
if (!left_type().Is(Type::Symbol())) { if (!left_type().Is(Type::Symbol())) {
Node* left_input = graph()->NewNode(simplified()->CheckSymbol(), left(), CheckLeftInputToSymbol();
effect(), control());
node_->ReplaceInput(0, left_input);
update_effect(left_input);
} }
if (!right_type().Is(Type::Symbol())) { if (!right_type().Is(Type::Symbol())) {
Node* right_input = graph()->NewNode(simplified()->CheckSymbol(), right(), Node* right_input = graph()->NewNode(simplified()->CheckSymbol(), right(),
...@@ -871,14 +876,17 @@ Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node) { ...@@ -871,14 +876,17 @@ Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node) {
} else if (r.IsReceiverCompareOperation()) { } else if (r.IsReceiverCompareOperation()) {
// For strict equality, it's enough to know that one input is a Receiver, // For strict equality, it's enough to know that one input is a Receiver,
// as a strict equality comparison with a Receiver can only yield true if // as a strict equality comparison with a Receiver can only yield true if
// both sides refer to the same Receiver than. // both sides refer to the same Receiver.
r.CheckLeftInputToReceiver(); r.CheckLeftInputToReceiver();
return r.ChangeToPureOperator(simplified()->ReferenceEqual()); return r.ChangeToPureOperator(simplified()->ReferenceEqual());
} else if (r.IsStringCompareOperation()) { } else if (r.IsStringCompareOperation()) {
r.CheckInputsToString(); r.CheckInputsToString();
return r.ChangeToPureOperator(simplified()->StringEqual()); return r.ChangeToPureOperator(simplified()->StringEqual());
} else if (r.IsSymbolCompareOperation()) { } else if (r.IsSymbolCompareOperation()) {
r.CheckInputsToSymbol(); // For strict equality, it's enough to know that one input is a Symbol,
// as a strict equality comparison with a Symbol can only yield true if
// both sides refer to the same Symbol.
r.CheckLeftInputToSymbol();
return r.ChangeToPureOperator(simplified()->ReferenceEqual()); return r.ChangeToPureOperator(simplified()->ReferenceEqual());
} }
return NoChange(); return NoChange();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment