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

Unified Diff: src/compiler/ast-graph-builder.cc

Issue 1776013002: [turbofan] Fix deoptimization stack layout for fast literal comparisons. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Address review comments Created 4 years, 9 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/ast-graph-builder.h ('k') | test/mjsunit/regress/regress-592341.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/ast-graph-builder.cc
diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
index b8507d5eec18885cc87955a9845ea5ddf6d438f3..cee49a1cc65b885b5069f630b9f92b0557e4d020 100644
--- a/src/compiler/ast-graph-builder.cc
+++ b/src/compiler/ast-graph-builder.cc
@@ -2817,8 +2817,57 @@ void AstGraphBuilder::VisitBinaryOperation(BinaryOperation* expr) {
}
}
+void AstGraphBuilder::VisitLiteralCompareNil(CompareOperation* expr,
+ Expression* sub_expr,
+ Node* nil_value) {
+ const Operator* op = nullptr;
+ switch (expr->op()) {
+ case Token::EQ:
+ op = javascript()->Equal();
+ break;
+ case Token::EQ_STRICT:
+ op = javascript()->StrictEqual();
+ break;
+ default:
+ UNREACHABLE();
+ }
+ VisitForValue(sub_expr);
+ FrameStateBeforeAndAfter states(this, sub_expr->id());
+ Node* value_to_compare = environment()->Pop();
+ Node* value = NewNode(op, value_to_compare, nil_value);
+ states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
+ return ast_context()->ProduceValue(value);
+}
+
+void AstGraphBuilder::VisitLiteralCompareTypeof(CompareOperation* expr,
+ Expression* sub_expr,
+ Handle<String> check) {
+ VisitTypeofExpression(sub_expr);
+ FrameStateBeforeAndAfter states(this, sub_expr->id());
+ Node* typeof_arg = NewNode(javascript()->TypeOf(), environment()->Pop());
+ Node* value = NewNode(javascript()->StrictEqual(), typeof_arg,
+ jsgraph()->Constant(check));
+ states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
+ return ast_context()->ProduceValue(value);
+}
void AstGraphBuilder::VisitCompareOperation(CompareOperation* expr) {
+ // Check for a few fast cases. The AST visiting behavior must be in sync
+ // with the full codegen: We don't push both left and right values onto
+ // the expression stack when one side is a special-case literal.
+ Expression* sub_expr = nullptr;
+ Handle<String> check;
+ if (expr->IsLiteralCompareTypeof(&sub_expr, &check)) {
+ return VisitLiteralCompareTypeof(expr, sub_expr, check);
+ }
+ if (expr->IsLiteralCompareUndefined(&sub_expr, isolate())) {
+ return VisitLiteralCompareNil(expr, sub_expr,
+ jsgraph()->UndefinedConstant());
+ }
+ if (expr->IsLiteralCompareNull(&sub_expr)) {
+ return VisitLiteralCompareNil(expr, sub_expr, jsgraph()->NullConstant());
+ }
+
const Operator* op;
switch (expr->op()) {
case Token::EQ:
@@ -2980,23 +3029,25 @@ void AstGraphBuilder::VisitVoid(UnaryOperation* expr) {
ast_context()->ProduceValue(value);
}
-
-void AstGraphBuilder::VisitTypeof(UnaryOperation* expr) {
- Node* operand;
- if (expr->expression()->IsVariableProxy()) {
+void AstGraphBuilder::VisitTypeofExpression(Expression* expr) {
+ if (expr->IsVariableProxy()) {
// Typeof does not throw a reference error on global variables, hence we
// perform a non-contextual load in case the operand is a variable proxy.
- VariableProxy* proxy = expr->expression()->AsVariableProxy();
+ VariableProxy* proxy = expr->AsVariableProxy();
VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot());
FrameStateBeforeAndAfter states(this, BeforeId(proxy));
- operand =
- BuildVariableLoad(proxy->var(), expr->expression()->id(), states, pair,
+ Node* load =
+ BuildVariableLoad(proxy->var(), expr->id(), states, pair,
OutputFrameStateCombine::Push(), INSIDE_TYPEOF);
+ environment()->Push(load);
} else {
- VisitForValue(expr->expression());
- operand = environment()->Pop();
+ VisitForValue(expr);
}
- Node* value = NewNode(javascript()->TypeOf(), operand);
+}
+
+void AstGraphBuilder::VisitTypeof(UnaryOperation* expr) {
+ VisitTypeofExpression(expr->expression());
+ Node* value = NewNode(javascript()->TypeOf(), environment()->Pop());
ast_context()->ProduceValue(value);
}
« no previous file with comments | « src/compiler/ast-graph-builder.h ('k') | test/mjsunit/regress/regress-592341.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698