Version 2.14.0-20.0.dev

Merge commit '6ec6fd7b4ad080a13e81acbef0214b4127d9c3f0' into 'dev'
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index aebbf7b..d6def19 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -922,18 +922,10 @@
   @override
   TypeInformation visitEqualsNull(ir.EqualsNull node) {
     visit(node.expression);
-    if (node.fileOffset < node.expression.fileOffset) {
-      // Hack to detect `null == o`.
-      // TODO(johnniwinther): Remove this after the new method invocation has
-      //  landed stably. This is only included to make the transition a no-op.
-      KernelGlobalTypeInferenceElementData data = _memberData;
-      data.setReceiverTypeMask(node, _closedWorld.abstractValueDomain.nullType);
-    } else {
-      // TODO(johnniwinther). This triggers the computation of the mask for the
-      // receiver of the call to `==`, which doesn't happen in this case. Remove
-      // this when the ssa builder recognized `== null` directly.
-      _typeOfReceiver(node, node.expression);
-    }
+    // TODO(johnniwinther). This triggers the computation of the mask for the
+    // receiver of the call to `==`, which doesn't happen in this case. Remove
+    // this when the ssa builder recognizes `== null` directly.
+    _typeOfReceiver(node, node.expression);
     _potentiallyAddNullCheck(node, node.expression);
     return _types.boolType;
   }
@@ -986,7 +978,7 @@
       TypeInformation rightType) {
     // TODO(johnniwinther). This triggers the computation of the mask for the
     // receiver of the call to `==`, which might not happen in this case. Remove
-    // this when the ssa builder recognized `== null` directly.
+    // this when the ssa builder recognizes `== null` directly.
     _typeOfReceiver(node, left);
     bool leftIsNull = _types.isNull(leftType);
     bool rightIsNull = _types.isNull(rightType);
@@ -1065,7 +1057,7 @@
         receiver.variable.parent is ir.FunctionDeclaration) {
       // TODO(johnniwinther). This triggers the computation of the mask for the
       // receiver of the call to `call`. Remove this when the ssa builder
-      // recognized local function invocation directly.
+      // recognizes local function invocation directly.
       _typeOfReceiver(node, node.receiver);
       // This is an invocation of a named local function.
       return _handleLocalFunctionInvocation(
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index 803aed8..7fabac6 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -598,15 +598,6 @@
 
   @override
   void handleEqualsNull(ir.EqualsNull node, ir.DartType expressionType) {
-    // TODO(johnniwinther): Remove this after the new method invocation has landed
-    // stably. This is only included to make the transition a no-op.
-    if (node.fileOffset < node.expression.fileOffset) {
-      // Hack to detect `null == o`.
-      expressionType = const ir.NullType();
-    }
-    ClassRelation relation = computeClassRelationFromType(expressionType);
-    registerDynamicInvocation(
-        expressionType, relation, ir.Name.equalsName, 1, const [], const []);
     registerNullLiteral();
   }
 
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index fd85772..224a793 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -1115,8 +1115,6 @@
     return super.visitEqualsCall(node);
   }
 
-  // TODO(johnniwinther): Remove this after the new method invocation has landed
-  // stably. This is only included to make the transition a no-op.
   void handleEqualsNull(ir.EqualsNull node, ir.DartType expressionType) {}
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 0051870..0520273 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -5284,28 +5284,8 @@
   void visitEqualsNull(ir.EqualsNull node) {
     node.expression.accept(this);
     HInstruction receiverInstruction = pop();
-
-    // Hack to detect `null == o`.
-    // TODO(johnniwinther): Remove this after the new method invocation has
-    // landed stably. This is only included to make the transition a no-op.
-    if (node.fileOffset < node.expression.fileOffset) {
-      _pushDynamicInvocation(
-          node,
-          new StaticType(
-              _elementMap.commonElements.nullType, ClassRelation.subtype),
-          _typeInferenceMap.receiverTypeOfInvocation(
-              node, _abstractValueDomain),
-          Selectors.equals,
-          <HInstruction>[
-            graph.addConstantNull(closedWorld),
-            receiverInstruction
-          ],
-          const <DartType>[],
-          _sourceInformationBuilder.buildCall(node.expression, node));
-    } else {
-      _handleEquals(node, node.expression, receiverInstruction,
-          graph.addConstantNull(closedWorld));
-    }
+    _handleEquals(node, node.expression, receiverInstruction,
+        graph.addConstantNull(closedWorld));
   }
 
   @override
diff --git a/pkg/compiler/test/codegen/builtin_equals_test.dart b/pkg/compiler/test/codegen/builtin_equals_test.dart
index d5281f8..c91d5d2 100644
--- a/pkg/compiler/test/codegen/builtin_equals_test.dart
+++ b/pkg/compiler/test/codegen/builtin_equals_test.dart
@@ -27,7 +27,9 @@
 
       RegExp regexp = new RegExp('==');
       Iterator<Match> matches = regexp.allMatches(generated).iterator;
-      checkNumberOfMatches(matches, 4);
+      // `s == null` and `null == s` now both encoded as `s == null` allowing
+      // the second to be optimized away.
+      checkNumberOfMatches(matches, 3);
     });
   }
 
diff --git a/pkg/compiler/test/codegen/constant_folding_test.dart b/pkg/compiler/test/codegen/constant_folding_test.dart
index a3471c3..ee8d440 100644
--- a/pkg/compiler/test/codegen/constant_folding_test.dart
+++ b/pkg/compiler/test/codegen/constant_folding_test.dart
@@ -67,7 +67,7 @@
       RegExp regexp = new RegExp(r'a == null');
       Expect.isTrue(regexp.hasMatch(generated), 'No match found for ${regexp}');
 
-      regexp = new RegExp(r'null == b');
+      regexp = new RegExp(r'b == null');
       Expect.isTrue(regexp.hasMatch(generated), 'No match found for ${regexp}');
 
       regexp = new RegExp(r'4 === c');
diff --git a/pkg/compiler/test/impact/data/expressions.dart b/pkg/compiler/test/impact/data/expressions.dart
index 6b4b041..2beebc8 100644
--- a/pkg/compiler/test/impact/data/expressions.dart
+++ b/pkg/compiler/test/impact/data/expressions.dart
@@ -364,13 +364,14 @@
  type=[inst:JSString]*/
 testThrow() => throw '';
 
-/*member: testIfNotNull:dynamic=[Object.==,foo],type=[inst:JSNull]*/
+/*member: testIfNotNull:
+ dynamic=[foo],
+ type=[inst:JSNull]
+*/
 testIfNotNull(o) => o?.foo;
 
 /*member: testTypedIfNotNull:
- dynamic=[
-  Class.==,
-  Class.field],
+ dynamic=[Class.field],
  static=[
   Rti._bind(1),
   Rti._eval(1),
@@ -415,13 +416,22 @@
 */
 testTypedIfNotNull(Class o) => o?.field;
 
-/*member: testIfNotNullSet:dynamic=[Object.==,foo=],type=[inst:JSBool,inst:JSNull]*/
+/*member: testIfNotNullSet:
+ dynamic=[foo=],
+ type=[
+  inst:JSBool,
+  inst:JSNull]
+*/
 testIfNotNullSet(o) => o?.foo = true;
 
-/*member: testIfNull:dynamic=[Object.==],type=[inst:JSBool,inst:JSNull]*/
+/*member: testIfNull:type=[
+  inst:JSBool,
+  inst:JSNull]*/
 testIfNull(o) => o ?? true;
 
-/*member: testSetIfNull:dynamic=[Object.==],type=[inst:JSBool,inst:JSNull]*/
+/*member: testSetIfNull:type=[
+  inst:JSBool,
+  inst:JSNull]*/
 testSetIfNull(o) => o ??= true;
 
 class Class {
diff --git a/pkg/compiler/test/impact/data/jsinterop_setter1.dart b/pkg/compiler/test/impact/data/jsinterop_setter1.dart
index 4042ca9..b2b6e34 100644
--- a/pkg/compiler/test/impact/data/jsinterop_setter1.dart
+++ b/pkg/compiler/test/impact/data/jsinterop_setter1.dart
@@ -68,9 +68,7 @@
 external set foo(Function f);
 
 /*member: _doStuff:
- dynamic=[
-  File.==,
-  File.name],
+ dynamic=[File.name],
  static=[
   Rti._bind(1),
   Rti._eval(1),
diff --git a/pkg/compiler/test/impact/data/jsinterop_setter2.dart b/pkg/compiler/test/impact/data/jsinterop_setter2.dart
index d62e98f..82f71cb 100644
--- a/pkg/compiler/test/impact/data/jsinterop_setter2.dart
+++ b/pkg/compiler/test/impact/data/jsinterop_setter2.dart
@@ -75,9 +75,7 @@
 external set foo(void Function(String, File) f);
 
 /*member: _doStuff:
- dynamic=[
-  File.==,
-  File.name],
+ dynamic=[File.name],
  static=[
   Rti._bind(1),
   Rti._eval(1),
diff --git a/pkg/compiler/test/impact/data/promotion.dart b/pkg/compiler/test/impact/data/promotion.dart
index 7aaba1c..713e6a0 100644
--- a/pkg/compiler/test/impact/data/promotion.dart
+++ b/pkg/compiler/test/impact/data/promotion.dart
@@ -197,7 +197,7 @@
   cls.toString;
 }
 
-/*member: dynamicToEquals:dynamic=[Object.==],type=[inst:JSNull]*/
+/*member: dynamicToEquals:type=[inst:JSNull]*/
 dynamicToEquals(dynamic cls) {
   cls == null;
 }
diff --git a/pkg/compiler/test/impact/data/runtime_type.dart b/pkg/compiler/test/impact/data/runtime_type.dart
index 2c8dd9a..926936d 100644
--- a/pkg/compiler/test/impact/data/runtime_type.dart
+++ b/pkg/compiler/test/impact/data/runtime_type.dart
@@ -36,7 +36,6 @@
 class Class1c<T> implements Class1a<T> {
   /*member: Class1c.==:
    dynamic=[
-    Object.==,
     Object.runtimeType,
     Type.==,
     this:Class1c.runtimeType],
@@ -52,7 +51,6 @@
 class Class1d<T> implements Class1a<T> {
   /*member: Class1d.==:
    dynamic=[
-    Object.==,
     Object.runtimeType,
     Type.==,
     this:Class1d.runtimeType],
@@ -134,7 +132,6 @@
 
 /*member: toString2:
  dynamic=[
-  Class2.==,
   Class2.runtimeType,
   toString(0)],
  runtimeType=[string:Class2<int*>*],
@@ -247,7 +244,6 @@
 /*member: toString4:
  dynamic=[
   Class2.runtimeType,
-  Type.==,
   Type.toString(0)],
  runtimeType=[string:Class2<int*>*],
  static=[
@@ -302,9 +298,7 @@
 
 /*member: toString5:
  dynamic=[
-  Class2.==,
   Class2.runtimeType,
-  Type.==,
   Type.toString(0)],
  runtimeType=[string:Class2<int*>*],
  static=[
@@ -359,7 +353,6 @@
 
 /*member: toString6:
  dynamic=[
-  Class2.==,
   Class2.runtimeType,
   Type.toString(0)],
  runtimeType=[string:Class2<int*>*],
@@ -467,9 +460,7 @@
 
 /*member: equals1:
  dynamic=[
-  Class1a.==,
   Class1a.runtimeType,
-  Class1d.==,
   Class1d.runtimeType,
   Type.==],
  runtimeType=[equals:Class1a<int*>*==Class1d<int*>*],
@@ -525,9 +516,7 @@
 equals1(Class1a<int> a, Class1d<int> b) => a?.runtimeType == b?.runtimeType;
 
 /*member: almostEquals1:
- dynamic=[
-  Class3.runtimeType,
-  Type.==],
+ dynamic=[Class3.runtimeType],
  runtimeType=[unknown:Class3*],
  static=[
   Rti._bind(1),
@@ -574,10 +563,7 @@
 almostEquals1(Class3 a) => a.runtimeType == null;
 
 /*member: almostEquals2:
- dynamic=[
-  Class3.==,
-  Class3.runtimeType,
-  Type.==],
+ dynamic=[Class3.runtimeType],
  runtimeType=[unknown:Class3*],
  static=[
   Rti._bind(1),
@@ -624,9 +610,7 @@
 almostEquals2(Class3 a) => a?.runtimeType == null;
 
 /*member: almostEquals3:
- dynamic=[
-  Class3.runtimeType,
-  Null.==],
+ dynamic=[Class3.runtimeType],
  runtimeType=[unknown:Class3*],
  static=[
   Rti._bind(1),
@@ -673,10 +657,7 @@
 almostEquals3(Class3 a) => null == a.runtimeType;
 
 /*member: almostEquals4:
- dynamic=[
-  Class3.==,
-  Class3.runtimeType,
-  Null.==],
+ dynamic=[Class3.runtimeType],
  runtimeType=[unknown:Class3*],
  static=[
   Rti._bind(1),
@@ -773,7 +754,6 @@
 
 /*member: almostEquals6:
  dynamic=[
-  Class3.==,
   Class3.field,
   Class3.runtimeType,
   Type.==],
@@ -824,7 +804,6 @@
 
 /*member: almostEquals7:
  dynamic=[
-  Class3.==,
   Class3.field,
   Class3.runtimeType,
   Type.==],
@@ -875,7 +854,6 @@
 
 /*member: almostEquals8:
  dynamic=[
-  Class3.==,
   Class3.field,
   Class3.runtimeType,
   Type.==],
@@ -975,7 +953,6 @@
 
 /*member: almostEquals10:
  dynamic=[
-  Class3.==,
   Class3.field,
   Class3.runtimeType,
   Object.==],
@@ -1026,7 +1003,6 @@
 
 /*member: almostEquals11:
  dynamic=[
-  Class3.==,
   Class3.field,
   Class3.runtimeType,
   Object.==],
@@ -1077,7 +1053,6 @@
 
 /*member: almostEquals12:
  dynamic=[
-  Class3.==,
   Class3.field,
   Class3.runtimeType,
   Object.==],
@@ -1176,9 +1151,7 @@
 
 /*member: almostToString2:
  dynamic=[
-  Class3.==,
   Class3.runtimeType,
-  Type.==,
   Type.toString],
  runtimeType=[unknown:Class3*],
  static=[
@@ -1276,7 +1249,6 @@
 
 /*member: almostToString4:
  dynamic=[
-  Class3.==,
   Class3.runtimeType,
   Type.noSuchMethod(1)],
  runtimeType=[unknown:Class3*],
@@ -1376,7 +1348,6 @@
 
 /*member: notEquals2:
  dynamic=[
-  Class3.==,
   Class3.runtimeType,
   Class4.runtimeType,
   Type.==],
@@ -1429,7 +1400,6 @@
 /*member: notEquals3:
  dynamic=[
   Class3.runtimeType,
-  Class4.==,
   Class4.runtimeType,
   Type.==],
  runtimeType=[equals:Class3*==Class4*],
@@ -1480,9 +1450,7 @@
 
 /*member: notEquals4:
  dynamic=[
-  Class3.==,
   Class3.runtimeType,
-  Class4.==,
   Class4.runtimeType,
   Type.==],
  runtimeType=[equals:Class3*==Class4*],
diff --git a/pkg/compiler/test/static_type/data/assert.dart b/pkg/compiler/test/static_type/data/assert.dart
index 39ecf52..cf39c87 100644
--- a/pkg/compiler/test/static_type/data/assert.dart
+++ b/pkg/compiler/test/static_type/data/assert.dart
@@ -20,25 +20,25 @@
 }
 
 assert1(Class c) {
-  assert(/*Class*/ c /*invoke: [Class]->bool*/ != null);
+  assert(/*Class*/ c != null);
   /*Class*/ c.next;
 }
 
 assert2(Class c) {
-  assert(/*Class*/ c /*invoke: [Class]->bool*/ == null);
+  assert(/*Class*/ c == null);
   /*Class*/ c.next;
 }
 
 assert3(Class c) {
   bool b;
-  assert(/*Class*/ c /*invoke: [Class]->bool*/ != null);
+  assert(/*Class*/ c != null);
   if (/*bool*/ b) return;
   /*Class*/ c.next;
 }
 
 assert4(Class c) {
   bool b;
-  assert(/*Class*/ c /*invoke: [Class]->bool*/ == null);
+  assert(/*Class*/ c == null);
   if (/*bool*/ b) return;
   /*Class*/ c.next;
 }
diff --git a/pkg/compiler/test/static_type/data/assert_ea.dart b/pkg/compiler/test/static_type/data/assert_ea.dart
index e178bbc..4851158 100644
--- a/pkg/compiler/test/static_type/data/assert_ea.dart
+++ b/pkg/compiler/test/static_type/data/assert_ea.dart
@@ -20,25 +20,25 @@
 }
 
 assert1(Class c) {
-  assert(/*Class*/ c /*invoke: [Class]->bool*/ != null);
+  assert(/*Class*/ c != null);
   /*Class*/ c.next;
 }
 
 assert2(Class c) {
-  assert(/*Class*/ c /*invoke: [Class]->bool*/ == null);
+  assert(/*Class*/ c == null);
   /*Null*/ c.next;
 }
 
 assert3(Class c) {
   bool b;
-  assert(/*Class*/ c /*invoke: [Class]->bool*/ != null);
+  assert(/*Class*/ c != null);
   if (/*bool*/ b) return;
   /*Class*/ c.next;
 }
 
 assert4(Class c) {
   bool b;
-  assert(/*Class*/ c /*invoke: [Class]->bool*/ == null);
+  assert(/*Class*/ c == null);
   if (/*bool*/ b) return;
   /*Null*/ c.next;
 }
diff --git a/pkg/compiler/test/static_type/data/do.dart b/pkg/compiler/test/static_type/data/do.dart
index 072fb39..7c1defa 100644
--- a/pkg/compiler/test/static_type/data/do.dart
+++ b/pkg/compiler/test/static_type/data/do.dart
@@ -22,7 +22,7 @@
         /*Class*/ c.next;
       }
       c = 0;
-    } while (/*dynamic*/ c /*invoke: [dynamic]->bool*/ != null);
+    } while (/*dynamic*/ c != null);
     /*dynamic*/ c.next;
   }
 }
@@ -32,7 +32,7 @@
     /*Class*/ c.next;
     do {
       /*Class*/ c.next;
-    } while (/*Class*/ c /*invoke: [Class]->bool*/ != null);
+    } while (/*Class*/ c != null);
     /*Class*/ c.next;
   }
 }
diff --git a/pkg/compiler/test/static_type/data/for.dart b/pkg/compiler/test/static_type/data/for.dart
index 1128ac9..df400d8 100644
--- a/pkg/compiler/test/static_type/data/for.dart
+++ b/pkg/compiler/test/static_type/data/for.dart
@@ -19,7 +19,7 @@
   if (/*dynamic*/ c is Class) {
     /*Class*/ c.next;
     for (/*Class*/ c.next;
-        /*dynamic*/ c /*invoke: [dynamic]->bool*/ != null;
+        /*dynamic*/ c != null;
         /*dynamic*/ c.next) {
       /*dynamic*/ c.next;
       if (/*dynamic*/ c is Class) {
@@ -35,7 +35,7 @@
   if (/*dynamic*/ c is Class) {
     /*Class*/ c.next;
     for (/*Class*/ c.next;
-        /*Class*/ c /*invoke: [Class]->bool*/ != null;
+        /*Class*/ c != null;
         /*Class*/ c.next) {
       /*Class*/ c.next;
     }
diff --git a/pkg/compiler/test/static_type/data/issue42281.dart b/pkg/compiler/test/static_type/data/issue42281.dart
index c8d8fdf..efe3a5d 100644
--- a/pkg/compiler/test/static_type/data/issue42281.dart
+++ b/pkg/compiler/test/static_type/data/issue42281.dart
@@ -16,8 +16,8 @@
 }
 
 method1(Class c, Type type, [o]) {
-  if (/*Class*/ c /*invoke: [Class]->bool*/ == null) {
-    if (/*dynamic*/ o /*invoke: [dynamic]->bool*/ != null) {
+  if (/*Class*/ c == null) {
+    if (/*dynamic*/ o != null) {
       c = new Class(String);
     }
     /*Class*/ c;
@@ -26,8 +26,8 @@
 }
 
 method2(Class c, Type type, [o]) {
-  if (/*Class*/ c /*invoke: [Class]->bool*/ == null) {
-    if (/*dynamic*/ o /*invoke: [dynamic]->bool*/ != null) {
+  if (/*Class*/ c == null) {
+    if (/*dynamic*/ o != null) {
       c = new SubClass(String);
     }
     /*Class*/ c;
@@ -37,8 +37,8 @@
 
 method3(Class c, Type type, [o]) {
   if (/*Class*/ c is SubClass) {
-    if (/*SubClass*/ c /*invoke: [SubClass]->bool*/ == null) {
-      if (/*dynamic*/ o /*invoke: [dynamic]->bool*/ != null) {
+    if (/*SubClass*/ c == null) {
+      if (/*dynamic*/ o != null) {
         c = new SubClass(String);
       }
       /*SubClass*/ c;
diff --git a/pkg/compiler/test/static_type/data/marker.options b/pkg/compiler/test/static_type/data/marker.options
index 3d9c6d9..478f33e 100644
--- a/pkg/compiler/test/static_type/data/marker.options
+++ b/pkg/compiler/test/static_type/data/marker.options
@@ -1,2 +1 @@
 spec=pkg/compiler/test/static_type/static_type_test.dart
-prod=pkg/compiler/test/static_type/static_type_test.dart
diff --git a/pkg/compiler/test/static_type/data/null.dart b/pkg/compiler/test/static_type/data/null.dart
index 5fd9622..a421ef1 100644
--- a/pkg/compiler/test/static_type/data/null.dart
+++ b/pkg/compiler/test/static_type/data/null.dart
@@ -21,46 +21,46 @@
 
 null1(dynamic c) {
   /*dynamic*/ c.next;
-  /*dynamic*/ c /*invoke: [dynamic]->bool*/ != null;
+  /*dynamic*/ c != null;
   /*dynamic*/ c.next;
 }
 
 null2(dynamic c) {
   /*dynamic*/ c.next;
-  /*dynamic*/ c /*invoke: [dynamic]->bool*/ == null;
+  /*dynamic*/ c == null;
   /*dynamic*/ c.next;
 }
 
 null3(dynamic c) {
-  if (/*dynamic*/ c /*invoke: [dynamic]->bool*/ == null) return;
+  if (/*dynamic*/ c == null) return;
   /*dynamic*/ c.next;
 }
 
 null4(dynamic c) {
-  if (/*dynamic*/ c /*invoke: [dynamic]->bool*/ != null) return;
+  if (/*dynamic*/ c != null) return;
   /*Null*/ c.next;
 }
 
 null5(dynamic c) {
-  if (/*dynamic*/ c /*invoke: [dynamic]->bool*/ != null) {
+  if (/*dynamic*/ c != null) {
     /*dynamic*/ c.next;
   }
 }
 
 null6(dynamic c) {
-  if (/*dynamic*/ c /*invoke: [dynamic]->bool*/ == null) {
+  if (/*dynamic*/ c == null) {
     /*Null*/ c.next;
   }
 }
 
 null7(dynamic c) {
-  while (/*dynamic*/ c /*invoke: [dynamic]->bool*/ != null) {
+  while (/*dynamic*/ c != null) {
     /*dynamic*/ c.next;
   }
 }
 
 null8(dynamic c) {
-  while (/*dynamic*/ c /*invoke: [dynamic]->bool*/ == null) {
+  while (/*dynamic*/ c == null) {
     /*Null*/ c.next;
   }
 }
diff --git a/pkg/compiler/test/static_type/data/while.dart b/pkg/compiler/test/static_type/data/while.dart
index 671d6da..881015a 100644
--- a/pkg/compiler/test/static_type/data/while.dart
+++ b/pkg/compiler/test/static_type/data/while.dart
@@ -26,7 +26,7 @@
 while1(dynamic c) {
   if (/*dynamic*/ c is Class) {
     /*Class*/ c.next;
-    while (/*dynamic*/ c /*invoke: [dynamic]->bool*/ != null) {
+    while (/*dynamic*/ c != null) {
       /*dynamic*/ c.next;
       if (/*dynamic*/ c is Class) {
         /*Class*/ c.next;
@@ -40,7 +40,7 @@
 while2(dynamic c) {
   if (/*dynamic*/ c is Class) {
     /*Class*/ c.next;
-    while (/*Class*/ c /*invoke: [Class]->bool*/ != null) {
+    while (/*Class*/ c != null) {
       /*Class*/ c.next;
     }
     /*Class*/ c.next;
@@ -48,7 +48,7 @@
 }
 
 whileNext(Class c) {
-  while (/*Class*/ c /*invoke: [Class]->bool*/ != null) {
+  while (/*Class*/ c != null) {
     c = /*Class*/ c.next;
   }
   return /*Class*/ c;
@@ -56,7 +56,7 @@
 
 whileNextGeneric(GenericClass<int> c) {
   while (
-      /*GenericClass<int>*/ c /*invoke: [GenericClass<int>]->bool*/ != null) {
+      /*GenericClass<int>*/ c != null) {
     c = /*GenericClass<int>*/ c.next;
   }
   return /*GenericClass<int>*/ c;
@@ -80,7 +80,7 @@
   whileNext2() {
     bool b;
     GenericClass<T> c;
-    while (/*GenericClass<T>*/ c /*invoke: [GenericClass<T>]->bool*/ != null) {
+    while (/*GenericClass<T>*/ c != null) {
       if (/*bool*/ b) {
         GenericClass<T> next = /*GenericClass<T>*/ c.next;
         c = /*GenericClass<T>*/ next;
@@ -94,7 +94,7 @@
   whileNext3() {
     bool b;
     GenericClass<T> c;
-    while (/*GenericClass<T>*/ c /*invoke: [GenericClass<T>]->bool*/ == null) {
+    while (/*GenericClass<T>*/ c == null) {
       if (/*bool*/ b) {
         GenericClass<T> next = /*Null*/ c.next;
         c = /*GenericClass<T>*/ next;
diff --git a/pkg/compiler/test/static_type/static_type_test.dart b/pkg/compiler/test/static_type/static_type_test.dart
index fca7c8a..15cf87d 100644
--- a/pkg/compiler/test/static_type/static_type_test.dart
+++ b/pkg/compiler/test/static_type/static_type_test.dart
@@ -107,11 +107,6 @@
     } else if (node is ir.EqualsCall) {
       return '[${typeToText(node.left.accept(staticTypeCache))}]->'
           '${typeToText(node.accept(staticTypeCache))}';
-    } else if (node is ir.EqualsNull) {
-      // TODO(johnniwinther): Remove this after the new method invocation has
-      // landed stably. This is only included to make the transition a no-op.
-      return '[${typeToText(node.expression.accept(staticTypeCache))}]->'
-          '${typeToText(node.accept(staticTypeCache))}';
     }
     return null;
   }
diff --git a/tools/VERSION b/tools/VERSION
index ca6b26c..0c01fa4 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 19
+PRERELEASE 20
 PRERELEASE_PATCH 0
\ No newline at end of file