Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index 7550809ae105f2a6c2e598ef191a93884767ff9c..ce9915b90403ba2641f0e381bdf7b51556cd3430 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -163,14 +163,13 @@ void HBasicBlock::Finish(HControlInstruction* end) { |
| } |
| -void HBasicBlock::Goto(HBasicBlock* block, bool include_stack_check) { |
| +void HBasicBlock::Goto(HBasicBlock* block) { |
| if (block->IsInlineReturnTarget()) { |
| AddInstruction(new(zone()) HLeaveInlined); |
| last_environment_ = last_environment()->outer(); |
| } |
| AddSimulate(AstNode::kNoNumber); |
| HGoto* instr = new(zone()) HGoto(block); |
| - instr->set_include_stack_check(include_stack_check); |
| Finish(instr); |
| } |
| @@ -576,7 +575,7 @@ HBasicBlock* HGraphBuilder::CreateLoop(IterationStatement* statement, |
| HBasicBlock* body_exit, |
| HBasicBlock* loop_successor, |
| HBasicBlock* break_block) { |
| - if (body_exit != NULL) body_exit->Goto(loop_entry, true); |
| + if (body_exit != NULL) body_exit->Goto(loop_entry); |
| loop_entry->PostProcessLoopHeader(statement); |
| if (break_block != NULL) { |
| if (loop_successor != NULL) loop_successor->Goto(break_block); |
| @@ -1234,8 +1233,6 @@ class HStackCheckEliminator BASE_EMBEDDED { |
| void Process(); |
| private: |
| - void RemoveStackCheck(HBasicBlock* block); |
| - |
| HGraph* graph_; |
| }; |
| @@ -1254,7 +1251,7 @@ void HStackCheckEliminator::Process() { |
| HInstruction* instr = dominator->first(); |
| while (instr != NULL) { |
| if (instr->IsCall()) { |
| - RemoveStackCheck(back_edge); |
| + block->loop_information()->stack_check()->set_eliminated(true); |
|
fschneider
2011/06/22 07:41:18
Idea for improvement: Can you delete the HStackChe
Søren Thygesen Gjesse
2011/06/27 11:07:52
Good point. Changed the elimination to unlink the
|
| break; |
| } |
| instr = instr->next(); |
| @@ -1271,18 +1268,6 @@ void HStackCheckEliminator::Process() { |
| } |
| -void HStackCheckEliminator::RemoveStackCheck(HBasicBlock* block) { |
| - HInstruction* instr = block->first(); |
| - while (instr != NULL) { |
| - if (instr->IsGoto()) { |
| - HGoto::cast(instr)->set_include_stack_check(false); |
| - return; |
| - } |
| - instr = instr->next(); |
| - } |
| -} |
| - |
| - |
| // Simple sparse set with O(1) add, contains, and clear. |
| class SparseSet { |
| public: |
| @@ -2136,8 +2121,8 @@ void TestContext::BuildBranch(HValue* value) { |
| HTest* test = new(zone()) HTest(value, empty_true, empty_false); |
| builder->current_block()->Finish(test); |
| - empty_true->Goto(if_true(), false); |
| - empty_false->Goto(if_false(), false); |
| + empty_true->Goto(if_true()); |
| + empty_false->Goto(if_false()); |
| builder->set_current_block(NULL); |
| } |
| @@ -2229,7 +2214,7 @@ HGraph* HGraphBuilder::CreateGraph() { |
| } |
| SetupScope(scope); |
| VisitDeclarations(scope->declarations()); |
| - AddInstruction(new(zone()) HStackCheck()); |
| + AddInstruction(new(zone()) HStackCheck(HStackCheck::kFunctionEntry)); |
| // Add an edge to the body entry. This is warty: the graph's start |
| // environment will be used by the Lithium translation as the initial |
| @@ -2567,7 +2552,7 @@ void HGraphBuilder::VisitReturnStatement(ReturnStatement* stmt) { |
| test->if_false()); |
| } else if (context->IsEffect()) { |
| CHECK_ALIVE(VisitForEffect(stmt->expression())); |
| - current_block()->Goto(function_return(), false); |
| + current_block()->Goto(function_return()); |
| } else { |
| ASSERT(context->IsValue()); |
| CHECK_ALIVE(VisitForValue(stmt->expression())); |
| @@ -2758,6 +2743,19 @@ void HGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
| } |
| +void HGraphBuilder::VisitLoopBody(Statement* body, |
| + HBasicBlock* loop_entry, |
| + BreakAndContinueInfo* break_info) { |
| + BreakAndContinueScope push(break_info, this); |
| + HStackCheck* stack_check = |
| + new(zone()) HStackCheck(HStackCheck::kBackwardsBranch); |
| + AddInstruction(stack_check); |
| + ASSERT(loop_entry->IsLoopHeader()); |
| + loop_entry->loop_information()->set_stack_check(stack_check); |
| + CHECK_BAILOUT(Visit(body)); |
| +} |
| + |
| + |
| void HGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| @@ -2765,13 +2763,11 @@ void HGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
| ASSERT(current_block() != NULL); |
| PreProcessOsrEntry(stmt); |
| HBasicBlock* loop_entry = CreateLoopHeaderBlock(); |
| - current_block()->Goto(loop_entry, false); |
| + current_block()->Goto(loop_entry); |
| set_current_block(loop_entry); |
| BreakAndContinueInfo break_info(stmt); |
| - { BreakAndContinueScope push(&break_info, this); |
| - CHECK_BAILOUT(Visit(stmt->body())); |
| - } |
| + CHECK_BAILOUT(VisitLoopBody(stmt->body(), loop_entry, &break_info)); |
| HBasicBlock* body_exit = |
| JoinContinue(stmt, current_block(), break_info.continue_block()); |
| HBasicBlock* loop_successor = NULL; |
| @@ -2809,7 +2805,7 @@ void HGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { |
| ASSERT(current_block() != NULL); |
| PreProcessOsrEntry(stmt); |
| HBasicBlock* loop_entry = CreateLoopHeaderBlock(); |
| - current_block()->Goto(loop_entry, false); |
| + current_block()->Goto(loop_entry); |
| set_current_block(loop_entry); |
| // If the condition is constant true, do not generate a branch. |
| @@ -2832,7 +2828,7 @@ void HGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { |
| BreakAndContinueInfo break_info(stmt); |
| if (current_block() != NULL) { |
| BreakAndContinueScope push(&break_info, this); |
| - CHECK_BAILOUT(Visit(stmt->body())); |
| + CHECK_BAILOUT(VisitLoopBody(stmt->body(), loop_entry, &break_info)); |
| } |
| HBasicBlock* body_exit = |
| JoinContinue(stmt, current_block(), break_info.continue_block()); |
| @@ -2855,7 +2851,7 @@ void HGraphBuilder::VisitForStatement(ForStatement* stmt) { |
| ASSERT(current_block() != NULL); |
| PreProcessOsrEntry(stmt); |
| HBasicBlock* loop_entry = CreateLoopHeaderBlock(); |
| - current_block()->Goto(loop_entry, false); |
| + current_block()->Goto(loop_entry); |
| set_current_block(loop_entry); |
| HBasicBlock* loop_successor = NULL; |
| @@ -2877,7 +2873,7 @@ void HGraphBuilder::VisitForStatement(ForStatement* stmt) { |
| BreakAndContinueInfo break_info(stmt); |
| if (current_block() != NULL) { |
| BreakAndContinueScope push(&break_info, this); |
| - CHECK_BAILOUT(Visit(stmt->body())); |
| + CHECK_BAILOUT(VisitLoopBody(stmt->body(), loop_entry, &break_info)); |
| } |
| HBasicBlock* body_exit = |
| JoinContinue(stmt, current_block(), break_info.continue_block()); |
| @@ -4486,7 +4482,7 @@ bool HGraphBuilder::TryInline(Call* expr) { |
| ASSERT(function_return() != NULL); |
| ASSERT(call_context()->IsEffect() || call_context()->IsValue()); |
| if (call_context()->IsEffect()) { |
| - current_block()->Goto(function_return(), false); |
| + current_block()->Goto(function_return()); |
| } else { |
| current_block()->AddLeaveInlined(undefined, function_return()); |
| } |
| @@ -4501,8 +4497,8 @@ bool HGraphBuilder::TryInline(Call* expr) { |
| HTest* test = new(zone()) HTest(undefined, empty_true, empty_false); |
| current_block()->Finish(test); |
| - empty_true->Goto(inlined_test_context()->if_true(), false); |
| - empty_false->Goto(inlined_test_context()->if_false(), false); |
| + empty_true->Goto(inlined_test_context()->if_true()); |
| + empty_false->Goto(inlined_test_context()->if_false()); |
| } |
| } |
| @@ -4519,12 +4515,12 @@ bool HGraphBuilder::TryInline(Call* expr) { |
| if (if_true->HasPredecessor()) { |
| if_true->SetJoinId(expr->id()); |
| HBasicBlock* true_target = TestContext::cast(ast_context())->if_true(); |
| - if_true->Goto(true_target, false); |
| + if_true->Goto(true_target); |
| } |
| if (if_false->HasPredecessor()) { |
| if_false->SetJoinId(expr->id()); |
| HBasicBlock* false_target = TestContext::cast(ast_context())->if_false(); |
| - if_false->Goto(false_target, false); |
| + if_false->Goto(false_target); |
| } |
| set_current_block(NULL); |