Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(448)

Unified Diff: src/compiler/js-typed-lowering.cc

Issue 2893263002: [turbofan] Add Symbol feedback to Equal/StrictEqual. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/js-type-hint-lowering.cc ('k') | src/compiler/opcodes.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/js-typed-lowering.cc
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
index 64838a1f839c8d2d2d1ba4c8fb55a298c8b0b563..4539be6e80b52a31fb1a43e19227f0c2498b6964 100644
--- a/src/compiler/js-typed-lowering.cc
+++ b/src/compiler/js-typed-lowering.cc
@@ -47,6 +47,7 @@ class JSBinopReduction final {
case CompareOperationHint::kAny:
case CompareOperationHint::kNone:
case CompareOperationHint::kString:
+ case CompareOperationHint::kSymbol:
case CompareOperationHint::kReceiver:
case CompareOperationHint::kInternalizedString:
break;
@@ -85,6 +86,16 @@ class JSBinopReduction final {
return false;
}
+ bool IsSymbolCompareOperation() {
+ if (lowering_->flags() & JSTypedLowering::kDeoptimizationEnabled) {
+ DCHECK_EQ(1, node_->op()->EffectOutputCount());
+ return (CompareOperationHintOf(node_->op()) ==
+ CompareOperationHint::kSymbol) &&
+ BothInputsMaybe(Type::Symbol());
+ }
+ return false;
+ }
+
// Check if a string addition will definitely result in creating a ConsString,
// i.e. if the combined length of the resulting string exceeds the ConsString
// minimum length.
@@ -137,6 +148,24 @@ class JSBinopReduction final {
}
}
+ // Checks that both inputs are Symbol, and if we don't know
+ // statically that one side is already a Symbol, insert a
+ // CheckSymbol node.
+ void CheckInputsToSymbol() {
+ if (!left_type()->Is(Type::Symbol())) {
+ Node* left_input = graph()->NewNode(simplified()->CheckSymbol(), left(),
+ effect(), control());
+ node_->ReplaceInput(0, left_input);
+ update_effect(left_input);
+ }
+ if (!right_type()->Is(Type::Symbol())) {
+ Node* right_input = graph()->NewNode(simplified()->CheckSymbol(), right(),
+ effect(), control());
+ node_->ReplaceInput(1, right_input);
+ update_effect(right_input);
+ }
+ }
+
// Checks that both inputs are String, and if we don't know
// statically that one side is already a String, insert a
// CheckString node.
@@ -896,6 +925,9 @@ Reduction JSTypedLowering::ReduceJSEqual(Node* node) {
} else if (r.IsStringCompareOperation()) {
r.CheckInputsToString();
return r.ChangeToPureOperator(simplified()->StringEqual());
+ } else if (r.IsSymbolCompareOperation()) {
+ r.CheckInputsToSymbol();
+ return r.ChangeToPureOperator(simplified()->ReferenceEqual());
}
return NoChange();
}
@@ -953,6 +985,9 @@ Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node) {
} else if (r.IsStringCompareOperation()) {
r.CheckInputsToString();
return r.ChangeToPureOperator(simplified()->StringEqual());
+ } else if (r.IsSymbolCompareOperation()) {
+ r.CheckInputsToSymbol();
+ return r.ChangeToPureOperator(simplified()->ReferenceEqual());
}
return NoChange();
}
« no previous file with comments | « src/compiler/js-type-hint-lowering.cc ('k') | src/compiler/opcodes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698