Index: src/compiler/ast-graph-builder.cc |
diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc |
index 8c6f2f17113590d4c83c6d5678b8710c993d74e5..68668e73ba948b8baa9815e75534478614875c93 100644 |
--- a/src/compiler/ast-graph-builder.cc |
+++ b/src/compiler/ast-graph-builder.cc |
@@ -5,10 +5,11 @@ |
#include "src/compiler/ast-graph-builder.h" |
#include "src/compiler.h" |
+#include "src/compiler/ast-loop-assignment-analyzer.h" |
#include "src/compiler/control-builders.h" |
#include "src/compiler/machine-operator.h" |
-#include "src/compiler/node-properties.h" |
#include "src/compiler/node-properties-inl.h" |
+#include "src/compiler/node-properties.h" |
#include "src/full-codegen.h" |
#include "src/parser.h" |
#include "src/scopes.h" |
@@ -24,7 +25,8 @@ AstGraphBuilder::AstGraphBuilder(Zone* local_zone, CompilationInfo* info, |
jsgraph_(jsgraph), |
globals_(0, local_zone), |
breakable_(NULL), |
- execution_context_(NULL) { |
+ execution_context_(NULL), |
+ loop_assignment_analysis_(NULL) { |
InitializeAstVisitor(local_zone); |
} |
@@ -59,6 +61,12 @@ bool AstGraphBuilder::CreateGraph() { |
int parameter_count = info()->num_parameters(); |
graph()->SetStart(graph()->NewNode(common()->Start(parameter_count))); |
+ if (FLAG_loop_assignment_analysis) { |
+ // TODO(turbofan): use a temporary zone for the loop assignment analysis. |
+ AstLoopAssignmentAnalyzer analyzer(zone(), info()); |
+ loop_assignment_analysis_ = analyzer.Analyze(); |
+ } |
+ |
// Initialize the top-level environment. |
Environment env(this, scope, graph()->start()); |
set_environment(&env); |
@@ -579,9 +587,16 @@ void AstGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { |
} |
+BitVector* AstGraphBuilder::GetVariablesAssignedInLoop( |
+ IterationStatement* stmt) { |
+ if (loop_assignment_analysis_ == NULL) return NULL; |
+ return loop_assignment_analysis_->GetVariablesAssignedInLoop(stmt); |
+} |
+ |
+ |
void AstGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
LoopBuilder while_loop(this); |
- while_loop.BeginLoop(); |
+ while_loop.BeginLoop(GetVariablesAssignedInLoop(stmt)); |
VisitIterationBody(stmt, &while_loop, 0); |
while_loop.EndBody(); |
VisitForTest(stmt->cond()); |
@@ -593,7 +608,7 @@ void AstGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
void AstGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { |
LoopBuilder while_loop(this); |
- while_loop.BeginLoop(); |
+ while_loop.BeginLoop(GetVariablesAssignedInLoop(stmt)); |
VisitForTest(stmt->cond()); |
Node* condition = environment()->Pop(); |
while_loop.BreakUnless(condition); |
@@ -606,7 +621,7 @@ void AstGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { |
void AstGraphBuilder::VisitForStatement(ForStatement* stmt) { |
LoopBuilder for_loop(this); |
VisitIfNotNull(stmt->init()); |
- for_loop.BeginLoop(); |
+ for_loop.BeginLoop(GetVariablesAssignedInLoop(stmt)); |
if (stmt->cond() != NULL) { |
VisitForTest(stmt->cond()); |
Node* condition = environment()->Pop(); |
@@ -682,7 +697,7 @@ void AstGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
environment()->Push(jsgraph()->ZeroConstant()); |
// PrepareForBailoutForId(stmt->BodyId(), NO_REGISTERS); |
LoopBuilder for_loop(this); |
- for_loop.BeginLoop(); |
+ for_loop.BeginLoop(GetVariablesAssignedInLoop(stmt)); |
// Check loop termination condition. |
Node* index = environment()->Peek(0); |
Node* exit_cond = |