Revision: 7045
Author: [email protected]
Date: Thu Mar 3 05:02:56 2011
Log: 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
http://code.google.com/p/v8/source/detail?r=7045
Modified:
/branches/bleeding_edge/src/hydrogen.cc
=======================================
--- /branches/bleeding_edge/src/hydrogen.cc Wed Mar 2 06:09:59 2011
+++ /branches/bleeding_edge/src/hydrogen.cc Thu Mar 3 05:02:56 2011
@@ -4915,28 +4915,23 @@
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