Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 7cde43797dd0618c83b0e19a90aa43945f3ee5fd..3b7b37de374b622a6f13f27e40bcc296ef444c2e 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -2520,6 +2520,14 @@ HGraph* HGraphBuilder::CreateGraph() { |
if (FLAG_eliminate_dead_phis) graph()->EliminateUnreachablePhis(); |
graph()->CollectPhis(); |
+ if (graph()->has_osr_loop_entry()) { |
+ const ZoneList<HPhi*>* phis = graph()->osr_loop_entry()->phis(); |
+ for (int j = 0; j < phis->length(); j++) { |
+ HPhi* phi = phis->at(j); |
+ graph()->osr_values()->at(phi->merged_index())->set_incoming_value(phi); |
+ } |
+ } |
+ |
HInferRepresentation rep(graph()); |
rep.Analyze(); |
@@ -3092,8 +3100,8 @@ bool HGraphBuilder::HasOsrEntryAt(IterationStatement* statement) { |
} |
-void HGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
- if (!HasOsrEntryAt(statement)) return; |
+bool HGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
+ if (!HasOsrEntryAt(statement)) return false; |
HBasicBlock* non_osr_entry = graph()->CreateBasicBlock(); |
HBasicBlock* osr_entry = graph()->CreateBasicBlock(); |
@@ -3108,10 +3116,14 @@ void HGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
int osr_entry_id = statement->OsrEntryId(); |
int first_expression_index = environment()->first_expression_index(); |
int length = environment()->length(); |
+ ZoneList<HUnknownOSRValue*>* osr_values = |
+ new(zone()) ZoneList<HUnknownOSRValue*>(length); |
+ |
for (int i = 0; i < first_expression_index; ++i) { |
HUnknownOSRValue* osr_value = new(zone()) HUnknownOSRValue; |
AddInstruction(osr_value); |
environment()->Bind(i, osr_value); |
+ osr_values->Add(osr_value); |
} |
if (first_expression_index != length) { |
@@ -3120,9 +3132,12 @@ void HGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
HUnknownOSRValue* osr_value = new(zone()) HUnknownOSRValue; |
AddInstruction(osr_value); |
environment()->Push(osr_value); |
+ osr_values->Add(osr_value); |
} |
} |
+ graph()->set_osr_values(osr_values); |
+ |
AddSimulate(osr_entry_id); |
AddInstruction(new(zone()) HOsrEntry(osr_entry_id)); |
HContext* context = new(zone()) HContext; |
@@ -3131,6 +3146,7 @@ void HGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
current_block()->Goto(loop_predecessor); |
loop_predecessor->SetJoinId(statement->EntryId()); |
set_current_block(loop_predecessor); |
+ return true; |
} |
@@ -3154,10 +3170,11 @@ void HGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
ASSERT(current_block() != NULL); |
ASSERT(current_block()->HasPredecessor()); |
ASSERT(current_block() != NULL); |
- PreProcessOsrEntry(stmt); |
+ bool osr_entry = PreProcessOsrEntry(stmt); |
HBasicBlock* loop_entry = CreateLoopHeaderBlock(); |
current_block()->Goto(loop_entry); |
set_current_block(loop_entry); |
+ if (osr_entry) graph()->set_osr_loop_entry(loop_entry); |
BreakAndContinueInfo break_info(stmt); |
CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry, &break_info)); |
@@ -3196,10 +3213,12 @@ void HGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { |
ASSERT(current_block() != NULL); |
ASSERT(current_block()->HasPredecessor()); |
ASSERT(current_block() != NULL); |
- PreProcessOsrEntry(stmt); |
+ bool osr_entry = PreProcessOsrEntry(stmt); |
HBasicBlock* loop_entry = CreateLoopHeaderBlock(); |
current_block()->Goto(loop_entry); |
set_current_block(loop_entry); |
+ if (osr_entry) graph()->set_osr_loop_entry(loop_entry); |
+ |
// If the condition is constant true, do not generate a branch. |
HBasicBlock* loop_successor = NULL; |
@@ -3241,10 +3260,11 @@ void HGraphBuilder::VisitForStatement(ForStatement* stmt) { |
CHECK_ALIVE(Visit(stmt->init())); |
} |
ASSERT(current_block() != NULL); |
- PreProcessOsrEntry(stmt); |
+ bool osr_entry = PreProcessOsrEntry(stmt); |
HBasicBlock* loop_entry = CreateLoopHeaderBlock(); |
current_block()->Goto(loop_entry); |
set_current_block(loop_entry); |
+ if (osr_entry) graph()->set_osr_loop_entry(loop_entry); |
HBasicBlock* loop_successor = NULL; |
if (stmt->cond() != NULL) { |
@@ -3336,10 +3356,11 @@ void HGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
HForInCacheArray::cast(array)->set_index_cache( |
HForInCacheArray::cast(index_cache)); |
- PreProcessOsrEntry(stmt); |
+ bool osr_entry = PreProcessOsrEntry(stmt); |
HBasicBlock* loop_entry = CreateLoopHeaderBlock(); |
current_block()->Goto(loop_entry); |
set_current_block(loop_entry); |
+ if (osr_entry) graph()->set_osr_loop_entry(loop_entry); |
HValue* index = environment()->ExpressionStackAt(0); |
HValue* limit = environment()->ExpressionStackAt(1); |