| 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);
|
|
|