| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 1ddd17cb14959d1b68ef9fd9716f1fc87db1cabc..30cc08839a5dd64a31cf795f822bf34be0232c8b 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -4915,28 +4915,23 @@ void HGraphBuilder::VisitBinaryOperation(BinaryOperation* expr) {
|
| VISIT_FOR_VALUE(expr->left());
|
| ASSERT(current_block() != NULL);
|
|
|
| - HValue* left = Top();
|
| - HEnvironment* environment_copy = environment()->Copy();
|
| - environment_copy->Pop();
|
| - HSubgraph* right_subgraph;
|
| - right_subgraph = CreateBranchSubgraph(environment_copy);
|
| - ADD_TO_SUBGRAPH(right_subgraph, expr->right());
|
| -
|
| - ASSERT(current_block() != NULL &&
|
| - right_subgraph->exit_block() != NULL);
|
| // We need an extra block to maintain edge-split form.
|
| HBasicBlock* empty_block = graph()->CreateBasicBlock();
|
| - HBasicBlock* join_block = graph()->CreateBasicBlock();
|
| -
|
| + HBasicBlock* eval_right = graph()->CreateBasicBlock();
|
| HTest* test = is_logical_and
|
| - ? new HTest(left, right_subgraph->entry_block(), empty_block)
|
| - : new HTest(left, empty_block, right_subgraph->entry_block());
|
| + ? new HTest(Top(), eval_right, empty_block)
|
| + : new HTest(Top(), empty_block, eval_right);
|
| current_block()->Finish(test);
|
| - empty_block->Goto(join_block);
|
| - right_subgraph->exit_block()->Goto(join_block);
|
| - join_block->SetJoinId(expr->id());
|
| +
|
| + set_current_block(eval_right);
|
| + Drop(1); // Value of the left subexpression.
|
| + VISIT_FOR_VALUE(expr->right());
|
| +
|
| + HBasicBlock* join_block =
|
| + CreateJoin(empty_block, current_block(), expr->id());
|
| set_current_block(join_block);
|
| ast_context()->ReturnValue(Pop());
|
| +
|
| } else {
|
| ASSERT(ast_context()->IsEffect());
|
| // In an effect context, we don't need the value of the left
|
|
|