Commit 21b23e69 authored by wingo's avatar wingo Committed by Commit bot

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}
parent 68c800ef
...@@ -23,7 +23,7 @@ class AstNumberingVisitor FINAL : public AstVisitor { ...@@ -23,7 +23,7 @@ class AstNumberingVisitor FINAL : public AstVisitor {
InitializeAstVisitor(zone); InitializeAstVisitor(zone);
} }
void Renumber(FunctionLiteral* node); bool Renumber(FunctionLiteral* node);
private: private:
// AST node visitor interface. // AST node visitor interface.
...@@ -31,6 +31,8 @@ class AstNumberingVisitor FINAL : public AstVisitor { ...@@ -31,6 +31,8 @@ class AstNumberingVisitor FINAL : public AstVisitor {
AST_NODE_LIST(DEFINE_VISIT) AST_NODE_LIST(DEFINE_VISIT)
#undef DEFINE_VISIT #undef DEFINE_VISIT
bool Finish(FunctionLiteral* node);
void VisitStatements(ZoneList<Statement*>* statements) OVERRIDE; void VisitStatements(ZoneList<Statement*>* statements) OVERRIDE;
void VisitDeclarations(ZoneList<Declaration*>* declarations) OVERRIDE; void VisitDeclarations(ZoneList<Declaration*>* declarations) OVERRIDE;
void VisitArguments(ZoneList<Expression*>* arguments); void VisitArguments(ZoneList<Expression*>* arguments);
...@@ -537,14 +539,26 @@ void AstNumberingVisitor::VisitFunctionLiteral(FunctionLiteral* node) { ...@@ -537,14 +539,26 @@ void AstNumberingVisitor::VisitFunctionLiteral(FunctionLiteral* node) {
} }
void AstNumberingVisitor::Renumber(FunctionLiteral* node) { bool AstNumberingVisitor::Finish(FunctionLiteral* node) {
if (node->scope()->HasIllegalRedeclaration()) {
node->scope()->VisitIllegalRedeclaration(this);
node->set_ast_properties(&properties_); node->set_ast_properties(&properties_);
return; node->set_dont_optimize_reason(dont_optimize_reason());
} return !HasStackOverflow();
}
bool AstNumberingVisitor::Renumber(FunctionLiteral* node) {
Scope* scope = node->scope(); 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);
}
VisitDeclarations(scope->declarations()); VisitDeclarations(scope->declarations());
if (scope->is_function_scope() && scope->function() != NULL) { if (scope->is_function_scope() && scope->function() != NULL) {
// Visit the name of the named function expression. // Visit the name of the named function expression.
...@@ -552,15 +566,13 @@ void AstNumberingVisitor::Renumber(FunctionLiteral* node) { ...@@ -552,15 +566,13 @@ void AstNumberingVisitor::Renumber(FunctionLiteral* node) {
} }
VisitStatements(node->body()); VisitStatements(node->body());
node->set_ast_properties(&properties_); return Finish(node);
node->set_dont_optimize_reason(dont_optimize_reason());
} }
bool AstNumbering::Renumber(FunctionLiteral* function, Zone* zone) { bool AstNumbering::Renumber(FunctionLiteral* function, Zone* zone) {
AstNumberingVisitor visitor(zone); AstNumberingVisitor visitor(zone);
visitor.Renumber(function); return visitor.Renumber(function);
return !visitor.HasStackOverflow();
} }
} }
} // namespace v8::internal } // namespace v8::internal
...@@ -4290,19 +4290,7 @@ void HOptimizedGraphBuilder::VisitExpressions(ZoneList<Expression*>* exprs, ...@@ -4290,19 +4290,7 @@ void HOptimizedGraphBuilder::VisitExpressions(ZoneList<Expression*>* exprs,
bool HOptimizedGraphBuilder::BuildGraph() { bool HOptimizedGraphBuilder::BuildGraph() {
if (current_info()->function()->is_generator()) {
Bailout(kFunctionIsAGenerator);
return false;
}
Scope* scope = current_info()->scope(); Scope* scope = current_info()->scope();
if (scope->HasIllegalRedeclaration()) {
Bailout(kFunctionWithIllegalRedeclaration);
return false;
}
if (scope->calls_eval()) {
Bailout(kFunctionCallsEval);
return false;
}
SetUpScope(scope); SetUpScope(scope);
// Add an edge to the body entry. This is warty: the graph's start // Add an edge to the body entry. This is warty: the graph's start
...@@ -4538,10 +4526,6 @@ void HOptimizedGraphBuilder::SetUpScope(Scope* scope) { ...@@ -4538,10 +4526,6 @@ void HOptimizedGraphBuilder::SetUpScope(Scope* scope) {
// Handle the arguments and arguments shadow variables specially (they do // Handle the arguments and arguments shadow variables specially (they do
// not have declarations). // not have declarations).
if (scope->arguments() != NULL) { if (scope->arguments() != NULL) {
if (!scope->arguments()->IsStackAllocated()) {
return Bailout(kContextAllocatedArguments);
}
environment()->Bind(scope->arguments(), environment()->Bind(scope->arguments(),
graph()->GetArgumentsObject()); graph()->GetArgumentsObject());
} }
...@@ -7931,11 +7915,6 @@ bool HOptimizedGraphBuilder::TryInline(Handle<JSFunction> target, ...@@ -7931,11 +7915,6 @@ bool HOptimizedGraphBuilder::TryInline(Handle<JSFunction> target,
return false; return false;
} }
if (target_info.scope()->HasIllegalRedeclaration()) {
TraceInline(target, caller, "target has illegal redeclaration");
return false;
}
if (target_info.scope()->num_heap_slots() > 0) { if (target_info.scope()->num_heap_slots() > 0) {
TraceInline(target, caller, "target has context-allocated variables"); TraceInline(target, caller, "target has context-allocated variables");
return false; return false;
...@@ -7962,13 +7941,6 @@ bool HOptimizedGraphBuilder::TryInline(Handle<JSFunction> target, ...@@ -7962,13 +7941,6 @@ bool HOptimizedGraphBuilder::TryInline(Handle<JSFunction> target,
TraceInline(target, caller, "target uses arguments object"); TraceInline(target, caller, "target uses arguments object");
return false; return false;
} }
if (!function->scope()->arguments()->IsStackAllocated()) {
TraceInline(target,
caller,
"target uses non-stackallocated arguments object");
return false;
}
} }
// All declarations must be inlineable. // All declarations must be inlineable.
......
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