| Index: pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
 | 
| diff --git a/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart b/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
 | 
| index dd44f1d1ed49be4b095f471cb34a5376eb32ef0f..bfed37d7923afe3c90bb419dfd5bedc2ecd8dadf 100644
 | 
| --- a/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
 | 
| +++ b/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
 | 
| @@ -52,8 +52,7 @@ import '../../constants/values.dart' as values;
 | 
|  ///
 | 
|  ///   !x ? y : false  ==>  !x && y
 | 
|  ///
 | 
| -class LogicalRewriter extends RecursiveTransformer
 | 
| -                      implements Pass {
 | 
| +class LogicalRewriter extends RecursiveTransformer implements Pass {
 | 
|    String get passName => 'Logical rewriter';
 | 
|  
 | 
|    @override
 | 
| @@ -68,20 +67,20 @@ class LogicalRewriter extends RecursiveTransformer
 | 
|    /// This means it will ultimately translate to an empty statement.
 | 
|    bool isFallthrough(Statement node) {
 | 
|      return node is Break && isFallthroughBreak(node) ||
 | 
| -           node is Continue && isFallthroughContinue(node) ||
 | 
| -           node is Return && isFallthroughReturn(node);
 | 
| +        node is Continue && isFallthroughContinue(node) ||
 | 
| +        node is Return && isFallthroughReturn(node);
 | 
|    }
 | 
|  
 | 
|    bool isFallthroughBreak(Break node) {
 | 
|      Statement target = fallthrough.target;
 | 
|      return node.target.binding.next == target ||
 | 
| -           target is Break && target.target == node.target;
 | 
| +        target is Break && target.target == node.target;
 | 
|    }
 | 
|  
 | 
|    bool isFallthroughContinue(Continue node) {
 | 
|      Statement target = fallthrough.target;
 | 
|      return node.target.binding == target ||
 | 
| -           target is Continue && target.target == node.target;
 | 
| +        target is Continue && target.target == node.target;
 | 
|    }
 | 
|  
 | 
|    bool isFallthroughReturn(Return node) {
 | 
| @@ -90,8 +89,8 @@ class LogicalRewriter extends RecursiveTransformer
 | 
|  
 | 
|    bool isTerminator(Statement node) {
 | 
|      return (node is Jump || node is Return) && !isFallthrough(node) ||
 | 
| -           (node is ExpressionStatement && node.next is Unreachable) ||
 | 
| -           node is Throw;
 | 
| +        (node is ExpressionStatement && node.next is Unreachable) ||
 | 
| +        node is Throw;
 | 
|    }
 | 
|  
 | 
|    Statement visitIf(If node) {
 | 
| @@ -123,7 +122,7 @@ class LogicalRewriter extends RecursiveTransformer
 | 
|        // if (E) {} else {S} ==> if (!E) {S}
 | 
|        bestThenBranch = ELSE;
 | 
|      } else if (isFallthrough(node.elseStatement) &&
 | 
| -               !isFallthrough(node.thenStatement)) {
 | 
| +        !isFallthrough(node.thenStatement)) {
 | 
|        // Keep the empty statement in the 'else' branch.
 | 
|        // if (E) {S} else {}
 | 
|        bestThenBranch = THEN;
 | 
| @@ -136,12 +135,12 @@ class LogicalRewriter extends RecursiveTransformer
 | 
|        // if (E) {S1; return v}; S2
 | 
|        bestThenBranch = THEN;
 | 
|      } else if (isTerminator(node.elseStatement) &&
 | 
| -               !isTerminator(node.thenStatement)) {
 | 
| +        !isTerminator(node.thenStatement)) {
 | 
|        // Put early termination in the 'then' branch to reduce nesting depth.
 | 
|        // if (E) {S}; return v ==> if (!E) return v; S
 | 
|        bestThenBranch = ELSE;
 | 
|      } else if (isTerminator(node.thenStatement) &&
 | 
| -               !isTerminator(node.elseStatement)) {
 | 
| +        !isTerminator(node.elseStatement)) {
 | 
|        // Keep early termination in the 'then' branch to reduce nesting depth.
 | 
|        // if (E) {return v;} S
 | 
|        bestThenBranch = THEN;
 | 
| @@ -160,7 +159,7 @@ class LogicalRewriter extends RecursiveTransformer
 | 
|      //   ==>
 | 
|      // if (E) S2 else S1
 | 
|      node.condition = makeCondition(node.condition, true,
 | 
| -                                   liftNots: bestThenBranch == NEITHER);
 | 
| +        liftNots: bestThenBranch == NEITHER);
 | 
|      if (bestThenBranch == NEITHER && node.condition is Not) {
 | 
|        node.condition = (node.condition as Not).operand;
 | 
|        Statement tmp = node.thenStatement;
 | 
| @@ -269,15 +268,13 @@ class LogicalRewriter extends RecursiveTransformer
 | 
|      // x ? y : 0     ==> x && y  (if x is truthy or zero) (and so on...)
 | 
|      if (matchesFalsyValue(node.condition, getConstant(node.elseExpression))) {
 | 
|        return new LogicalOperator.and(
 | 
| -          visitExpression(node.condition),
 | 
| -          node.thenExpression);
 | 
| +          visitExpression(node.condition), node.thenExpression);
 | 
|      }
 | 
|      // x ? true : y ==> x || y  (if x is falsy or true)
 | 
|      // x ? 1    : y ==> x || y  (if x is falsy or one) (and so on...)
 | 
|      if (matchesTruthyValue(node.condition, getConstant(node.thenExpression))) {
 | 
|        return new LogicalOperator.or(
 | 
| -          visitExpression(node.condition),
 | 
| -          node.elseExpression);
 | 
| +          visitExpression(node.condition), node.elseExpression);
 | 
|      }
 | 
|      // x ? y : true ==> !x || y
 | 
|      if (isTrue(node.elseExpression)) {
 | 
| @@ -328,11 +325,11 @@ class LogicalRewriter extends RecursiveTransformer
 | 
|    /// rewritten anyway.
 | 
|    bool isBooleanValued(Expression e) {
 | 
|      return isTrue(e) ||
 | 
| -           isFalse(e) ||
 | 
| -           e is Not ||
 | 
| -           e is LogicalOperator && isBooleanValuedLogicalOperator(e) ||
 | 
| -           e is ApplyBuiltinOperator && operatorReturnsBool(e.operator) ||
 | 
| -           e is TypeOperator && isBooleanValuedTypeOperator(e);
 | 
| +        isFalse(e) ||
 | 
| +        e is Not ||
 | 
| +        e is LogicalOperator && isBooleanValuedLogicalOperator(e) ||
 | 
| +        e is ApplyBuiltinOperator && operatorReturnsBool(e.operator) ||
 | 
| +        e is TypeOperator && isBooleanValuedTypeOperator(e);
 | 
|    }
 | 
|  
 | 
|    bool isBooleanValuedLogicalOperator(LogicalOperator e) {
 | 
| @@ -368,14 +365,22 @@ class LogicalRewriter extends RecursiveTransformer
 | 
|  
 | 
|    BuiltinOperator negateBuiltin(BuiltinOperator operator) {
 | 
|      switch (operator) {
 | 
| -      case BuiltinOperator.StrictEq: return BuiltinOperator.StrictNeq;
 | 
| -      case BuiltinOperator.StrictNeq: return BuiltinOperator.StrictEq;
 | 
| -      case BuiltinOperator.LooseEq: return BuiltinOperator.LooseNeq;
 | 
| -      case BuiltinOperator.LooseNeq: return BuiltinOperator.LooseEq;
 | 
| -      case BuiltinOperator.IsNumber: return BuiltinOperator.IsNotNumber;
 | 
| -      case BuiltinOperator.IsNotNumber: return BuiltinOperator.IsNumber;
 | 
| -      case BuiltinOperator.IsInteger: return BuiltinOperator.IsNotInteger;
 | 
| -      case BuiltinOperator.IsNotInteger: return BuiltinOperator.IsInteger;
 | 
| +      case BuiltinOperator.StrictEq:
 | 
| +        return BuiltinOperator.StrictNeq;
 | 
| +      case BuiltinOperator.StrictNeq:
 | 
| +        return BuiltinOperator.StrictEq;
 | 
| +      case BuiltinOperator.LooseEq:
 | 
| +        return BuiltinOperator.LooseNeq;
 | 
| +      case BuiltinOperator.LooseNeq:
 | 
| +        return BuiltinOperator.LooseEq;
 | 
| +      case BuiltinOperator.IsNumber:
 | 
| +        return BuiltinOperator.IsNotNumber;
 | 
| +      case BuiltinOperator.IsNotNumber:
 | 
| +        return BuiltinOperator.IsNumber;
 | 
| +      case BuiltinOperator.IsInteger:
 | 
| +        return BuiltinOperator.IsNotInteger;
 | 
| +      case BuiltinOperator.IsNotInteger:
 | 
| +        return BuiltinOperator.IsInteger;
 | 
|        case BuiltinOperator.IsUnsigned32BitInteger:
 | 
|          return BuiltinOperator.IsNotUnsigned32BitInteger;
 | 
|        case BuiltinOperator.IsNotUnsigned32BitInteger:
 | 
| @@ -406,7 +411,7 @@ class LogicalRewriter extends RecursiveTransformer
 | 
|    /// If [polarity] if false, the negated condition will be created instead.
 | 
|    /// If [liftNots] is true (default) then Not expressions will be lifted toward
 | 
|    /// the root of the condition so they can be eliminated by the caller.
 | 
| -  Expression makeCondition(Expression e, bool polarity, {bool liftNots:true}) {
 | 
| +  Expression makeCondition(Expression e, bool polarity, {bool liftNots: true}) {
 | 
|      if (e is Not) {
 | 
|        // !!E ==> E
 | 
|        return makeCondition(e.operand, !polarity, liftNots: liftNots);
 | 
| @@ -453,27 +458,23 @@ class LogicalRewriter extends RecursiveTransformer
 | 
|        }
 | 
|        // x ? true : y  ==> x || y
 | 
|        if (isTrue(e.thenExpression)) {
 | 
| -        return makeOr(makeCondition(e.condition, true),
 | 
| -                      e.elseExpression,
 | 
| -                      liftNots: liftNots);
 | 
| +        return makeOr(makeCondition(e.condition, true), e.elseExpression,
 | 
| +            liftNots: liftNots);
 | 
|        }
 | 
|        // x ? false : y  ==> !x && y
 | 
|        if (isFalse(e.thenExpression)) {
 | 
| -        return makeAnd(makeCondition(e.condition, false),
 | 
| -                       e.elseExpression,
 | 
| -                       liftNots: liftNots);
 | 
| +        return makeAnd(makeCondition(e.condition, false), e.elseExpression,
 | 
| +            liftNots: liftNots);
 | 
|        }
 | 
|        // x ? y : true  ==> !x || y
 | 
|        if (isTrue(e.elseExpression)) {
 | 
| -        return makeOr(makeCondition(e.condition, false),
 | 
| -                      e.thenExpression,
 | 
| -                      liftNots: liftNots);
 | 
| +        return makeOr(makeCondition(e.condition, false), e.thenExpression,
 | 
| +            liftNots: liftNots);
 | 
|        }
 | 
|        // x ? y : false  ==> x && y
 | 
|        if (isFalse(e.elseExpression)) {
 | 
| -        return makeAnd(makeCondition(e.condition, true),
 | 
| -                       e.thenExpression,
 | 
| -                       liftNots: liftNots);
 | 
| +        return makeAnd(makeCondition(e.condition, true), e.thenExpression,
 | 
| +            liftNots: liftNots);
 | 
|        }
 | 
|  
 | 
|        e.condition = makeCondition(e.condition, true);
 | 
| 
 |