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 bc49dc750fd47f5d27e7d8f210fd3d9f9ac60764..4f0be4ad41428b4d8f3bb5a075004aaa377178a1 100644 |
--- a/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart |
+++ b/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart |
@@ -335,8 +335,13 @@ class LogicalRewriter extends RecursiveTransformer |
return isTrue(e) || |
isFalse(e) || |
e is Not || |
- e is LogicalOperator || |
- e is ApplyBuiltinOperator && operatorReturnsBool(e.operator); |
+ e is LogicalOperator && isBooleanValuedLogicalOperator(e) || |
+ e is ApplyBuiltinOperator && operatorReturnsBool(e.operator) || |
+ e is TypeOperator && isBooleanValuedTypeOperator(e); |
+ } |
+ |
+ bool isBooleanValuedLogicalOperator(LogicalOperator e) { |
+ return isBooleanValued(e.left) && isBooleanValued(e.right); |
} |
/// True if the given operator always returns `true` or `false`. |
@@ -361,6 +366,10 @@ class LogicalRewriter extends RecursiveTransformer |
} |
} |
+ bool isBooleanValuedTypeOperator(TypeOperator e) { |
+ return e.isTypeTest; |
+ } |
+ |
BuiltinOperator negateBuiltin(BuiltinOperator operator) { |
switch (operator) { |
case BuiltinOperator.StrictEq: return BuiltinOperator.StrictNeq; |
@@ -552,4 +561,3 @@ class LogicalRewriter extends RecursiveTransformer |
--node.variable.readCount; |
} |
} |
- |