From 0755160e28411dccd97604e1463799653e68dce2 Mon Sep 17 00:00:00 2001 From: "wingo@igalia.com" Date: Mon, 27 Oct 2014 16:25:11 +0000 Subject: [PATCH] Revert "Move AST node counting to post-pass" This reverts commit 698356720824559a6bd81c24be707b44ac277526 for breaking regress-96526-002 among other things. TBR=mstarzinger@chromium.org BUG= Review URL: https://codereview.chromium.org/678033002 Cr-Commit-Position: refs/heads/master@{#24910} git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24910 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ast-numbering.cc | 71 ++---------------------------- src/ast.cc | 10 +++++ src/ast.h | 1 + src/compiler.cc | 36 +++++---------- src/compiler.h | 9 +--- src/compiler/js-inlining.cc | 14 +++++- src/full-codegen.cc | 5 +++ src/hydrogen.cc | 3 +- test/cctest/compiler/function-tester.h | 8 +++- test/cctest/compiler/test-codegen-deopt.cc | 4 +- test/cctest/compiler/test-pipeline.cc | 6 ++- test/cctest/test-parsing.cc | 4 +- 12 files changed, 65 insertions(+), 106 deletions(-) diff --git a/src/ast-numbering.cc b/src/ast-numbering.cc index 8dfdccb..e878424 100644 --- a/src/ast-numbering.cc +++ b/src/ast-numbering.cc @@ -39,10 +39,7 @@ class AstNumberingVisitor FINAL : public AstVisitor { return tmp; } - void IncrementNodeCount() { properties_.add_node_count(1); } - int next_id_; - AstProperties properties_; DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); DISALLOW_COPY_AND_ASSIGN(AstNumberingVisitor); @@ -50,127 +47,102 @@ class AstNumberingVisitor FINAL : public AstVisitor { void AstNumberingVisitor::VisitVariableDeclaration(VariableDeclaration* node) { - IncrementNodeCount(); VisitVariableProxy(node->proxy()); } void AstNumberingVisitor::VisitExportDeclaration(ExportDeclaration* node) { - IncrementNodeCount(); VisitVariableProxy(node->proxy()); } -void AstNumberingVisitor::VisitModuleUrl(ModuleUrl* node) { - IncrementNodeCount(); -} +void AstNumberingVisitor::VisitModuleUrl(ModuleUrl* node) {} -void AstNumberingVisitor::VisitEmptyStatement(EmptyStatement* node) { - IncrementNodeCount(); -} +void AstNumberingVisitor::VisitEmptyStatement(EmptyStatement* node) {} -void AstNumberingVisitor::VisitContinueStatement(ContinueStatement* node) { - IncrementNodeCount(); -} +void AstNumberingVisitor::VisitContinueStatement(ContinueStatement* node) {} -void AstNumberingVisitor::VisitBreakStatement(BreakStatement* node) { - IncrementNodeCount(); -} +void AstNumberingVisitor::VisitBreakStatement(BreakStatement* node) {} void AstNumberingVisitor::VisitDebuggerStatement(DebuggerStatement* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(DebuggerStatement::num_ids())); } void AstNumberingVisitor::VisitNativeFunctionLiteral( NativeFunctionLiteral* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(NativeFunctionLiteral::num_ids())); } void AstNumberingVisitor::VisitLiteral(Literal* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(Literal::num_ids())); } void AstNumberingVisitor::VisitRegExpLiteral(RegExpLiteral* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(RegExpLiteral::num_ids())); } void AstNumberingVisitor::VisitVariableProxy(VariableProxy* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(VariableProxy::num_ids())); } void AstNumberingVisitor::VisitThisFunction(ThisFunction* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(ThisFunction::num_ids())); } void AstNumberingVisitor::VisitSuperReference(SuperReference* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(SuperReference::num_ids())); Visit(node->this_var()); } void AstNumberingVisitor::VisitModuleDeclaration(ModuleDeclaration* node) { - IncrementNodeCount(); VisitVariableProxy(node->proxy()); Visit(node->module()); } void AstNumberingVisitor::VisitImportDeclaration(ImportDeclaration* node) { - IncrementNodeCount(); VisitVariableProxy(node->proxy()); Visit(node->module()); } void AstNumberingVisitor::VisitModuleVariable(ModuleVariable* node) { - IncrementNodeCount(); Visit(node->proxy()); } void AstNumberingVisitor::VisitModulePath(ModulePath* node) { - IncrementNodeCount(); Visit(node->module()); } void AstNumberingVisitor::VisitModuleStatement(ModuleStatement* node) { - IncrementNodeCount(); Visit(node->body()); } void AstNumberingVisitor::VisitExpressionStatement(ExpressionStatement* node) { - IncrementNodeCount(); Visit(node->expression()); } void AstNumberingVisitor::VisitReturnStatement(ReturnStatement* node) { - IncrementNodeCount(); Visit(node->expression()); } void AstNumberingVisitor::VisitYield(Yield* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(Yield::num_ids())); Visit(node->generator_object()); Visit(node->expression()); @@ -178,28 +150,24 @@ void AstNumberingVisitor::VisitYield(Yield* node) { void AstNumberingVisitor::VisitThrow(Throw* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(Throw::num_ids())); Visit(node->exception()); } void AstNumberingVisitor::VisitUnaryOperation(UnaryOperation* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(UnaryOperation::num_ids())); Visit(node->expression()); } void AstNumberingVisitor::VisitCountOperation(CountOperation* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(CountOperation::num_ids())); Visit(node->expression()); } void AstNumberingVisitor::VisitBlock(Block* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(Block::num_ids())); if (node->scope() != NULL) VisitDeclarations(node->scope()->declarations()); VisitStatements(node->statements()); @@ -207,34 +175,29 @@ void AstNumberingVisitor::VisitBlock(Block* node) { void AstNumberingVisitor::VisitFunctionDeclaration(FunctionDeclaration* node) { - IncrementNodeCount(); VisitVariableProxy(node->proxy()); VisitFunctionLiteral(node->fun()); } void AstNumberingVisitor::VisitModuleLiteral(ModuleLiteral* node) { - IncrementNodeCount(); VisitBlock(node->body()); } void AstNumberingVisitor::VisitCallRuntime(CallRuntime* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(CallRuntime::num_ids())); VisitArguments(node->arguments()); } void AstNumberingVisitor::VisitWithStatement(WithStatement* node) { - IncrementNodeCount(); Visit(node->expression()); Visit(node->statement()); } void AstNumberingVisitor::VisitDoWhileStatement(DoWhileStatement* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(DoWhileStatement::num_ids())); Visit(node->body()); Visit(node->cond()); @@ -242,7 +205,6 @@ void AstNumberingVisitor::VisitDoWhileStatement(DoWhileStatement* node) { void AstNumberingVisitor::VisitWhileStatement(WhileStatement* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(WhileStatement::num_ids())); Visit(node->cond()); Visit(node->body()); @@ -250,21 +212,18 @@ void AstNumberingVisitor::VisitWhileStatement(WhileStatement* node) { void AstNumberingVisitor::VisitTryCatchStatement(TryCatchStatement* node) { - IncrementNodeCount(); Visit(node->try_block()); Visit(node->catch_block()); } void AstNumberingVisitor::VisitTryFinallyStatement(TryFinallyStatement* node) { - IncrementNodeCount(); Visit(node->try_block()); Visit(node->finally_block()); } void AstNumberingVisitor::VisitProperty(Property* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(Property::num_ids())); Visit(node->key()); Visit(node->obj()); @@ -272,7 +231,6 @@ void AstNumberingVisitor::VisitProperty(Property* node) { void AstNumberingVisitor::VisitAssignment(Assignment* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(Assignment::num_ids())); if (node->is_compound()) VisitBinaryOperation(node->binary_operation()); Visit(node->target()); @@ -281,7 +239,6 @@ void AstNumberingVisitor::VisitAssignment(Assignment* node) { void AstNumberingVisitor::VisitBinaryOperation(BinaryOperation* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(BinaryOperation::num_ids())); Visit(node->left()); Visit(node->right()); @@ -289,7 +246,6 @@ void AstNumberingVisitor::VisitBinaryOperation(BinaryOperation* node) { void AstNumberingVisitor::VisitCompareOperation(CompareOperation* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(CompareOperation::num_ids())); Visit(node->left()); Visit(node->right()); @@ -297,7 +253,6 @@ void AstNumberingVisitor::VisitCompareOperation(CompareOperation* node) { void AstNumberingVisitor::VisitForInStatement(ForInStatement* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(ForInStatement::num_ids())); Visit(node->each()); Visit(node->enumerable()); @@ -306,7 +261,6 @@ void AstNumberingVisitor::VisitForInStatement(ForInStatement* node) { void AstNumberingVisitor::VisitForOfStatement(ForOfStatement* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(ForOfStatement::num_ids())); Visit(node->assign_iterator()); Visit(node->next_result()); @@ -317,7 +271,6 @@ void AstNumberingVisitor::VisitForOfStatement(ForOfStatement* node) { void AstNumberingVisitor::VisitConditional(Conditional* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(Conditional::num_ids())); Visit(node->condition()); Visit(node->then_expression()); @@ -326,7 +279,6 @@ void AstNumberingVisitor::VisitConditional(Conditional* node) { void AstNumberingVisitor::VisitIfStatement(IfStatement* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(IfStatement::num_ids())); Visit(node->condition()); Visit(node->then_statement()); @@ -337,7 +289,6 @@ void AstNumberingVisitor::VisitIfStatement(IfStatement* node) { void AstNumberingVisitor::VisitSwitchStatement(SwitchStatement* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(SwitchStatement::num_ids())); Visit(node->tag()); ZoneList* cases = node->cases(); @@ -348,7 +299,6 @@ void AstNumberingVisitor::VisitSwitchStatement(SwitchStatement* node) { void AstNumberingVisitor::VisitCaseClause(CaseClause* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(CaseClause::num_ids())); if (!node->is_default()) Visit(node->label()); VisitStatements(node->statements()); @@ -356,7 +306,6 @@ void AstNumberingVisitor::VisitCaseClause(CaseClause* node) { void AstNumberingVisitor::VisitForStatement(ForStatement* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(ForStatement::num_ids())); if (node->init() != NULL) Visit(node->init()); if (node->cond() != NULL) Visit(node->cond()); @@ -366,7 +315,6 @@ void AstNumberingVisitor::VisitForStatement(ForStatement* node) { void AstNumberingVisitor::VisitClassLiteral(ClassLiteral* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(ClassLiteral::num_ids())); if (node->extends()) Visit(node->extends()); if (node->constructor()) Visit(node->constructor()); @@ -377,7 +325,6 @@ void AstNumberingVisitor::VisitClassLiteral(ClassLiteral* node) { void AstNumberingVisitor::VisitObjectLiteral(ObjectLiteral* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(ObjectLiteral::num_ids())); for (int i = 0; i < node->properties()->length(); i++) { VisitObjectLiteralProperty(node->properties()->at(i)); @@ -393,7 +340,6 @@ void AstNumberingVisitor::VisitObjectLiteralProperty( void AstNumberingVisitor::VisitArrayLiteral(ArrayLiteral* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(node->num_ids())); for (int i = 0; i < node->values()->length(); i++) { Visit(node->values()->at(i)); @@ -402,7 +348,6 @@ void AstNumberingVisitor::VisitArrayLiteral(ArrayLiteral* node) { void AstNumberingVisitor::VisitCall(Call* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(Call::num_ids())); Visit(node->expression()); VisitArguments(node->arguments()); @@ -410,7 +355,6 @@ void AstNumberingVisitor::VisitCall(Call* node) { void AstNumberingVisitor::VisitCallNew(CallNew* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(CallNew::num_ids())); Visit(node->expression()); VisitArguments(node->arguments()); @@ -441,7 +385,6 @@ void AstNumberingVisitor::VisitArguments(ZoneList* arguments) { void AstNumberingVisitor::VisitFunctionLiteral(FunctionLiteral* node) { - IncrementNodeCount(); node->set_base_id(ReserveIdRange(FunctionLiteral::num_ids())); // We don't recurse into the declarations or body of the function literal: // you have to separately Renumber() each FunctionLiteral that you compile. @@ -449,10 +392,6 @@ void AstNumberingVisitor::VisitFunctionLiteral(FunctionLiteral* node) { void AstNumberingVisitor::Renumber(FunctionLiteral* node) { - properties_.flags()->Add(*node->flags()); - properties_.increase_feedback_slots(node->slot_count()); - properties_.increase_ic_feedback_slots(node->ic_slot_count()); - if (node->scope()->HasIllegalRedeclaration()) { node->scope()->VisitIllegalRedeclaration(this); return; @@ -465,8 +404,6 @@ void AstNumberingVisitor::Renumber(FunctionLiteral* node) { Visit(scope->function()); } VisitStatements(node->body()); - - node->set_ast_properties(&properties_); } diff --git a/src/ast.cc b/src/ast.cc index 1df668d..11bb4ef 100644 --- a/src/ast.cc +++ b/src/ast.cc @@ -998,30 +998,36 @@ CaseClause::CaseClause(Zone* zone, Expression* label, #define REGULAR_NODE(NodeType) \ void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ + increase_node_count(); \ } #define REGULAR_NODE_WITH_FEEDBACK_SLOTS(NodeType) \ void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ + increase_node_count(); \ add_slot_node(node); \ } #define DONT_OPTIMIZE_NODE(NodeType) \ void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ + increase_node_count(); \ set_dont_crankshaft_reason(k##NodeType); \ add_flag(kDontSelfOptimize); \ } #define DONT_OPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(NodeType) \ void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ + increase_node_count(); \ add_slot_node(node); \ set_dont_crankshaft_reason(k##NodeType); \ add_flag(kDontSelfOptimize); \ } #define DONT_TURBOFAN_NODE(NodeType) \ void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ + increase_node_count(); \ set_dont_crankshaft_reason(k##NodeType); \ set_dont_turbofan_reason(k##NodeType); \ add_flag(kDontSelfOptimize); \ } #define DONT_TURBOFAN_NODE_WITH_FEEDBACK_SLOTS(NodeType) \ void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ + increase_node_count(); \ add_slot_node(node); \ set_dont_crankshaft_reason(k##NodeType); \ set_dont_turbofan_reason(k##NodeType); \ @@ -1029,15 +1035,18 @@ CaseClause::CaseClause(Zone* zone, Expression* label, } #define DONT_SELFOPTIMIZE_NODE(NodeType) \ void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ + increase_node_count(); \ add_flag(kDontSelfOptimize); \ } #define DONT_SELFOPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(NodeType) \ void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ + increase_node_count(); \ add_slot_node(node); \ add_flag(kDontSelfOptimize); \ } #define DONT_CACHE_NODE(NodeType) \ void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ + increase_node_count(); \ set_dont_crankshaft_reason(k##NodeType); \ add_flag(kDontSelfOptimize); \ add_flag(kDontCache); \ @@ -1111,6 +1120,7 @@ DONT_CACHE_NODE(ModuleLiteral) void AstConstructionVisitor::VisitCallRuntime(CallRuntime* node) { + increase_node_count(); add_slot_node(node); if (node->is_jsruntime()) { // Don't try to optimize JS runtime calls because we bailout on them. diff --git a/src/ast.h b/src/ast.h index 6f6cb1e..ae7ec1a 100644 --- a/src/ast.h +++ b/src/ast.h @@ -3144,6 +3144,7 @@ class AstConstructionVisitor BASE_EMBEDDED { AST_NODE_LIST(DEF_VISIT) #undef DEF_VISIT + void increase_node_count() { properties_.add_node_count(1); } void add_flag(AstPropertiesFlag flag) { properties_.flags()->Add(flag); } void set_dont_crankshaft_reason(BailoutReason reason) { dont_crankshaft_reason_ = reason; diff --git a/src/compiler.cc b/src/compiler.cc index fa8201b..92331c6 100644 --- a/src/compiler.cc +++ b/src/compiler.cc @@ -647,7 +647,11 @@ static void RecordFunctionCompilation(Logger::LogEventsAndTags tag, static bool CompileUnoptimizedCode(CompilationInfo* info) { DCHECK(AllowCompilation::IsAllowed(info->isolate())); - if (!Compiler::Analyze(info)) return false; + DCHECK(info->function() != NULL); + if (!Rewriter::Rewrite(info)) return false; + if (!Scope::Analyze(info)) return false; + DCHECK(info->scope() != NULL); + if (!FullCodeGenerator::MakeCode(info)) { Isolate* isolate = info->isolate(); if (!isolate->has_pending_exception()) isolate->StackOverflow(); @@ -669,6 +673,7 @@ MUST_USE_RESULT static MaybeHandle GetUnoptimizedCodeCommon( shared->set_strict_mode(lit->strict_mode()); SetExpectedNofPropertiesFromEstimate(shared, lit->expected_property_count()); shared->set_bailout_reason(lit->dont_optimize_reason()); + shared->set_ast_node_count(lit->ast_node_count()); // Compile unoptimized code. if (!CompileUnoptimizedCode(info)) return MaybeHandle(); @@ -738,33 +743,18 @@ static void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) { } -static bool Renumber(CompilationInfo* info) { - if (!AstNumbering::Renumber(info->function(), info->zone())) return false; - if (!info->shared_info().is_null()) { - info->shared_info()->set_ast_node_count(info->function()->ast_node_count()); - } - return true; -} - - -bool Compiler::Analyze(CompilationInfo* info) { - DCHECK(info->function() != NULL); +static bool CompileOptimizedPrologue(CompilationInfo* info) { + if (!Parser::Parse(info)) return false; if (!Rewriter::Rewrite(info)) return false; if (!Scope::Analyze(info)) return false; - if (!Renumber(info)) return false; + if (!AstNumbering::Renumber(info->function(), info->zone())) return false; DCHECK(info->scope() != NULL); return true; } -bool Compiler::ParseAndAnalyze(CompilationInfo* info) { - if (!Parser::Parse(info)) return false; - return Compiler::Analyze(info); -} - - static bool GetOptimizedCodeNow(CompilationInfo* info) { - if (!Compiler::ParseAndAnalyze(info)) return false; + if (!CompileOptimizedPrologue(info)) return false; TimerEventScope timer(info->isolate()); @@ -806,7 +796,7 @@ static bool GetOptimizedCodeLater(CompilationInfo* info) { } CompilationHandleScope handle_scope(info); - if (!Compiler::ParseAndAnalyze(info)) return false; + if (!CompileOptimizedPrologue(info)) return false; info->SaveHandles(); // Copy handles to the compilation handle scope. TimerEventScope timer(info->isolate()); @@ -920,8 +910,6 @@ bool Compiler::EnsureCompiled(Handle function, // TODO(turbofan): In the future, unoptimized code with deopt support could // be generated lazily once deopt is triggered. bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) { - DCHECK(info->function() != NULL); - DCHECK(info->scope() != NULL); if (!info->shared_info()->has_deoptimization_support()) { CompilationInfoWithZone unoptimized(info->shared_info()); // Note that we use the same AST that we will use for generating the @@ -1316,7 +1304,7 @@ Handle Compiler::BuildFunctionInfo( Handle code = isolate->builtins()->CompileLazy(); info.SetCode(code); scope_info = Handle(ScopeInfo::Empty(isolate)); - } else if (Renumber(&info) && FullCodeGenerator::MakeCode(&info)) { + } else if (FullCodeGenerator::MakeCode(&info)) { DCHECK(!info.code().is_null()); scope_info = ScopeInfo::Create(info.scope(), info.zone()); } else { diff --git a/src/compiler.h b/src/compiler.h index 05b97a9..47579bd 100644 --- a/src/compiler.h +++ b/src/compiler.h @@ -675,16 +675,11 @@ class Compiler : public AllStatic { MUST_USE_RESULT static MaybeHandle GetDebugCode( Handle function); - // Parser::Parse, then Compiler::Analyze. - static bool ParseAndAnalyze(CompilationInfo* info); - // Rewrite, analyze scopes, and renumber. - static bool Analyze(CompilationInfo* info); - // Adds deoptimization support, requires ParseAndAnalyze. - static bool EnsureDeoptimizationSupport(CompilationInfo* info); - static bool EnsureCompiled(Handle function, ClearExceptionFlag flag); + static bool EnsureDeoptimizationSupport(CompilationInfo* info); + static void CompileForLiveEdit(Handle