Index: src/crankshaft/hydrogen.cc |
diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc |
index 38a9fd0ad88425776d69b9485ac0ea852c81d91d..0de6dac78eca1008f326cebed6197a06cc7f68b4 100644 |
--- a/src/crankshaft/hydrogen.cc |
+++ b/src/crankshaft/hydrogen.cc |
@@ -5111,7 +5111,7 @@ void HOptimizedGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
HBasicBlock* body_exit = |
JoinContinue(stmt, current_block(), break_info.continue_block()); |
HBasicBlock* loop_successor = NULL; |
- if (body_exit != NULL && !stmt->cond()->ToBooleanIsTrue()) { |
+ if (body_exit != NULL) { |
set_current_block(body_exit); |
loop_successor = graph()->CreateBasicBlock(); |
if (stmt->cond()->ToBooleanIsFalse()) { |
@@ -5153,19 +5153,17 @@ void HOptimizedGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { |
// If the condition is constant true, do not generate a branch. |
HBasicBlock* loop_successor = NULL; |
- if (!stmt->cond()->ToBooleanIsTrue()) { |
- HBasicBlock* body_entry = graph()->CreateBasicBlock(); |
- loop_successor = graph()->CreateBasicBlock(); |
- CHECK_BAILOUT(VisitForControl(stmt->cond(), body_entry, loop_successor)); |
- if (body_entry->HasPredecessor()) { |
- body_entry->SetJoinId(stmt->BodyId()); |
- set_current_block(body_entry); |
- } |
- if (loop_successor->HasPredecessor()) { |
- loop_successor->SetJoinId(stmt->ExitId()); |
- } else { |
- loop_successor = NULL; |
- } |
+ HBasicBlock* body_entry = graph()->CreateBasicBlock(); |
+ loop_successor = graph()->CreateBasicBlock(); |
+ CHECK_BAILOUT(VisitForControl(stmt->cond(), body_entry, loop_successor)); |
+ if (body_entry->HasPredecessor()) { |
+ body_entry->SetJoinId(stmt->BodyId()); |
+ set_current_block(body_entry); |
+ } |
+ if (loop_successor->HasPredecessor()) { |
+ loop_successor->SetJoinId(stmt->ExitId()); |
+ } else { |
+ loop_successor = NULL; |
} |
BreakAndContinueInfo break_info(stmt, scope()); |
@@ -5194,10 +5192,9 @@ void HOptimizedGraphBuilder::VisitForStatement(ForStatement* stmt) { |
DCHECK(current_block() != NULL); |
HBasicBlock* loop_entry = BuildLoopEntry(stmt); |
- HBasicBlock* loop_successor = NULL; |
+ HBasicBlock* loop_successor = graph()->CreateBasicBlock(); |
+ HBasicBlock* body_entry = graph()->CreateBasicBlock(); |
if (stmt->cond() != NULL) { |
- HBasicBlock* body_entry = graph()->CreateBasicBlock(); |
- loop_successor = graph()->CreateBasicBlock(); |
CHECK_BAILOUT(VisitForControl(stmt->cond(), body_entry, loop_successor)); |
if (body_entry->HasPredecessor()) { |
body_entry->SetJoinId(stmt->BodyId()); |
@@ -5208,6 +5205,14 @@ void HOptimizedGraphBuilder::VisitForStatement(ForStatement* stmt) { |
} else { |
loop_successor = NULL; |
} |
+ } else { |
+ // Create dummy control flow so that variable liveness analysis |
+ // produces teh correct result. |
+ HControlInstruction* branch = New<HBranch>(graph()->GetConstantTrue()); |
+ branch->SetSuccessorAt(0, body_entry); |
+ branch->SetSuccessorAt(1, loop_successor); |
+ FinishCurrentBlock(branch); |
+ set_current_block(body_entry); |
} |
BreakAndContinueInfo break_info(stmt, scope()); |