| Index: pkg/compiler/lib/src/cps_ir/type_propagation.dart | 
| diff --git a/pkg/compiler/lib/src/cps_ir/type_propagation.dart b/pkg/compiler/lib/src/cps_ir/type_propagation.dart | 
| index 0a2b4cef8060d3aa61435b707c5d6d69397d3fc1..1c2686761a1a069c35e000d96515c3b77eaed9c4 100644 | 
| --- a/pkg/compiler/lib/src/cps_ir/type_propagation.dart | 
| +++ b/pkg/compiler/lib/src/cps_ir/type_propagation.dart | 
| @@ -40,12 +40,15 @@ class ConstantPropagationLattice { | 
| final ConstantSystem constantSystem; | 
| final types.DartTypes dartTypes; | 
| final AbstractValue anything; | 
| +  final AbstractValue nullValue; | 
|  | 
| ConstantPropagationLattice(TypeMaskSystem typeSystem, | 
| this.constantSystem, | 
| this.dartTypes) | 
| : this.typeSystem = typeSystem, | 
| -      anything = new AbstractValue.nonConstant(typeSystem.dynamicType); | 
| +      anything = new AbstractValue.nonConstant(typeSystem.dynamicType), | 
| +      nullValue = new AbstractValue.constantValue( | 
| +          new NullConstantValue(), new TypeMask.empty()); | 
|  | 
| final AbstractValue nothing = new AbstractValue.nothing(); | 
|  | 
| @@ -1844,9 +1847,30 @@ class TransformingVisitor extends LeafVisitor { | 
| <Primitive>[prim, prim, prim], | 
| node.sourceInformation); | 
| } | 
| -    if (dartType == dartTypes.coreTypes.numType || | 
| -        dartType == dartTypes.coreTypes.doubleType) { | 
| -      return unaryBuiltinOperator(BuiltinOperator.IsNumber); | 
| +    if (node.dartType == dartTypes.coreTypes.numType || | 
| +        node.dartType == dartTypes.coreTypes.doubleType) { | 
| +      return new ApplyBuiltinOperator( | 
| +          BuiltinOperator.IsNumber, | 
| +          <Primitive>[prim], | 
| +          node.sourceInformation); | 
| +    } | 
| + | 
| +    AbstractBool isNullableSubtype = | 
| +        lattice.isSubtypeOf(value, node.dartType, allowNull: true); | 
| +    AbstractBool isNullPassingTest = | 
| +        lattice.isSubtypeOf(lattice.nullValue, node.dartType, allowNull: false); | 
| +    if (isNullableSubtype == AbstractBool.True && | 
| +        isNullPassingTest == AbstractBool.False) { | 
| +      // Null is the only value not satisfying the type test. | 
| +      // Replace the type test with a null-check. | 
| +      // This has lower priority than the 'typeof'-based tests because | 
| +      // 'typeof' expressions might give the VM some more useful information. | 
| +      Primitive nullConst = makeConstantPrimitive(new NullConstantValue()); | 
| +      insertLetPrim(node.parent, nullConst); | 
| +      return new ApplyBuiltinOperator( | 
| +          BuiltinOperator.LooseNeq, | 
| +          <Primitive>[prim, nullConst], | 
| +          node.sourceInformation); | 
| } | 
|  | 
| if (dartType.element == functionCompiler.glue.jsFixedArrayClass) { | 
|  |