Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 62fa571bbcdcd2e29e687b5d2ffc4604979cbab8..5bda97d2187c4b78ef098eb8d40f7d72c725c45a 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -3615,6 +3615,16 @@ void TestContext::BuildBranch(HValue* value) { |
if (value != NULL && value->CheckFlag(HValue::kIsArguments)) { |
builder->Bailout("arguments object value in a test context"); |
} |
+ if (value->IsConstant()) { |
+ HConstant* constant_value = HConstant::cast(value); |
+ if (constant_value->ToBoolean()) { |
+ builder->current_block()->Goto(if_true(), builder->function_state()); |
+ } else { |
+ builder->current_block()->Goto(if_false(), builder->function_state()); |
+ } |
+ builder->set_current_block(NULL); |
+ return; |
+ } |
HBasicBlock* empty_true = builder->graph()->CreateBasicBlock(); |
HBasicBlock* empty_false = builder->graph()->CreateBasicBlock(); |
TypeFeedbackId test_id = condition()->test_id(); |
@@ -3622,8 +3632,8 @@ void TestContext::BuildBranch(HValue* value) { |
HBranch* test = new(zone()) HBranch(value, empty_true, empty_false, expected); |
builder->current_block()->Finish(test); |
- empty_true->Goto(if_true(), owner()->function_state()); |
- empty_false->Goto(if_false(), owner()->function_state()); |
+ empty_true->Goto(if_true(), builder->function_state()); |
+ empty_false->Goto(if_false(), builder->function_state()); |
builder->set_current_block(NULL); |
} |
@@ -9032,6 +9042,17 @@ void HOptimizedGraphBuilder::VisitLogicalExpression(BinaryOperation* expr) { |
} else if (ast_context()->IsValue()) { |
CHECK_ALIVE(VisitForValue(expr->left())); |
ASSERT(current_block() != NULL); |
+ HValue* left_value = Top(); |
+ |
+ if (left_value->IsConstant()) { |
+ HConstant* left_constant = HConstant::cast(left_value); |
+ if ((is_logical_and && left_constant->ToBoolean()) || |
+ (!is_logical_and && !left_constant->ToBoolean())) { |
+ Drop(1); // left_value. |
+ CHECK_BAILOUT(VisitForValue(expr->right())); |
+ } |
+ return ast_context()->ReturnValue(Pop()); |
+ } |
// We need an extra block to maintain edge-split form. |
HBasicBlock* empty_block = graph()->CreateBasicBlock(); |
@@ -9039,8 +9060,8 @@ void HOptimizedGraphBuilder::VisitLogicalExpression(BinaryOperation* expr) { |
TypeFeedbackId test_id = expr->left()->test_id(); |
ToBooleanStub::Types expected(oracle()->ToBooleanTypes(test_id)); |
HBranch* test = is_logical_and |
- ? new(zone()) HBranch(Top(), eval_right, empty_block, expected) |
- : new(zone()) HBranch(Top(), empty_block, eval_right, expected); |
+ ? new(zone()) HBranch(left_value, eval_right, empty_block, expected) |
+ : new(zone()) HBranch(left_value, empty_block, eval_right, expected); |
current_block()->Finish(test); |
set_current_block(eval_right); |