Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 7550809ae105f2a6c2e598ef191a93884767ff9c..2b07e78b1aa8bbcc8e7e1d2664bc5df5a4778c7e 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()->Eliminate(); |
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); |