From 21b23e6966ba7a309532a0626e0dd5a24360e69b Mon Sep 17 00:00:00 2001 From: wingo Date: Wed, 3 Dec 2014 06:52:36 -0800 Subject: [PATCH] Move more don't-crankshaft computation to numbering pass The "do I inline?" decision needs many of the same inputs as the "should I even try to crankshaft?" decision. This change consolidates these checks in the numbering pass. It also removes the is_generator() check, as that's already handled when visiting the initial Yield expression. R=svenpanne@chromium.org BUG= Review URL: https://codereview.chromium.org/775693003 Cr-Commit-Position: refs/heads/master@{#25642} --- src/ast-numbering.cc | 34 +++++++++++++++++++++++----------- src/hydrogen.cc | 28 ---------------------------- 2 files changed, 23 insertions(+), 39 deletions(-) diff --git a/src/ast-numbering.cc b/src/ast-numbering.cc index e9b9050ae7..c2dd70e1bb 100644 --- a/src/ast-numbering.cc +++ b/src/ast-numbering.cc @@ -23,7 +23,7 @@ class AstNumberingVisitor FINAL : public AstVisitor { InitializeAstVisitor(zone); } - void Renumber(FunctionLiteral* node); + bool Renumber(FunctionLiteral* node); private: // AST node visitor interface. @@ -31,6 +31,8 @@ class AstNumberingVisitor FINAL : public AstVisitor { AST_NODE_LIST(DEFINE_VISIT) #undef DEFINE_VISIT + bool Finish(FunctionLiteral* node); + void VisitStatements(ZoneList* statements) OVERRIDE; void VisitDeclarations(ZoneList* declarations) OVERRIDE; void VisitArguments(ZoneList* arguments); @@ -537,14 +539,26 @@ void AstNumberingVisitor::VisitFunctionLiteral(FunctionLiteral* node) { } -void AstNumberingVisitor::Renumber(FunctionLiteral* node) { - if (node->scope()->HasIllegalRedeclaration()) { - node->scope()->VisitIllegalRedeclaration(this); - node->set_ast_properties(&properties_); - return; +bool AstNumberingVisitor::Finish(FunctionLiteral* node) { + node->set_ast_properties(&properties_); + node->set_dont_optimize_reason(dont_optimize_reason()); + return !HasStackOverflow(); +} + + +bool AstNumberingVisitor::Renumber(FunctionLiteral* node) { + Scope* scope = node->scope(); + + if (scope->HasIllegalRedeclaration()) { + scope->VisitIllegalRedeclaration(this); + DisableCrankshaft(kFunctionWithIllegalRedeclaration); + return Finish(node); + } + if (scope->calls_eval()) DisableCrankshaft(kFunctionCallsEval); + if (scope->arguments() != NULL && !scope->arguments()->IsStackAllocated()) { + DisableCrankshaft(kContextAllocatedArguments); } - Scope* scope = node->scope(); VisitDeclarations(scope->declarations()); if (scope->is_function_scope() && scope->function() != NULL) { // Visit the name of the named function expression. @@ -552,15 +566,13 @@ void AstNumberingVisitor::Renumber(FunctionLiteral* node) { } VisitStatements(node->body()); - node->set_ast_properties(&properties_); - node->set_dont_optimize_reason(dont_optimize_reason()); + return Finish(node); } bool AstNumbering::Renumber(FunctionLiteral* function, Zone* zone) { AstNumberingVisitor visitor(zone); - visitor.Renumber(function); - return !visitor.HasStackOverflow(); + return visitor.Renumber(function); } } } // namespace v8::internal diff --git a/src/hydrogen.cc b/src/hydrogen.cc index f2ce8a1c9b..78f6f33842 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -4290,19 +4290,7 @@ void HOptimizedGraphBuilder::VisitExpressions(ZoneList* exprs, bool HOptimizedGraphBuilder::BuildGraph() { - if (current_info()->function()->is_generator()) { - Bailout(kFunctionIsAGenerator); - return false; - } Scope* scope = current_info()->scope(); - if (scope->HasIllegalRedeclaration()) { - Bailout(kFunctionWithIllegalRedeclaration); - return false; - } - if (scope->calls_eval()) { - Bailout(kFunctionCallsEval); - return false; - } SetUpScope(scope); // Add an edge to the body entry. This is warty: the graph's start @@ -4538,10 +4526,6 @@ void HOptimizedGraphBuilder::SetUpScope(Scope* scope) { // Handle the arguments and arguments shadow variables specially (they do // not have declarations). if (scope->arguments() != NULL) { - if (!scope->arguments()->IsStackAllocated()) { - return Bailout(kContextAllocatedArguments); - } - environment()->Bind(scope->arguments(), graph()->GetArgumentsObject()); } @@ -7931,11 +7915,6 @@ bool HOptimizedGraphBuilder::TryInline(Handle target, return false; } - if (target_info.scope()->HasIllegalRedeclaration()) { - TraceInline(target, caller, "target has illegal redeclaration"); - return false; - } - if (target_info.scope()->num_heap_slots() > 0) { TraceInline(target, caller, "target has context-allocated variables"); return false; @@ -7962,13 +7941,6 @@ bool HOptimizedGraphBuilder::TryInline(Handle target, TraceInline(target, caller, "target uses arguments object"); return false; } - - if (!function->scope()->arguments()->IsStackAllocated()) { - TraceInline(target, - caller, - "target uses non-stackallocated arguments object"); - return false; - } } // All declarations must be inlineable.