From: kmillikin@chromium.org Date: Thu, 3 Mar 2011 13:02:56 +0000 (+0000) Subject: Refactor translation of short-circuit logical operations to avoid subgraphs. X-Git-Tag: upstream/4.7.83~20015 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=84aceb526a515cfb8825bae6efab01c29f2ed52d;p=platform%2Fupstream%2Fv8.git Refactor translation of short-circuit logical operations to avoid subgraphs. Do not use a subgraph or subgraph scope for the Hydrogen translation of the short-circuit logical operations. Review URL: http://codereview.chromium.org/6615010 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7045 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 1ddd17c..30cc088 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