| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 478d938cf6fa27d74994d43674af59ca7f05ef41..efa47e0c3f7659207a116f0fe3a5c283a88b4580 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -9522,11 +9522,14 @@ void HOptimizedGraphBuilder::VisitLogicalExpression(BinaryOperation* expr) {
|
| 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->BooleanValue()) ||
|
| - (!is_logical_and && !left_constant->BooleanValue())) {
|
| - Drop(1); // left_value.
|
| + // Short-circuit left values that always evaluate to the same boolean value.
|
| + if (expr->left()->ToBooleanIsTrue() || expr->left()->ToBooleanIsFalse()) {
|
| + // l (evals true) && r -> r
|
| + // l (evals true) || r -> l
|
| + // l (evals false) && r -> l
|
| + // l (evals false) || r -> r
|
| + if (is_logical_and == expr->left()->ToBooleanIsTrue()) {
|
| + Drop(1);
|
| CHECK_ALIVE(VisitForValue(expr->right()));
|
| }
|
| return ast_context()->ReturnValue(Pop());
|
|
|