| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 9587dd3440e749ae8f9a9f847827daa5526d338e..0a3623051e6a4b87e12086674482e61bdf7ef5b7 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -8050,11 +8050,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());
|
|
|