Reviewers: fschneider,
Description:
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.
Please review this at http://codereview.chromium.org/6615010/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge/build/ia32
Affected files:
M src/hydrogen.cc
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
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev