[kernel] Update kernel encodings

* Add InstanceGetterInvocation for getter/field invocation in web
  backends
* Add localFunction getter to LocalFunctionInvocation
* Remove isNot from EqualsCall and EqualsNull - the encoding didn't
  carry its weight.
* Remove uses of Name.name
* Remove BottomType code from VM

TEST=existing

Change-Id: I99d05d35b9ef193d092cc151c99ad472dbd60834
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/188725
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 17d63df..3d43b0c 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -919,10 +919,8 @@
         node, node.variable.parent, node.arguments, selector);
   }
 
-  TypeInformation _handleEqualsNull(ir.Expression node, ir.Expression operand,
-      {bool isNot}) {
-    assert(isNot != null);
-    _potentiallyAddNullCheck(node, operand, isNot: isNot);
+  TypeInformation _handleEqualsNull(ir.Expression node, ir.Expression operand) {
+    _potentiallyAddNullCheck(node, operand);
     return _types.boolType;
   }
 
@@ -932,7 +930,7 @@
     // 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);
-    return _handleEqualsNull(node, node.expression, isNot: node.isNot);
+    return _handleEqualsNull(node, node.expression);
   }
 
   TypeInformation _handleMethodInvocation(
@@ -975,20 +973,22 @@
     return type;
   }
 
-  TypeInformation _handleEqualsCall(ir.Expression node, ir.Expression left,
-      TypeInformation leftType, ir.Expression right, TypeInformation rightType,
-      {bool isNot}) {
-    assert(isNot != null);
+  TypeInformation _handleEqualsCall(
+      ir.Expression node,
+      ir.Expression left,
+      TypeInformation leftType,
+      ir.Expression right,
+      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.
     _typeOfReceiver(node, left);
     if (_types.isNull(leftType)) {
       // null == o
-      return _handleEqualsNull(node, right, isNot: isNot);
+      return _handleEqualsNull(node, right);
     } else if (_types.isNull(rightType)) {
       // o == null
-      return _handleEqualsNull(node, left, isNot: isNot);
+      return _handleEqualsNull(node, left);
     }
     Selector selector = Selector.binaryOperator('==');
     ArgumentsTypes arguments = ArgumentsTypes([rightType], null);
@@ -1000,8 +1000,7 @@
   TypeInformation visitEqualsCall(ir.EqualsCall node) {
     TypeInformation leftType = visit(node.left);
     TypeInformation rightType = visit(node.right);
-    return _handleEqualsCall(node, node.left, leftType, node.right, rightType,
-        isNot: node.isNot);
+    return _handleEqualsCall(node, node.left, leftType, node.right, rightType);
   }
 
   @override
@@ -1053,8 +1052,7 @@
     ArgumentsTypes arguments = analyzeArguments(node.arguments);
     if (selector.name == '==') {
       return _handleEqualsCall(node, node.receiver, receiverType,
-          node.arguments.positional.first, arguments.positional[0],
-          isNot: false);
+          node.arguments.positional.first, arguments.positional[0]);
     }
 
     return _handleMethodInvocation(node, node.receiver, receiverType, selector,
@@ -1725,9 +1723,7 @@
     }
   }
 
-  void _potentiallyAddNullCheck(ir.Expression node, ir.Expression receiver,
-      {bool isNot}) {
-    assert(isNot != null);
+  void _potentiallyAddNullCheck(ir.Expression node, ir.Expression receiver) {
     if (!_accumulateIsChecks) return;
     if (receiver is ir.VariableGet) {
       Local local = _localsMap.getLocalVariable(receiver.variable);
@@ -1750,14 +1746,8 @@
           node,
           _closedWorld.commonElements.objectType,
           excludeNull: true);
-
-      if (isNot) {
-        _setStateAfter(
-            _state, stateAfterCheckWhenNotNull, stateAfterCheckWhenNull);
-      } else {
-        _setStateAfter(
-            _state, stateAfterCheckWhenNull, stateAfterCheckWhenNotNull);
-      }
+      _setStateAfter(
+          _state, stateAfterCheckWhenNull, stateAfterCheckWhenNotNull);
     }
   }
 
diff --git a/pkg/compiler/lib/src/ir/scope_visitor.dart b/pkg/compiler/lib/src/ir/scope_visitor.dart
index 1fa89f1..07e82b0 100644
--- a/pkg/compiler/lib/src/ir/scope_visitor.dart
+++ b/pkg/compiler/lib/src/ir/scope_visitor.dart
@@ -1107,12 +1107,8 @@
   EvaluationComplexity visitLocalFunctionInvocation(
       ir.LocalFunctionInvocation node) {
     if (node.arguments.types.isNotEmpty) {
-      assert(
-          node.variable.parent is ir.LocalFunction,
-          "Unexpected variable in local function invocation ${node} "
-          "(${node.runtimeType}).");
       VariableUse usage =
-          new VariableUse.localTypeArgument(node.variable.parent, node);
+          new VariableUse.localTypeArgument(node.localFunction, node);
       visitNodesInContext(node.arguments.types, usage);
     }
     visitArguments(node.arguments);
@@ -1145,7 +1141,7 @@
   EvaluationComplexity visitPropertyGet(ir.PropertyGet node) {
     node.receiver = _handleExpression(node.receiver);
     EvaluationComplexity complexity = _lastExpressionComplexity;
-    if (complexity.isConstant && node.name.name == 'length') {
+    if (complexity.isConstant && node.name.text == 'length') {
       return _evaluateImplicitConstant(node);
     }
     return const EvaluationComplexity.lazy();
@@ -1155,7 +1151,7 @@
   EvaluationComplexity visitInstanceGet(ir.InstanceGet node) {
     node.receiver = _handleExpression(node.receiver);
     EvaluationComplexity complexity = _lastExpressionComplexity;
-    if (complexity.isConstant && node.name.name == 'length') {
+    if (complexity.isConstant && node.name.text == 'length') {
       return _evaluateImplicitConstant(node);
     }
     return const EvaluationComplexity.lazy();
@@ -1171,7 +1167,7 @@
   EvaluationComplexity visitDynamicGet(ir.DynamicGet node) {
     node.receiver = _handleExpression(node.receiver);
     EvaluationComplexity complexity = _lastExpressionComplexity;
-    if (complexity.isConstant && node.name.name == 'length') {
+    if (complexity.isConstant && node.name.text == 'length') {
       return _evaluateImplicitConstant(node);
     }
     return const EvaluationComplexity.lazy();
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 7ecbbe2..8dcffab 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -833,8 +833,7 @@
   void handleEqualsCall(ir.Expression left, ir.DartType leftType,
       ir.Expression right, ir.DartType rightType, ir.Member interfaceTarget) {}
 
-  void _registerEqualsNull(TypeMap afterInvocation, ir.Expression expression,
-      {bool isNot: false}) {
+  void _registerEqualsNull(TypeMap afterInvocation, ir.Expression expression) {
     if (expression is ir.VariableGet &&
         !_invalidatedVariables.contains(expression.variable)) {
       // If `expression == null` is true, we promote the type of the
@@ -845,13 +844,8 @@
           isTrue: false);
       TypeMap ofItsDeclaredType = afterInvocation
           .promote(expression.variable, expression.variable.type, isTrue: true);
-      if (isNot) {
-        typeMapWhenTrue = ofItsDeclaredType;
-        typeMapWhenFalse = notOfItsDeclaredType;
-      } else {
-        typeMapWhenTrue = notOfItsDeclaredType;
-        typeMapWhenFalse = ofItsDeclaredType;
-      }
+      typeMapWhenTrue = notOfItsDeclaredType;
+      typeMapWhenFalse = ofItsDeclaredType;
     }
   }
 
@@ -968,7 +962,7 @@
   @override
   ir.DartType visitEqualsNull(ir.EqualsNull node) {
     visitNode(node.expression);
-    _registerEqualsNull(typeMap, node.expression, isNot: node.isNot);
+    _registerEqualsNull(typeMap, node.expression);
     return super.visitEqualsNull(node);
   }
 
@@ -984,7 +978,7 @@
   @override
   ir.DartType visitLocalFunctionInvocation(ir.LocalFunctionInvocation node) {
     ArgumentTypes argumentTypes = _visitArguments(node.arguments);
-    ir.FunctionDeclaration localFunction = node.variable.parent;
+    ir.FunctionDeclaration localFunction = node.localFunction;
     ir.DartType returnType = super.visitLocalFunctionInvocation(node);
     handleLocalFunctionInvocation(
         node, localFunction, argumentTypes, returnType);
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index ba0057a..7a42127 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -2121,7 +2121,7 @@
         break;
       } else if (node is ir.Field) {
         // Add the field name for closures in field initializers.
-        String name = node.name?.name;
+        String name = node.name?.text;
         if (name != null) parts.add(name);
       }
       current = current.parent;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index ef086e0..083df95 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -5277,9 +5277,7 @@
   }
 
   void _handleEquals(ir.Expression node, ir.Expression left,
-      HInstruction leftInstruction, HInstruction rightInstruction,
-      {bool isNot}) {
-    assert(isNot != null);
+      HInstruction leftInstruction, HInstruction rightInstruction) {
     _pushDynamicInvocation(
         node,
         _getStaticType(left),
@@ -5288,10 +5286,6 @@
         <HInstruction>[leftInstruction, rightInstruction],
         const <DartType>[],
         _sourceInformationBuilder.buildCall(left, node));
-    if (isNot) {
-      push(new HNot(popBoolified(), _abstractValueDomain.boolType)
-        ..sourceInformation = _sourceInformationBuilder.buildUnary(node));
-    }
   }
 
   @override
@@ -5299,8 +5293,7 @@
     node.expression.accept(this);
     HInstruction receiverInstruction = pop();
     return _handleEquals(node, node.expression, receiverInstruction,
-        graph.addConstantNull(closedWorld),
-        isNot: node.isNot);
+        graph.addConstantNull(closedWorld));
   }
 
   @override
@@ -5309,8 +5302,7 @@
     HInstruction leftInstruction = pop();
     node.right.accept(this);
     HInstruction rightInstruction = pop();
-    return _handleEquals(node, node.left, leftInstruction, rightInstruction,
-        isNot: node.isNot);
+    return _handleEquals(node, node.left, leftInstruction, rightInstruction);
   }
 
   HInterceptor _interceptorFor(
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index b1341b9..faae4a6 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -4369,19 +4369,19 @@
 
   @override
   js_ast.Expression visitDynamicGet(DynamicGet node) {
-    return _emitPropertyGet(node.receiver, null, node.name.name);
+    return _emitPropertyGet(node.receiver, null, node.name.text);
   }
 
   @override
   js_ast.Expression visitInstanceGet(InstanceGet node) {
     return _emitPropertyGet(
-        node.receiver, node.interfaceTarget, node.name.name);
+        node.receiver, node.interfaceTarget, node.name.text);
   }
 
   @override
   js_ast.Expression visitInstanceTearOff(InstanceTearOff node) {
     return _emitPropertyGet(
-        node.receiver, node.interfaceTarget, node.name.name);
+        node.receiver, node.interfaceTarget, node.name.text);
   }
 
   @override
@@ -4554,6 +4554,13 @@
   }
 
   @override
+  js_ast.Expression visitInstanceGetterInvocation(
+      InstanceGetterInvocation node) {
+    return _emitMethodCall(
+        node.receiver, node.interfaceTarget, node.arguments, node);
+  }
+
+  @override
   js_ast.Expression visitLocalFunctionInvocation(LocalFunctionInvocation node) {
     return _emitMethodCall(
         VariableGet(node.variable)..fileOffset = node.fileOffset,
@@ -4565,13 +4572,13 @@
   @override
   js_ast.Expression visitEqualsCall(EqualsCall node) {
     return _emitEqualityOperator(node.left, node.interfaceTarget, node.right,
-        negated: node.isNot);
+        negated: false);
   }
 
   @override
   js_ast.Expression visitEqualsNull(EqualsNull node) {
     return _emitCoreIdenticalCall([node.expression, NullLiteral()],
-        negated: node.isNot);
+        negated: false);
   }
 
   @override
@@ -4591,12 +4598,10 @@
     /// list and the element type is known to be invariant so it can skip the
     /// type check.
     bool isNativeListInvariantAdd(InvocationExpression node) {
-      if (node is MethodInvocation &&
-          node.isInvariant &&
-          node.name.name == 'add') {
+      Expression receiver;
+      if (receiver != null && node.name.text == 'add') {
         // The call to add is marked as invariant, so the type check on the
         // parameter to add is not needed.
-        var receiver = node.receiver;
         if (receiver is VariableGet &&
             receiver.variable.isFinal &&
             !receiver.variable.isLate) {
@@ -5560,6 +5565,13 @@
       return _emitEqualityOperator(operand.receiver, operand.interfaceTarget,
           operand.arguments.positional[0],
           negated: true);
+    } else if (operand is EqualsCall) {
+      return _emitEqualityOperator(
+          operand.left, operand.interfaceTarget, operand.right,
+          negated: true);
+    } else if (operand is EqualsNull) {
+      return _emitCoreIdenticalCall([operand.expression, NullLiteral()],
+          negated: true);
     } else if (operand is StaticInvocation &&
         operand.target == _coreTypes.identicalProcedure) {
       return _emitCoreIdenticalCall(operand.arguments.positional,
diff --git a/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart b/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart
index 413ae5e..933dce6 100644
--- a/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart
@@ -81,7 +81,7 @@
                 member.isForwardingStub ||
                 member.stubKind == ProcedureStubKind.ConcreteMixinStub
             : (member is Field)
-                ? member.name.name.contains(redirectingName)
+                ? member.name.text.contains(redirectingName)
                 : false;
 
     if (!noBreakPointPossible) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index a759519..5b0237b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -609,11 +609,9 @@
     Expression left = transform(node.left);
     Expression right = transform(node.right);
     if (_isNull(left)) {
-      return new EqualsNull(right, isNot: node.isNot)
-        ..fileOffset = node.fileOffset;
+      return new EqualsNull(right)..fileOffset = node.fileOffset;
     } else if (_isNull(right)) {
-      return new EqualsNull(left, isNot: node.isNot)
-        ..fileOffset = node.fileOffset;
+      return new EqualsNull(left)..fileOffset = node.fileOffset;
     }
     node.left = left..parent = node;
     node.right = right..parent = node;
@@ -1931,13 +1929,12 @@
       return unevaluated(
           node,
           new EqualsCall(extract(left), extract(right),
-              isNot: node.isNot,
               functionType: node.functionType,
               interfaceTarget: node.interfaceTarget)
             ..fileOffset = node.fileOffset);
     }
 
-    return _handleEquals(node, left, right, isNot: node.isNot);
+    return _handleEquals(node, left, right);
   }
 
   @override
@@ -1946,18 +1943,14 @@
     if (expression is AbortConstant) return expression;
 
     if (shouldBeUnevaluated) {
-      return unevaluated(
-          node,
-          new EqualsNull(extract(expression), isNot: node.isNot)
-            ..fileOffset = node.fileOffset);
+      return unevaluated(node,
+          new EqualsNull(extract(expression))..fileOffset = node.fileOffset);
     }
 
-    return _handleEquals(node, expression, nullConstant, isNot: node.isNot);
+    return _handleEquals(node, expression, nullConstant);
   }
 
-  Constant _handleEquals(Expression node, Constant left, Constant right,
-      {bool isNot}) {
-    assert(isNot != null);
+  Constant _handleEquals(Expression node, Constant left, Constant right) {
     if (left is NullConstant ||
         left is BoolConstant ||
         left is IntConstant ||
@@ -1966,17 +1959,7 @@
         right is NullConstant) {
       // [DoubleConstant] uses [identical] to determine equality, so we need
       // to take the special cases into account.
-      Constant result =
-          doubleSpecialCases(left, right) ?? makeBoolConstant(left == right);
-      if (isNot) {
-        if (result == trueConstant) {
-          result = falseConstant;
-        } else {
-          assert(result == falseConstant);
-          result = trueConstant;
-        }
-      }
-      return result;
+      return doubleSpecialCases(left, right) ?? makeBoolConstant(left == right);
     } else {
       return createErrorConstant(
           node,
@@ -1993,7 +1976,7 @@
     // parsed as `!(a == b)` it is handled implicitly through ==.
     if (arguments.length == 1 && op == '==') {
       final Constant right = arguments[0];
-      return _handleEquals(node, receiver, right, isNot: false);
+      return _handleEquals(node, receiver, right);
     }
 
     // This is a white-listed set of methods we need to support on constants.
@@ -2466,7 +2449,7 @@
         return createErrorConstant(
             node,
             templateConstEvalInvalidStaticInvocation
-                .withArguments(target.name.name));
+                .withArguments(target.name.text));
       } else {
         return createInvalidExpressionConstant(
             node, 'No support for ${target.runtimeType} in a static tear-off.');
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index be077f9..3b061ee 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -94,6 +94,90 @@
   }
 
   @override
+  ExpressionInferenceResult visitDynamicGet(
+      DynamicGet node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitInstanceGet(
+      InstanceGet node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitInstanceTearOff(
+      InstanceTearOff node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitDynamicInvocation(
+      DynamicInvocation node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitDynamicSet(
+      DynamicSet node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitEqualsCall(
+      EqualsCall node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitEqualsNull(
+      EqualsNull node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitFunctionInvocation(
+      FunctionInvocation node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitInstanceInvocation(
+      InstanceInvocation node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitInstanceGetterInvocation(
+      InstanceGetterInvocation node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitInstanceSet(
+      InstanceSet node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitLocalFunctionInvocation(
+      LocalFunctionInvocation node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitStaticTearOff(
+      StaticTearOff node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
+  ExpressionInferenceResult visitFunctionTearOff(
+      FunctionTearOff node, DartType typeContext) {
+    return _unhandledExpression(node, typeContext);
+  }
+
+  @override
   ExpressionInferenceResult visitFileUriExpression(
       FileUriExpression node, DartType typeContext) {
     return _unhandledExpression(node, typeContext);
@@ -3747,12 +3831,15 @@
 
     if (inferrer.useNewMethodInvocationEncoding) {
       if (_isNull(right)) {
-        equals = new EqualsNull(left, isNot: isNot)..fileOffset = fileOffset;
+        equals = new EqualsNull(left)..fileOffset = fileOffset;
       } else if (_isNull(left)) {
-        equals = new EqualsNull(rightResult.expression, isNot: isNot)
+        equals = new EqualsNull(rightResult.expression)
           ..fileOffset = fileOffset;
       }
       if (equals != null) {
+        if (isNot) {
+          equals = new Not(equals)..fileOffset = fileOffset;
+        }
         inferrer.flowAnalysis.equalityOp_end(
             equals, rightResult.expression, rightResult.inferredType,
             notEqual: isNot);
@@ -3798,10 +3885,11 @@
         FunctionType functionType =
             inferrer.getFunctionType(equalsTarget, leftType);
         equals = new EqualsCall(left, right,
-            isNot: isNot,
-            functionType: functionType,
-            interfaceTarget: equalsTarget.member)
+            functionType: functionType, interfaceTarget: equalsTarget.member)
           ..fileOffset = fileOffset;
+        if (isNot) {
+          equals = new Not(equals)..fileOffset = fileOffset;
+        }
       } else {
         assert(equalsTarget.isNever);
         FunctionType functionType = new FunctionType([const DynamicType()],
@@ -3812,8 +3900,11 @@
                 instrumented: false)
             .member;
         equals = new EqualsCall(left, right,
-            isNot: isNot, functionType: functionType, interfaceTarget: target)
+            functionType: functionType, interfaceTarget: target)
           ..fileOffset = fileOffset;
+        if (isNot) {
+          equals = new Not(equals)..fileOffset = fileOffset;
+        }
       }
     } else {
       equals = new MethodInvocation(
@@ -5708,7 +5799,7 @@
         node.fileOffset, receiver, receiverType, node.name, typeContext,
         isThisReceiver: node.receiver is ThisExpression);
     inferrer.flowAnalysis.propertyGet(
-        node, node.receiver, node.name.name, readResult.inferredType);
+        node, node.receiver, node.name.text, readResult.inferredType);
     ExpressionInferenceResult expressionInferenceResult =
         inferrer.createNullAwareExpressionInferenceResult(
             readResult.inferredType, readResult.expression, nullAwareGuards);
@@ -6867,97 +6958,6 @@
       }
     }
   }
-
-  @override
-  ExpressionInferenceResult visitDynamicGet(
-      DynamicGet node, DartType typeContext) {
-    // TODO: implement visitDynamicGet
-    throw new UnimplementedError();
-  }
-
-  @override
-  ExpressionInferenceResult visitInstanceGet(
-      InstanceGet node, DartType typeContext) {
-    // TODO: implement visitInstanceGet
-    throw new UnimplementedError();
-  }
-
-  @override
-  ExpressionInferenceResult visitInstanceTearOff(
-      InstanceTearOff node, DartType typeContext) {
-    // TODO: implement visitInstanceTearOff
-    throw new UnimplementedError();
-  }
-
-  @override
-  ExpressionInferenceResult visitDynamicInvocation(
-      DynamicInvocation node, DartType typeContext) {
-    // TODO: implement visitDynamicInvocation
-    throw new UnimplementedError();
-  }
-
-  @override
-  ExpressionInferenceResult visitDynamicSet(
-      DynamicSet node, DartType typeContext) {
-    // TODO: implement visitDynamicSet
-    throw new UnimplementedError();
-  }
-
-  @override
-  ExpressionInferenceResult visitEqualsCall(
-      EqualsCall node, DartType typeContext) {
-    // TODO: implement visitEqualsCall
-    throw new UnimplementedError();
-  }
-
-  @override
-  ExpressionInferenceResult visitEqualsNull(
-      EqualsNull node, DartType typeContext) {
-    // TODO: implement visitEqualsNull
-    throw new UnimplementedError();
-  }
-
-  @override
-  ExpressionInferenceResult visitFunctionInvocation(
-      FunctionInvocation node, DartType typeContext) {
-    // TODO: implement visitFunctionInvocation
-    throw new UnimplementedError();
-  }
-
-  @override
-  ExpressionInferenceResult visitInstanceInvocation(
-      InstanceInvocation node, DartType typeContext) {
-    // TODO: implement visitInstanceInvocation
-    throw new UnimplementedError();
-  }
-
-  @override
-  ExpressionInferenceResult visitInstanceSet(
-      InstanceSet node, DartType typeContext) {
-    // TODO: implement visitInstanceSet
-    throw new UnimplementedError();
-  }
-
-  @override
-  ExpressionInferenceResult visitLocalFunctionInvocation(
-      LocalFunctionInvocation node, DartType typeContext) {
-    // TODO: implement visitLocalFunctionInvocation
-    throw new UnimplementedError();
-  }
-
-  @override
-  ExpressionInferenceResult visitStaticTearOff(
-      StaticTearOff node, DartType typeContext) {
-    // TODO: implement visitStaticTearOff
-    throw new UnimplementedError();
-  }
-
-  @override
-  ExpressionInferenceResult visitFunctionTearOff(
-      FunctionTearOff node, DartType arg) {
-    // TODO: implement visitFunctionTearOff
-    throw new UnimplementedError();
-  }
 }
 
 class ForInResult {
diff --git a/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart b/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
index 1f87bde..0e2ea27 100644
--- a/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
@@ -106,8 +106,7 @@
           new ConditionalExpression(
               useNewMethodInvocationEncoding
                   ? (new EqualsNull(
-                      new VariableGet(variable)..fileOffset = fileOffset,
-                      isNot: false)
+                      new VariableGet(variable)..fileOffset = fileOffset)
                     ..fileOffset = fileOffset)
                   : new MethodInvocation(
                       new VariableGet(variable)..fileOffset = fileOffset,
@@ -261,8 +260,7 @@
           new ConditionalExpression(
               useNewMethodInvocationEncoding
                   ? (new EqualsNull(
-                      new VariableGet(variable)..fileOffset = fileOffset,
-                      isNot: false)
+                      new VariableGet(variable)..fileOffset = fileOffset)
                     ..fileOffset = fileOffset)
                   : new MethodInvocation(
                       new VariableGet(variable)..fileOffset = fileOffset,
@@ -278,8 +276,7 @@
                       useNewMethodInvocationEncoding
                           ? (new EqualsNull(
                               createVariableRead(needsPromotion: false)
-                                ..fileOffset = fileOffset,
-                              isNot: false)
+                                ..fileOffset = fileOffset)
                             ..fileOffset = fileOffset)
                           : new MethodInvocation(
                               createVariableRead(needsPromotion: false)
@@ -381,8 +378,7 @@
           new ConditionalExpression(
               useNewMethodInvocationEncoding
                   ? (new EqualsNull(
-                      new VariableGet(variable)..fileOffset = fileOffset,
-                      isNot: false)
+                      new VariableGet(variable)..fileOffset = fileOffset)
                     ..fileOffset = fileOffset)
                   : new MethodInvocation(
                       new VariableGet(variable)..fileOffset = fileOffset,
@@ -540,8 +536,7 @@
       //    }
       return new IfStatement(
         useNewMethodInvocationEncoding
-            ? (new EqualsNull(createVariableRead()..fileOffset = fileOffset,
-                isNot: false)
+            ? (new EqualsNull(createVariableRead()..fileOffset = fileOffset)
               ..fileOffset = fileOffset)
             : new MethodInvocation(
                 createVariableRead()..fileOffset = fileOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
index 0866c33..ac5f466 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
@@ -946,22 +946,22 @@
   Expression _createEqualsNull(Expression expression, {bool notEquals: false}) {
     assert(expression != null);
     assert(expression.fileOffset != TreeNode.noOffset);
+    Expression check;
     if (useNewMethodInvocationEncoding) {
-      return new EqualsNull(expression, isNot: notEquals)
-        ..fileOffset = expression.fileOffset;
+      check = new EqualsNull(expression)..fileOffset = expression.fileOffset;
     } else {
-      Expression check = new MethodInvocation(
+      check = new MethodInvocation(
           expression,
           new Name('=='),
           new Arguments(
               [new NullLiteral()..fileOffset = expression.fileOffset]),
           _objectEquals)
         ..fileOffset = expression.fileOffset;
-      if (notEquals) {
-        check = new Not(check)..fileOffset = expression.fileOffset;
-      }
-      return check;
     }
+    if (notEquals) {
+      check = new Not(check)..fileOffset = expression.fileOffset;
+    }
+    return check;
   }
 
   Expression _createIndexSet(int fileOffset, Expression receiver,
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index d70f4c1..d01bde9 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -738,8 +738,7 @@
     Expression nullCheck;
     // TODO(johnniwinther): Avoid null-check for non-nullable expressions.
     if (useNewMethodInvocationEncoding) {
-      nullCheck = new EqualsNull(new VariableGet(t)..fileOffset = fileOffset,
-          isNot: false)
+      nullCheck = new EqualsNull(new VariableGet(t)..fileOffset = fileOffset)
         ..fileOffset = fileOffset;
     } else {
       nullCheck = new MethodInvocation(
@@ -2910,7 +2909,8 @@
           ..fileOffset = fileOffset;
       } else if (receiver is VariableGet) {
         VariableDeclaration variable = receiver.variable;
-        if (variable.parent is FunctionDeclaration) {
+        TreeNode parent = variable.parent;
+        if (parent is FunctionDeclaration) {
           assert(inferredFunctionType != unknownFunction,
               "Unknown function type for local function invocation.");
           expression = new LocalFunctionInvocation(variable, arguments,
@@ -3403,7 +3403,7 @@
           resultType: calleeType, interfaceTarget: originalTarget)
         ..fileOffset = fileOffset;
       flowAnalysis.propertyGet(
-          originalPropertyGet, originalReceiver, originalName.name, calleeType);
+          originalPropertyGet, originalReceiver, originalName.text, calleeType);
     } else {
       originalPropertyGet =
           new PropertyGet(originalReceiver, originalName, originalTarget)
@@ -4246,7 +4246,7 @@
   Expression createEqualsNull(
       int fileOffset, Expression left, Member equalsMember) {
     if (useNewMethodInvocationEncoding) {
-      return new EqualsNull(left, isNot: false)..fileOffset = fileOffset;
+      return new EqualsNull(left)..fileOffset = fileOffset;
     } else {
       return new MethodInvocation(
           left,
diff --git a/pkg/front_end/lib/src/testing/id_extractor.dart b/pkg/front_end/lib/src/testing/id_extractor.dart
index ebee200..e07b415 100644
--- a/pkg/front_end/lib/src/testing/id_extractor.dart
+++ b/pkg/front_end/lib/src/testing/id_extractor.dart
@@ -200,9 +200,9 @@
   }
 
   _visitInvocation(Expression node, Name name) {
-    if (name.name == '[]') {
+    if (name.text == '[]') {
       computeForNode(node, computeDefaultNodeId(node));
-    } else if (name.name == '[]=') {
+    } else if (name.text == '[]=') {
       computeForNode(node, createUpdateId(node));
     } else {
       if (node.fileOffset != TreeNode.noOffset) {
@@ -221,7 +221,7 @@
       // This is an invocation of a named local function.
       computeForNode(node, createInvokeId(node.receiver));
       node.arguments.accept(this);
-    } else if (node.name.name == '==' &&
+    } else if (node.name.text == '==' &&
         receiver is VariableGet &&
         receiver.variable.name == null) {
       // This is a desugared `?.`.
@@ -273,6 +273,12 @@
   }
 
   @override
+  visitInstanceGetterInvocation(InstanceGetterInvocation node) {
+    _visitInvocation(node, node.name);
+    super.visitInstanceGetterInvocation(node);
+  }
+
+  @override
   visitLoadLibrary(LoadLibrary node) {
     computeForNode(node, createInvokeId(node));
   }
diff --git a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.expect b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.expect
index b452cdb..ce47bb9 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.expect
@@ -171,7 +171,7 @@
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   self::enableRead = true;
-  if(expected !={core::Object::==}{(core::Object*) →* core::bool*} actual)
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
     throw "Expected ${expected}, ${actual}";
 }
 
diff --git a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.transformed.expect b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.transformed.expect
index 7462ff3..25ceba5 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.transformed.expect
@@ -171,7 +171,7 @@
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   self::enableRead = true;
-  if(expected !={core::Object::==}{(core::Object*) →* core::bool*} actual)
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
     throw "Expected ${expected}, ${actual}";
 }
 
@@ -204,4 +204,4 @@
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///getter_call.dart:160:10 -> IntConstant(-23)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///getter_call.dart:161:10 -> IntConstant(-11)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///getter_call.dart:162:10 -> IntConstant(-11)
-Extra constant evaluation: evaluated: 321, effectively constant: 17
+Extra constant evaluation: evaluated: 322, effectively constant: 17
diff --git a/pkg/front_end/testcases/none/equals.dart.strong.expect b/pkg/front_end/testcases/none/equals.dart.strong.expect
index 905a90a..3c8e61d 100644
--- a/pkg/front_end/testcases/none/equals.dart.strong.expect
+++ b/pkg/front_end/testcases/none/equals.dart.strong.expect
@@ -129,347 +129,347 @@
 static method test<T1 extends core::Function = core::Function, T2 extends (core::int) → core::int = (core::int) → core::int>(core::Object o, core::Object nonNullableObject, core::Object? nullableObject, self::Class<core::String> nonNullableClass, self::Class<core::String>? nullableClass, dynamic dyn, Never never, Never? nullableNever, Null nullTypedValue, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
   core::print("EqualsNull (literal null)");
   null == null;
-  null != null;
+  !(null == null);
   nonNullableObject == null;
-  nonNullableObject != null;
+  !(nonNullableObject == null);
   nonNullableObject == null;
-  nonNullableObject != null;
+  !(nonNullableObject == null);
   nullableObject == null;
-  nullableObject != null;
+  !(nullableObject == null);
   nullableObject == null;
-  nullableObject != null;
+  !(nullableObject == null);
   nullableClass == null;
-  nullableClass != null;
+  !(nullableClass == null);
   nullableClass == null;
-  nullableClass != null;
+  !(nullableClass == null);
   nonNullableClass == null;
-  nonNullableClass != null;
+  !(nonNullableClass == null);
   nonNullableClass == null;
-  nonNullableClass != null;
+  !(nonNullableClass == null);
   dyn == null;
-  dyn != null;
+  !(dyn == null);
   dyn == null;
-  dyn != null;
+  !(dyn == null);
   never == null;
-  never != null;
+  !(never == null);
   never == null;
-  never != null;
+  !(never == null);
   nullableNever == null;
-  nullableNever != null;
+  !(nullableNever == null);
   nullableNever == null;
-  nullableNever != null;
+  !(nullableNever == null);
   nullTypedValue == null;
-  nullTypedValue != null;
+  !(nullTypedValue == null);
   nullTypedValue == null;
-  nullTypedValue != null;
+  !(nullTypedValue == null);
   nonNullableFunction == null;
-  nonNullableFunction != null;
+  !(nonNullableFunction == null);
   nonNullableFunction == null;
-  nonNullableFunction != null;
+  !(nonNullableFunction == null);
   nullableFunction == null;
-  nullableFunction != null;
+  !(nullableFunction == null);
   nullableFunction == null;
-  nullableFunction != null;
+  !(nullableFunction == null);
   nonNullableFunctionType == null;
-  nonNullableFunctionType != null;
+  !(nonNullableFunctionType == null);
   nonNullableFunctionType == null;
-  nonNullableFunctionType != null;
+  !(nonNullableFunctionType == null);
   nullableFunctionType == null;
-  nullableFunctionType != null;
+  !(nullableFunctionType == null);
   nullableFunctionType == null;
-  nullableFunctionType != null;
+  !(nullableFunctionType == null);
   nonNullableTypeVariable1 == null;
-  nonNullableTypeVariable1 != null;
+  !(nonNullableTypeVariable1 == null);
   nonNullableTypeVariable1 == null;
-  nonNullableTypeVariable1 != null;
+  !(nonNullableTypeVariable1 == null);
   nullableTypeVariable1 == null;
-  nullableTypeVariable1 != null;
+  !(nullableTypeVariable1 == null);
   nullableTypeVariable1 == null;
-  nullableTypeVariable1 != null;
+  !(nullableTypeVariable1 == null);
   nonNullableTypeVariable2 == null;
-  nonNullableTypeVariable2 != null;
+  !(nonNullableTypeVariable2 == null);
   nonNullableTypeVariable2 == null;
-  nonNullableTypeVariable2 != null;
+  !(nonNullableTypeVariable2 == null);
   nullableTypeVariable2 == null;
-  nullableTypeVariable2 != null;
+  !(nullableTypeVariable2 == null);
   nullableTypeVariable2 == null;
-  nullableTypeVariable2 != null;
+  !(nullableTypeVariable2 == null);
   (let final Never #t1 = invalid-expression "pkg/front_end/testcases/none/equals.dart:115:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() == null;
                          ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
-  (let final Never #t2 = invalid-expression "pkg/front_end/testcases/none/equals.dart:116:26: Error: Too few positional arguments: 1 required, 0 given.
+  !((let final Never #t2 = invalid-expression "pkg/front_end/testcases/none/equals.dart:116:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() != null;
-                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
   (let final Never #t3 = invalid-expression "pkg/front_end/testcases/none/equals.dart:117:34: Error: Too few positional arguments: 1 required, 0 given.
   null == nonNullableClass.method();
                                  ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
-  (let final Never #t4 = invalid-expression "pkg/front_end/testcases/none/equals.dart:118:34: Error: Too few positional arguments: 1 required, 0 given.
+  !((let final Never #t4 = invalid-expression "pkg/front_end/testcases/none/equals.dart:118:34: Error: Too few positional arguments: 1 required, 0 given.
   null != nonNullableClass.method();
-                                 ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+                                 ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
   core::print("EqualsNull (constant null)");
   (#C1) == null;
-  (#C1) != null;
+  !((#C1) == null);
   nonNullableObject == null;
-  nonNullableObject != null;
+  !(nonNullableObject == null);
   nonNullableObject == null;
-  nonNullableObject != null;
+  !(nonNullableObject == null);
   nullableObject == null;
-  nullableObject != null;
+  !(nullableObject == null);
   nullableObject == null;
-  nullableObject != null;
+  !(nullableObject == null);
   nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t5 = invalid-expression "pkg/front_end/testcases/none/equals.dart:134:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nonNullableClass == nullValue;
                       ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
-  nonNullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t6 = invalid-expression "pkg/front_end/testcases/none/equals.dart:135:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+  !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t6 = invalid-expression "pkg/front_end/testcases/none/equals.dart:135:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nonNullableClass != nullValue;
-                      ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+                      ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
   nonNullableClass == null;
-  nonNullableClass != null;
+  !(nonNullableClass == null);
   nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t7 = invalid-expression "pkg/front_end/testcases/none/equals.dart:139:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nullableClass == nullValue;
                    ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
-  nullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t8 = invalid-expression "pkg/front_end/testcases/none/equals.dart:140:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+  !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t8 = invalid-expression "pkg/front_end/testcases/none/equals.dart:140:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nullableClass != nullValue;
-                   ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+                   ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
   nullableClass == null;
-  nullableClass != null;
+  !(nullableClass == null);
   dyn == null;
-  dyn != null;
+  !(dyn == null);
   dyn == null;
-  dyn != null;
+  !(dyn == null);
   never == null;
-  never != null;
+  !(never == null);
   never == null;
-  never != null;
+  !(never == null);
   nullableNever == null;
-  nullableNever != null;
+  !(nullableNever == null);
   nullableNever == null;
-  nullableNever != null;
+  !(nullableNever == null);
   nullTypedValue == null;
-  nullTypedValue != null;
+  !(nullTypedValue == null);
   nullTypedValue == null;
-  nullTypedValue != null;
+  !(nullTypedValue == null);
   nonNullableFunction == null;
-  nonNullableFunction != null;
+  !(nonNullableFunction == null);
   nonNullableFunction == null;
-  nonNullableFunction != null;
+  !(nonNullableFunction == null);
   nullableFunction == null;
-  nullableFunction != null;
+  !(nullableFunction == null);
   nullableFunction == null;
-  nullableFunction != null;
+  !(nullableFunction == null);
   nonNullableFunctionType == null;
-  nonNullableFunctionType != null;
+  !(nonNullableFunctionType == null);
   nonNullableFunctionType == null;
-  nonNullableFunctionType != null;
+  !(nonNullableFunctionType == null);
   nullableFunctionType == null;
-  nullableFunctionType != null;
+  !(nullableFunctionType == null);
   nullableFunctionType == null;
-  nullableFunctionType != null;
+  !(nullableFunctionType == null);
   nonNullableTypeVariable1 == null;
-  nonNullableTypeVariable1 != null;
+  !(nonNullableTypeVariable1 == null);
   nonNullableTypeVariable1 == null;
-  nonNullableTypeVariable1 != null;
+  !(nonNullableTypeVariable1 == null);
   nullableTypeVariable1 == null;
-  nullableTypeVariable1 != null;
+  !(nullableTypeVariable1 == null);
   nullableTypeVariable1 == null;
-  nullableTypeVariable1 != null;
+  !(nullableTypeVariable1 == null);
   nonNullableTypeVariable2 == null;
-  nonNullableTypeVariable2 != null;
+  !(nonNullableTypeVariable2 == null);
   nonNullableTypeVariable2 == null;
-  nonNullableTypeVariable2 != null;
+  !(nonNullableTypeVariable2 == null);
   nullableTypeVariable2 == null;
-  nullableTypeVariable2 != null;
+  !(nullableTypeVariable2 == null);
   nullableTypeVariable2 == null;
-  nullableTypeVariable2 != null;
+  !(nullableTypeVariable2 == null);
   (let final Never #t9 = invalid-expression "pkg/front_end/testcases/none/equals.dart:204:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() == nullValue;
                          ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
-  (let final Never #t10 = invalid-expression "pkg/front_end/testcases/none/equals.dart:205:26: Error: Too few positional arguments: 1 required, 0 given.
+  !((let final Never #t10 = invalid-expression "pkg/front_end/testcases/none/equals.dart:205:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() != nullValue;
-                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
   (let final Never #t11 = invalid-expression "pkg/front_end/testcases/none/equals.dart:206:39: Error: Too few positional arguments: 1 required, 0 given.
   nullValue == nonNullableClass.method();
                                       ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
-  (let final Never #t12 = invalid-expression "pkg/front_end/testcases/none/equals.dart:207:39: Error: Too few positional arguments: 1 required, 0 given.
+  !((let final Never #t12 = invalid-expression "pkg/front_end/testcases/none/equals.dart:207:39: Error: Too few positional arguments: 1 required, 0 given.
   nullValue != nonNullableClass.method();
-                                      ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+                                      ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
   core::print("EqualsCall");
   nonNullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nonNullableObject !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableObject);
   nonNullableObject =={core::Object::==}{(core::Object) → core::bool} o;
-  nonNullableObject !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nonNullableObject =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
-  o !={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableObject);
   nullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nullableObject !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableObject;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableObject;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableObject);
   nullableObject =={core::Object::==}{(core::Object) → core::bool} o;
-  nullableObject !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullableObject =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullableObject;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableObject;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableObject);
   nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
-  nonNullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
+  !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableClass);
   nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t13 = invalid-expression "pkg/front_end/testcases/none/equals.dart:233:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nonNullableClass == o;
                       ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
-  nonNullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t14 = invalid-expression "pkg/front_end/testcases/none/equals.dart:234:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+  !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t14 = invalid-expression "pkg/front_end/testcases/none/equals.dart:234:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nonNullableClass != o;
-                      ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+                      ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
   o =={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
-  o !={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableClass);
   nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
-  nullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
+  !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableClass;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableClass;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableClass);
   nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t15 = invalid-expression "pkg/front_end/testcases/none/equals.dart:242:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nullableClass == o;
                    ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
-  nullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t16 = invalid-expression "pkg/front_end/testcases/none/equals.dart:243:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+  !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t16 = invalid-expression "pkg/front_end/testcases/none/equals.dart:243:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nullableClass != o;
-                   ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+                   ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
   o =={core::Object::==}{(core::Object) → core::bool} nullableClass;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableClass;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableClass);
   dyn =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  dyn !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(dyn =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} dyn;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} dyn;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} dyn);
   dyn =={core::Object::==}{(core::Object) → core::bool} o;
-  dyn !={core::Object::==}{(core::Object) → core::bool} o;
+  !(dyn =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} dyn;
-  o !={core::Object::==}{(core::Object) → core::bool} dyn;
+  !(o =={core::Object::==}{(core::Object) → core::bool} dyn);
   never =={core::Object::==}{(dynamic) → Never} nullTypedValue;
-  never !={core::Object::==}{(dynamic) → Never} nullTypedValue;
+  !(never =={core::Object::==}{(dynamic) → Never} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} never;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} never;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} never);
   never =={core::Object::==}{(dynamic) → Never} o;
-  never !={core::Object::==}{(dynamic) → Never} o;
+  !(never =={core::Object::==}{(dynamic) → Never} o);
   o =={core::Object::==}{(core::Object) → core::bool} never;
-  o !={core::Object::==}{(core::Object) → core::bool} never;
+  !(o =={core::Object::==}{(core::Object) → core::bool} never);
   nullableNever =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nullableNever !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableNever =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableNever;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableNever;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableNever);
   nullableNever =={core::Object::==}{(core::Object) → core::bool} o;
-  nullableNever !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullableNever =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullableNever;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableNever;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableNever);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} o;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  o !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
-  nonNullableFunction !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction);
   nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} o;
-  nonNullableFunction !={core::Function::==}{(core::Object) → core::bool} o;
+  !(nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
-  o !={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction);
   nullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
-  nullableFunction !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunction;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableFunction;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunction);
   nullableFunction =={core::Function::==}{(core::Object) → core::bool} o;
-  nullableFunction !={core::Function::==}{(core::Object) → core::bool} o;
+  !(nullableFunction =={core::Function::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullableFunction;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableFunction;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableFunction);
   nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nonNullableFunctionType !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType);
   nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o;
-  nonNullableFunctionType !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
-  o !={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType);
   nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nullableFunctionType !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType);
   nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o;
-  nullableFunctionType !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType);
   nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
-  nonNullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1);
   nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o;
-  nonNullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} o;
+  !(nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
-  o !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1);
   nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
-  nullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1);
   nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o;
-  nullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} o;
+  !(nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1);
   nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nonNullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2);
   nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o;
-  nonNullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
-  o !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2);
   nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2);
   nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o;
-  nullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2);
   (let final Never #t17 = invalid-expression "pkg/front_end/testcases/none/equals.dart:355:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() == nullTypedValue;
                          ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  (let final Never #t18 = invalid-expression "pkg/front_end/testcases/none/equals.dart:356:26: Error: Too few positional arguments: 1 required, 0 given.
+  !((let final Never #t18 = invalid-expression "pkg/front_end/testcases/none/equals.dart:356:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() != nullTypedValue;
-                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t19 = invalid-expression "pkg/front_end/testcases/none/equals.dart:357:44: Error: Too few positional arguments: 1 required, 0 given.
   nullTypedValue == nonNullableClass.method();
                                            ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} (let final Never #t20 = invalid-expression "pkg/front_end/testcases/none/equals.dart:358:44: Error: Too few positional arguments: 1 required, 0 given.
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t20 = invalid-expression "pkg/front_end/testcases/none/equals.dart:358:44: Error: Too few positional arguments: 1 required, 0 given.
   nullTypedValue != nonNullableClass.method();
-                                           ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
+                                           ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}));
   (let final Never #t21 = invalid-expression "pkg/front_end/testcases/none/equals.dart:359:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() == o;
                          ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} o;
-  (let final Never #t22 = invalid-expression "pkg/front_end/testcases/none/equals.dart:360:26: Error: Too few positional arguments: 1 required, 0 given.
+  !((let final Never #t22 = invalid-expression "pkg/front_end/testcases/none/equals.dart:360:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() != o;
-                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) !={core::Object::==}{(core::Object) → core::bool} o;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t23 = invalid-expression "pkg/front_end/testcases/none/equals.dart:361:31: Error: Too few positional arguments: 1 required, 0 given.
   o == nonNullableClass.method();
                               ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
-  o !={core::Object::==}{(core::Object) → core::bool} (let final Never #t24 = invalid-expression "pkg/front_end/testcases/none/equals.dart:362:31: Error: Too few positional arguments: 1 required, 0 given.
+  !(o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t24 = invalid-expression "pkg/front_end/testcases/none/equals.dart:362:31: Error: Too few positional arguments: 1 required, 0 given.
   o != nonNullableClass.method();
-                              ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
+                              ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}));
 }
 static method nullEqualsIndexGet(core::Map<core::int, core::String> map) → dynamic {
   map.{core::Map::[]}(0){(core::Object?) → core::String?} == null;
diff --git a/pkg/front_end/testcases/none/equals.dart.weak.expect b/pkg/front_end/testcases/none/equals.dart.weak.expect
index 538a152..622fa6c8 100644
--- a/pkg/front_end/testcases/none/equals.dart.weak.expect
+++ b/pkg/front_end/testcases/none/equals.dart.weak.expect
@@ -130,347 +130,347 @@
 static method test<T1 extends core::Function = core::Function, T2 extends (core::int) → core::int = (core::int) → core::int>(core::Object o, core::Object nonNullableObject, core::Object? nullableObject, self::Class<core::String> nonNullableClass, self::Class<core::String>? nullableClass, dynamic dyn, Never never, Never? nullableNever, Null nullTypedValue, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
   core::print("EqualsNull (literal null)");
   null == null;
-  null != null;
+  !(null == null);
   nonNullableObject == null;
-  nonNullableObject != null;
+  !(nonNullableObject == null);
   nonNullableObject == null;
-  nonNullableObject != null;
+  !(nonNullableObject == null);
   nullableObject == null;
-  nullableObject != null;
+  !(nullableObject == null);
   nullableObject == null;
-  nullableObject != null;
+  !(nullableObject == null);
   nullableClass == null;
-  nullableClass != null;
+  !(nullableClass == null);
   nullableClass == null;
-  nullableClass != null;
+  !(nullableClass == null);
   nonNullableClass == null;
-  nonNullableClass != null;
+  !(nonNullableClass == null);
   nonNullableClass == null;
-  nonNullableClass != null;
+  !(nonNullableClass == null);
   dyn == null;
-  dyn != null;
+  !(dyn == null);
   dyn == null;
-  dyn != null;
+  !(dyn == null);
   (let final Never #t1 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null;
-  (let final Never #t2 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) != null;
+  !((let final Never #t2 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null);
   (let final Never #t3 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null;
-  (let final Never #t4 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) != null;
+  !((let final Never #t4 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null);
   nullableNever == null;
-  nullableNever != null;
+  !(nullableNever == null);
   nullableNever == null;
-  nullableNever != null;
+  !(nullableNever == null);
   nullTypedValue == null;
-  nullTypedValue != null;
+  !(nullTypedValue == null);
   nullTypedValue == null;
-  nullTypedValue != null;
+  !(nullTypedValue == null);
   nonNullableFunction == null;
-  nonNullableFunction != null;
+  !(nonNullableFunction == null);
   nonNullableFunction == null;
-  nonNullableFunction != null;
+  !(nonNullableFunction == null);
   nullableFunction == null;
-  nullableFunction != null;
+  !(nullableFunction == null);
   nullableFunction == null;
-  nullableFunction != null;
+  !(nullableFunction == null);
   nonNullableFunctionType == null;
-  nonNullableFunctionType != null;
+  !(nonNullableFunctionType == null);
   nonNullableFunctionType == null;
-  nonNullableFunctionType != null;
+  !(nonNullableFunctionType == null);
   nullableFunctionType == null;
-  nullableFunctionType != null;
+  !(nullableFunctionType == null);
   nullableFunctionType == null;
-  nullableFunctionType != null;
+  !(nullableFunctionType == null);
   nonNullableTypeVariable1 == null;
-  nonNullableTypeVariable1 != null;
+  !(nonNullableTypeVariable1 == null);
   nonNullableTypeVariable1 == null;
-  nonNullableTypeVariable1 != null;
+  !(nonNullableTypeVariable1 == null);
   nullableTypeVariable1 == null;
-  nullableTypeVariable1 != null;
+  !(nullableTypeVariable1 == null);
   nullableTypeVariable1 == null;
-  nullableTypeVariable1 != null;
+  !(nullableTypeVariable1 == null);
   nonNullableTypeVariable2 == null;
-  nonNullableTypeVariable2 != null;
+  !(nonNullableTypeVariable2 == null);
   nonNullableTypeVariable2 == null;
-  nonNullableTypeVariable2 != null;
+  !(nonNullableTypeVariable2 == null);
   nullableTypeVariable2 == null;
-  nullableTypeVariable2 != null;
+  !(nullableTypeVariable2 == null);
   nullableTypeVariable2 == null;
-  nullableTypeVariable2 != null;
+  !(nullableTypeVariable2 == null);
   (let final Never #t5 = invalid-expression "pkg/front_end/testcases/none/equals.dart:115:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() == null;
                          ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
-  (let final Never #t6 = invalid-expression "pkg/front_end/testcases/none/equals.dart:116:26: Error: Too few positional arguments: 1 required, 0 given.
+  !((let final Never #t6 = invalid-expression "pkg/front_end/testcases/none/equals.dart:116:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() != null;
-                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
   (let final Never #t7 = invalid-expression "pkg/front_end/testcases/none/equals.dart:117:34: Error: Too few positional arguments: 1 required, 0 given.
   null == nonNullableClass.method();
                                  ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
-  (let final Never #t8 = invalid-expression "pkg/front_end/testcases/none/equals.dart:118:34: Error: Too few positional arguments: 1 required, 0 given.
+  !((let final Never #t8 = invalid-expression "pkg/front_end/testcases/none/equals.dart:118:34: Error: Too few positional arguments: 1 required, 0 given.
   null != nonNullableClass.method();
-                                 ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+                                 ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
   core::print("EqualsNull (constant null)");
   (#C1) == null;
-  (#C1) != null;
+  !((#C1) == null);
   nonNullableObject == null;
-  nonNullableObject != null;
+  !(nonNullableObject == null);
   nonNullableObject == null;
-  nonNullableObject != null;
+  !(nonNullableObject == null);
   nullableObject == null;
-  nullableObject != null;
+  !(nullableObject == null);
   nullableObject == null;
-  nullableObject != null;
+  !(nullableObject == null);
   nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t9 = invalid-expression "pkg/front_end/testcases/none/equals.dart:134:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nonNullableClass == nullValue;
                       ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
-  nonNullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t10 = invalid-expression "pkg/front_end/testcases/none/equals.dart:135:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+  !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t10 = invalid-expression "pkg/front_end/testcases/none/equals.dart:135:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nonNullableClass != nullValue;
-                      ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+                      ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
   nonNullableClass == null;
-  nonNullableClass != null;
+  !(nonNullableClass == null);
   nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t11 = invalid-expression "pkg/front_end/testcases/none/equals.dart:139:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nullableClass == nullValue;
                    ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
-  nullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t12 = invalid-expression "pkg/front_end/testcases/none/equals.dart:140:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+  !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t12 = invalid-expression "pkg/front_end/testcases/none/equals.dart:140:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nullableClass != nullValue;
-                   ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+                   ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
   nullableClass == null;
-  nullableClass != null;
+  !(nullableClass == null);
   dyn == null;
-  dyn != null;
+  !(dyn == null);
   dyn == null;
-  dyn != null;
+  !(dyn == null);
   let final Never #t13 = (let final Never #t14 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never #t15 = (let final Never #t16 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) != null in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t15 = !((let final Never #t16 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   (let final Never #t17 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null;
-  (let final Never #t18 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) != null;
+  !((let final Never #t18 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null);
   nullableNever == null;
-  nullableNever != null;
+  !(nullableNever == null);
   nullableNever == null;
-  nullableNever != null;
+  !(nullableNever == null);
   nullTypedValue == null;
-  nullTypedValue != null;
+  !(nullTypedValue == null);
   nullTypedValue == null;
-  nullTypedValue != null;
+  !(nullTypedValue == null);
   nonNullableFunction == null;
-  nonNullableFunction != null;
+  !(nonNullableFunction == null);
   nonNullableFunction == null;
-  nonNullableFunction != null;
+  !(nonNullableFunction == null);
   nullableFunction == null;
-  nullableFunction != null;
+  !(nullableFunction == null);
   nullableFunction == null;
-  nullableFunction != null;
+  !(nullableFunction == null);
   nonNullableFunctionType == null;
-  nonNullableFunctionType != null;
+  !(nonNullableFunctionType == null);
   nonNullableFunctionType == null;
-  nonNullableFunctionType != null;
+  !(nonNullableFunctionType == null);
   nullableFunctionType == null;
-  nullableFunctionType != null;
+  !(nullableFunctionType == null);
   nullableFunctionType == null;
-  nullableFunctionType != null;
+  !(nullableFunctionType == null);
   nonNullableTypeVariable1 == null;
-  nonNullableTypeVariable1 != null;
+  !(nonNullableTypeVariable1 == null);
   nonNullableTypeVariable1 == null;
-  nonNullableTypeVariable1 != null;
+  !(nonNullableTypeVariable1 == null);
   nullableTypeVariable1 == null;
-  nullableTypeVariable1 != null;
+  !(nullableTypeVariable1 == null);
   nullableTypeVariable1 == null;
-  nullableTypeVariable1 != null;
+  !(nullableTypeVariable1 == null);
   nonNullableTypeVariable2 == null;
-  nonNullableTypeVariable2 != null;
+  !(nonNullableTypeVariable2 == null);
   nonNullableTypeVariable2 == null;
-  nonNullableTypeVariable2 != null;
+  !(nonNullableTypeVariable2 == null);
   nullableTypeVariable2 == null;
-  nullableTypeVariable2 != null;
+  !(nullableTypeVariable2 == null);
   nullableTypeVariable2 == null;
-  nullableTypeVariable2 != null;
+  !(nullableTypeVariable2 == null);
   (let final Never #t19 = invalid-expression "pkg/front_end/testcases/none/equals.dart:204:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() == nullValue;
                          ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
-  (let final Never #t20 = invalid-expression "pkg/front_end/testcases/none/equals.dart:205:26: Error: Too few positional arguments: 1 required, 0 given.
+  !((let final Never #t20 = invalid-expression "pkg/front_end/testcases/none/equals.dart:205:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() != nullValue;
-                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
   (let final Never #t21 = invalid-expression "pkg/front_end/testcases/none/equals.dart:206:39: Error: Too few positional arguments: 1 required, 0 given.
   nullValue == nonNullableClass.method();
                                       ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
-  (let final Never #t22 = invalid-expression "pkg/front_end/testcases/none/equals.dart:207:39: Error: Too few positional arguments: 1 required, 0 given.
+  !((let final Never #t22 = invalid-expression "pkg/front_end/testcases/none/equals.dart:207:39: Error: Too few positional arguments: 1 required, 0 given.
   nullValue != nonNullableClass.method();
-                                      ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+                                      ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
   core::print("EqualsCall");
   nonNullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nonNullableObject !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableObject);
   nonNullableObject =={core::Object::==}{(core::Object) → core::bool} o;
-  nonNullableObject !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nonNullableObject =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
-  o !={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableObject);
   nullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nullableObject !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableObject;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableObject;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableObject);
   nullableObject =={core::Object::==}{(core::Object) → core::bool} o;
-  nullableObject !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullableObject =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullableObject;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableObject;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableObject);
   nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
-  nonNullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
+  !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableClass);
   nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t23 = invalid-expression "pkg/front_end/testcases/none/equals.dart:233:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nonNullableClass == o;
                       ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
-  nonNullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t24 = invalid-expression "pkg/front_end/testcases/none/equals.dart:234:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+  !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t24 = invalid-expression "pkg/front_end/testcases/none/equals.dart:234:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nonNullableClass != o;
-                      ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+                      ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
   o =={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
-  o !={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableClass);
   nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
-  nullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
+  !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableClass;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableClass;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableClass);
   nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t25 = invalid-expression "pkg/front_end/testcases/none/equals.dart:242:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nullableClass == o;
                    ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
-  nullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t26 = invalid-expression "pkg/front_end/testcases/none/equals.dart:243:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+  !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t26 = invalid-expression "pkg/front_end/testcases/none/equals.dart:243:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
  - 'Object' is from 'dart:core'.
  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
   nullableClass != o;
-                   ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+                   ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
   o =={core::Object::==}{(core::Object) → core::bool} nullableClass;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableClass;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableClass);
   dyn =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  dyn !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(dyn =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} dyn;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} dyn;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} dyn);
   dyn =={core::Object::==}{(core::Object) → core::bool} o;
-  dyn !={core::Object::==}{(core::Object) → core::bool} o;
+  !(dyn =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} dyn;
-  o !={core::Object::==}{(core::Object) → core::bool} dyn;
+  !(o =={core::Object::==}{(core::Object) → core::bool} dyn);
   let final Never #t27 = (let final Never #t28 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} nullTypedValue in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never #t29 = (let final Never #t30 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) !={core::Object::==}{(dynamic) → Never} nullTypedValue in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t29 = !((let final Never #t30 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} nullTypedValue) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t31 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} (let final Never #t32 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t32 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")));
   let final Never #t33 = (let final Never #t34 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} o in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never #t35 = (let final Never #t36 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) !={core::Object::==}{(dynamic) → Never} o in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t35 = !((let final Never #t36 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} o) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t37 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  o !={core::Object::==}{(core::Object) → core::bool} (let final Never #t38 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  !(o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t38 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")));
   nullableNever =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nullableNever !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableNever =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableNever;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableNever;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableNever);
   nullableNever =={core::Object::==}{(core::Object) → core::bool} o;
-  nullableNever !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullableNever =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullableNever;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableNever;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableNever);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} o;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  o !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
-  nonNullableFunction !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction);
   nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} o;
-  nonNullableFunction !={core::Function::==}{(core::Object) → core::bool} o;
+  !(nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
-  o !={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction);
   nullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
-  nullableFunction !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunction;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableFunction;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunction);
   nullableFunction =={core::Function::==}{(core::Object) → core::bool} o;
-  nullableFunction !={core::Function::==}{(core::Object) → core::bool} o;
+  !(nullableFunction =={core::Function::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullableFunction;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableFunction;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableFunction);
   nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nonNullableFunctionType !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType);
   nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o;
-  nonNullableFunctionType !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
-  o !={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType);
   nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nullableFunctionType !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType);
   nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o;
-  nullableFunctionType !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType);
   nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
-  nonNullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1);
   nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o;
-  nonNullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} o;
+  !(nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
-  o !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1);
   nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
-  nullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1);
   nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o;
-  nullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} o;
+  !(nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1);
   nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nonNullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2);
   nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o;
-  nonNullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
-  o !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2);
   nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  nullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2);
   nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o;
-  nullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
-  o !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2);
   (let final Never #t39 = invalid-expression "pkg/front_end/testcases/none/equals.dart:355:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() == nullTypedValue;
                          ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
-  (let final Never #t40 = invalid-expression "pkg/front_end/testcases/none/equals.dart:356:26: Error: Too few positional arguments: 1 required, 0 given.
+  !((let final Never #t40 = invalid-expression "pkg/front_end/testcases/none/equals.dart:356:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() != nullTypedValue;
-                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
   nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t41 = invalid-expression "pkg/front_end/testcases/none/equals.dart:357:44: Error: Too few positional arguments: 1 required, 0 given.
   nullTypedValue == nonNullableClass.method();
                                            ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
-  nullTypedValue !={core::Object::==}{(core::Object) → core::bool} (let final Never #t42 = invalid-expression "pkg/front_end/testcases/none/equals.dart:358:44: Error: Too few positional arguments: 1 required, 0 given.
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t42 = invalid-expression "pkg/front_end/testcases/none/equals.dart:358:44: Error: Too few positional arguments: 1 required, 0 given.
   nullTypedValue != nonNullableClass.method();
-                                           ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
+                                           ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}));
   (let final Never #t43 = invalid-expression "pkg/front_end/testcases/none/equals.dart:359:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() == o;
                          ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} o;
-  (let final Never #t44 = invalid-expression "pkg/front_end/testcases/none/equals.dart:360:26: Error: Too few positional arguments: 1 required, 0 given.
+  !((let final Never #t44 = invalid-expression "pkg/front_end/testcases/none/equals.dart:360:26: Error: Too few positional arguments: 1 required, 0 given.
   nonNullableClass.method() != o;
-                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) !={core::Object::==}{(core::Object) → core::bool} o;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} o);
   o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t45 = invalid-expression "pkg/front_end/testcases/none/equals.dart:361:31: Error: Too few positional arguments: 1 required, 0 given.
   o == nonNullableClass.method();
                               ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
-  o !={core::Object::==}{(core::Object) → core::bool} (let final Never #t46 = invalid-expression "pkg/front_end/testcases/none/equals.dart:362:31: Error: Too few positional arguments: 1 required, 0 given.
+  !(o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t46 = invalid-expression "pkg/front_end/testcases/none/equals.dart:362:31: Error: Too few positional arguments: 1 required, 0 given.
   o != nonNullableClass.method();
-                              ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
+                              ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}));
 }
 static method nullEqualsIndexGet(core::Map<core::int, core::String> map) → dynamic {
   map.{core::Map::[]}(0){(core::Object?) → core::String?} == null;
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
index be28553..81796a7 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
@@ -65,7 +65,7 @@
   self::expect("Mixin", m.{self::Mixin::method4}(0, 1){(core::int, core::int) → core::String});
 }
 static method expect(dynamic expected, dynamic actual) → void {
-  if(expected !={core::Object::==}{(core::Object) → core::bool} actual)
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 static method throws(() → void f) → void {
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect
index be28553..81796a7 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect
@@ -65,7 +65,7 @@
   self::expect("Mixin", m.{self::Mixin::method4}(0, 1){(core::int, core::int) → core::String});
 }
 static method expect(dynamic expected, dynamic actual) → void {
-  if(expected !={core::Object::==}{(core::Object) → core::bool} actual)
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 static method throws(() → void f) → void {
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
index be28553..81796a7 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
@@ -65,7 +65,7 @@
   self::expect("Mixin", m.{self::Mixin::method4}(0, 1){(core::int, core::int) → core::String});
 }
 static method expect(dynamic expected, dynamic actual) → void {
-  if(expected !={core::Object::==}{(core::Object) → core::bool} actual)
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 static method throws(() → void f) → void {
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect
index be28553..81796a7 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect
@@ -65,7 +65,7 @@
   self::expect("Mixin", m.{self::Mixin::method4}(0, 1){(core::int, core::int) → core::String});
 }
 static method expect(dynamic expected, dynamic actual) → void {
-  if(expected !={core::Object::==}{(core::Object) → core::bool} actual)
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 static method throws(() → void f) → void {
diff --git a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.expect b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.expect
index 6bbacdb..a213a54 100644
--- a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.expect
+++ b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.expect
@@ -46,10 +46,10 @@
   function local() → Null {}
   local(){() → Null};
   c =={core::Object::==}{(core::Object) → core::bool} d;
-  c !={core::Object::==}{(core::Object) → core::bool} d;
+  !(c =={core::Object::==}{(core::Object) → core::bool} d);
   c == null;
-  c != null;
+  !(c == null);
   d == null;
-  d != null;
+  !(d == null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.transformed.expect b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.transformed.expect
index 6bbacdb..a213a54 100644
--- a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.transformed.expect
@@ -46,10 +46,10 @@
   function local() → Null {}
   local(){() → Null};
   c =={core::Object::==}{(core::Object) → core::bool} d;
-  c !={core::Object::==}{(core::Object) → core::bool} d;
+  !(c =={core::Object::==}{(core::Object) → core::bool} d);
   c == null;
-  c != null;
+  !(c == null);
   d == null;
-  d != null;
+  !(d == null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.expect b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.expect
index 6bbacdb..a213a54 100644
--- a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.expect
+++ b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.expect
@@ -46,10 +46,10 @@
   function local() → Null {}
   local(){() → Null};
   c =={core::Object::==}{(core::Object) → core::bool} d;
-  c !={core::Object::==}{(core::Object) → core::bool} d;
+  !(c =={core::Object::==}{(core::Object) → core::bool} d);
   c == null;
-  c != null;
+  !(c == null);
   d == null;
-  d != null;
+  !(d == null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.transformed.expect b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.transformed.expect
index 6bbacdb..a213a54 100644
--- a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.transformed.expect
@@ -46,10 +46,10 @@
   function local() → Null {}
   local(){() → Null};
   c =={core::Object::==}{(core::Object) → core::bool} d;
-  c !={core::Object::==}{(core::Object) → core::bool} d;
+  !(c =={core::Object::==}{(core::Object) → core::bool} d);
   c == null;
-  c != null;
+  !(c == null);
   d == null;
-  d != null;
+  !(d == null);
 }
 static method main() → dynamic {}
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index d4edbf5..b19ad56 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -147,7 +147,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 56;
+  UInt32 formatVersion = 57;
   Byte[10] shortSdkHash;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
@@ -741,6 +741,19 @@
   MemberReference interfaceTargetOrigin; // May be NullReference.
 }
 
+type InstanceGetterInvocation extends Expression {
+  Byte tag = 89;
+  Byte kind; // Index into InstanceAccessKind above.
+  Byte flags (isInvariant, isBoundsSafe);
+  FileOffset fileOffset;
+  Expression receiver;
+  Name name;
+  Arguments arguments;
+  DartType functionType;
+  MemberReference interfaceTarget;
+  MemberReference interfaceTargetOrigin; // May be NullReference.
+}
+
 type DynamicInvocation extends Expression {
   Byte tag = 124;
   Byte kind; // Index into DynamicAccessKind above.
@@ -789,7 +802,6 @@
   Byte tag = 15;
   FileOffset fileOffset;
   Expression expression;
-  Byte isNot;
 }
 
 type EqualsCall extends Expression {
@@ -797,7 +809,6 @@
   FileOffset fileOffset;
   Expression left;
   Expression right;
-  Byte isNot;
   DartType functionType;
   MemberReference interfaceTarget;
   MemberReference interfaceTargetOrigin; // May be NullReference.
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 7e38523..a52a42c 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -5329,6 +5329,169 @@
   }
 }
 
+/// An invocation of an instance getter or field with a statically known
+/// interface target.
+///
+/// This is used only for web backend in order to support invocation of
+/// native properties as functions. This node will be removed when this
+/// invocation style is no longer supported.
+class InstanceGetterInvocation extends InvocationExpression {
+  // Must match serialized bit positions.
+  static const int FlagInvariant = 1 << 0;
+  static const int FlagBoundsSafe = 1 << 1;
+
+  final InstanceAccessKind kind;
+  Expression receiver;
+
+  @override
+  Name name;
+
+  @override
+  Arguments arguments;
+
+  int flags = 0;
+
+  /// The static type of the invocation.
+  ///
+  /// This includes substituted type parameters from the static receiver type
+  /// and generic type arguments.
+  ///
+  /// For instance
+  ///
+  ///    class A<T> {
+  ///      Map<T, S> map<S>(S s) { ... }
+  ///    }
+  ///    m(A<String> a) {
+  ///      a.map(0); // The function type is `Map<String, int> Function(int)`.
+  ///    }
+  ///
+  FunctionType functionType;
+
+  Reference interfaceTargetReference;
+
+  InstanceGetterInvocation(InstanceAccessKind kind, Expression receiver,
+      Name name, Arguments arguments,
+      {required Procedure interfaceTarget, required FunctionType functionType})
+      : this.byReference(kind, receiver, name, arguments,
+            interfaceTargetReference:
+                getNonNullableMemberReferenceGetter(interfaceTarget),
+            functionType: functionType);
+
+  InstanceGetterInvocation.byReference(
+      this.kind, this.receiver, this.name, this.arguments,
+      {required this.interfaceTargetReference, required this.functionType})
+      // ignore: unnecessary_null_comparison
+      : assert(interfaceTargetReference != null),
+        // ignore: unnecessary_null_comparison
+        assert(functionType != null),
+        assert(functionType.typeParameters.isEmpty) {
+    receiver.parent = this;
+    arguments.parent = this;
+  }
+
+  Member get interfaceTarget => interfaceTargetReference.asProcedure;
+
+  void set interfaceTarget(Member target) {
+    interfaceTargetReference = getNonNullableMemberReferenceGetter(target);
+  }
+
+  /// If `true`, this call is known to be safe wrt. parameter covariance checks.
+  ///
+  /// This is for instance the case in code patterns like this
+  ///
+  ///     List<int> list = <int>[];
+  ///     list.add(0);
+  ///
+  /// where the `list` variable is known to hold a value of the same type as
+  /// the static type. In contrast the would not be the case in code patterns
+  /// like this
+  ///
+  ///     List<num> list = <double>[];
+  ///     list.add(0); // Runtime error `int` is not a subtype of `double`.
+  ///
+  bool get isInvariant => flags & FlagInvariant != 0;
+
+  void set isInvariant(bool value) {
+    flags = value ? (flags | FlagInvariant) : (flags & ~FlagInvariant);
+  }
+
+  /// If `true`, this call is known to be safe wrt. parameter covariance checks.
+  ///
+  /// This is for instance the case in code patterns like this
+  ///
+  ///     List list = new List.filled(2, 0);
+  ///     list[1] = 42;
+  ///
+  /// where the `list` is known to have a sufficient length for the update
+  /// in `list[1] = 42`.
+  bool get isBoundsSafe => flags & FlagBoundsSafe != 0;
+
+  void set isBoundsSafe(bool value) {
+    flags = value ? (flags | FlagBoundsSafe) : (flags & ~FlagBoundsSafe);
+  }
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
+      functionType.returnType;
+
+  @override
+  R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceGetterInvocation(this);
+
+  @override
+  R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
+      v.visitInstanceGetterInvocation(this, arg);
+
+  @override
+  void visitChildren(Visitor v) {
+    receiver.accept(v);
+    interfaceTarget.acceptReference(v);
+    name.accept(v);
+    arguments.accept(v);
+  }
+
+  @override
+  void transformChildren(Transformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (arguments != null) {
+      arguments = v.transform(arguments);
+      arguments.parent = this;
+    }
+  }
+
+  @override
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    // ignore: unnecessary_null_comparison
+    if (receiver != null) {
+      receiver = v.transform(receiver);
+      receiver.parent = this;
+    }
+    // ignore: unnecessary_null_comparison
+    if (arguments != null) {
+      arguments = v.transform(arguments);
+      arguments.parent = this;
+    }
+  }
+
+  @override
+  String toString() {
+    return "InstanceGetterInvocation($kind, ${toStringInternal()})";
+  }
+
+  @override
+  void toTextInternal(AstPrinter printer) {
+    printer.writeExpression(receiver,
+        minimumPrecedence: astToText.Precedence.PRIMARY);
+    printer.write('.');
+    printer.writeInterfaceMemberName(interfaceTargetReference, name);
+    printer.writeArguments(arguments);
+  }
+}
+
 /// Access kind used by [FunctionInvocation] and [FunctionTearOff].
 enum FunctionAccessKind {
   /// An access to the 'call' method on an expression of static type `Function`.
@@ -5472,7 +5635,6 @@
 /// An invocation of a local function declaration.
 class LocalFunctionInvocation extends InvocationExpression {
   /// The variable declaration for the function declaration.
-  // TODO(johnniwinther): Should this be the `FunctionDeclaration` instead?
   VariableDeclaration variable;
 
   @override
@@ -5499,6 +5661,10 @@
     arguments.parent = this;
   }
 
+  /// The declaration for the invoked local function.
+  FunctionDeclaration get localFunction =>
+      variable.parent as FunctionDeclaration;
+
   @override
   Name get name => Name.callName;
 
@@ -5548,21 +5714,14 @@
   }
 }
 
-/// Nullness test of an expression, that is `e == null` or `e != null`.
+/// Nullness test of an expression, that is `e == null`.
 ///
-/// This is generated for code like `e1 == e2` and `e1 != e2` where `e1` or `e2`
-/// is `null`.
+/// This is generated for code like `e1 == e2` where `e1` or `e2` is `null`.
 class EqualsNull extends Expression {
   /// The expression tested for nullness.
   Expression expression;
 
-  /// If `true` this is an `e != null` test. Otherwise it is an `e == null`
-  /// test.
-  final bool isNot;
-
-  EqualsNull(this.expression, {required this.isNot})
-      // ignore: unnecessary_null_comparison
-      : assert(isNot != null) {
+  EqualsNull(this.expression) {
     expression.parent = this;
   }
 
@@ -5608,18 +5767,14 @@
   @override
   void toTextInternal(AstPrinter printer) {
     printer.writeExpression(expression, minimumPrecedence: precedence);
-    if (isNot) {
-      printer.write(' != null');
-    } else {
-      printer.write(' == null');
-    }
+    printer.write(' == null');
   }
 }
 
-/// A test of equality, that is `e1 == e2` or `e1 != e2`.
+/// A test of equality, that is `e1 == e2`.
 ///
-/// This is generated for code like `e1 == e2` and `e1 != e2` where neither `e1`
-/// nor `e2` is `null`.
+/// This is generated for code like `e1 == e2` where neither `e1` nor `e2` is
+/// `null`.
 class EqualsCall extends Expression {
   Expression left;
   Expression right;
@@ -5639,27 +5794,17 @@
   ///
   FunctionType functionType;
 
-  /// If `true` this is an `e1 != e2` test. Otherwise it is an `e1 == e2` test.
-  final bool isNot;
-
   Reference interfaceTargetReference;
 
   EqualsCall(Expression left, Expression right,
-      {required bool isNot,
-      required FunctionType functionType,
-      required Procedure interfaceTarget})
+      {required FunctionType functionType, required Procedure interfaceTarget})
       : this.byReference(left, right,
-            isNot: isNot,
             functionType: functionType,
             interfaceTargetReference:
                 getNonNullableMemberReferenceGetter(interfaceTarget));
 
   EqualsCall.byReference(this.left, this.right,
-      {required this.isNot,
-      required this.functionType,
-      required this.interfaceTargetReference})
-      // ignore: unnecessary_null_comparison
-      : assert(isNot != null) {
+      {required this.functionType, required this.interfaceTargetReference}) {
     left.parent = this;
     right.parent = this;
   }
@@ -5726,11 +5871,7 @@
   void toTextInternal(AstPrinter printer) {
     int minimumPrecedence = precedence;
     printer.writeExpression(left, minimumPrecedence: minimumPrecedence);
-    if (isNot) {
-      printer.write(' != ');
-    } else {
-      printer.write(' == ');
-    }
+    printer.write(' == ');
     printer.writeExpression(right, minimumPrecedence: minimumPrecedence + 1);
   }
 }
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 7da0618..5f9a62f3 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1936,6 +1936,8 @@
         return _readMethodInvocation();
       case Tag.InstanceInvocation:
         return _readInstanceInvocation();
+      case Tag.InstanceGetterInvocation:
+        return _readInstanceGetterInvocation();
       case Tag.DynamicInvocation:
         return _readDynamicInvocation();
       case Tag.FunctionInvocation:
@@ -2193,6 +2195,18 @@
       ..flags = flags;
   }
 
+  Expression _readInstanceGetterInvocation() {
+    InstanceAccessKind kind = InstanceAccessKind.values[readByte()];
+    int flags = readByte();
+    int offset = readOffset();
+    return new InstanceGetterInvocation.byReference(
+        kind, readExpression(), readName(), readArguments(),
+        functionType: readDartType() as FunctionType,
+        interfaceTargetReference: readNonNullInstanceMemberReference())
+      ..fileOffset = offset
+      ..flags = flags;
+  }
+
   Expression _readDynamicInvocation() {
     DynamicAccessKind kind = DynamicAccessKind.values[readByte()];
     int offset = readOffset();
@@ -2223,21 +2237,20 @@
   Expression _readLocalFunctionInvocation() {
     int offset = readOffset();
     readUInt30(); // offset of the variable declaration in the binary.
-    return new LocalFunctionInvocation(readVariableReference(), readArguments(),
+    VariableDeclaration variable = readVariableReference();
+    return new LocalFunctionInvocation(variable, readArguments(),
         functionType: readDartType() as FunctionType)
       ..fileOffset = offset;
   }
 
   Expression _readEqualsNull() {
     int offset = readOffset();
-    return new EqualsNull(readExpression(), isNot: readByte() == 1)
-      ..fileOffset = offset;
+    return new EqualsNull(readExpression())..fileOffset = offset;
   }
 
   Expression _readEqualsCall() {
     int offset = readOffset();
     return new EqualsCall.byReference(readExpression(), readExpression(),
-        isNot: readByte() == 1,
         functionType: readDartType() as FunctionType,
         interfaceTargetReference: readNonNullInstanceMemberReference())
       ..fileOffset = offset;
@@ -2768,8 +2781,8 @@
     int offset = readOffset();
     VariableDeclaration variable = readVariableDeclaration();
     variableStack.add(variable); // Will be popped by the enclosing scope.
-    FunctionNode function = readFunctionNode();
-    return new FunctionDeclaration(variable, function)..fileOffset = offset;
+    return new FunctionDeclaration(variable, readFunctionNode())
+      ..fileOffset = offset;
   }
 
   void _readSwitchCaseInto(SwitchCase caseNode) {
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index f9409b0..2c431e2 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -1557,7 +1557,6 @@
     writeOffset(node.fileOffset);
     writeNode(node.left);
     writeNode(node.right);
-    writeByte(node.isNot ? 1 : 0);
     writeDartType(node.functionType);
     writeNonNullInstanceMemberReference(node.interfaceTargetReference);
   }
@@ -1567,7 +1566,6 @@
     writeByte(Tag.EqualsNull);
     writeOffset(node.fileOffset);
     writeNode(node.expression);
-    writeByte(node.isNot ? 1 : 0);
   }
 
   @override
@@ -1595,6 +1593,19 @@
   }
 
   @override
+  void visitInstanceGetterInvocation(InstanceGetterInvocation node) {
+    writeByte(Tag.InstanceGetterInvocation);
+    writeByte(node.kind.index);
+    writeByte(node.flags);
+    writeOffset(node.fileOffset);
+    writeNode(node.receiver);
+    writeName(node.name);
+    writeArgumentsNode(node.arguments);
+    writeDartType(node.functionType);
+    writeNonNullInstanceMemberReference(node.interfaceTargetReference);
+  }
+
+  @override
   void visitLocalFunctionInvocation(LocalFunctionInvocation node) {
     writeByte(Tag.LocalFunctionInvocation);
     writeOffset(node.fileOffset);
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index c91a5e6..3b8d1ee 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -90,6 +90,7 @@
   static const int InstanceGet = 118;
   static const int InstanceSet = 119;
   static const int InstanceInvocation = 120;
+  static const int InstanceGetterInvocation = 89;
   static const int InstanceTearOff = 121;
   static const int DynamicGet = 122;
   static const int DynamicSet = 123;
@@ -124,6 +125,7 @@
 
   // Types
   static const int TypedefType = 87;
+  // 89 is occupied by [InstanceGetterInvocation] (expression).
   static const int InvalidType = 90;
   static const int DynamicType = 91;
   static const int VoidType = 92;
@@ -172,7 +174,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 56;
+  static const int BinaryFormatVersion = 57;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 69d6fd7..a04b607 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -466,7 +466,13 @@
 
   visitFunctionDeclaration(FunctionDeclaration node) {
     VariableDeclaration newVariable = clone(node.variable);
-    return new FunctionDeclaration(newVariable, clone(node.function!));
+    // Create the declaration before cloning the body to support recursive
+    // [LocalFunctionInvocation] nodes.
+    FunctionDeclaration declaration =
+        new FunctionDeclaration(newVariable, null);
+    FunctionNode functionNode = clone(node.function!);
+    declaration.function = functionNode..parent = declaration;
+    return declaration;
   }
 
   void prepareTypeParameters(List<TypeParameter> typeParameters) {
@@ -637,14 +643,13 @@
   @override
   TreeNode visitEqualsCall(EqualsCall node) {
     return new EqualsCall.byReference(clone(node.left), clone(node.right),
-        isNot: node.isNot,
         functionType: visitType(node.functionType) as FunctionType,
         interfaceTargetReference: node.interfaceTargetReference);
   }
 
   @override
   TreeNode visitEqualsNull(EqualsNull node) {
-    return new EqualsNull(clone(node.expression), isNot: node.isNot);
+    return new EqualsNull(clone(node.expression));
   }
 
   @override
@@ -671,6 +676,14 @@
   }
 
   @override
+  TreeNode visitInstanceGetterInvocation(InstanceGetterInvocation node) {
+    return new InstanceGetterInvocation.byReference(
+        node.kind, clone(node.receiver), node.name, clone(node.arguments),
+        functionType: visitType(node.functionType) as FunctionType,
+        interfaceTargetReference: node.interfaceTargetReference);
+  }
+
+  @override
   TreeNode visitInstanceSet(InstanceSet node) {
     return new InstanceSet.byReference(
         node.kind, clone(node.receiver), node.name, clone(node.value),
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index f8ffce6..26f4eec 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1501,11 +1501,7 @@
     int precedence = Precedence.EQUALITY;
     writeExpression(node.left, precedence);
     writeSpace();
-    if (node.isNot) {
-      writeSymbol('!=');
-    } else {
-      writeSymbol('==');
-    }
+    writeSymbol('==');
     writeInterfaceTarget(Name.equalsName, node.interfaceTargetReference);
     writeSymbol('{');
     writeType(node.functionType);
@@ -1517,11 +1513,7 @@
   visitEqualsNull(EqualsNull node) {
     writeExpression(node.expression, Precedence.EQUALITY);
     writeSpace();
-    if (node.isNot) {
-      writeSymbol('!=');
-    } else {
-      writeSymbol('==');
-    }
+    writeSymbol('==');
     writeSpace();
     writeSymbol('null');
   }
@@ -2739,6 +2731,9 @@
   int visitInstanceInvocation(InstanceInvocation node) => CALLEE;
 
   @override
+  int visitInstanceGetterInvocation(InstanceGetterInvocation node) => CALLEE;
+
+  @override
   int visitDynamicInvocation(DynamicInvocation node) => CALLEE;
 
   @override
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 7e0ad34..b1e4b75 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -747,43 +747,38 @@
 }
 
 TextSerializer<EqualsNull> equalsNullSerializer =
-    new Wrapped<Tuple2<Expression, bool>, EqualsNull>(
-        unwrapEqualsNull,
-        wrapEqualsNull,
-        new Tuple2Serializer(expressionSerializer, const DartBool()));
+    new Wrapped<Expression, EqualsNull>(
+        unwrapEqualsNull, wrapEqualsNull, expressionSerializer);
 
-Tuple2<Expression, bool> unwrapEqualsNull(EqualsNull expression) {
-  return new Tuple2(expression.expression, expression.isNot);
+Expression unwrapEqualsNull(EqualsNull expression) {
+  return expression.expression;
 }
 
-EqualsNull wrapEqualsNull(Tuple2<Expression, bool> tuple) {
-  return new EqualsNull(tuple.first, isNot: tuple.second);
+EqualsNull wrapEqualsNull(Expression expression) {
+  return new EqualsNull(expression);
 }
 
 TextSerializer<EqualsCall> equalsCallSerializer = new Wrapped<
-        Tuple5<Expression, Expression, bool, CanonicalName, DartType>,
-        EqualsCall>(
+        Tuple4<Expression, Expression, CanonicalName, DartType>, EqualsCall>(
     unwrapEqualsCall,
     wrapEqualsCall,
-    new Tuple5Serializer(expressionSerializer, expressionSerializer,
-        const DartBool(), const CanonicalNameSerializer(), dartTypeSerializer));
+    new Tuple4Serializer(expressionSerializer, expressionSerializer,
+        const CanonicalNameSerializer(), dartTypeSerializer));
 
-Tuple5<Expression, Expression, bool, CanonicalName, DartType> unwrapEqualsCall(
+Tuple4<Expression, Expression, CanonicalName, DartType> unwrapEqualsCall(
     EqualsCall expression) {
-  return new Tuple5(
+  return new Tuple4(
       expression.left,
       expression.right,
-      expression.isNot,
       expression.interfaceTargetReference.canonicalName,
       expression.functionType);
 }
 
 EqualsCall wrapEqualsCall(
-    Tuple5<Expression, Expression, bool, CanonicalName, DartType> tuple) {
+    Tuple4<Expression, Expression, CanonicalName, DartType> tuple) {
   return new EqualsCall.byReference(tuple.first, tuple.second,
-      isNot: tuple.third,
-      interfaceTargetReference: tuple.fourth.getReference(),
-      functionType: tuple.fifth);
+      interfaceTargetReference: tuple.third.getReference(),
+      functionType: tuple.fourth);
 }
 
 TextSerializer<SuperMethodInvocation> superMethodInvocationSerializer =
diff --git a/pkg/kernel/lib/transformations/value_class.dart b/pkg/kernel/lib/transformations/value_class.dart
index 0264e0a..5a5f424 100644
--- a/pkg/kernel/lib/transformations/value_class.dart
+++ b/pkg/kernel/lib/transformations/value_class.dart
@@ -52,7 +52,7 @@
   // V v;
   // (v as dynamic).copyWith() as V
   bool predicate(MethodInvocation node) {
-    return node.name.name == "copyWith" &&
+    return node.name.text == "copyWith" &&
         _isValueClassAsConstruct(node.receiver);
   }
 
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index a42bdc8..d078850 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -1156,6 +1156,19 @@
   }
 
   @override
+  DartType visitInstanceGetterInvocation(InstanceGetterInvocation node) {
+    // TODO(johnniwinther): Use embedded static type.
+    Member target = node.interfaceTarget;
+    assert(
+        !(target is Procedure &&
+            environment.isSpecialCasedBinaryOperator(target)),
+        "Unexpected instance getter invocation target: $target");
+    visitExpression(node.receiver);
+    return handleCall(node.arguments, target.getterType,
+        receiver: getReceiverType(node, node.receiver, node.interfaceTarget));
+  }
+
+  @override
   DartType visitInstanceSet(InstanceSet node) {
     DartType value = visitExpression(node.value);
     Substitution receiver =
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index ae54219..f4afa00 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -35,6 +35,8 @@
   R visitDynamicInvocation(DynamicInvocation node) => defaultExpression(node);
   R visitFunctionInvocation(FunctionInvocation node) => defaultExpression(node);
   R visitInstanceInvocation(InstanceInvocation node) => defaultExpression(node);
+  R visitInstanceGetterInvocation(InstanceGetterInvocation node) =>
+      defaultExpression(node);
   R visitEqualsNull(EqualsNull node) => defaultExpression(node);
   R visitEqualsCall(EqualsCall node) => defaultExpression(node);
   R visitMethodInvocation(MethodInvocation node) => defaultExpression(node);
@@ -207,6 +209,8 @@
   R visitDynamicInvocation(DynamicInvocation node) => defaultExpression(node);
   R visitFunctionInvocation(FunctionInvocation node) => defaultExpression(node);
   R visitInstanceInvocation(InstanceInvocation node) => defaultExpression(node);
+  R visitInstanceGetterInvocation(InstanceGetterInvocation node) =>
+      defaultExpression(node);
   R visitEqualsNull(EqualsNull node) => defaultExpression(node);
   R visitEqualsCall(EqualsCall node) => defaultExpression(node);
   R visitMethodInvocation(MethodInvocation node) => defaultExpression(node);
@@ -363,6 +367,8 @@
       defaultExpression(node, arg);
   R visitInstanceInvocation(InstanceInvocation node, A arg) =>
       defaultExpression(node, arg);
+  R visitInstanceGetterInvocation(InstanceGetterInvocation node, A arg) =>
+      defaultExpression(node, arg);
   R visitEqualsNull(EqualsNull node, A arg) => defaultExpression(node, arg);
   R visitEqualsCall(EqualsCall node, A arg) => defaultExpression(node, arg);
   R visitMethodInvocation(MethodInvocation node, A arg) =>
@@ -1450,6 +1456,8 @@
       defaultExpression(node, arg);
   R visitInstanceInvocation(InstanceInvocation node, T arg) =>
       defaultExpression(node, arg);
+  R visitInstanceGetterInvocation(InstanceGetterInvocation node, T arg) =>
+      defaultExpression(node, arg);
   R visitEqualsNull(EqualsNull node, T arg) => defaultExpression(node, arg);
   R visitEqualsCall(EqualsCall node, T arg) => defaultExpression(node, arg);
   R visitMethodInvocation(MethodInvocation node, T arg) =>
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
index 9f7415c..d8cacea 100644
--- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -232,7 +232,6 @@
     case kInvalidType:
     case kDynamicType:
     case kVoidType:
-    case kBottomType:
       // those contain nothing.
       break;
     case kNeverType:
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 1da5a95..7324e81 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -2135,7 +2135,6 @@
     case kInvalidType:
     case kDynamicType:
     case kVoidType:
-    case kBottomType:
       // those contain nothing.
       return;
     case kNeverType:
@@ -2985,11 +2984,6 @@
                     .ToNullability(nullability, Heap::kOld);
       break;
     }
-    case kBottomType:
-      // Map Bottom type to Null type until not emitted by CFE anymore.
-      result_ = IG->object_store()->null_type();
-      ASSERT(result_.IsNullable());
-      break;
     case kInterfaceType:
       BuildInterfaceType(false);
       break;
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 32f02f5..12d1c1e 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -1318,7 +1318,6 @@
     case kInvalidType:
     case kDynamicType:
     case kVoidType:
-    case kBottomType:
       // those contain nothing.
       return;
     case kNeverType:
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 472de49..1c29a5b 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,8 +20,8 @@
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
 
 // Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 56;
-static const uint32_t kMaxSupportedKernelFormatVersion = 56;
+static const uint32_t kMinSupportedKernelFormatVersion = 57;
+static const uint32_t kMaxSupportedKernelFormatVersion = 57;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
@@ -118,7 +118,6 @@
   V(AsyncForInStatement, 80)                                                   \
   V(AssertBlock, 81)                                                           \
   V(TypedefType, 87)                                                           \
-  V(BottomType, 89)                                                            \
   V(NeverType, 98)                                                             \
   V(InvalidType, 90)                                                           \
   V(DynamicType, 91)                                                           \
@@ -132,6 +131,7 @@
   V(InstanceGet, 118)                                                          \
   V(InstanceSet, 119)                                                          \
   V(InstanceInvocation, 120)                                                   \
+  V(InstanceGetterInvocation, 89)                                              \
   V(InstanceTearOff, 121)                                                      \
   V(DynamicGet, 122)                                                           \
   V(DynamicSet, 123)                                                           \