Version 2.14.0-337.0.dev

Merge commit '8e1fbc9ab3ab69add46054828ad2f380a4b46b3a' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 673386c..ded9980 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-07-16T15:43:40.485506",
+  "generated": "2021-07-19T10:44:52.605499",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -755,7 +755,7 @@
       "name": "vm",
       "rootUri": "../pkg/vm",
       "packageUri": "lib/",
-      "languageVersion": "2.7"
+      "languageVersion": "2.12"
     },
     {
       "name": "vm_service",
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index fe9e63c..1462633 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -72,39 +72,42 @@
   @override
   Class get actualCls => cls;
 
-  void addMember(Member member) {
-    if (member is Field) {
-      DillFieldBuilder builder = new DillFieldBuilder(member, this);
-      String name = member.name.text;
-      scopeBuilder.addMember(name, builder);
-    } else if (member is Procedure) {
-      String name = member.name.text;
-      switch (member.kind) {
-        case ProcedureKind.Factory:
-          constructorScopeBuilder.addMember(
-              name, new DillFactoryBuilder(member, this));
-          break;
-        case ProcedureKind.Setter:
-          scopeBuilder.addSetter(name, new DillSetterBuilder(member, this));
-          break;
-        case ProcedureKind.Getter:
-          scopeBuilder.addMember(name, new DillGetterBuilder(member, this));
-          break;
-        case ProcedureKind.Operator:
-          scopeBuilder.addMember(name, new DillOperatorBuilder(member, this));
-          break;
-        case ProcedureKind.Method:
-          scopeBuilder.addMember(name, new DillMethodBuilder(member, this));
-          break;
-      }
-    } else if (member is Constructor) {
-      DillConstructorBuilder builder =
-          new DillConstructorBuilder(member, null, this);
-      String name = member.name.text;
-      constructorScopeBuilder.addMember(name, builder);
-    } else {
-      throw new UnsupportedError(
-          "Unexpected class member ${member} (${member.runtimeType})");
+  void addField(Field field) {
+    DillFieldBuilder builder = new DillFieldBuilder(field, this);
+    String name = field.name.text;
+    scopeBuilder.addMember(name, builder);
+  }
+
+  void addConstructor(Constructor constructor, Procedure? constructorTearOff) {
+    DillConstructorBuilder builder =
+        new DillConstructorBuilder(constructor, constructorTearOff, this);
+    String name = constructor.name.text;
+    constructorScopeBuilder.addMember(name, builder);
+  }
+
+  void addFactory(Procedure factory, Procedure? factoryTearOff) {
+    String name = factory.name.text;
+    constructorScopeBuilder.addMember(
+        name, new DillFactoryBuilder(factory, factoryTearOff, this));
+  }
+
+  void addProcedure(Procedure procedure) {
+    String name = procedure.name.text;
+    switch (procedure.kind) {
+      case ProcedureKind.Factory:
+        throw new UnsupportedError("Use addFactory for adding factories");
+      case ProcedureKind.Setter:
+        scopeBuilder.addSetter(name, new DillSetterBuilder(procedure, this));
+        break;
+      case ProcedureKind.Getter:
+        scopeBuilder.addMember(name, new DillGetterBuilder(procedure, this));
+        break;
+      case ProcedureKind.Operator:
+        scopeBuilder.addMember(name, new DillOperatorBuilder(procedure, this));
+        break;
+      case ProcedureKind.Method:
+        scopeBuilder.addMember(name, new DillMethodBuilder(procedure, this));
+        break;
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index c899e3df..e52ce9a 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -10,6 +10,7 @@
     show
         Class,
         ConstantExpression,
+        Constructor,
         DartType,
         DynamicType,
         Expression,
@@ -48,6 +49,7 @@
         templateTypeNotFound,
         templateUnspecified;
 
+import '../kernel/constructor_tearoff_lowering.dart';
 import '../kernel/redirecting_factory_body.dart'
     show RedirectingFactoryBody, isRedirectingFactoryField;
 
@@ -167,10 +169,28 @@
   }
 
   void addClass(Class cls) {
-    DillClassBuilder classBulder = new DillClassBuilder(cls, this);
-    addBuilder(cls.name, classBulder, cls.fileOffset);
-    cls.procedures.forEach(classBulder.addMember);
-    cls.constructors.forEach(classBulder.addMember);
+    DillClassBuilder classBuilder = new DillClassBuilder(cls, this);
+    addBuilder(cls.name, classBuilder, cls.fileOffset);
+    Map<String, Procedure> tearOffs = {};
+    List<Procedure> nonTearOffs = [];
+    for (Procedure procedure in cls.procedures) {
+      String? name = extractConstructorNameFromTearOff(procedure.name);
+      if (name != null) {
+        tearOffs[name] = procedure;
+      } else {
+        nonTearOffs.add(procedure);
+      }
+    }
+    for (Procedure procedure in nonTearOffs) {
+      if (procedure.kind == ProcedureKind.Factory) {
+        classBuilder.addFactory(procedure, tearOffs[procedure.name.text]);
+      } else {
+        classBuilder.addProcedure(procedure);
+      }
+    }
+    for (Constructor constructor in cls.constructors) {
+      classBuilder.addConstructor(constructor, tearOffs[constructor.name.text]);
+    }
     for (Field field in cls.fields) {
       if (isRedirectingFactoryField(field)) {
         ListLiteral initializer = field.initializer as ListLiteral;
@@ -179,7 +199,7 @@
           RedirectingFactoryBody.restoreFromDill(get.target as Procedure);
         }
       } else {
-        classBulder.addMember(field);
+        classBuilder.addField(field);
       }
     }
   }
@@ -215,10 +235,6 @@
         addBuilder(name, new DillFieldBuilder(member, this), member.fileOffset);
       } else if (member is Procedure) {
         switch (member.kind) {
-          case ProcedureKind.Factory:
-            addBuilder(
-                name, new DillFactoryBuilder(member, this), member.fileOffset);
-            break;
           case ProcedureKind.Setter:
             addBuilder(
                 name, new DillSetterBuilder(member, this), member.fileOffset);
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index d076161..54a3158 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -188,13 +188,15 @@
 
 class DillFactoryBuilder extends DillMemberBuilder {
   final Procedure procedure;
+  final Procedure? _factoryTearOff;
 
-  DillFactoryBuilder(this.procedure, Builder parent) : super(procedure, parent);
+  DillFactoryBuilder(this.procedure, this._factoryTearOff, Builder parent)
+      : super(procedure, parent);
 
   Member get member => procedure;
 
   @override
-  Member? get readTarget => null;
+  Member? get readTarget => _factoryTearOff ?? procedure;
 
   @override
   Member? get writeTarget => null;
diff --git a/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart b/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
index d5c0140..f9863ea 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
@@ -8,14 +8,36 @@
 import '../builder/member_builder.dart';
 import '../source/source_library_builder.dart';
 
-/// Creates the synthesized name to use for the lowering of a generative
-/// constructor by the given [constructorName] in [library].
-Name constructorTearOffName(String constructorName, Library library) {
+const String _constructorTearOffNamePrefix = '_#';
+const String _constructorTearOffNameSuffix = '#tearOff';
+
+/// Creates the synthesized name to use for the lowering of the tear off of a
+/// constructor or factory by the given [name] in [library].
+Name constructorTearOffName(String name, Library library) {
   return new Name(
-      '_#${constructorName.isEmpty ? 'new' : constructorName}#tearOff',
+      '$_constructorTearOffNamePrefix'
+      '${name.isEmpty ? 'new' : name}'
+      '$_constructorTearOffNameSuffix',
       library);
 }
 
+/// Returns the name of the corresponding constructor or factory if [name] is
+/// the synthesized name of a lowering of the tear off of a constructor or
+/// factory. Returns `null` otherwise.
+String? extractConstructorNameFromTearOff(Name name) {
+  if (name.text.startsWith(_constructorTearOffNamePrefix) &&
+      name.text.endsWith(_constructorTearOffNameSuffix) &&
+      name.text.length >
+          _constructorTearOffNamePrefix.length +
+              _constructorTearOffNameSuffix.length) {
+    String text = name.text
+        .substring(0, name.text.length - _constructorTearOffNameSuffix.length);
+    text = text.substring(_constructorTearOffNamePrefix.length);
+    return text == 'new' ? '' : text;
+  }
+  return null;
+}
+
 /// Creates the [Procedure] for the lowering of a generative constructor of
 /// the given [name] in [compilationUnit].
 ///
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 6f4a1af..07ed5c1 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -142,7 +142,6 @@
 bslash
 buffered
 builder`s
-bulder
 bulk
 bump
 bypassing
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index c241a42..4d4aa59 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -121,9 +121,13 @@
 c3d
 c4a
 c4b
+c4c
+c4d
 c59cdee365b94ce066344840f9e3412d642019b
 c5a
 c5b
+c5c
+c5d
 c6a
 c6b
 c6c
@@ -331,6 +335,7 @@
 f4
 f4a
 f4b
+f4c
 f5a
 f5b
 f6a
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart
new file mode 100644
index 0000000..e9ac4b7
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'main_lib.dart';
+
+final bool inSoundMode = <int?>[] is! List<int>;
+
+main() {
+  var f1a = Class1.new;
+  var c1a = f1a();
+  expect(true, c1a is Class1);
+
+  dynamic f1b = Class1.new;
+  var c1b = f1b();
+  expect(true, c1b is Class1);
+
+  expect(true, identical(f1a, f1b));
+
+  var f2a = Class2.named;
+  var c2a = f2a();
+  expect(true, c2a is Class2);
+
+  dynamic f2b = Class2.named;
+  var c2b = f2b();
+  expect(true, c2b is Class2);
+
+  expect(true, identical(f2a, f2b));
+
+  var f3a = Class3.new;
+  var c3a = f3a(42);
+  expect(42, c3a.field);
+  () {
+    f3a(); // error
+    f3a(42, 87); // error
+  };
+
+  dynamic f3b = Class3.new;
+  var c3b = f3b(87);
+  expect(87, c3b.field);
+  throws(() => f3b());
+  throws(() => f3b(42, 87));
+
+  var f4a = Class4.new;
+  var c4a = f4a();
+  expect(true, c4a is Class4<dynamic>);
+  expect(false, c4a is Class4<int>);
+  var c4b = f4a<int>();
+  expect(true, c4b is Class4<int>);
+  expect(false, c4b is Class4<String>);
+  () {
+    f4a<int, String>(); // error
+  };
+
+  var f4b = f4a<int>;
+  var c4c = f4b();
+  expect(true, c4c is Class4<int>);
+  expect(false, c4c is Class4<String>);
+  () {
+    f4b<int>(); // error
+  };
+
+  dynamic f4c = Class4.new;
+  var c4d = f4c();
+  expect(true, c4d is Class4<dynamic>);
+  expect(false, c4d is Class4<int>);
+  throws(() => f4c<int, String>());
+
+  var f5a = Class5.new;
+  var c5a = f5a();
+  expect(true, c5a is Class5<num>);
+  expect(false, c5a is Class5<int>);
+  var c5b = f5a<int>();
+  expect(true, c5b is Class5<int>);
+  expect(false, c5b is Class5<double>);
+  () {
+    f5a<String>(); // error
+    f5a<int, String>(); // error
+  };
+
+  dynamic f5b = Class5.new;
+  var c5c = f5b();
+  expect(true, c5c is Class5<num>);
+  expect(false, c5c is Class5<int>);
+  var c5d = f5b<int>();
+  expect(true, c5d is Class5<int>);
+  expect(false, c5d is Class5<double>);
+  throws(() => f5b<String>());
+  throws(() => f5b<int, String>());
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
+
+throws(Function() f, {bool inSoundModeOnly: false}) {
+  try {
+    f();
+  } catch (e) {
+    print('Thrown: $e');
+    return;
+  }
+  if (!inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw 'Expected exception';
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.expect
new file mode 100644
index 0000000..d1c7116
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.expect
@@ -0,0 +1,193 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:34:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f3a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:35:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f3a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:52:8: Error: Expected 1 type arguments.
+//     f4a<int, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:60:8: Error: Expected 0 type arguments.
+//     f4b<int>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:77:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f5a<String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:78:8: Error: Expected 1 type arguments.
+//     f5a<int, String>(); // error
+//        ^
+//
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  () → mai::Class1 f1a = #C1;
+  mai::Class1 c1a = f1a(){() → mai::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} mai::Class1);
+  dynamic f1b = #C1;
+  dynamic c1b = f1b{dynamic}.call();
+  self::expect(true, c1b is{ForNonNullableByDefault} mai::Class1);
+  self::expect(true, core::identical(f1a, f1b));
+  () → mai::Class2 f2a = #C2;
+  mai::Class2 c2a = f2a(){() → mai::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} mai::Class2);
+  dynamic f2b = #C2;
+  dynamic c2b = f2b{dynamic}.call();
+  self::expect(true, c2b is{ForNonNullableByDefault} mai::Class2);
+  self::expect(true, core::identical(f2a, f2b));
+  (core::int) → mai::Class3 f3a = #C3;
+  mai::Class3 c3a = f3a(42){(core::int) → mai::Class3};
+  self::expect(42, c3a.{mai::Class3::field}{core::int});
+  () → Null {
+    let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:34:8: Error: Too few positional arguments: 1 required, 0 given.
+    f3a(); // error
+       ^" in f3a{<inapplicable>}.();
+    let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:35:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f3a(42, 87); // error
+       ^" in f3a{<inapplicable>}.(42, 87);
+  };
+  dynamic f3b = #C3;
+  dynamic c3b = f3b{dynamic}.call(87);
+  self::expect(87, c3b{dynamic}.field);
+  self::throws(() → dynamic => f3b{dynamic}.call());
+  self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
+  <T extends core::Object? = dynamic>() → mai::Class4<T%> f4a = #C4;
+  mai::Class4<dynamic> c4a = f4a<dynamic>(){() → mai::Class4<dynamic>};
+  self::expect(true, c4a is{ForNonNullableByDefault} mai::Class4<dynamic>);
+  self::expect(false, c4a is{ForNonNullableByDefault} mai::Class4<core::int>);
+  mai::Class4<core::int> c4b = f4a<core::int>(){() → mai::Class4<core::int>};
+  self::expect(true, c4b is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::expect(false, c4b is{ForNonNullableByDefault} mai::Class4<core::String>);
+  () → Null {
+    let final Never #t3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:52:8: Error: Expected 1 type arguments.
+    f4a<int, String>(); // error
+       ^" in f4a{<inapplicable>}.<core::int, core::String>();
+  };
+  () → mai::Class4<core::int> f4b = f4a<core::int>;
+  mai::Class4<core::int> c4c = f4b(){() → mai::Class4<core::int>};
+  self::expect(true, c4c is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::expect(false, c4c is{ForNonNullableByDefault} mai::Class4<core::String>);
+  () → Null {
+    let final Never #t4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:60:8: Error: Expected 0 type arguments.
+    f4b<int>(); // error
+       ^" in f4b{<inapplicable>}.<core::int>();
+  };
+  dynamic f4c = #C4;
+  dynamic c4d = f4c{dynamic}.call();
+  self::expect(true, c4d is{ForNonNullableByDefault} mai::Class4<dynamic>);
+  self::expect(false, c4d is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::throws(() → dynamic => f4c{dynamic}.call<core::int, core::String>());
+  <T extends core::num>() → mai::Class5<T> f5a = #C5;
+  mai::Class5<core::num> c5a = f5a<core::num>(){() → mai::Class5<core::num>};
+  self::expect(true, c5a is{ForNonNullableByDefault} mai::Class5<core::num>);
+  self::expect(false, c5a is{ForNonNullableByDefault} mai::Class5<core::int>);
+  mai::Class5<core::int> c5b = f5a<core::int>(){() → mai::Class5<core::int>};
+  self::expect(true, c5b is{ForNonNullableByDefault} mai::Class5<core::int>);
+  self::expect(false, c5b is{ForNonNullableByDefault} mai::Class5<core::double>);
+  () → Null {
+    f5a<core::String>(){() → mai::Class5<core::String>};
+    let final Never #t5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:78:8: Error: Expected 1 type arguments.
+    f5a<int, String>(); // error
+       ^" in f5a{<inapplicable>}.<core::int, core::String>();
+  };
+  dynamic f5b = #C5;
+  dynamic c5c = f5b{dynamic}.call();
+  self::expect(true, c5c is{ForNonNullableByDefault} mai::Class5<core::num>);
+  self::expect(false, c5c is{ForNonNullableByDefault} mai::Class5<core::int>);
+  dynamic c5d = f5b{dynamic}.call<core::int>();
+  self::expect(true, c5d is{ForNonNullableByDefault} mai::Class5<core::int>);
+  self::expect(false, c5d is{ForNonNullableByDefault} mai::Class5<core::double>);
+  self::throws(() → dynamic => f5b{dynamic}.call<core::String>());
+  self::throws(() → dynamic => f5b{dynamic}.call<core::int, core::String>());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → mai::Class1
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → mai::Class1
+    return new mai::Class1::•();
+}
+class Class2 extends core::Object {
+  constructor named() → mai::Class2
+    : super core::Object::•()
+    ;
+  static method _#named#tearOff() → mai::Class2
+    return new mai::Class2::named();
+}
+class Class3 extends core::Object {
+  final field core::int field;
+  constructor •(core::int field) → mai::Class3
+    : mai::Class3::field = field, super core::Object::•()
+    ;
+  static method _#new#tearOff(core::int field) → mai::Class3
+    return new mai::Class3::•(field);
+}
+class Class4<T extends core::Object? = dynamic> extends core::Object {
+  constructor _() → mai::Class4<mai::Class4::T%>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#_#tearOff::T%>
+    return new mai::Class4::_<mai::Class4::_#_#tearOff::T%>();
+  static factory •<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::•::T%>
+    return new mai::Class4::_<mai::Class4::•::T%>();
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#new#tearOff::T%>
+    return mai::Class4::•<mai::Class4::_#new#tearOff::T%>();
+}
+class Class5<T extends core::num> extends core::Object {
+  constructor _() → mai::Class5<mai::Class5::T>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends core::num>() → mai::Class5<mai::Class5::_#_#tearOff::T>
+    return new mai::Class5::_<mai::Class5::_#_#tearOff::T>();
+  static factory •<T extends core::num>() → mai::Class5<mai::Class5::•::T>
+    return new mai::Class5::_<mai::Class5::•::T>();
+  static method _#new#tearOff<T extends core::num>() → mai::Class5<mai::Class5::_#new#tearOff::T>
+    return mai::Class5::•<mai::Class5::_#new#tearOff::T>();
+}
+
+constants  {
+  #C1 = tearoff mai::Class1::_#new#tearOff
+  #C2 = tearoff mai::Class2::_#named#tearOff
+  #C3 = tearoff mai::Class3::_#new#tearOff
+  #C4 = tearoff mai::Class4::_#new#tearOff
+  #C5 = tearoff mai::Class5::_#new#tearOff
+  #C6 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.transformed.expect
new file mode 100644
index 0000000..f476c02
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.transformed.expect
@@ -0,0 +1,193 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:34:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f3a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:35:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f3a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:52:8: Error: Expected 1 type arguments.
+//     f4a<int, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:60:8: Error: Expected 0 type arguments.
+//     f4b<int>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:77:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f5a<String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:78:8: Error: Expected 1 type arguments.
+//     f5a<int, String>(); // error
+//        ^
+//
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  () → mai::Class1 f1a = #C1;
+  mai::Class1 c1a = f1a(){() → mai::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} mai::Class1);
+  dynamic f1b = #C1;
+  dynamic c1b = f1b{dynamic}.call();
+  self::expect(true, c1b is{ForNonNullableByDefault} mai::Class1);
+  self::expect(true, core::identical(f1a, f1b));
+  () → mai::Class2 f2a = #C2;
+  mai::Class2 c2a = f2a(){() → mai::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} mai::Class2);
+  dynamic f2b = #C2;
+  dynamic c2b = f2b{dynamic}.call();
+  self::expect(true, c2b is{ForNonNullableByDefault} mai::Class2);
+  self::expect(true, core::identical(f2a, f2b));
+  (core::int) → mai::Class3 f3a = #C3;
+  mai::Class3 c3a = f3a(42){(core::int) → mai::Class3};
+  self::expect(42, c3a.{mai::Class3::field}{core::int});
+  () → Null {
+    let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:34:8: Error: Too few positional arguments: 1 required, 0 given.
+    f3a(); // error
+       ^" in f3a{<inapplicable>}.();
+    let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:35:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f3a(42, 87); // error
+       ^" in f3a{<inapplicable>}.(42, 87);
+  };
+  dynamic f3b = #C3;
+  dynamic c3b = f3b{dynamic}.call(87);
+  self::expect(87, c3b{dynamic}.field);
+  self::throws(() → dynamic => f3b{dynamic}.call());
+  self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
+  <T extends core::Object? = dynamic>() → mai::Class4<T%> f4a = #C4;
+  mai::Class4<dynamic> c4a = f4a<dynamic>(){() → mai::Class4<dynamic>};
+  self::expect(true, c4a is{ForNonNullableByDefault} mai::Class4<dynamic>);
+  self::expect(false, c4a is{ForNonNullableByDefault} mai::Class4<core::int>);
+  mai::Class4<core::int> c4b = f4a<core::int>(){() → mai::Class4<core::int>};
+  self::expect(true, c4b is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::expect(false, c4b is{ForNonNullableByDefault} mai::Class4<core::String>);
+  () → Null {
+    let final Never #t3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:52:8: Error: Expected 1 type arguments.
+    f4a<int, String>(); // error
+       ^" in f4a{<inapplicable>}.<core::int, core::String>();
+  };
+  () → mai::Class4<core::int> f4b = f4a<core::int>;
+  mai::Class4<core::int> c4c = f4b(){() → mai::Class4<core::int>};
+  self::expect(true, c4c is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::expect(false, c4c is{ForNonNullableByDefault} mai::Class4<core::String>);
+  () → Null {
+    let final Never #t4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:60:8: Error: Expected 0 type arguments.
+    f4b<int>(); // error
+       ^" in f4b{<inapplicable>}.<core::int>();
+  };
+  dynamic f4c = #C4;
+  dynamic c4d = f4c{dynamic}.call();
+  self::expect(true, c4d is{ForNonNullableByDefault} mai::Class4<dynamic>);
+  self::expect(false, c4d is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::throws(() → dynamic => f4c{dynamic}.call<core::int, core::String>());
+  <T extends core::num>() → mai::Class5<T> f5a = #C5;
+  mai::Class5<core::num> c5a = f5a<core::num>(){() → mai::Class5<core::num>};
+  self::expect(true, c5a is{ForNonNullableByDefault} mai::Class5<core::num>);
+  self::expect(false, c5a is{ForNonNullableByDefault} mai::Class5<core::int>);
+  mai::Class5<core::int> c5b = f5a<core::int>(){() → mai::Class5<core::int>};
+  self::expect(true, c5b is{ForNonNullableByDefault} mai::Class5<core::int>);
+  self::expect(false, c5b is{ForNonNullableByDefault} mai::Class5<core::double>);
+  () → Null {
+    f5a<core::String>(){() → mai::Class5<core::String>};
+    let final Never #t5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:78:8: Error: Expected 1 type arguments.
+    f5a<int, String>(); // error
+       ^" in f5a{<inapplicable>}.<core::int, core::String>();
+  };
+  dynamic f5b = #C5;
+  dynamic c5c = f5b{dynamic}.call();
+  self::expect(true, c5c is{ForNonNullableByDefault} mai::Class5<core::num>);
+  self::expect(false, c5c is{ForNonNullableByDefault} mai::Class5<core::int>);
+  dynamic c5d = f5b{dynamic}.call<core::int>();
+  self::expect(true, c5d is{ForNonNullableByDefault} mai::Class5<core::int>);
+  self::expect(false, c5d is{ForNonNullableByDefault} mai::Class5<core::double>);
+  self::throws(() → dynamic => f5b{dynamic}.call<core::String>());
+  self::throws(() → dynamic => f5b{dynamic}.call<core::int, core::String>());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → mai::Class1
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → mai::Class1
+    return new mai::Class1::•();
+}
+class Class2 extends core::Object {
+  constructor named() → mai::Class2
+    : super core::Object::•()
+    ;
+  static method _#named#tearOff() → mai::Class2
+    return new mai::Class2::named();
+}
+class Class3 extends core::Object {
+  final field core::int field;
+  constructor •(core::int field) → mai::Class3
+    : mai::Class3::field = field, super core::Object::•()
+    ;
+  static method _#new#tearOff(core::int field) → mai::Class3
+    return new mai::Class3::•(field);
+}
+class Class4<T extends core::Object? = dynamic> extends core::Object {
+  constructor _() → mai::Class4<mai::Class4::T%>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#_#tearOff::T%>
+    return new mai::Class4::_<mai::Class4::_#_#tearOff::T%>();
+  static factory •<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::•::T%>
+    return new mai::Class4::_<mai::Class4::•::T%>();
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#new#tearOff::T%>
+    return mai::Class4::•<mai::Class4::_#new#tearOff::T%>();
+}
+class Class5<T extends core::num> extends core::Object {
+  constructor _() → mai::Class5<mai::Class5::T>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends core::num>() → mai::Class5<mai::Class5::_#_#tearOff::T>
+    return new mai::Class5::_<mai::Class5::_#_#tearOff::T>();
+  static factory •<T extends core::num>() → mai::Class5<mai::Class5::•::T>
+    return new mai::Class5::_<mai::Class5::•::T>();
+  static method _#new#tearOff<T extends core::num>() → mai::Class5<mai::Class5::_#new#tearOff::T>
+    return mai::Class5::•<mai::Class5::_#new#tearOff::T>();
+}
+
+constants  {
+  #C1 = tearoff mai::Class1::_#new#tearOff
+  #C2 = tearoff mai::Class2::_#named#tearOff
+  #C3 = tearoff mai::Class3::_#new#tearOff
+  #C4 = tearoff mai::Class4::_#new#tearOff
+  #C5 = tearoff mai::Class5::_#new#tearOff
+  #C6 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.textual_outline.expect
new file mode 100644
index 0000000..4166ca7
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+import 'main_lib.dart';
+
+final bool inSoundMode = <int?>[] is! List<int>;
+main() {}
+expect(expected, actual) {}
+throws(Function() f, {bool inSoundModeOnly: false}) {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..26f0c41
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+import 'main_lib.dart';
+
+expect(expected, actual) {}
+final bool inSoundMode = <int?>[] is! List<int>;
+main() {}
+throws(Function() f, {bool inSoundModeOnly: false}) {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.expect
new file mode 100644
index 0000000..d1c7116
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.expect
@@ -0,0 +1,193 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:34:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f3a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:35:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f3a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:52:8: Error: Expected 1 type arguments.
+//     f4a<int, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:60:8: Error: Expected 0 type arguments.
+//     f4b<int>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:77:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f5a<String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:78:8: Error: Expected 1 type arguments.
+//     f5a<int, String>(); // error
+//        ^
+//
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  () → mai::Class1 f1a = #C1;
+  mai::Class1 c1a = f1a(){() → mai::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} mai::Class1);
+  dynamic f1b = #C1;
+  dynamic c1b = f1b{dynamic}.call();
+  self::expect(true, c1b is{ForNonNullableByDefault} mai::Class1);
+  self::expect(true, core::identical(f1a, f1b));
+  () → mai::Class2 f2a = #C2;
+  mai::Class2 c2a = f2a(){() → mai::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} mai::Class2);
+  dynamic f2b = #C2;
+  dynamic c2b = f2b{dynamic}.call();
+  self::expect(true, c2b is{ForNonNullableByDefault} mai::Class2);
+  self::expect(true, core::identical(f2a, f2b));
+  (core::int) → mai::Class3 f3a = #C3;
+  mai::Class3 c3a = f3a(42){(core::int) → mai::Class3};
+  self::expect(42, c3a.{mai::Class3::field}{core::int});
+  () → Null {
+    let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:34:8: Error: Too few positional arguments: 1 required, 0 given.
+    f3a(); // error
+       ^" in f3a{<inapplicable>}.();
+    let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:35:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f3a(42, 87); // error
+       ^" in f3a{<inapplicable>}.(42, 87);
+  };
+  dynamic f3b = #C3;
+  dynamic c3b = f3b{dynamic}.call(87);
+  self::expect(87, c3b{dynamic}.field);
+  self::throws(() → dynamic => f3b{dynamic}.call());
+  self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
+  <T extends core::Object? = dynamic>() → mai::Class4<T%> f4a = #C4;
+  mai::Class4<dynamic> c4a = f4a<dynamic>(){() → mai::Class4<dynamic>};
+  self::expect(true, c4a is{ForNonNullableByDefault} mai::Class4<dynamic>);
+  self::expect(false, c4a is{ForNonNullableByDefault} mai::Class4<core::int>);
+  mai::Class4<core::int> c4b = f4a<core::int>(){() → mai::Class4<core::int>};
+  self::expect(true, c4b is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::expect(false, c4b is{ForNonNullableByDefault} mai::Class4<core::String>);
+  () → Null {
+    let final Never #t3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:52:8: Error: Expected 1 type arguments.
+    f4a<int, String>(); // error
+       ^" in f4a{<inapplicable>}.<core::int, core::String>();
+  };
+  () → mai::Class4<core::int> f4b = f4a<core::int>;
+  mai::Class4<core::int> c4c = f4b(){() → mai::Class4<core::int>};
+  self::expect(true, c4c is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::expect(false, c4c is{ForNonNullableByDefault} mai::Class4<core::String>);
+  () → Null {
+    let final Never #t4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:60:8: Error: Expected 0 type arguments.
+    f4b<int>(); // error
+       ^" in f4b{<inapplicable>}.<core::int>();
+  };
+  dynamic f4c = #C4;
+  dynamic c4d = f4c{dynamic}.call();
+  self::expect(true, c4d is{ForNonNullableByDefault} mai::Class4<dynamic>);
+  self::expect(false, c4d is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::throws(() → dynamic => f4c{dynamic}.call<core::int, core::String>());
+  <T extends core::num>() → mai::Class5<T> f5a = #C5;
+  mai::Class5<core::num> c5a = f5a<core::num>(){() → mai::Class5<core::num>};
+  self::expect(true, c5a is{ForNonNullableByDefault} mai::Class5<core::num>);
+  self::expect(false, c5a is{ForNonNullableByDefault} mai::Class5<core::int>);
+  mai::Class5<core::int> c5b = f5a<core::int>(){() → mai::Class5<core::int>};
+  self::expect(true, c5b is{ForNonNullableByDefault} mai::Class5<core::int>);
+  self::expect(false, c5b is{ForNonNullableByDefault} mai::Class5<core::double>);
+  () → Null {
+    f5a<core::String>(){() → mai::Class5<core::String>};
+    let final Never #t5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:78:8: Error: Expected 1 type arguments.
+    f5a<int, String>(); // error
+       ^" in f5a{<inapplicable>}.<core::int, core::String>();
+  };
+  dynamic f5b = #C5;
+  dynamic c5c = f5b{dynamic}.call();
+  self::expect(true, c5c is{ForNonNullableByDefault} mai::Class5<core::num>);
+  self::expect(false, c5c is{ForNonNullableByDefault} mai::Class5<core::int>);
+  dynamic c5d = f5b{dynamic}.call<core::int>();
+  self::expect(true, c5d is{ForNonNullableByDefault} mai::Class5<core::int>);
+  self::expect(false, c5d is{ForNonNullableByDefault} mai::Class5<core::double>);
+  self::throws(() → dynamic => f5b{dynamic}.call<core::String>());
+  self::throws(() → dynamic => f5b{dynamic}.call<core::int, core::String>());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → mai::Class1
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → mai::Class1
+    return new mai::Class1::•();
+}
+class Class2 extends core::Object {
+  constructor named() → mai::Class2
+    : super core::Object::•()
+    ;
+  static method _#named#tearOff() → mai::Class2
+    return new mai::Class2::named();
+}
+class Class3 extends core::Object {
+  final field core::int field;
+  constructor •(core::int field) → mai::Class3
+    : mai::Class3::field = field, super core::Object::•()
+    ;
+  static method _#new#tearOff(core::int field) → mai::Class3
+    return new mai::Class3::•(field);
+}
+class Class4<T extends core::Object? = dynamic> extends core::Object {
+  constructor _() → mai::Class4<mai::Class4::T%>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#_#tearOff::T%>
+    return new mai::Class4::_<mai::Class4::_#_#tearOff::T%>();
+  static factory •<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::•::T%>
+    return new mai::Class4::_<mai::Class4::•::T%>();
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#new#tearOff::T%>
+    return mai::Class4::•<mai::Class4::_#new#tearOff::T%>();
+}
+class Class5<T extends core::num> extends core::Object {
+  constructor _() → mai::Class5<mai::Class5::T>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends core::num>() → mai::Class5<mai::Class5::_#_#tearOff::T>
+    return new mai::Class5::_<mai::Class5::_#_#tearOff::T>();
+  static factory •<T extends core::num>() → mai::Class5<mai::Class5::•::T>
+    return new mai::Class5::_<mai::Class5::•::T>();
+  static method _#new#tearOff<T extends core::num>() → mai::Class5<mai::Class5::_#new#tearOff::T>
+    return mai::Class5::•<mai::Class5::_#new#tearOff::T>();
+}
+
+constants  {
+  #C1 = tearoff mai::Class1::_#new#tearOff
+  #C2 = tearoff mai::Class2::_#named#tearOff
+  #C3 = tearoff mai::Class3::_#new#tearOff
+  #C4 = tearoff mai::Class4::_#new#tearOff
+  #C5 = tearoff mai::Class5::_#new#tearOff
+  #C6 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.outline.expect
new file mode 100644
index 0000000..2591204
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.outline.expect
@@ -0,0 +1,57 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static final field core::bool inSoundMode;
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+static method throws(() → dynamic f, {core::bool inSoundModeOnly}) → dynamic
+  ;
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self2::Class1
+    ;
+  static method _#new#tearOff() → self2::Class1
+    return new self2::Class1::•();
+}
+class Class2 extends core::Object {
+  constructor named() → self2::Class2
+    ;
+  static method _#named#tearOff() → self2::Class2
+    return new self2::Class2::named();
+}
+class Class3 extends core::Object {
+  final field core::int field;
+  constructor •(core::int field) → self2::Class3
+    ;
+  static method _#new#tearOff(core::int field) → self2::Class3
+    return new self2::Class3::•(field);
+}
+class Class4<T extends core::Object? = dynamic> extends core::Object {
+  constructor _() → self2::Class4<self2::Class4::T%>
+    ;
+  static method _#_#tearOff<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::_#_#tearOff::T%>
+    return new self2::Class4::_<self2::Class4::_#_#tearOff::T%>();
+  static factory •<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::•::T%>
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::_#new#tearOff::T%>
+    return self2::Class4::•<self2::Class4::_#new#tearOff::T%>();
+}
+class Class5<T extends core::num> extends core::Object {
+  constructor _() → self2::Class5<self2::Class5::T>
+    ;
+  static method _#_#tearOff<T extends core::num>() → self2::Class5<self2::Class5::_#_#tearOff::T>
+    return new self2::Class5::_<self2::Class5::_#_#tearOff::T>();
+  static factory •<T extends core::num>() → self2::Class5<self2::Class5::•::T>
+    ;
+  static method _#new#tearOff<T extends core::num>() → self2::Class5<self2::Class5::_#new#tearOff::T>
+    return self2::Class5::•<self2::Class5::_#new#tearOff::T>();
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..f476c02
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.transformed.expect
@@ -0,0 +1,193 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:34:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f3a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:35:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f3a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:52:8: Error: Expected 1 type arguments.
+//     f4a<int, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:60:8: Error: Expected 0 type arguments.
+//     f4b<int>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:77:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f5a<String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:78:8: Error: Expected 1 type arguments.
+//     f5a<int, String>(); // error
+//        ^
+//
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  () → mai::Class1 f1a = #C1;
+  mai::Class1 c1a = f1a(){() → mai::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} mai::Class1);
+  dynamic f1b = #C1;
+  dynamic c1b = f1b{dynamic}.call();
+  self::expect(true, c1b is{ForNonNullableByDefault} mai::Class1);
+  self::expect(true, core::identical(f1a, f1b));
+  () → mai::Class2 f2a = #C2;
+  mai::Class2 c2a = f2a(){() → mai::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} mai::Class2);
+  dynamic f2b = #C2;
+  dynamic c2b = f2b{dynamic}.call();
+  self::expect(true, c2b is{ForNonNullableByDefault} mai::Class2);
+  self::expect(true, core::identical(f2a, f2b));
+  (core::int) → mai::Class3 f3a = #C3;
+  mai::Class3 c3a = f3a(42){(core::int) → mai::Class3};
+  self::expect(42, c3a.{mai::Class3::field}{core::int});
+  () → Null {
+    let final Never #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:34:8: Error: Too few positional arguments: 1 required, 0 given.
+    f3a(); // error
+       ^" in f3a{<inapplicable>}.();
+    let final Never #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:35:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f3a(42, 87); // error
+       ^" in f3a{<inapplicable>}.(42, 87);
+  };
+  dynamic f3b = #C3;
+  dynamic c3b = f3b{dynamic}.call(87);
+  self::expect(87, c3b{dynamic}.field);
+  self::throws(() → dynamic => f3b{dynamic}.call());
+  self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
+  <T extends core::Object? = dynamic>() → mai::Class4<T%> f4a = #C4;
+  mai::Class4<dynamic> c4a = f4a<dynamic>(){() → mai::Class4<dynamic>};
+  self::expect(true, c4a is{ForNonNullableByDefault} mai::Class4<dynamic>);
+  self::expect(false, c4a is{ForNonNullableByDefault} mai::Class4<core::int>);
+  mai::Class4<core::int> c4b = f4a<core::int>(){() → mai::Class4<core::int>};
+  self::expect(true, c4b is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::expect(false, c4b is{ForNonNullableByDefault} mai::Class4<core::String>);
+  () → Null {
+    let final Never #t3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:52:8: Error: Expected 1 type arguments.
+    f4a<int, String>(); // error
+       ^" in f4a{<inapplicable>}.<core::int, core::String>();
+  };
+  () → mai::Class4<core::int> f4b = f4a<core::int>;
+  mai::Class4<core::int> c4c = f4b(){() → mai::Class4<core::int>};
+  self::expect(true, c4c is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::expect(false, c4c is{ForNonNullableByDefault} mai::Class4<core::String>);
+  () → Null {
+    let final Never #t4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:60:8: Error: Expected 0 type arguments.
+    f4b<int>(); // error
+       ^" in f4b{<inapplicable>}.<core::int>();
+  };
+  dynamic f4c = #C4;
+  dynamic c4d = f4c{dynamic}.call();
+  self::expect(true, c4d is{ForNonNullableByDefault} mai::Class4<dynamic>);
+  self::expect(false, c4d is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::throws(() → dynamic => f4c{dynamic}.call<core::int, core::String>());
+  <T extends core::num>() → mai::Class5<T> f5a = #C5;
+  mai::Class5<core::num> c5a = f5a<core::num>(){() → mai::Class5<core::num>};
+  self::expect(true, c5a is{ForNonNullableByDefault} mai::Class5<core::num>);
+  self::expect(false, c5a is{ForNonNullableByDefault} mai::Class5<core::int>);
+  mai::Class5<core::int> c5b = f5a<core::int>(){() → mai::Class5<core::int>};
+  self::expect(true, c5b is{ForNonNullableByDefault} mai::Class5<core::int>);
+  self::expect(false, c5b is{ForNonNullableByDefault} mai::Class5<core::double>);
+  () → Null {
+    f5a<core::String>(){() → mai::Class5<core::String>};
+    let final Never #t5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:78:8: Error: Expected 1 type arguments.
+    f5a<int, String>(); // error
+       ^" in f5a{<inapplicable>}.<core::int, core::String>();
+  };
+  dynamic f5b = #C5;
+  dynamic c5c = f5b{dynamic}.call();
+  self::expect(true, c5c is{ForNonNullableByDefault} mai::Class5<core::num>);
+  self::expect(false, c5c is{ForNonNullableByDefault} mai::Class5<core::int>);
+  dynamic c5d = f5b{dynamic}.call<core::int>();
+  self::expect(true, c5d is{ForNonNullableByDefault} mai::Class5<core::int>);
+  self::expect(false, c5d is{ForNonNullableByDefault} mai::Class5<core::double>);
+  self::throws(() → dynamic => f5b{dynamic}.call<core::String>());
+  self::throws(() → dynamic => f5b{dynamic}.call<core::int, core::String>());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → mai::Class1
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → mai::Class1
+    return new mai::Class1::•();
+}
+class Class2 extends core::Object {
+  constructor named() → mai::Class2
+    : super core::Object::•()
+    ;
+  static method _#named#tearOff() → mai::Class2
+    return new mai::Class2::named();
+}
+class Class3 extends core::Object {
+  final field core::int field;
+  constructor •(core::int field) → mai::Class3
+    : mai::Class3::field = field, super core::Object::•()
+    ;
+  static method _#new#tearOff(core::int field) → mai::Class3
+    return new mai::Class3::•(field);
+}
+class Class4<T extends core::Object? = dynamic> extends core::Object {
+  constructor _() → mai::Class4<mai::Class4::T%>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#_#tearOff::T%>
+    return new mai::Class4::_<mai::Class4::_#_#tearOff::T%>();
+  static factory •<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::•::T%>
+    return new mai::Class4::_<mai::Class4::•::T%>();
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#new#tearOff::T%>
+    return mai::Class4::•<mai::Class4::_#new#tearOff::T%>();
+}
+class Class5<T extends core::num> extends core::Object {
+  constructor _() → mai::Class5<mai::Class5::T>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends core::num>() → mai::Class5<mai::Class5::_#_#tearOff::T>
+    return new mai::Class5::_<mai::Class5::_#_#tearOff::T>();
+  static factory •<T extends core::num>() → mai::Class5<mai::Class5::•::T>
+    return new mai::Class5::_<mai::Class5::•::T>();
+  static method _#new#tearOff<T extends core::num>() → mai::Class5<mai::Class5::_#new#tearOff::T>
+    return mai::Class5::•<mai::Class5::_#new#tearOff::T>();
+}
+
+constants  {
+  #C1 = tearoff mai::Class1::_#new#tearOff
+  #C2 = tearoff mai::Class2::_#named#tearOff
+  #C3 = tearoff mai::Class3::_#new#tearOff
+  #C4 = tearoff mai::Class4::_#new#tearOff
+  #C5 = tearoff mai::Class5::_#new#tearOff
+  #C6 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main_lib.dart b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main_lib.dart
new file mode 100644
index 0000000..f50d3cd
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main_lib.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class1 {}
+
+class Class2 {
+  Class2.named();
+}
+
+class Class3 {
+  final int field;
+
+  Class3(this.field);
+}
+
+class Class4<T> {
+  Class4._();
+  factory Class4() => new Class4<T>._();
+}
+
+class Class5<T extends num> {
+  Class5._();
+  factory Class5() => new Class5<T>._();
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/test.options b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/test.options
new file mode 100644
index 0000000..bfe6dc8
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/test.options
@@ -0,0 +1 @@
+main_lib.dart
\ No newline at end of file
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 3f78529..03628bb 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -13477,7 +13477,7 @@
   /// Write List<Byte> into the sink.
   void writeByteList(List<int> bytes);
 
-  void writeNullAllowedCanonicalNameReference(CanonicalName name);
+  void writeNullAllowedCanonicalNameReference(CanonicalName? name);
   void writeStringReference(String str);
   void writeName(Name node);
   void writeDartType(DartType type);
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 8d01d1f..7c4b76b 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -256,7 +256,7 @@
       Map<String, String>? environmentDefines,
       DiagnosticReporter diagnosticReporter,
       ReferenceFromIndex? referenceFromIndex,
-      {void logger(String msg),
+      {void Function(String msg)? logger,
       ChangedStructureNotifier? changedStructureNotifier});
 
   /// Perform target-specific modular transformations on the given program.
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index ed2ab26..5545e18 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:async';
 import 'dart:io' as io;
 
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 4c46e9e..eb69ce4 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 /// This is an interface to the Dart Kernel parser and Kernel binary generator.
 ///
 /// It is used by the kernel-isolate to load Dart source code and generate
diff --git a/pkg/vm/bin/protobuf_aware_treeshaker.dart b/pkg/vm/bin/protobuf_aware_treeshaker.dart
index 69aa466..8ee0887 100644
--- a/pkg/vm/bin/protobuf_aware_treeshaker.dart
+++ b/pkg/vm/bin/protobuf_aware_treeshaker.dart
@@ -3,6 +3,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 /// This program will take a .dill file and do a protobuf aware tree-shaking.
 ///
 /// All fields of GeneratedMessage subclasses that are not accessed with their
diff --git a/pkg/vm/lib/dominators.dart b/pkg/vm/lib/dominators.dart
index 19c5d84..f3b71ed 100644
--- a/pkg/vm/lib/dominators.dart
+++ b/pkg/vm/lib/dominators.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library vm.dominators;
+// @dart=2.9
 
 class Vertex<T extends Vertex<T>> {
   // Input: vertices directly reachable from this vertex.
diff --git a/pkg/vm/lib/http_filesystem.dart b/pkg/vm/lib/http_filesystem.dart
index cd8e42a..401d859 100644
--- a/pkg/vm/lib/http_filesystem.dart
+++ b/pkg/vm/lib/http_filesystem.dart
@@ -1,3 +1,9 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.9
+
 import 'dart:async';
 import 'dart:io' as io;
 
diff --git a/pkg/vm/lib/incremental_compiler.dart b/pkg/vm/lib/incremental_compiler.dart
index f2f483f..5179a44 100644
--- a/pkg/vm/lib/incremental_compiler.dart
+++ b/pkg/vm/lib/incremental_compiler.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 /// Defines wrapper class around incremental compiler to support
 /// the flow, where incremental deltas can be rejected by VM.
 import 'dart:async';
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 0458451..43d5a59 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 /// Defines the VM-specific translation of Dart source code to kernel binaries.
 library vm.kernel_front_end;
 
diff --git a/pkg/vm/lib/metadata/direct_call.dart b/pkg/vm/lib/metadata/direct_call.dart
index 8e4298b..3539978 100644
--- a/pkg/vm/lib/metadata/direct_call.dart
+++ b/pkg/vm/lib/metadata/direct_call.dart
@@ -14,7 +14,7 @@
 
   DirectCallMetadata(Member target, bool checkReceiverForNull)
       : this.byReference(
-            getMemberReferenceGetter(target), checkReceiverForNull);
+            getNonNullableMemberReferenceGetter(target), checkReceiverForNull);
 
   DirectCallMetadata.byReference(
       this._targetReference, this.checkReceiverForNull);
diff --git a/pkg/vm/lib/metadata/inferred_type.dart b/pkg/vm/lib/metadata/inferred_type.dart
index 4d609fd..6f23f6e 100644
--- a/pkg/vm/lib/metadata/inferred_type.dart
+++ b/pkg/vm/lib/metadata/inferred_type.dart
@@ -9,8 +9,8 @@
 
 /// Metadata for annotating nodes with an inferred type information.
 class InferredType {
-  final Reference _concreteClassReference;
-  final Constant _constantValue;
+  final Reference? _concreteClassReference;
+  final Constant? _constantValue;
   final int _flags;
 
   static const int flagNullable = 1 << 0;
@@ -31,11 +31,11 @@
   //
   // Otherwise, a non-null type argument indicates that that particular type
   // argument (in the runtime type) is always exactly a particular `DartType`.
-  final List<DartType> exactTypeArguments;
+  final List<DartType?>? exactTypeArguments;
 
   InferredType(
-      Class concreteClass, bool nullable, bool isInt, Constant constantValue,
-      {List<DartType> exactTypeArguments,
+      Class? concreteClass, bool nullable, bool isInt, Constant? constantValue,
+      {List<DartType?>? exactTypeArguments,
       bool skipCheck: false,
       bool receiverNotInt: false})
       : this._byReference(
@@ -54,9 +54,9 @@
     assert(_constantValue == null || _concreteClassReference != null);
   }
 
-  Class get concreteClass => _concreteClassReference?.asClass;
+  Class? get concreteClass => _concreteClassReference?.asClass;
 
-  Constant get constantValue => _constantValue;
+  Constant? get constantValue => _constantValue;
 
   bool get nullable => (_flags & flagNullable) != 0;
   bool get isInt => (_flags & flagInt) != 0;
@@ -69,7 +69,7 @@
   String toString() {
     final StringBuffer buf = new StringBuffer();
     if (concreteClass != null) {
-      buf.write(concreteClass.toText(astTextStrategyForTesting));
+      buf.write(concreteClass!.toText(astTextStrategyForTesting));
     } else if (isInt) {
       buf.write('int');
     } else {
@@ -80,7 +80,7 @@
     }
     if (exactTypeArguments != null) {
       buf.write('<');
-      buf.write(exactTypeArguments
+      buf.write(exactTypeArguments!
           .map(
               (t) => t != null ? "${t.toText(astTextStrategyForTesting)}" : "?")
           .join(", "));
@@ -91,7 +91,7 @@
     }
     if (_constantValue != null) {
       buf.write(
-          ' (value: ${_constantValue.toText(astTextStrategyForTesting)})');
+          ' (value: ${_constantValue!.toText(astTextStrategyForTesting)})');
     }
     if (receiverNotInt) {
       buf.write(' (receiver not int)');
@@ -115,11 +115,11 @@
     // TODO(sjindel/tfa): Implement serialization of type arguments when can use
     // them for optimizations.
     sink.writeNullAllowedCanonicalNameReference(metadata.concreteClass != null
-        ? getCanonicalNameOfClass(metadata.concreteClass)
+        ? getCanonicalNameOfClass(metadata.concreteClass!)
         : null);
     sink.writeByte(metadata._flags);
     if (metadata.constantValue != null) {
-      sink.writeConstantReference(metadata.constantValue);
+      sink.writeConstantReference(metadata.constantValue!);
     }
   }
 
diff --git a/pkg/vm/lib/metadata/unboxing_info.dart b/pkg/vm/lib/metadata/unboxing_info.dart
index 7069c05..64646a7 100644
--- a/pkg/vm/lib/metadata/unboxing_info.dart
+++ b/pkg/vm/lib/metadata/unboxing_info.dart
@@ -14,11 +14,12 @@
   final List<int> unboxedArgsInfo;
   int returnInfo;
 
-  UnboxingInfoMetadata(int argsLen) : unboxedArgsInfo = [] {
+  UnboxingInfoMetadata(int argsLen)
+      : unboxedArgsInfo = [],
+        returnInfo = kUnboxingCandidate {
     for (int i = 0; i < argsLen; i++) {
       unboxedArgsInfo.add(kUnboxingCandidate);
     }
-    returnInfo = kUnboxingCandidate;
   }
 
   UnboxingInfoMetadata.readFromBinary(BinarySource source)
diff --git a/pkg/vm/lib/target/dart_runner.dart b/pkg/vm/lib/target/dart_runner.dart
index 928863c..c1df052 100644
--- a/pkg/vm/lib/target/dart_runner.dart
+++ b/pkg/vm/lib/target/dart_runner.dart
@@ -1,7 +1,8 @@
 // Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-library vm.target.dart_runner;
+
+// @dart=2.9
 
 import 'package:kernel/target/targets.dart';
 import 'package:vm/target/vm.dart' show VmTarget;
diff --git a/pkg/vm/lib/target/flutter.dart b/pkg/vm/lib/target/flutter.dart
index 7746e98..3ffdc12 100644
--- a/pkg/vm/lib/target/flutter.dart
+++ b/pkg/vm/lib/target/flutter.dart
@@ -1,7 +1,8 @@
 // Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-library vm.target.flutter;
+
+// @dart=2.9
 
 import 'package:kernel/ast.dart' show Component, Library;
 import 'package:kernel/core_types.dart' show CoreTypes;
@@ -56,7 +57,7 @@
       CoreTypes coreTypes,
       List<Library> libraries,
       DiagnosticReporter diagnosticReporter,
-      {void logger(String msg),
+      {void Function(String msg) logger,
       ChangedStructureNotifier changedStructureNotifier}) {
     super.performPreConstantEvaluationTransformations(
         component, coreTypes, libraries, diagnosticReporter,
diff --git a/pkg/vm/lib/target/flutter_runner.dart b/pkg/vm/lib/target/flutter_runner.dart
index 9a2b477..a9c41ac 100644
--- a/pkg/vm/lib/target/flutter_runner.dart
+++ b/pkg/vm/lib/target/flutter_runner.dart
@@ -1,7 +1,8 @@
 // Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-library vm.target.flutter_runner;
+
+// @dart=2.9
 
 import 'package:kernel/target/targets.dart';
 import 'package:vm/target/vm.dart' show VmTarget;
diff --git a/pkg/vm/lib/target/install.dart b/pkg/vm/lib/target/install.dart
index 4973418..d691d28 100644
--- a/pkg/vm/lib/target/install.dart
+++ b/pkg/vm/lib/target/install.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library vm.target.install;
+// @dart=2.9
 
 import 'package:kernel/target/targets.dart' show targets, TargetFlags;
 import 'package:vm/target/dart_runner.dart' show DartRunnerTarget;
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 3230605..07a1b8c 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -1,7 +1,8 @@
 // Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-library vm.target.vm;
+
+// @dart=2.9
 
 import 'package:kernel/ast.dart';
 import 'package:kernel/clone.dart';
@@ -111,9 +112,9 @@
     // support patching fields.
     // See http://dartbug.com/32836 for the background.
     final Field host =
-        coreTypes.index.getMember('dart:typed_data', 'Endian', 'host');
+        coreTypes.index.getField('dart:typed_data', 'Endian', 'host');
     final Field little =
-        coreTypes.index.getMember('dart:typed_data', 'Endian', 'little');
+        coreTypes.index.getField('dart:typed_data', 'Endian', 'little');
     host.isConst = true;
     host.initializer = new CloneVisitorNotMembers().clone(little.initializer)
       ..parent = host;
@@ -125,7 +126,7 @@
       CoreTypes coreTypes,
       List<Library> libraries,
       DiagnosticReporter diagnosticReporter,
-      {void logger(String msg),
+      {void Function(String msg) logger,
       ChangedStructureNotifier changedStructureNotifier}) {
     super.performPreConstantEvaluationTransformations(
         component, coreTypes, libraries, diagnosticReporter,
@@ -154,7 +155,7 @@
       Map<String, String> environmentDefines,
       DiagnosticReporter diagnosticReporter,
       ReferenceFromIndex referenceFromIndex,
-      {void logger(String msg),
+      {void Function(String msg) logger,
       ChangedStructureNotifier changedStructureNotifier}) {
     transformMixins.transformLibraries(
         this, coreTypes, hierarchy, libraries, referenceFromIndex);
@@ -204,7 +205,7 @@
       ClassHierarchy hierarchy,
       Procedure procedure,
       Map<String, String> environmentDefines,
-      {void logger(String msg)}) {
+      {void Function(String msg) logger}) {
     bool productMode = environmentDefines["dart.vm.product"] == "true";
     transformAsync.transformProcedure(
         new TypeEnvironment(coreTypes, hierarchy), procedure,
diff --git a/pkg/vm/lib/transformations/deferred_loading.dart b/pkg/vm/lib/transformations/deferred_loading.dart
index 03bb9c2..ce46af7 100644
--- a/pkg/vm/lib/transformations/deferred_loading.dart
+++ b/pkg/vm/lib/transformations/deferred_loading.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 library vm.transformations.deferred_loading;
 
 import 'package:kernel/ast.dart';
diff --git a/pkg/vm/lib/transformations/devirtualization.dart b/pkg/vm/lib/transformations/devirtualization.dart
index 38de80f..559dcb2 100644
--- a/pkg/vm/lib/transformations/devirtualization.dart
+++ b/pkg/vm/lib/transformations/devirtualization.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 library vm.transformations.cha_devirtualization;
 
 import 'package:kernel/ast.dart';
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 7271f50..340f2b9 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 library vm.transformations.ffi_definitions;
 
 import 'dart:math' as math;
diff --git a/pkg/vm/lib/transformations/ffi_native.dart b/pkg/vm/lib/transformations/ffi_native.dart
index 7a85d36..945f66e 100644
--- a/pkg/vm/lib/transformations/ffi_native.dart
+++ b/pkg/vm/lib/transformations/ffi_native.dart
@@ -12,7 +12,7 @@
 /// Transform @FfiNative annotated functions into FFI native function pointer
 /// functions.
 void transformLibraries(Component component, List<Library> libraries,
-    ReferenceFromIndex referenceFromIndex) {
+    ReferenceFromIndex? referenceFromIndex) {
   final index = LibraryIndex(component, ['dart:ffi']);
   // Skip if dart:ffi isn't loaded (e.g. during incremental compile).
   if (index.tryGetClass('dart:ffi', 'FfiNative') == null) {
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index 4600fde..7ee4ecc 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 library vm.transformations.ffi_use_sites;
 
 import 'package:front_end/src/api_unstable/vm.dart'
diff --git a/pkg/vm/lib/transformations/list_literals_lowering.dart b/pkg/vm/lib/transformations/list_literals_lowering.dart
index e6b5e13..c7f6739 100644
--- a/pkg/vm/lib/transformations/list_literals_lowering.dart
+++ b/pkg/vm/lib/transformations/list_literals_lowering.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'package:front_end/src/api_unstable/vm.dart'
     show isRedirectingFactoryField;
 import 'package:kernel/ast.dart';
diff --git a/pkg/vm/lib/transformations/lowering.dart b/pkg/vm/lib/transformations/lowering.dart
index 4b320ad..72932d9 100644
--- a/pkg/vm/lib/transformations/lowering.dart
+++ b/pkg/vm/lib/transformations/lowering.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/core_types.dart' show CoreTypes;
diff --git a/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart b/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart
index 5e9600e..75b566f 100644
--- a/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart
+++ b/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart
@@ -46,7 +46,6 @@
       case Action.invoke:
         return '${target}';
     }
-    return '?';
   }
 }
 
diff --git a/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart b/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart
index 98592ef..b4eeab7 100644
--- a/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart
+++ b/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart
@@ -28,7 +28,7 @@
   void _addIfEntryPoint(
       List<Expression> annotations, String name, TreeNode node) {
     for (var ann in annotations) {
-      ParsedPragma pragma = parser.parsePragma(ann);
+      ParsedPragma? pragma = parser.parsePragma(ann);
       if (pragma is ParsedEntryPointPragma) {
         metadata.protectedNames.add(name);
         if (node is Field) {
diff --git a/pkg/vm/lib/transformations/pragma.dart b/pkg/vm/lib/transformations/pragma.dart
index cde363a..dfac713 100644
--- a/pkg/vm/lib/transformations/pragma.dart
+++ b/pkg/vm/lib/transformations/pragma.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library vm.transformations.pragma;
-
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart' show CoreTypes;
 
@@ -54,7 +52,7 @@
 abstract class PragmaAnnotationParser {
   /// May return 'null' if the annotation does not represent a recognized
   /// @pragma.
-  ParsedPragma parsePragma(Expression annotation);
+  ParsedPragma? parsePragma(Expression annotation);
 }
 
 class ConstantPragmaAnnotationParser extends PragmaAnnotationParser {
@@ -62,8 +60,8 @@
 
   ConstantPragmaAnnotationParser(this.coreTypes);
 
-  ParsedPragma parsePragma(Expression annotation) {
-    InstanceConstant pragmaConstant;
+  ParsedPragma? parsePragma(Expression annotation) {
+    InstanceConstant? pragmaConstant;
     if (annotation is ConstantExpression) {
       Constant constant = annotation.constant;
       if (constant is InstanceConstant) {
@@ -79,7 +77,7 @@
     if (pragmaConstant == null) return null;
 
     String pragmaName;
-    Constant name =
+    Constant? name =
         pragmaConstant.fieldValues[coreTypes.pragmaName.getterReference];
     if (name is StringConstant) {
       pragmaName = name.value;
@@ -88,12 +86,11 @@
     }
 
     Constant options =
-        pragmaConstant.fieldValues[coreTypes.pragmaOptions.getterReference];
-    assert(options != null);
+        pragmaConstant.fieldValues[coreTypes.pragmaOptions.getterReference]!;
 
     switch (pragmaName) {
       case kEntryPointPragmaName:
-        PragmaEntryPointType type;
+        PragmaEntryPointType? type;
         if (options is NullConstant) {
           type = PragmaEntryPointType.Default;
         } else if (options is BoolConstant && options.value == true) {
@@ -113,7 +110,6 @@
         }
         return type != null ? new ParsedEntryPointPragma(type) : null;
       case kExactResultTypePragmaName:
-        if (options == null) return null;
         if (options is TypeLiteralConstant) {
           return new ParsedResultTypeByTypePragma(options.type, false);
         } else if (options is StringConstant) {
@@ -132,7 +128,7 @@
       case kNonNullableResultType:
         return new ParsedNonNullableResultType();
       case kRecognizedPragmaName:
-        PragmaRecognizedType type;
+        PragmaRecognizedType? type;
         if (options is StringConstant) {
           if (options.value == "asm-intrinsic") {
             type = PragmaRecognizedType.AsmIntrinsic;
diff --git a/pkg/vm/lib/transformations/to_string_transformer.dart b/pkg/vm/lib/transformations/to_string_transformer.dart
index 10e7575..0cd1b5f 100644
--- a/pkg/vm/lib/transformations/to_string_transformer.dart
+++ b/pkg/vm/lib/transformations/to_string_transformer.dart
@@ -13,7 +13,7 @@
 /// `super.toString()`.
 class ToStringVisitor extends RecursiveVisitor {
   /// The [packageUris] must not be null.
-  ToStringVisitor(this._packageUris) : assert(_packageUris != null);
+  ToStringVisitor(this._packageUris);
 
   /// A set of package URIs to apply this transformer to, e.g. 'dart:ui' and
   /// 'package:flutter/foundation.dart'.
@@ -42,7 +42,7 @@
       if (className == 'pragma' && libraryUri == 'dart:core') {
         for (var fieldRef in constant.fieldValues.keys) {
           if (fieldRef.asField.name.text == 'name') {
-            Constant name = constant.fieldValues[fieldRef];
+            Constant? name = constant.fieldValues[fieldRef];
             return name is StringConstant &&
                 name.value == 'flutter:keep-to-string';
           }
@@ -57,13 +57,12 @@
   void visitProcedure(Procedure node) {
     if (node.name.text == 'toString' &&
         node.enclosingClass != null &&
-        node.enclosingLibrary != null &&
         !node.isStatic &&
         !node.isAbstract &&
-        !node.enclosingClass.isEnum &&
+        !node.enclosingClass!.isEnum &&
         _isInTargetPackage(node) &&
         !_hasKeepAnnotation(node)) {
-      node.function.body.replaceWith(
+      node.function.body!.replaceWith(
         ReturnStatement(
           SuperMethodInvocation(
             node.name,
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index 502fe14..ac1c9ad 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 /// Global type flow analysis.
 library kernel.transformations.analysis;
 
diff --git a/pkg/vm/lib/transformations/type_flow/calls.dart b/pkg/vm/lib/transformations/type_flow/calls.dart
index 6fa64e8..060500a 100644
--- a/pkg/vm/lib/transformations/type_flow/calls.dart
+++ b/pkg/vm/lib/transformations/type_flow/calls.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 /// Declares classes which describe a call: selectors and arguments.
 library vm.transformations.type_flow.calls;
 
diff --git a/pkg/vm/lib/transformations/type_flow/native_code.dart b/pkg/vm/lib/transformations/type_flow/native_code.dart
index ebecc27..7a5baf9 100644
--- a/pkg/vm/lib/transformations/type_flow/native_code.dart
+++ b/pkg/vm/lib/transformations/type_flow/native_code.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 /// Handling of native code and entry points.
 library vm.transformations.type_flow.native_code;
 
diff --git a/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart b/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
index 5bd8db7..a4b0bbc 100644
--- a/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
+++ b/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'package:kernel/ast.dart';
 import 'package:kernel/clone.dart' show CloneVisitorNotMembers;
 import 'package:kernel/core_types.dart' show CoreTypes;
diff --git a/pkg/vm/lib/transformations/type_flow/signature_shaking.dart b/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
index f24d9af..a61e222 100644
--- a/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
+++ b/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'package:kernel/ast.dart';
 import 'package:kernel/external_name.dart';
 import 'package:kernel/type_environment.dart';
diff --git a/pkg/vm/lib/transformations/type_flow/summary.dart b/pkg/vm/lib/transformations/type_flow/summary.dart
index 002acc1..1c9ae91 100644
--- a/pkg/vm/lib/transformations/type_flow/summary.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 /// Type flow summary of a member, function or initializer.
 library vm.transformations.type_flow.summary;
 
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 1527a11..b5b213f 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 /// Creation of type flow summaries out of kernel AST.
 library vm.transformations.type_flow.summary_collector;
 
diff --git a/pkg/vm/lib/transformations/type_flow/table_selector_assigner.dart b/pkg/vm/lib/transformations/type_flow/table_selector_assigner.dart
index 2cfe329..f1901e7 100644
--- a/pkg/vm/lib/transformations/type_flow/table_selector_assigner.dart
+++ b/pkg/vm/lib/transformations/type_flow/table_selector_assigner.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'package:kernel/ast.dart';
 
 import 'utils.dart' show UnionFind;
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index fb4dec7..5fb8cc5 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 /// Transformations based on type flow analysis.
 library vm.transformations.type_flow.transformer;
 
diff --git a/pkg/vm/lib/transformations/type_flow/types.dart b/pkg/vm/lib/transformations/type_flow/types.dart
index a5e9561..4d13774 100644
--- a/pkg/vm/lib/transformations/type_flow/types.dart
+++ b/pkg/vm/lib/transformations/type_flow/types.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 /// Declares the type system used by global type flow analysis.
 library vm.transformations.type_flow.types;
 
diff --git a/pkg/vm/lib/transformations/type_flow/unboxing_info.dart b/pkg/vm/lib/transformations/type_flow/unboxing_info.dart
index 03f7ef2..723e673 100644
--- a/pkg/vm/lib/transformations/type_flow/unboxing_info.dart
+++ b/pkg/vm/lib/transformations/type_flow/unboxing_info.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/external_name.dart' show getExternalName;
diff --git a/pkg/vm/lib/transformations/type_flow/utils.dart b/pkg/vm/lib/transformations/type_flow/utils.dart
index 815736c..b04e69e 100644
--- a/pkg/vm/lib/transformations/type_flow/utils.dart
+++ b/pkg/vm/lib/transformations/type_flow/utils.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 /// Declares miscellaneous utility functions and constants for type flow
 /// analysis.
 library vm.transformations.type_flow.utils;
diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml
index 95341eb..f57cf389 100644
--- a/pkg/vm/pubspec.yaml
+++ b/pkg/vm/pubspec.yaml
@@ -4,7 +4,7 @@
 publish_to: none
 
 environment:
-  sdk: "^2.7.0"
+  sdk: '>=2.12.0 <3.0.0'
 
 dependencies:
   args: ^1.4.4
diff --git a/pkg/vm/test/common_test_utils.dart b/pkg/vm/test/common_test_utils.dart
index a45a95d..3f8bf9c 100644
--- a/pkg/vm/test/common_test_utils.dart
+++ b/pkg/vm/test/common_test_utils.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:async';
 import 'dart:io';
 
diff --git a/pkg/vm/test/dominators_test.dart b/pkg/vm/test/dominators_test.dart
index f9e6ee6..15163b2 100644
--- a/pkg/vm/test/dominators_test.dart
+++ b/pkg/vm/test/dominators_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'package:expect/expect.dart';
 import 'package:vm/dominators.dart';
 
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index 2fc1928..cdde7fc 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
diff --git a/pkg/vm/test/kernel_front_end_test.dart b/pkg/vm/test/kernel_front_end_test.dart
index 711b616..182ba38 100644
--- a/pkg/vm/test/kernel_front_end_test.dart
+++ b/pkg/vm/test/kernel_front_end_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:io';
 
 import 'package:front_end/src/api_unstable/vm.dart'
diff --git a/pkg/vm/test/modular_kernel_plus_aot_test.dart b/pkg/vm/test/modular_kernel_plus_aot_test.dart
index 8d9419d..95354c9 100644
--- a/pkg/vm/test/modular_kernel_plus_aot_test.dart
+++ b/pkg/vm/test/modular_kernel_plus_aot_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:async';
 import 'dart:io';
 import 'dart:typed_data';
diff --git a/pkg/vm/test/transformations/deferred_loading_test.dart b/pkg/vm/test/transformations/deferred_loading_test.dart
index f36b610..88e8ee2 100644
--- a/pkg/vm/test/transformations/deferred_loading_test.dart
+++ b/pkg/vm/test/transformations/deferred_loading_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:io';
 
 import 'package:kernel/target/targets.dart';
diff --git a/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart b/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
index 023c93e..cf39848 100644
--- a/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
+++ b/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:io';
 
 import 'package:kernel/target/targets.dart';
diff --git a/pkg/vm/test/transformations/to_string_transformer_test.dart b/pkg/vm/test/transformations/to_string_transformer_test.dart
index ef94ca8..936f13f 100644
--- a/pkg/vm/test/transformations/to_string_transformer_test.dart
+++ b/pkg/vm/test/transformations/to_string_transformer_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:io';
 
 import 'package:kernel/ast.dart';
diff --git a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
index cad4936..f9ea8d7 100644
--- a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
+++ b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:io';
 
 import 'package:kernel/ast.dart';
diff --git a/pkg/vm/test/transformations/type_flow/transformer_test.dart b/pkg/vm/test/transformations/type_flow/transformer_test.dart
index b1e876fe..9735223 100644
--- a/pkg/vm/test/transformations/type_flow/transformer_test.dart
+++ b/pkg/vm/test/transformations/type_flow/transformer_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:io';
 
 import 'package:kernel/target/targets.dart';
diff --git a/pkg/vm/test/transformations/type_flow/types_test.dart b/pkg/vm/test/transformations/type_flow/types_test.dart
index 0945917..3a9987c 100644
--- a/pkg/vm/test/transformations/type_flow/types_test.dart
+++ b/pkg/vm/test/transformations/type_flow/types_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:core' hide Type;
 
 import 'package:kernel/ast.dart';
diff --git a/pkg/vm/test/transformations/unreachable_code_elimination_test.dart b/pkg/vm/test/transformations/unreachable_code_elimination_test.dart
index d1471bb..7330168 100644
--- a/pkg/vm/test/transformations/unreachable_code_elimination_test.dart
+++ b/pkg/vm/test/transformations/unreachable_code_elimination_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:io';
 
 import 'package:kernel/target/targets.dart';
diff --git a/pkg/vm/test/unlinked_ast_to_text_test.dart b/pkg/vm/test/unlinked_ast_to_text_test.dart
index 8b03a2c..49f8529 100644
--- a/pkg/vm/test/unlinked_ast_to_text_test.dart
+++ b/pkg/vm/test/unlinked_ast_to_text_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:io';
 
 import 'package:args/args.dart';
diff --git a/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect b/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect
index 0d07eae..328e71f 100644
--- a/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect
+++ b/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect
@@ -46,12 +46,12 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/a.dart" as a;
 
   static method j() → dynamic /* originally async */ {
-    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    final dart.async::_Future<dynamic> :async_future = new dart.async::_Future::•<dynamic>();
     dart.core::bool* :is_sync = false;
-    FutureOr<dynamic>* :return_value;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
+    FutureOr<dynamic>? :return_value;
+    (dynamic) → dynamic :async_op_then;
+    (dart.core::Object, dart.core::StackTrace) → dynamic :async_op_error;
+    dart.core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
@@ -62,12 +62,12 @@
         dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, dart.core::StackTrace stack_trace) {
         dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_op(){() →* dynamic};
+    :async_op(){() → dynamic};
     :is_sync = true;
     return :async_future;
   }
@@ -77,12 +77,12 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/g.dart" as g;
 
   static method h() → dynamic /* originally async */ {
-    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    final dart.async::_Future<dynamic> :async_future = new dart.async::_Future::•<dynamic>();
     dart.core::bool* :is_sync = false;
-    FutureOr<dynamic>* :return_value;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
+    FutureOr<dynamic>? :return_value;
+    (dynamic) → dynamic :async_op_then;
+    (dart.core::Object, dart.core::StackTrace) → dynamic :async_op_error;
+    dart.core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
@@ -93,12 +93,12 @@
         dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, dart.core::StackTrace stack_trace) {
         dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_op(){() →* dynamic};
+    :async_op(){() → dynamic};
     :is_sync = true;
     return :async_future;
   }
@@ -109,12 +109,12 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b;
 
   static method i() → dynamic /* originally async */ {
-    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    final dart.async::_Future<dynamic> :async_future = new dart.async::_Future::•<dynamic>();
     dart.core::bool* :is_sync = false;
-    FutureOr<dynamic>* :return_value;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
+    FutureOr<dynamic>? :return_value;
+    (dynamic) → dynamic :async_op_then;
+    (dart.core::Object, dart.core::StackTrace) → dynamic :async_op_error;
+    dart.core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
     dynamic :saved_try_context_var0;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
@@ -130,12 +130,12 @@
         dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, dart.core::StackTrace stack_trace) {
         dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_op(){() →* dynamic};
+    :async_op(){() → dynamic};
     :is_sync = true;
     return :async_future;
   }
@@ -145,12 +145,12 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/h.dart" as h;
 
   static method g() → dynamic /* originally async */ {
-    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    final dart.async::_Future<dynamic> :async_future = new dart.async::_Future::•<dynamic>();
     dart.core::bool* :is_sync = false;
-    FutureOr<dynamic>* :return_value;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
+    FutureOr<dynamic>? :return_value;
+    (dynamic) → dynamic :async_op_then;
+    (dart.core::Object, dart.core::StackTrace) → dynamic :async_op_error;
+    dart.core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
@@ -161,12 +161,12 @@
         dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, dart.core::StackTrace stack_trace) {
         dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_op(){() →* dynamic};
+    :async_op(){() → dynamic};
     :is_sync = true;
     return :async_future;
   }
@@ -177,12 +177,12 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/i.dart" deferred as i;
 
   static method f() → dynamic /* originally async */ {
-    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    final dart.async::_Future<dynamic> :async_future = new dart.async::_Future::•<dynamic>();
     dart.core::bool* :is_sync = false;
-    FutureOr<dynamic>* :return_value;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
+    FutureOr<dynamic>? :return_value;
+    (dynamic) → dynamic :async_op_then;
+    (dart.core::Object, dart.core::StackTrace) → dynamic :async_op_error;
+    dart.core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
     dynamic :saved_try_context_var0;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
@@ -202,12 +202,12 @@
         dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, dart.core::StackTrace stack_trace) {
         dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_op(){() →* dynamic};
+    :async_op(){() → dynamic};
     :is_sync = true;
     return :async_future;
   }
@@ -217,12 +217,12 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/g.dart" deferred as g;
 
   static method e() → dynamic /* originally async */ {
-    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    final dart.async::_Future<dynamic> :async_future = new dart.async::_Future::•<dynamic>();
     dart.core::bool* :is_sync = false;
-    FutureOr<dynamic>* :return_value;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
+    FutureOr<dynamic>? :return_value;
+    (dynamic) → dynamic :async_op_then;
+    (dart.core::Object, dart.core::StackTrace) → dynamic :async_op_error;
+    dart.core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
     dynamic :saved_try_context_var0;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
@@ -238,12 +238,12 @@
         dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, dart.core::StackTrace stack_trace) {
         dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_op(){() →* dynamic};
+    :async_op(){() → dynamic};
     :is_sync = true;
     return :async_future;
   }
@@ -254,12 +254,12 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/f.dart" deferred as f;
 
   static method c() → dynamic /* originally async */ {
-    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    final dart.async::_Future<dynamic> :async_future = new dart.async::_Future::•<dynamic>();
     dart.core::bool* :is_sync = false;
-    FutureOr<dynamic>* :return_value;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
+    FutureOr<dynamic>? :return_value;
+    (dynamic) → dynamic :async_op_then;
+    (dart.core::Object, dart.core::StackTrace) → dynamic :async_op_error;
+    dart.core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
     dynamic :saved_try_context_var0;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
@@ -275,12 +275,12 @@
         dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, dart.core::StackTrace stack_trace) {
         dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_op(){() →* dynamic};
+    :async_op(){() → dynamic};
     :is_sync = true;
     return :async_future;
   }
@@ -290,12 +290,12 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/e.dart" as e;
 
   static method d() → dynamic /* originally async */ {
-    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    final dart.async::_Future<dynamic> :async_future = new dart.async::_Future::•<dynamic>();
     dart.core::bool* :is_sync = false;
-    FutureOr<dynamic>* :return_value;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
+    FutureOr<dynamic>? :return_value;
+    (dynamic) → dynamic :async_op_then;
+    (dart.core::Object, dart.core::StackTrace) → dynamic :async_op_error;
+    dart.core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
@@ -308,12 +308,12 @@
         dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, dart.core::StackTrace stack_trace) {
         dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_op(){() →* dynamic};
+    :async_op(){() → dynamic};
     :is_sync = true;
     return :async_future;
   }
@@ -323,12 +323,12 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/c.dart" as c;
 
   static method b() → dynamic /* originally async */ {
-    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    final dart.async::_Future<dynamic> :async_future = new dart.async::_Future::•<dynamic>();
     dart.core::bool* :is_sync = false;
-    FutureOr<dynamic>* :return_value;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
+    FutureOr<dynamic>? :return_value;
+    (dynamic) → dynamic :async_op_then;
+    (dart.core::Object, dart.core::StackTrace) → dynamic :async_op_error;
+    dart.core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
@@ -341,12 +341,12 @@
         dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, dart.core::StackTrace stack_trace) {
         dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_op(){() →* dynamic};
+    :async_op(){() → dynamic};
     :is_sync = true;
     return :async_future;
   }
@@ -356,12 +356,12 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/d.dart" deferred as d;
 
   static method a() → dynamic /* originally async */ {
-    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    final dart.async::_Future<dynamic> :async_future = new dart.async::_Future::•<dynamic>();
     dart.core::bool* :is_sync = false;
-    FutureOr<dynamic>* :return_value;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
+    FutureOr<dynamic>? :return_value;
+    (dynamic) → dynamic :async_op_then;
+    (dart.core::Object, dart.core::StackTrace) → dynamic :async_op_error;
+    dart.core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
     dynamic :saved_try_context_var0;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
@@ -377,12 +377,12 @@
         dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, dart.core::StackTrace stack_trace) {
         dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_op(){() →* dynamic};
+    :async_op(){() → dynamic};
     :is_sync = true;
     return :async_future;
   }
@@ -393,12 +393,12 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/b.dart";
 
   static method main() → dynamic /* originally async */ {
-    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    final dart.async::_Future<dynamic> :async_future = new dart.async::_Future::•<dynamic>();
     dart.core::bool* :is_sync = false;
-    FutureOr<dynamic>* :return_value;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
+    FutureOr<dynamic>? :return_value;
+    (dynamic) → dynamic :async_op_then;
+    (dart.core::Object, dart.core::StackTrace) → dynamic :async_op_error;
+    dart.core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
     dynamic :saved_try_context_var0;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
@@ -413,12 +413,12 @@
         dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, dart.core::StackTrace stack_trace) {
         dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_op(){() →* dynamic};
+    :async_op(){() → dynamic};
     :is_sync = true;
     return :async_future;
   }
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart
index a22bad2..d4a77af 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 dynamic foo() => null;
 bool bar() => null;
 
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart b/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart
index 06cf7ea..1f4d7da 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 abstract class A {
   void foo1(Object x) {}
   dynamic get foo2;
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect
index 9a4772b..18d97a8 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect
@@ -4,21 +4,21 @@
 RESULT: _T {}?
 ------------ C.foo ------------
 %this = _Parameter #0 [_T (#lib::C)+]
-t1 = _Extract (%this[#lib::C/0]*)
+t1 = _Extract (%this[#lib::C/0])
 t2 = _CreateConcreteType (#lib::D @ (t1))
 t3* = _Call direct [#lib::D.] (t2)
 RESULT: t3
 ------------ C.id1 ------------
 %this = _Parameter #0 [_T (#lib::C)+]
 %x = _Parameter #1
-t2 = _Extract (%this[#lib::C/0]*)
-t3 = _TypeCheck (%x against t2) (for #lib::C.T* x;)
+t2 = _Extract (%this[#lib::C/0])
+t3 = _TypeCheck (%x against t2) (for #lib::C.T% x;)
 RESULT: t3
 ------------ C.id2 ------------
 %this = _Parameter #0 [_T (#lib::C)+]
 %x = _Parameter #1
-t2 = _Extract (%this[#lib::C/0]*)
-t3 = _TypeCheck (%x against t2) (for #lib::C.T* x;)
+t2 = _Extract (%this[#lib::C/0])
+t3 = _TypeCheck (%x against t2) (for #lib::C.T% x;)
 RESULT: t3
 ------------ D. ------------
 %this = _Parameter #0 [_T (#lib::D)+]
@@ -34,13 +34,13 @@
 RESULT: t1
 ------------ E.bar ------------
 %this = _Parameter #0 [_T (#lib::E)+]
-t1 = _Extract (%this[#lib::E/0]*)
+t1 = _Extract (%this[#lib::E/0])
 t2 = _CreateConcreteType (#lib::D @ (t1))
 t3* = _Call direct [#lib::D.] (t2)
 RESULT: t3
 ------------ E.baz ------------
 %this = _Parameter #0 [_T (#lib::E)+]
-t1 = _Extract (%this[#lib::E/1]*)
+t1 = _Extract (%this[#lib::E/1])
 t2 = _CreateConcreteType (#lib::D @ (t1))
 t3* = _Call direct [#lib::D.] (t2)
 RESULT: t3
@@ -75,34 +75,34 @@
 ------------ C2.id3 ------------
 %this = _Parameter #0 [_T (#lib::C2)+]
 %x = _Parameter #1
-t2 = _Extract (%this[#lib::C2/0]*)
-t3 = _CreateRuntimeType (dart.core::Comparable @ (t2)*)
-t4 = _TypeCheck (%x against t3) (for dart.core::Comparable<#lib::C2.T*>* x;)
+t2 = _Extract (%this[#lib::C2/0])
+t3 = _CreateRuntimeType (dart.core::Comparable @ (t2))
+t4 = _TypeCheck (%x against t3) (for dart.core::Comparable<#lib::C2.T%> x;)
 RESULT: t4
 ------------ C2.id4 ------------
 %this = _Parameter #0 [_T (#lib::C2)+]
 %x = _Parameter #1
-t2 = _Extract (%this[#lib::C2/0]*)
-t3 = _CreateRuntimeType (#lib::I @ (t2)*)
-t4 = _CreateRuntimeType (#lib::K @ (t3)*)
-t5 = _TypeCheck (%x against t4) (for #lib::K<#lib::I<#lib::C2.T*>*>* x;)
+t2 = _Extract (%this[#lib::C2/0])
+t3 = _CreateRuntimeType (#lib::I @ (t2))
+t4 = _CreateRuntimeType (#lib::K @ (t3))
+t5 = _TypeCheck (%x against t4) (for #lib::K<#lib::I<#lib::C2.T%>> x;)
 RESULT: t5
 ------------ main ------------
-t0* = _Call direct [#lib::C.] (_T (#lib::C<dart.core::int*>))
+t0* = _Call direct [#lib::C.] (_T (#lib::C<dart.core::int>))
 t1 = _Call [#lib::C.foo] (t0)
-t2* = _Call direct [#lib::E.] (_T (#lib::E<dart.core::int*, dart.core::String*>))
+t2* = _Call direct [#lib::E.] (_T (#lib::E<dart.core::int, dart.core::String>))
 t3 = _Call [#lib::E.foo] (t2)
-t4* = _Call direct [#lib::E.] (_T (#lib::E<dart.core::int*, dart.core::String*>))
+t4* = _Call direct [#lib::E.] (_T (#lib::E<dart.core::int, dart.core::String>))
 t5 = _Call [#lib::E.bar] (t4)
-t6* = _Call direct [#lib::E.] (_T (#lib::E<dart.core::int*, dart.core::String*>))
+t6* = _Call direct [#lib::E.] (_T (#lib::E<dart.core::int, dart.core::String>))
 t7* = _Call [#lib::E.baz] (t6)
-t8* = _Call direct [#lib::C.] (_T (#lib::C<#lib::Y*>))
+t8* = _Call direct [#lib::C.] (_T (#lib::C<#lib::Y>))
 t9* = _Call direct [#lib::Y.] (_T (#lib::Y))
 t10 = _Call [#lib::C.id1] (t8, t9)
 t11* = _Call direct [#lib::Z.] (_T (#lib::Z))
 t12 = _Call [#lib::C.id2] (t8, t11)
-t13* = _Call direct [#lib::C2.] (_T (#lib::C2<dart.core::num*>))
+t13* = _Call direct [#lib::C2.] (_T (#lib::C2<dart.core::num>))
 t14 = _Call [#lib::C2.id3] (t13, _T (dart.core::_Double, 3.0))
-t15* = _Call direct [#lib::K.] (_T (#lib::K<#lib::J*>))
+t15* = _Call direct [#lib::K.] (_T (#lib::K<#lib::J>))
 t16 = _Call [#lib::C2.id4] (t13, t15)
 RESULT: t7
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_case1.dart b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_case1.dart
index 3b211f3..1140e51 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_case1.dart
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_case1.dart
@@ -11,6 +11,8 @@
 // call, and we want to make sure there is only one call-site in this example
 // (call-site level info is not available yet).
 
+// @dart=2.9
+
 import 'dart:collection';
 
 class Element {}
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/constants.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/constants.dart.expect
index a894b41..010aa92 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/constants.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/constants.dart.expect
@@ -13,7 +13,7 @@
 RESULT: t1
 ------------ indexingIntoConstantList2 ------------
 %i = _Parameter #0 [_T (dart.core::int)+?]
-t1 = _Join [dart.core::Object*] (_T (dart.core::_OneByteString, "hi"), _T (dart.core::_Smi, 33), _T {}?, _T (dart.core::_Smi, -5))
+t1 = _Join [dart.core::Object?] (_T (dart.core::_OneByteString, "hi"), _T (dart.core::_Smi, 33), _T {}?, _T (dart.core::_Smi, -5))
 RESULT: t1
 ------------ main ------------
 
@@ -23,4 +23,4 @@
 RESULT: _T (dart.core::_ImmutableList, const <dart.core::int*>[1, 2, 3])
 ------------ _constList2 ------------
 
-RESULT: _T (dart.core::_ImmutableList, const <dart.core::Object*>["hi", 33, null, -5])
+RESULT: _T (dart.core::_ImmutableList, const <dart.core::Object?>["hi", 33, null, -5])
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect
index e434ee3..54aa62d 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect
@@ -71,10 +71,10 @@
 t2 = _Call direct [#lib::C1.] (_T (#lib::C1))
 t3* = _Call direct [#lib::C2.] (_T (#lib::C2))
 t4* = _Call direct [#lib::foo] (t3)
-t5 = _TypeCheck (t4 against dart.core::bool*) (for #lib::foo(x = new #lib::C2()) as dart.core::bool*)
+t5 = _TypeCheck (t4 against dart.core::bool) (for #lib::foo(x = new #lib::C2()) as dart.core::bool)
 t6* = _Call direct [#lib::C3.] (_T (#lib::C3))
 t7* = _Call direct [#lib::foo] (t6)
-t8 = _TypeCheck (t7 against dart.core::bool*) (for #lib::foo(x = new #lib::C3()) as dart.core::bool*)
+t8 = _TypeCheck (t7 against dart.core::bool) (for #lib::foo(x = new #lib::C3()) as dart.core::bool)
 x_0 = _Join [dynamic] (t3, t6)
 t10 = _Call direct [#lib::bar] (x_0)
 RESULT: x_0
@@ -82,10 +82,10 @@
 t0 = _Call direct [#lib::C1.] (_T (#lib::C1))
 t1* = _Call direct [#lib::C2.] (_T (#lib::C2))
 t2* = _Call direct [#lib::foo] (t1)
-t3 = _TypeCheck (t2 against dart.core::bool*) (for #lib::foo(x = new #lib::C2()) as dart.core::bool*)
+t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x = new #lib::C2()) as dart.core::bool)
 t4* = _Call direct [#lib::C3.] (_T (#lib::C3))
 t5* = _Call direct [#lib::foo] (t4)
-t6 = _TypeCheck (t5 against dart.core::bool*) (for #lib::foo(x = new #lib::C3()) as dart.core::bool*)
+t6 = _TypeCheck (t5 against dart.core::bool) (for #lib::foo(x = new #lib::C3()) as dart.core::bool)
 t7 = _Call direct [#lib::bar] (t4)
 x_0 = _Join [dynamic] (t1, t4)
 RESULT: x_0
@@ -99,12 +99,12 @@
 %x = _Parameter #0 [_T (dart.core::bool)+?]
 t1 = _Call direct [#lib::foo] (_T (dart.core::bool, true))
 t2 = _Call direct [#lib::bar] (_T (dart.core::bool, false))
-x_0 = _Join [dart.core::bool*] (_T (dart.core::bool, true), _T (dart.core::bool, false))
+x_0 = _Join [dart.core::bool] (_T (dart.core::bool, true), _T (dart.core::bool, false))
 t4 = _Call direct [#lib::baz] (x_0)
 RESULT: _T {}?
 ------------ if6b ------------
 %x = _Parameter #0 [_T ANY?]
-t1 = _TypeCheck (%x against dart.core::bool*) (for x as dart.core::bool*)
+t1 = _TypeCheck (%x against dart.core::bool) (for x as dart.core::bool)
 t2 = _Call direct [#lib::foo] (_T (dart.core::bool, true))
 t3 = _Call direct [#lib::bar] (_T (dart.core::bool, false))
 x_0 = _Join [dynamic] (_T (dart.core::bool, true), _T (dart.core::bool, false))
@@ -129,7 +129,7 @@
 RESULT: _T {}?
 ------------ if9 ------------
 %x = _Parameter #0 [_T (#lib::TestEnum)+?]
-t1* = _Call [#lib::TestEnum.==] (%x, _T (#lib::TestEnum, const #lib::TestEnum{#lib::TestEnum.index: 0, #lib::TestEnum._name: "TestEnum.v1"}))
+t1* = _Call [dart.core::Object.==] (%x, _T (#lib::TestEnum, const #lib::TestEnum{#lib::TestEnum.index: 0, #lib::TestEnum._name: "TestEnum.v1"}))
 t2 = _Call direct [#lib::foo] (_T (#lib::TestEnum, const #lib::TestEnum{#lib::TestEnum.index: 0, #lib::TestEnum._name: "TestEnum.v1"}))
 RESULT: _T {}?
 ------------ conditional1 ------------
@@ -138,12 +138,12 @@
 t2 = _Call direct [#lib::C1.] (_T (#lib::C1))
 t3* = _Call direct [#lib::C2.] (_T (#lib::C2))
 t4* = _Call direct [#lib::foo] (t3)
-t5 = _TypeCheck (t4 against dart.core::bool*) (for #lib::foo(x = new #lib::C2()) as dart.core::bool*)
+t5 = _TypeCheck (t4 against dart.core::bool) (for #lib::foo(x = new #lib::C2()) as dart.core::bool)
 t6* = _Call direct [#lib::C3.] (_T (#lib::C3))
 t7* = _Call direct [#lib::C4.] (_T (#lib::C4))
 x_0 = _Join [dynamic] (t6, t7)
 t9 = _Call direct [#lib::foo] (x_0)
-t10 = _Join [dart.core::Object*] (t6, t7)
+t10 = _Join [dart.core::Object] (t6, t7)
 t11 = _Narrow (t10 to _T (dart.core::Object)+?)
 t12 = _Call direct [#lib::bar] (t11)
 RESULT: _T {}?
@@ -153,10 +153,10 @@
 t2 = _Call direct [#lib::C1.] (_T (#lib::C1))
 t3* = _Call direct [#lib::C2.] (_T (#lib::C2))
 t4* = _Call direct [#lib::foo] (t3)
-t5 = _TypeCheck (t4 against dart.core::bool*) (for #lib::foo(x = new #lib::C2()) as dart.core::bool*)
+t5 = _TypeCheck (t4 against dart.core::bool) (for #lib::foo(x = new #lib::C2()) as dart.core::bool)
 t6* = _Call direct [#lib::C3.] (_T (#lib::C3))
 t7* = _Call direct [#lib::C4.] (_T (#lib::C4))
-t8* = _Call direct [dart.core::_GrowableList._literal2] (#lib::C4*, t7, _T {})
+t8* = _Call direct [dart.core::_GrowableList._literal2] (#lib::C4, t7, _T {})
 t9* = _Call direct [#lib::foo] (t8)
 t10 = _Call direct [#lib::foo] (t6)
 t11 = _Join [dynamic] (t6, t9)
@@ -167,7 +167,7 @@
 t1* = _Call direct [#lib::C2.] (_T (#lib::C2))
 x_0 = _Join [dynamic] (t0, t1)
 t3* = _Call direct [#lib::foo] (x_0)
-t4 = _TypeCheck (t3 against dart.core::bool*) (for #lib::foo(x) as dart.core::bool*)
+t4 = _TypeCheck (t3 against dart.core::bool) (for #lib::foo(x) as dart.core::bool)
 t5 = _Call direct [#lib::bar] (x_0)
 RESULT: x_0
 ------------ loop2 ------------
@@ -178,13 +178,13 @@
 t4* = _Call direct [#lib::C2.] (_T (#lib::C2))
 t5 = _Call direct [#lib::bar] (t4)
 t6* = _Call direct [#lib::bar] (t1)
-t7 = _TypeCheck (t6 against dart.core::bool*) (for #lib::bar(x = new #lib::C3()) as dart.core::bool*)
+t7 = _TypeCheck (t6 against dart.core::bool) (for #lib::bar(x = new #lib::C3()) as dart.core::bool)
 RESULT: t1
 ------------ loop3 ------------
 t0 = _Call direct [#lib::C1.] (_T (#lib::C1))
 t1* = _Call direct [#lib::C2.] (_T (#lib::C2))
 t2* = _Call direct [#lib::foo] (t1)
-t3 = _TypeCheck (t2 against dart.core::bool*) (for #lib::foo(x = new #lib::C2()) as dart.core::bool*)
+t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x = new #lib::C2()) as dart.core::bool)
 t4 = _Call direct [#lib::C3.] (_T (#lib::C3))
 t5 = _Call direct [#lib::bar] (t1)
 RESULT: t1
@@ -206,10 +206,10 @@
 t1* = _Call direct [#lib::C3.] (_T (#lib::C3))
 x_0 = _Join [dynamic] (t0, t1)
 t3* = _Call direct [#lib::foo] (x_0)
-t4 = _TypeCheck (t3 against dart.core::bool*) (for #lib::foo(x) as dart.core::bool*)
+t4 = _TypeCheck (t3 against dart.core::bool) (for #lib::foo(x) as dart.core::bool)
 t5* = _Call direct [#lib::C2.] (_T (#lib::C2))
 t6* = _Call direct [#lib::bar] (t5)
-t7 = _TypeCheck (t6 against dart.core::bool*) (for #lib::bar(x) as dart.core::bool*)
+t7 = _TypeCheck (t6 against dart.core::bool) (for #lib::bar(x) as dart.core::bool)
 x_1 = _Join [dynamic] (x_0, t5)
 RESULT: x_1
 ------------ loop6 ------------
@@ -219,9 +219,9 @@
 x_1 = _Join [dynamic] (t1, t2)
 x_0 = _Join [dynamic] (t0, x_1)
 t5* = _Call direct [#lib::foo] (x_0)
-t6 = _TypeCheck (t5 against dart.core::bool*) (for #lib::foo(x) as dart.core::bool*)
+t6 = _TypeCheck (t5 against dart.core::bool) (for #lib::foo(x) as dart.core::bool)
 t7* = _Call direct [#lib::bar] (t2)
-t8 = _TypeCheck (t7 against dart.core::bool*) (for #lib::bar(x) as dart.core::bool*)
+t8 = _TypeCheck (t7 against dart.core::bool) (for #lib::bar(x) as dart.core::bool)
 RESULT: x_0
 ------------ try1 ------------
 t0* = _Call direct [#lib::C1.] (_T (#lib::C1))
@@ -273,7 +273,7 @@
 RESULT: x_2
 ------------ cast1 ------------
 %x = _Parameter #0 [_T ANY?]
-t1 = _TypeCheck (%x against #lib::C1*) (for x as #lib::C1*)
+t1 = _TypeCheck (%x against #lib::C1) (for x as #lib::C1)
 t2 = _Call direct [#lib::foo] (t1)
 t3 = _Call direct [#lib::bar] (t1)
 RESULT: _T {}?
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart b/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart
index 11518c5..9526505 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 class T {}
 
 empty1() {}
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart
index 753486f..b52da4f 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 bool someStatic;
 
 class A {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/abstract_class_entry_point.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/abstract_class_entry_point.dart.expect
index 02a29c4..46131e7 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/abstract_class_entry_point.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/abstract_class_entry_point.dart.expect
@@ -1,4 +1,4 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart
index b5b68eb..cf61eb7 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 class ClassAnnotation {
   const ClassAnnotation();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/async_await.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/async_await.dart.expect
index 6e5364a..fc5a260 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/async_await.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/async_await.dart.expect
@@ -1,19 +1,19 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method bar(dynamic x) → asy::Future<dynamic>* /* originally async */ {
-    final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method bar(dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
     core::bool* :is_sync = false;
-    FutureOr<dynamic>* :return_value;
-    (dynamic) →* dynamic :async_op_then;
-    (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
-    core::int* :await_jump_var = 0;
+    FutureOr<dynamic>? :return_value;
+    (dynamic) → dynamic :async_op_then;
+    (core::Object, core::StackTrace) → dynamic :async_op_error;
+    core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
@@ -25,30 +25,30 @@
         asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
-      on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
         asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_op(){() →* dynamic};
+    :async_op(){() → dynamic};
     :is_sync = true;
     return :async_future;
   }
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic
   return new self::A::•();
-static method baz() → asy::Future<dynamic>* /* originally async */ {
-  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+static method baz() → asy::Future<dynamic> /* originally async */ {
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
   core::bool* :is_sync = false;
-  FutureOr<dynamic>* :return_value;
-  (dynamic) →* dynamic :async_op_then;
-  (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
-  core::int* :await_jump_var = 0;
+  FutureOr<dynamic>? :return_value;
+  (dynamic) → dynamic :async_op_then;
+  (core::Object, core::StackTrace) → dynamic :async_op_error;
+  core::int :await_jump_var = 0;
   dynamic :await_ctx_var;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
@@ -60,22 +60,22 @@
       asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
-    on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
+    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
       asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_op(){() →* dynamic};
+  :async_op(){() → dynamic};
   :is_sync = true;
   return :async_future;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
   core::bool* :is_sync = false;
-  FutureOr<dynamic>* :return_value;
-  (dynamic) →* dynamic :async_op_then;
-  (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
-  core::int* :await_jump_var = 0;
+  FutureOr<dynamic>? :return_value;
+  (dynamic) → dynamic :async_op_then;
+  (core::Object, core::StackTrace) → dynamic :async_op_error;
+  core::int :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
   dynamic :async_temporary_0;
@@ -91,12 +91,12 @@
       asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
-    on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
+    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
       asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_op(){() →* dynamic};
+  :async_op(){() → dynamic};
   :is_sync = true;
   return :async_future;
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
index dc738d5..0a0c97a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
@@ -1,43 +1,43 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-[@vm.unboxing-info.metadata=(i)->b]static method isPrime([@vm.inferred-type.metadata=int] dynamic n) → core::bool* {
-  if(_in::unsafeCast<core::bool*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool] n{dynamic}.<(2)))
+[@vm.unboxing-info.metadata=(i)->b]static method isPrime([@vm.inferred-type.metadata=int] dynamic n) → core::bool {
+  if(_in::unsafeCast<core::bool>([@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool] n{dynamic}.<(2)))
     return false;
-  for (core::int* i = 2; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<=] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation.*] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::*}(i){(core::num*) →* core::int*}.{core::num::<=}(_in::unsafeCast<core::num*>(n)){(core::num*) →* core::bool*}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num*) →* core::int*}) {
-    if([@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation.%] [@vm.inferred-type.metadata=int] n{dynamic}.%(i) =={core::Object::==}{(core::Object*) →* core::bool*} 0)
+  for (core::int i = 2; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<=] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation.*] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::*}(i){(core::num) → core::int}.{core::num::<=}(_in::unsafeCast<core::num>(n)){(core::num) → core::bool}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num) → core::int}) {
+    if([@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation.%] [@vm.inferred-type.metadata=int] n{dynamic}.%(i) =={core::Object::==}{(core::Object) → core::bool} 0)
       return false;
   }
   return true;
 }
-static method nThPrimeNumber() → core::int* {
-  core::int* counter = 0;
-  for (core::int* i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num*) →* core::int*}) {
+static method nThPrimeNumber() → core::int {
+  core::int counter = 0;
+  for (core::int i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num) → core::int}) {
     if([@vm.inferred-type.metadata=dart.core::bool] self::isPrime(i))
-      counter = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] counter.{core::num::+}(1){(core::num*) →* core::int*};
-    if([@vm.inferred-type.metadata=dart.core::bool] counter =={core::num::==}{(core::Object*) →* core::bool*} (#C1)) {
+      counter = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] counter.{core::num::+}(1){(core::num) → core::int};
+    if([@vm.inferred-type.metadata=dart.core::bool] counter =={core::num::==}{(core::Object) → core::bool} (#C1)) {
       return i;
     }
   }
 }
 static method run() → void {
-  core::int* e = 611953;
-  core::int* p = [@vm.inferred-type.metadata=int?] self::nThPrimeNumber();
-  if(!([@vm.inferred-type.metadata=dart.core::bool] p =={core::num::==}{(core::Object*) →* core::bool*} e)) {
+  core::int e = 611953;
+  core::int p = [@vm.inferred-type.metadata=int?] self::nThPrimeNumber();
+  if(!([@vm.inferred-type.metadata=dart.core::bool] p =={core::num::==}{(core::Object) → core::bool} e)) {
     throw core::Exception::•("Unexpected result: ${p} != ${e}");
   }
 }
-static method main(core::List<core::String*>* args) → dynamic {
-  core::Stopwatch* timer = let final core::Stopwatch* #t1 = new core::Stopwatch::•() in block {
-    [@vm.direct-call.metadata=dart.core::Stopwatch.start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}(){() →* void};
+static method main(core::List<core::String> args) → dynamic {
+  core::Stopwatch timer = let final core::Stopwatch #t1 = new core::Stopwatch::•() in block {
+    [@vm.direct-call.metadata=dart.core::Stopwatch.start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}(){() → void};
   } =>#t1;
-  for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100){(core::num*) →* core::bool*}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num*) →* core::int*}) {
+  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100){(core::num) → core::bool}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num) → core::int}) {
     self::run();
   }
-  [@vm.direct-call.metadata=dart.core::Stopwatch.stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}(){() →* void};
-  core::print("Elapsed ${[@vm.direct-call.metadata=dart.core::Stopwatch.elapsedMilliseconds] timer.{core::Stopwatch::elapsedMilliseconds}{core::int*}}ms");
+  [@vm.direct-call.metadata=dart.core::Stopwatch.stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}(){() → void};
+  core::print("Elapsed ${[@vm.direct-call.metadata=dart.core::Stopwatch.elapsedMilliseconds] timer.{core::Stopwatch::elapsedMilliseconds}{core::int}}ms");
 }
 constants  {
   #C1 = 50000
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
index 599ca03..370e042 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
@@ -1,4 +1,4 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:typed_data" as typ;
@@ -6,38 +6,38 @@
 import "dart:typed_data";
 
 class _Vector extends core::Object {
-[@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] [@vm.unboxing-info.metadata=()->i]  final field core::int* _offset;
-[@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2] [@vm.unboxing-info.metadata=()->i]  final field core::int* _length;
-[@vm.inferred-type.metadata=dart.typed_data::_Float64List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  final field core::List<core::double*>* _elements;
-  constructor •() → self::_Vector*
+[@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] [@vm.unboxing-info.metadata=()->i]  final field core::int _offset;
+[@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2] [@vm.unboxing-info.metadata=()->i]  final field core::int _length;
+[@vm.inferred-type.metadata=dart.typed_data::_Float64List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  final field core::List<core::double> _elements;
+  constructor •() → self::_Vector
     : self::_Vector::_offset = 0, self::_Vector::_length = #C1, self::_Vector::_elements = [@vm.inferred-type.metadata=dart.typed_data::_Float64List] typ::Float64List::•(#C1), super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:4] [@vm.unboxing-info.metadata=(b)->d]  operator []([@vm.inferred-type.metadata=!] core::int* i) → core::double*
-    return [@vm.direct-call.metadata=dart.typed_data::_Float64List.[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector._elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}{core::List<core::double*>*}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector._offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset}{core::int*}){(core::num*) →* core::int*}){(core::int*) →* core::double*};
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5]  operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int* i, core::double* value) → void {
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:4] [@vm.unboxing-info.metadata=(b)->d]  operator []([@vm.inferred-type.metadata=!] core::int i) → core::double
+    return [@vm.direct-call.metadata=dart.typed_data::_Float64List.[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector._elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}{core::List<core::double>}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector._offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset}{core::int}){(core::num) → core::int}){(core::int) → core::double};
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5]  operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int i, core::double value) → void {
     block {
-      [@vm.direct-call.metadata=#lib::_Vector._elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}{core::List<core::double*>*};
-      [@vm.direct-call.metadata=#lib::_Vector._offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset}{core::int*};
+      [@vm.direct-call.metadata=#lib::_Vector._elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}{core::List<core::double>};
+      [@vm.direct-call.metadata=#lib::_Vector._offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset}{core::int};
     } =>throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6] [@vm.unboxing-info.metadata=(b)->d]  operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector* a) → core::double* {
-    core::double* result = 0.0;
-    for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector._length] [@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] this.{self::_Vector::_length}{core::int*}){(core::num*) →* core::bool*}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num*) →* core::int*})
-      result = [@vm.direct-call.metadata=dart.core::_Double.+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double.*] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector.[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] this.{self::_Vector::[]}(i){(core::int*) →* core::double*}.{core::double::*}([@vm.direct-call.metadata=#lib::_Vector.[]??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] a.{self::_Vector::[]}(i){(core::int*) →* core::double*}){(core::num*) →* core::double*}){(core::num*) →* core::double*};
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6] [@vm.unboxing-info.metadata=(b)->d]  operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector a) → core::double {
+    core::double result = 0.0;
+    for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector._length] [@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] this.{self::_Vector::_length}{core::int}){(core::num) → core::bool}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num) → core::int})
+      result = [@vm.direct-call.metadata=dart.core::_Double.+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double.*] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector.[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] this.{self::_Vector::[]}(i){(core::int) → core::double}.{core::double::*}([@vm.direct-call.metadata=#lib::_Vector.[]??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] a.{self::_Vector::[]}(i){(core::int) → core::double}){(core::num) → core::double}){(core::num) → core::double};
     return result;
   }
 }
-[@vm.inferred-type.metadata=#lib::_Vector?]static field self::_Vector* v = new self::_Vector::•();
-[@vm.inferred-type.metadata=dart.core::_Double?]static field core::double* x = 0.0;
-static method main(core::List<core::String*>* args) → dynamic {
-  core::Stopwatch* timer = let final core::Stopwatch* #t1 = new core::Stopwatch::•() in block {
-    [@vm.direct-call.metadata=dart.core::Stopwatch.start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}(){() →* void};
+[@vm.inferred-type.metadata=#lib::_Vector?]static field self::_Vector v = new self::_Vector::•();
+[@vm.inferred-type.metadata=dart.core::_Double?]static field core::double x = 0.0;
+static method main(core::List<core::String> args) → dynamic {
+  core::Stopwatch timer = let final core::Stopwatch #t1 = new core::Stopwatch::•() in block {
+    [@vm.direct-call.metadata=dart.core::Stopwatch.start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}(){() → void};
   } =>#t1;
-  for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100000000){(core::num*) →* core::bool*}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num*) →* core::int*}) {
-    self::x = [@vm.direct-call.metadata=dart.core::_Double.+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=dart.core::_Double?] self::x.{core::double::+}([@vm.direct-call.metadata=#lib::_Vector.*??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=#lib::_Vector?] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector?] self::v){(self::_Vector*) →* core::double*}){(core::num*) →* core::double*};
+  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100000000){(core::num) → core::bool}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num) → core::int}) {
+    self::x = [@vm.direct-call.metadata=dart.core::_Double.+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=dart.core::_Double?] self::x.{core::double::+}([@vm.direct-call.metadata=#lib::_Vector.*??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=#lib::_Vector?] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector?] self::v){(self::_Vector) → core::double}){(core::num) → core::double};
   }
-  [@vm.direct-call.metadata=dart.core::Stopwatch.stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}(){() →* void};
-  core::print("Elapsed ${[@vm.direct-call.metadata=dart.core::Stopwatch.elapsedMilliseconds] timer.{core::Stopwatch::elapsedMilliseconds}{core::int*}}ms, result ${self::x}");
+  [@vm.direct-call.metadata=dart.core::Stopwatch.stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}(){() → void};
+  core::print("Elapsed ${[@vm.direct-call.metadata=dart.core::Stopwatch.elapsedMilliseconds] timer.{core::Stopwatch::elapsedMilliseconds}{core::int}}ms, result ${self::x}");
 }
 constants  {
   #C1 = 10
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
index 00cfa5c..c42f78c 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
@@ -1,76 +1,76 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T*>*
+class C<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → dynamic
-    return new self::D::•<self::C::T*>();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method id1([@vm.inferred-type.metadata=#lib::Y (skip check)] generic-covariant-impl self::C::T* x) → dynamic
+    return new self::D::•<self::C::T%>();
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method id1([@vm.inferred-type.metadata=#lib::Y (skip check)] generic-covariant-impl self::C::T% x) → dynamic
     return x;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method id2([@vm.inferred-type.metadata=#lib::Z] generic-covariant-impl self::C::T* x) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method id2([@vm.inferred-type.metadata=#lib::Z] generic-covariant-impl self::C::T% x) → dynamic
     return x;
 }
-class D<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T*>*
+class D<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T%>
     : super core::Object::•()
     ;
 }
-class E<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::C<self::E::T*> {
-  synthetic constructor •() → self::E<self::E::S*, self::E::T*>*
+class E<S extends core::Object? = dynamic, T extends core::Object? = dynamic> extends self::C<self::E::T%> {
+  synthetic constructor •() → self::E<self::E::S%, self::E::T%>
     : super self::C::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → dynamic
-    return [@vm.inferred-type.metadata=#lib::D<dart.core::String*>] super.{self::C::foo}();
+    return [@vm.inferred-type.metadata=#lib::D<dart.core::String>] super.{self::C::foo}();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method bar() → dynamic
-    return new self::D::•<self::E::S*>();
+    return new self::D::•<self::E::S%>();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method baz() → dynamic
-    return new self::D::•<self::E::T*>();
+    return new self::D::•<self::E::T%>();
 }
 abstract class X extends core::Object {
-  synthetic constructor •() → self::X*
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
 class Y extends self::X {
-  synthetic constructor •() → self::Y*
+  synthetic constructor •() → self::Y
     : super self::X::•()
     ;
 }
 class Z extends self::X {
-  synthetic constructor •() → self::Z*
+  synthetic constructor •() → self::Z
     : super self::X::•()
     ;
 }
-abstract class I<T extends core::Object* = dynamic> extends core::Object {
+abstract class I<T extends core::Object? = dynamic> extends core::Object {
 }
-abstract class J extends self::I<core::int*> {
+abstract class J extends self::I<core::int> {
 }
-class K<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::K<self::K::T*>*
+class K<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::K<self::K::T%>
     : super core::Object::•()
     ;
 }
-class C2<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::T*>*
+class C2<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::T%>
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=(d)->d]  method id3([@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.0)] generic-covariant-impl core::Comparable<self::C2::T*>* x) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=(d)->d]  method id3([@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.0)] generic-covariant-impl core::Comparable<self::C2::T%> x) → dynamic
     return x;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method id4([@vm.inferred-type.metadata=#lib::K<#lib::J*> (skip check)] generic-covariant-impl self::K<self::I<self::C2::T*>*>* x) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method id4([@vm.inferred-type.metadata=#lib::K<#lib::J> (skip check)] generic-covariant-impl self::K<self::I<self::C2::T%>> x) → dynamic
     return x;
 }
 static method main() → dynamic {
-  core::print([@vm.direct-call.metadata=#lib::C.foo] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::C::•<core::int*>().{self::C::foo}(){() →* dynamic});
-  core::print([@vm.direct-call.metadata=#lib::E.foo] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::foo}(){() →* dynamic});
-  core::print([@vm.direct-call.metadata=#lib::E.bar] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::bar}(){() →* dynamic});
-  core::print([@vm.direct-call.metadata=#lib::E.baz] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::baz}(){() →* dynamic});
-  self::C<self::X*>* c = new self::C::•<self::Y*>();
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X*>*] [@vm.direct-call.metadata=#lib::C.id1] [@vm.inferred-type.metadata=!? (skip check)] c.{self::C::id1}(new self::Y::•()){(self::X*) →* dynamic};
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X*>*] [@vm.direct-call.metadata=#lib::C.id2] c.{self::C::id2}(new self::Z::•()){(self::X*) →* dynamic};
-  self::C2<core::num*>* c2 = new self::C2::•<core::num*>();
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num*>*] [@vm.direct-call.metadata=#lib::C2.id3] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id3}(3.0){(core::Comparable<core::num*>*) →* dynamic};
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num*>*] [@vm.direct-call.metadata=#lib::C2.id4] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id4}(new self::K::•<self::J*>()){(self::K<self::I<core::num*>*>*) →* dynamic};
+  core::print([@vm.direct-call.metadata=#lib::C.foo] [@vm.inferred-type.metadata=#lib::D<dart.core::int> (skip check)] new self::C::•<core::int>().{self::C::foo}(){() → dynamic});
+  core::print([@vm.direct-call.metadata=#lib::E.foo] [@vm.inferred-type.metadata=#lib::D<dart.core::String> (skip check)] new self::E::•<core::int, core::String>().{self::E::foo}(){() → dynamic});
+  core::print([@vm.direct-call.metadata=#lib::E.bar] [@vm.inferred-type.metadata=#lib::D<dart.core::int> (skip check)] new self::E::•<core::int, core::String>().{self::E::bar}(){() → dynamic});
+  core::print([@vm.direct-call.metadata=#lib::E.baz] [@vm.inferred-type.metadata=#lib::D<dart.core::String> (skip check)] new self::E::•<core::int, core::String>().{self::E::baz}(){() → dynamic});
+  self::C<self::X> c = new self::C::•<self::Y>();
+  [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X>] [@vm.direct-call.metadata=#lib::C.id1] [@vm.inferred-type.metadata=!? (skip check)] c.{self::C::id1}(new self::Y::•()){(self::X) → dynamic};
+  [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X>] [@vm.direct-call.metadata=#lib::C.id2] c.{self::C::id2}(new self::Z::•()){(self::X) → dynamic};
+  self::C2<core::num> c2 = new self::C2::•<core::num>();
+  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num>] [@vm.direct-call.metadata=#lib::C2.id3] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id3}(3.0){(core::Comparable<core::num>) → dynamic};
+  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num>] [@vm.direct-call.metadata=#lib::C2.id4] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id4}(new self::K::•<self::J>()){(self::K<self::I<core::num>>) → dynamic};
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart
index c211e10..121201d 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:collection';
 
 class Element {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect
index 1a8dce9..685989f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect
@@ -1,21 +1,21 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get foo() → core::String*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get foo() → core::String
     return "foo";
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  method getBar() → core::String*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  method getBar() → core::String
     return "bar";
 }
 class B extends core::Object implements core::Enum /*isEnum*/  {
-[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4] [@vm.unboxing-info.metadata=()->i]  final field core::int* index;
-[@vm.inferred-type.metadata=dart.core::_OneByteString (value: "B.b2")] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5]  final field core::String* _name;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  method toString() → core::String*
-    return [@vm.direct-call.metadata=#lib::B._name] [@vm.inferred-type.metadata=dart.core::_OneByteString (value: "B.b2")] this.{self::B::_name}{core::String*};
+[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4] [@vm.unboxing-info.metadata=()->i]  final field core::int index;
+[@vm.inferred-type.metadata=dart.core::_OneByteString (value: "B.b2")] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5]  final field core::String _name;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  method toString() → core::String
+    return [@vm.direct-call.metadata=#lib::B._name] [@vm.inferred-type.metadata=dart.core::_OneByteString (value: "B.b2")] this.{self::B::_name}{core::String};
 }
 static method test0() → void {
   core::print(#C1);
@@ -32,9 +32,9 @@
   core::print(#C4);
   core::print([@vm.inferred-type.metadata=dart.core::_Double (value: 100.0)] self::getD);
 }
-static method testStrings([@vm.inferred-type.metadata=#lib::A] self::A* a0) → void {
-  core::print([@vm.direct-call.metadata=#lib::A.foo] [@vm.inferred-type.metadata=dart.core::_OneByteString (value: "foo")] a0.{self::A::foo}{core::String*});
-  core::print([@vm.direct-call.metadata=#lib::A.getBar] [@vm.inferred-type.metadata=dart.core::_OneByteString (skip check) (value: "bar")] a0.{self::A::getBar}(){() →* core::String*});
+static method testStrings([@vm.inferred-type.metadata=#lib::A] self::A a0) → void {
+  core::print([@vm.direct-call.metadata=#lib::A.foo] [@vm.inferred-type.metadata=dart.core::_OneByteString (value: "foo")] a0.{self::A::foo}{core::String});
+  core::print([@vm.direct-call.metadata=#lib::A.getBar] [@vm.inferred-type.metadata=dart.core::_OneByteString (skip check) (value: "bar")] a0.{self::A::getBar}(){() → core::String});
   core::print(#C5);
 }
 static method testPassEnum() → void {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart
index 515824c..8356b38 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 abstract class A {
   int foo();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart b/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart
index 5f51fa3..bd09bf6 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart
@@ -1,3 +1,5 @@
+// @dart=2.9
+
 main() {
   dynamic x = List<int>.filled(10, null);
   x[0] + 10;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/enum_used_as_type.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/enum_used_as_type.dart.expect
index ac4bbc2..34740ea 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/enum_used_as_type.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/enum_used_as_type.dart.expect
@@ -1,24 +1,21 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
 abstract class Enum extends core::Object implements core::Enum {
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  abstract get index() → core::int*;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  abstract get /*isLegacy*/ index() → core::int;
 }
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  method method() → core::int*
-    return [@vm.inferred-type.metadata=!](#C1).{self::Enum::index}{core::int*};
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::Enum e) → core::int
+    return [@vm.inferred-type.metadata=!] e.{self::Enum::index}{core::int};
 }
 static method main() → dynamic {
-  core::List<dynamic>* list = [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::•<dynamic>(0);
-  if([@vm.direct-call.metadata=dart.core::_GrowableList.isNotEmpty] [@vm.inferred-type.metadata=dart.core::bool] list.{core::Iterable::isNotEmpty}{core::bool*}) {
-    let final self::Class* #t1 = new self::Class::•() in let final self::Enum* #t2 = _in::unsafeCast<self::Enum*>(_in::unsafeCast<dynamic>(null)) in [@vm.direct-call.metadata=#lib::Class.method] [@vm.inferred-type.metadata=!? (skip check)] #t1.{self::Class::method}(){(self::Enum*) →* core::int*};
+  core::List<dynamic> list = [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::•<dynamic>(0);
+  if([@vm.direct-call.metadata=dart.core::_GrowableList.isNotEmpty] [@vm.inferred-type.metadata=dart.core::bool] list.{core::Iterable::isNotEmpty}{core::bool}) {
+    [@vm.direct-call.metadata=#lib::Class.method] [@vm.inferred-type.metadata=!? (skip check)] new self::Class::•().{self::Class::method}(_in::unsafeCast<self::Enum>(_in::unsafeCast<dynamic>(null))){(self::Enum) → core::int};
   }
 }
-constants  {
-  #C1 = null
-}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart b/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart
index fcdd2df..cfe006d 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:ffi';
 
 /// Retained because of being by-value return type in FFI call.
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
index 8a43ab1..a0447e5 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
@@ -1,35 +1,35 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
 
 import "dart:async";
 
-class C<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T*>*
+class C<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=(i)->b]  method test2c([@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] generic-covariant-impl FutureOr<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl asy::Future<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl FutureOr<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method test2r([@vm.inferred-type.metadata=#lib::C<dart.core::int*> (skip check)] generic-covariant-impl self::C<FutureOr<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method test3r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method test4r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<FutureOr<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method test5r([@vm.inferred-type.metadata=#lib::C<FutureOr<dart.core::int*>?>] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  method test6r([@vm.inferred-type.metadata=#lib::C<FutureOr<dart.core::int*>?> (skip check)] generic-covariant-impl self::C<FutureOr<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  method test7r([@vm.inferred-type.metadata=#lib::C<FutureOr<dart.core::int*>?>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  method test8r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=(i)->b]  method test2c([@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] generic-covariant-impl FutureOr<self::C::T%>x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int> (skip check)] generic-covariant-impl asy::Future<self::C::T%> x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int> (skip check)] generic-covariant-impl FutureOr<self::C::T%>x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method test2r([@vm.inferred-type.metadata=#lib::C<dart.core::int> (skip check)] generic-covariant-impl self::C<FutureOr<self::C::T%>> x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method test3r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int>> (skip check)] generic-covariant-impl self::C<asy::Future<self::C::T%>> x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method test4r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int>> (skip check)] generic-covariant-impl self::C<FutureOr<self::C::T%>> x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method test5r([@vm.inferred-type.metadata=#lib::C<FutureOr<dart.core::int>?>] generic-covariant-impl self::C<asy::Future<self::C::T%>> x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  method test6r([@vm.inferred-type.metadata=#lib::C<FutureOr<dart.core::int>?> (skip check)] generic-covariant-impl self::C<FutureOr<self::C::T%>> x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  method test7r([@vm.inferred-type.metadata=#lib::C<FutureOr<dart.core::int>?>] generic-covariant-impl self::C<self::C::T%> x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  method test8r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int>>] generic-covariant-impl self::C<self::C::T%> x) → void {}
 }
 static method main() → dynamic {
-  dynamic c = new self::C::•<core::int*>();
+  dynamic c = new self::C::•<core::int>();
   [@vm.direct-call.metadata=#lib::C.test2c] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test2c(3);
-  [@vm.direct-call.metadata=#lib::C.test3c] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*>] asy::Future::value<core::int*>(3));
-  [@vm.direct-call.metadata=#lib::C.test4c] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*>] asy::Future::value<core::int*>(3));
-  [@vm.direct-call.metadata=#lib::C.test2r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test2r(new self::C::•<core::int*>());
-  [@vm.direct-call.metadata=#lib::C.test3r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test3r(new self::C::•<asy::Future<core::int*>*>());
-  [@vm.direct-call.metadata=#lib::C.test4r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test4r(new self::C::•<asy::Future<core::int*>*>());
-  [@vm.direct-call.metadata=#lib::C.test5r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test5r(new self::C::•<FutureOr<core::int*>*>());
-  [@vm.direct-call.metadata=#lib::C.test6r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test6r(new self::C::•<FutureOr<core::int*>*>());
-  [@vm.direct-call.metadata=#lib::C.test7r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test7r(new self::C::•<FutureOr<core::int*>*>());
-  [@vm.direct-call.metadata=#lib::C.test8r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test8r(new self::C::•<asy::Future<core::int*>*>());
+  [@vm.direct-call.metadata=#lib::C.test3c] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int>] asy::Future::value<core::int>(3));
+  [@vm.direct-call.metadata=#lib::C.test4c] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int>] asy::Future::value<core::int>(3));
+  [@vm.direct-call.metadata=#lib::C.test2r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test2r(new self::C::•<core::int>());
+  [@vm.direct-call.metadata=#lib::C.test3r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test3r(new self::C::•<asy::Future<core::int>>());
+  [@vm.direct-call.metadata=#lib::C.test4r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test4r(new self::C::•<asy::Future<core::int>>());
+  [@vm.direct-call.metadata=#lib::C.test5r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test5r(new self::C::•<FutureOr<core::int>>());
+  [@vm.direct-call.metadata=#lib::C.test6r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test6r(new self::C::•<FutureOr<core::int>>());
+  [@vm.direct-call.metadata=#lib::C.test7r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test7r(new self::C::•<FutureOr<core::int>>());
+  [@vm.direct-call.metadata=#lib::C.test8r] [@vm.inferred-type.metadata=!? (receiver not int)] c{dynamic}.test8r(new self::C::•<asy::Future<core::int>>());
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart b/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart
index f253547..03e65ae 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:async';
 
 dynamic usedObject;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect
index 2296f5b..7b1f705 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect
@@ -1,14 +1,14 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
-static method foo() → core::Object*
+static method foo() → core::Object
   return new self::A::•();
-static method main(core::List<core::String*>* args) → dynamic {
+static method main(core::List<core::String> args) → dynamic {
   core::print([@vm.inferred-type.metadata=#lib::A] self::foo());
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart
index da1f458..7420b2c 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart
@@ -11,6 +11,8 @@
 //   self-induced invalidations.
 //
 
+// @dart=2.9
+
 class StreamSubscription {}
 
 class _BufferingStreamSubscription extends StreamSubscription {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart
index c4e949c..b0ca102 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 class T1 {}
 
 class T2 {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart
index b70a6cf..844a585 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 class T1 {}
 
 class T2 {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart
index 5248ac9..d7a751a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 class T1 {}
 
 class T2 {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart
index cd5d128..b91b3a3 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 class T1 {}
 
 class T2 {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart
index 7fb845e..9a5df63 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 class T1 {}
 
 class T2 {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
index ffc08fe..918c5ae 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
@@ -1,43 +1,43 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1*
+  synthetic constructor •() → self::T1
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method go() → self::T3*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method go() → self::T3
     return new self::T3::•();
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2*
+  synthetic constructor •() → self::T2
     : super core::Object::•()
     ;
 }
 class T3 extends core::Object {
-  synthetic constructor •() → self::T3*
+  synthetic constructor •() → self::T3
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method run() → dynamic {
     core::print("hi");
   }
 }
-class Q<T extends core::Object* = dynamic> extends core::Object {
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5]  final field self::Q::T* result;
-  constructor •(self::Q::T* result) → self::Q<self::Q::T*>*
+class Q<T extends core::Object? = dynamic> extends core::Object {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5]  final field self::Q::T% result;
+  constructor •(self::Q::T% result) → self::Q<self::Q::T%>
     : self::Q::result = result, super core::Object::•()
     ;
 }
-static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::T1*>] core::List<self::T1*>* list) → dynamic {
-  [@vm.direct-call.metadata=#lib::T3.run] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::T1.go??] [@vm.inferred-type.metadata=#lib::T3 (skip check)] [@vm.direct-call.metadata=#lib::Q.result??] [@vm.direct-call.metadata=dart._internal::ListIterable.first] [@vm.inferred-type.metadata=#lib::Q?] [@vm.direct-call.metadata=dart.collection::_ListBase&Object&ListMixin.map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<#lib::T1*, ?> (skip check)] list.{core::Iterable::map}<self::Q<self::T1*>*>((self::T1* t1) → self::Q<self::T1*>* => new self::Q::•<self::T1*>(t1)){((self::T1*) →* self::Q<self::T1*>*) →* core::Iterable<self::Q<self::T1*>*>*}.{core::Iterable::first}{self::Q<self::T1*>*}.{self::Q::result}{self::T1*}.{self::T1::go}(){() →* self::T3*}.{self::T3::run}(){() →* dynamic};
+static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::T1>] core::List<self::T1> list) → dynamic {
+  [@vm.direct-call.metadata=#lib::T3.run] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::T1.go??] [@vm.inferred-type.metadata=#lib::T3 (skip check)] [@vm.direct-call.metadata=#lib::Q.result??] [@vm.direct-call.metadata=dart._internal::ListIterable.first] [@vm.inferred-type.metadata=#lib::Q?] [@vm.direct-call.metadata=dart.collection::_ListBase&Object&ListMixin.map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<#lib::T1, ?> (skip check)] list.{core::Iterable::map}<self::Q<self::T1>>((self::T1 t1) → self::Q<self::T1> => new self::Q::•<self::T1>(t1)){((self::T1) → self::Q<self::T1>) → core::Iterable<self::Q<self::T1>>}.{core::Iterable::first}{self::Q<self::T1>}.{self::Q::result}{self::T1}.{self::T1::go}(){() → self::T3}.{self::T3::run}(){() → dynamic};
 }
-static method foo2NewValue() → self::Q<dynamic>*
-  return new self::Q::•<self::T2*>(new self::T2::•());
+static method foo2NewValue() → self::Q<dynamic>
+  return new self::Q::•<self::T2>(new self::T2::•());
 static method foo3NewT1() → dynamic {
   new self::T1::•();
 }
-static method main(core::List<core::String*>* args) → dynamic {
-  self::foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::T1*>] core::_GrowableList::•<self::T1*>(0));
+static method main(core::List<core::String> args) → dynamic {
+  self::foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::T1>] core::_GrowableList::•<self::T1>(0));
   self::foo2NewValue();
   self::foo3NewT1();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
index 74df479..84447db 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
@@ -1,4 +1,4 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
@@ -6,35 +6,35 @@
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  abstract method foo() → void;
 }
 class T1 extends core::Object implements self::I {
-  synthetic constructor •() → self::T1*
+  synthetic constructor •() → self::T1
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → void {}
 }
 class T2 extends core::Object implements self::I {
-  synthetic constructor •() → self::T2*
+  synthetic constructor •() → self::T2
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → void {}
 }
 class Point extends core::Object /*hasConstConstructor*/  {
-[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  final field self::I* x;
-  const constructor •([@vm.inferred-type.metadata=!] self::I* x) → self::Point*
+[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  final field self::I x;
+  const constructor •([@vm.inferred-type.metadata=!] self::I x) → self::Point
     : self::Point::x = x, super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  method newPoint1() → self::Point*
-    return new self::Point::•([@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!] this.{self::Point::x}{self::I*});
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  method newPoint2() → self::Point*
-    return new self::Point::•([@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!] this.{self::Point::x}{self::I*});
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  method newPoint1() → self::Point
+    return new self::Point::•([@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!] this.{self::Point::x}{self::I});
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  method newPoint2() → self::Point
+    return new self::Point::•([@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!] this.{self::Point::x}{self::I});
 }
 static method getX([@vm.inferred-type.metadata=#lib::Point] dynamic point) → dynamic {
   [@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!? (receiver not int)] point{dynamic}.x;
 }
 static method main() → dynamic {
-  self::Point* a = new self::Point::•(new self::T1::•());
-  core::print([@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!] a.{self::Point::x}{self::I*});
-  self::Point* c = new self::Point::•(new self::T2::•());
-  [@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!] c.{self::Point::x}{self::I*}.{self::I::foo}(){() →* void};
-  self::getX([@vm.direct-call.metadata=#lib::Point.newPoint1] [@vm.inferred-type.metadata=#lib::Point (skip check)] a.{self::Point::newPoint1}(){() →* self::Point*});
-  self::getX([@vm.direct-call.metadata=#lib::Point.newPoint2] [@vm.inferred-type.metadata=#lib::Point (skip check)] a.{self::Point::newPoint2}(){() →* self::Point*});
+  self::Point a = new self::Point::•(new self::T1::•());
+  core::print([@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!] a.{self::Point::x}{self::I});
+  self::Point c = new self::Point::•(new self::T2::•());
+  [@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!] c.{self::Point::x}{self::I}.{self::I::foo}(){() → void};
+  self::getX([@vm.direct-call.metadata=#lib::Point.newPoint1] [@vm.inferred-type.metadata=#lib::Point (skip check)] a.{self::Point::newPoint1}(){() → self::Point});
+  self::getX([@vm.direct-call.metadata=#lib::Point.newPoint2] [@vm.inferred-type.metadata=#lib::Point (skip check)] a.{self::Point::newPoint2}(){() → self::Point});
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart b/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart
index 62e1f09..355f41d3 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 nonConstant() => int.parse('1') == 1;
 
 class A {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/named_params_shaking_test.dart b/pkg/vm/testcases/transformations/type_flow/transformer/named_params_shaking_test.dart
index b941651..b180b60 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/named_params_shaking_test.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/named_params_shaking_test.dart
@@ -4,6 +4,8 @@
 //
 // Test that optimization of named parameters doesn't change evaluation order.
 
+// @dart=2.9
+
 import 'dart:math';
 import 'package:expect/expect.dart';
 
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart
index a85118e..e0ab4922 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 class T1 {}
 
 class T2 {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/null_test_elimination.dart b/pkg/vm/testcases/transformations/type_flow/transformer/null_test_elimination.dart
index 98488d3..121f842 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/null_test_elimination.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/null_test_elimination.dart
@@ -4,6 +4,8 @@
 
 // Tests elimination of null tests.
 
+// @dart=2.9
+
 class A {
   String nonNullable;
   String nullable;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart
index b60d23b..4065205 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart
@@ -5,6 +5,8 @@
 // This test verifies that inferred types of parameters are valid *before*
 // applying strong mode argument type checks.
 
+// @dart=2.9
+
 abstract class T0 {
   void foo();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/pragmas.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/pragmas.dart.expect
index b832065..9578649 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/pragmas.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/pragmas.dart.expect
@@ -1,30 +1,30 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object /*hasConstConstructor*/  {
-[@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] [@vm.unboxing-info.metadata=()->i]  final field core::int* x;
+[@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] [@vm.unboxing-info.metadata=()->i]  final field core::int x;
 }
 class B extends core::Object /*hasConstConstructor*/  {
-[@vm.inferred-type.metadata=dart.core::_Smi (value: 11)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2] [@vm.unboxing-info.metadata=()->i]  final field core::int* y;
+[@vm.inferred-type.metadata=dart.core::_Smi (value: 11)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:2] [@vm.unboxing-info.metadata=()->i]  final field core::int y;
 }
 class C extends core::Object /*hasConstConstructor*/  {
-[@vm.inferred-type.metadata=dart.core::_Smi (value: 12)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3] [@vm.unboxing-info.metadata=()->i]  final field core::int* z;
+[@vm.inferred-type.metadata=dart.core::_Smi (value: 12)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3] [@vm.unboxing-info.metadata=()->i]  final field core::int z;
 }
 @#C4
 class Foo extends core::Object {
-  synthetic constructor •() → self::Foo*
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  @#C13
   method bar() → void {
     @#C17
     function bazz() → void {}
-    bazz(){() →* void};
+    bazz(){() → void};
   }
 }
 static method main() → dynamic {
-  [@vm.direct-call.metadata=#lib::Foo.bar] [@vm.inferred-type.metadata=!? (skip check)] new self::Foo::•().{self::Foo::bar}(){() →* void};
+  [@vm.direct-call.metadata=#lib::Foo.bar] [@vm.inferred-type.metadata=!? (skip check)] new self::Foo::•().{self::Foo::bar}(){() → void};
 }
 constants  {
   #C1 = "test1"
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart
index 1912459..929945f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart
@@ -13,7 +13,7 @@
     ..aKeep = 43;
   test('retrieving values', () {
     expect(foo.barKeep.aKeep, 5);
-    expect(foo.mapKeep['foo'].aKeep, 2);
+    expect(foo.mapKeep['foo']!.aKeep, 2);
     expect(foo.hasHasKeep(), false);
     expect(foo.aKeep, 43);
     foo.clearClearKeep();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
index 9dae16a..d1e617c0 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
@@ -1,4 +1,4 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "generated/foo.pb.dart" as pb;
 import "dart:core" as core;
@@ -9,21 +9,21 @@
 import "file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart";
 
 static method main() → dynamic {
-  pb::FooKeep* foo = let final pb::FooKeep* #t1 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep] pb::FooKeep::•() in block {
-    [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::barKeep} = let final pb::BarKeep* #t2 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep] pb::BarKeep::•() in block {
+  pb::FooKeep foo = let final pb::FooKeep #t1 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep] pb::FooKeep::•() in block {
+    [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::barKeep} = let final pb::BarKeep #t2 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep] pb::BarKeep::•() in block {
       [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pb::BarKeep::aKeep} = 5;
     } =>#t2;
-    [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<dart.core::String*, library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep*>*] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] #t1.{pb::FooKeep::mapKeep}{core::Map<core::String*, pb::BarKeep*>*}.{core::Map::[]=}("foo", let final pb::BarKeep* #t3 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep] pb::BarKeep::•() in block {
+    [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<dart.core::String, library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep>] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] #t1.{pb::FooKeep::mapKeep}{core::Map<core::String, pb::BarKeep>}.{core::Map::[]=}("foo", let final pb::BarKeep #t3 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep] pb::BarKeep::•() in block {
       [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pb::BarKeep::aKeep} = 2;
-    } =>#t3){(core::String*, pb::BarKeep*) →* void};
+    } =>#t3){(core::String, pb::BarKeep) → void};
     [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::aKeep} = 43;
   } =>#t1;
   sca::test(() → Null {
-    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}{pb::BarKeep*}.{pb::BarKeep::aKeep}{core::int*}, 5);
-    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}{core::Map<core::String*, pb::BarKeep*>*}.{core::Map::[]}("foo"){(core::Object*) →* pb::BarKeep*}.{pb::BarKeep::aKeep}{core::int*}, 2);
-    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.hasHasKeep] [@vm.inferred-type.metadata=dart.core::bool (skip check)] foo.{pb::FooKeep::hasHasKeep}(){() →* core::bool*}, false);
-    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=int] foo.{pb::FooKeep::aKeep}{core::int*}, 43);
-    [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.clearClearKeep] [@vm.inferred-type.metadata=!? (skip check)] foo.{pb::FooKeep::clearClearKeep}(){() →* void};
+    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}{pb::BarKeep}.{pb::BarKeep::aKeep}{core::int}, 5);
+    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}{core::Map<core::String, pb::BarKeep>}.{core::Map::[]}("foo"){(core::Object?) → pb::BarKeep?}!.{pb::BarKeep::aKeep}{core::int}, 2);
+    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.hasHasKeep] [@vm.inferred-type.metadata=dart.core::bool (skip check)] foo.{pb::FooKeep::hasHasKeep}(){() → core::bool}, false);
+    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=int] foo.{pb::FooKeep::aKeep}{core::int}, 43);
+    [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.clearClearKeep] [@vm.inferred-type.metadata=!? (skip check)] foo.{pb::FooKeep::clearClearKeep}(){() → void};
   });
 }
 library foo.pb.dart /*isNonNullableByDefault*/;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart
index d33289f..7e96839 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart
@@ -19,7 +19,7 @@
 main() {
   FooKeep foo = FooKeep.fromBuffer(buffer);
   test('Kept values are restored correctly', () {
-    expect(foo.mapKeep['foo'].aKeep, 42);
+    expect(foo.mapKeep['foo']!.aKeep, 42);
     expect(foo.barKeep.aKeep, 5);
     expect(foo.aKeep, 43);
     expect(foo.hasHasKeep(), true);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
index 133c846..7b743f8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
@@ -1,4 +1,4 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "generated/foo.pb.dart" as pb;
 import "package:test_core/scaffolding.dart" as sca;
@@ -8,15 +8,15 @@
 import "package:test/test.dart";
 import "file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart";
 
-[@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int*>]static field core::List<core::int*>* buffer = <core::int*>[10, 4, 8, 5, 16, 4, 26, 9, 10, 3, 102, 111, 111, 18, 2, 8, 42, 34, 9, 10, 3, 122, 111, 112, 18, 2, 8, 3, 40, 43, 50, 0, 58, 0];
+[@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int>]static field core::List<core::int> buffer = <core::int>[10, 4, 8, 5, 16, 4, 26, 9, 10, 3, 102, 111, 111, 18, 2, 8, 42, 34, 9, 10, 3, 122, 111, 112, 18, 2, 8, 3, 40, 43, 50, 0, 58, 0];
 static method main() → dynamic {
-  pb::FooKeep* foo = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep] pb::FooKeep::fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int*>] self::buffer);
+  pb::FooKeep foo = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep] pb::FooKeep::fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int>] self::buffer);
   sca::test(() → Null {
-    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}{core::Map<core::String*, pb::BarKeep*>*}.{core::Map::[]}("foo"){(core::Object*) →* pb::BarKeep*}.{pb::BarKeep::aKeep}{core::int*}, 42);
-    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}{pb::BarKeep*}.{pb::BarKeep::aKeep}{core::int*}, 5);
-    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=int] foo.{pb::FooKeep::aKeep}{core::int*}, 43);
-    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.hasHasKeep] [@vm.inferred-type.metadata=dart.core::bool (skip check)] foo.{pb::FooKeep::hasHasKeep}(){() →* core::bool*}, true);
-    [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.clearClearKeep] [@vm.inferred-type.metadata=!? (skip check)] foo.{pb::FooKeep::clearClearKeep}(){() →* void};
+    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}{core::Map<core::String, pb::BarKeep>}.{core::Map::[]}("foo"){(core::Object?) → pb::BarKeep?}!.{pb::BarKeep::aKeep}{core::int}, 42);
+    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}{pb::BarKeep}.{pb::BarKeep::aKeep}{core::int}, 5);
+    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=int] foo.{pb::FooKeep::aKeep}{core::int}, 43);
+    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.hasHasKeep] [@vm.inferred-type.metadata=dart.core::bool (skip check)] foo.{pb::FooKeep::hasHasKeep}(){() → core::bool}, true);
+    [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.clearClearKeep] [@vm.inferred-type.metadata=!? (skip check)] foo.{pb::FooKeep::clearClearKeep}(){() → void};
   });
 }
 library foo.pb.dart /*isNonNullableByDefault*/;
@@ -41,7 +41,7 @@
   constructor _() → self::FooKeep
     : super pro::GeneratedMessage::•()
     ;
-  static factory fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int*>] core::List<core::int> i) → self::FooKeep
+  static factory fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int>] core::List<core::int> i) → self::FooKeep
     return let final self::FooKeep #t2 = [@vm.inferred-type.metadata=foo.pb.dart::FooKeep] self::FooKeep::create() in block {
       [@vm.direct-call.metadata=protobuf::GeneratedMessage.mergeFromBuffer] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::GeneratedMessage::mergeFromBuffer}(i){(core::List<core::int>, [pro::ExtensionRegistry]) → void};
     } =>#t2;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect
index f223e18..4b3811a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect
@@ -1,4 +1,4 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "generated/foo.pb.dart" as pb;
 import "dart:core" as core;
@@ -10,26 +10,26 @@
 import "file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart";
 
 static method main() → dynamic {
-  pb::FooKeep* foo = let final pb::FooKeep* #t1 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep] pb::FooKeep::•() in block {
-    [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::barKeep} = let final pb::BarKeep* #t2 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep] pb::BarKeep::•() in block {
+  pb::FooKeep foo = let final pb::FooKeep #t1 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep] pb::FooKeep::•() in block {
+    [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::barKeep} = let final pb::BarKeep #t2 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep] pb::BarKeep::•() in block {
       [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pb::BarKeep::aKeep} = 5;
       [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.bDrop] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pb::BarKeep::bDrop} = 4;
     } =>#t2;
-    [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<dart.core::String*, library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep*>*] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] #t1.{pb::FooKeep::mapKeep}{core::Map<core::String*, pb::BarKeep*>*}.{core::Map::[]=}("foo", let final pb::BarKeep* #t3 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep] pb::BarKeep::•() in block {
+    [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<dart.core::String, library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep>] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] #t1.{pb::FooKeep::mapKeep}{core::Map<core::String, pb::BarKeep>}.{core::Map::[]=}("foo", let final pb::BarKeep #t3 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep] pb::BarKeep::•() in block {
       [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pb::BarKeep::aKeep} = 42;
-    } =>#t3){(core::String*, pb::BarKeep*) →* void};
-    [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<dart.core::String*, library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::ZopDrop*>*] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapDrop] [@vm.inferred-type.metadata=!] #t1.{pb::FooKeep::mapDrop}{core::Map<core::String*, pb::ZopDrop*>*}.{core::Map::[]=}("zop", let final pb::ZopDrop* #t4 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::ZopDrop] pb::ZopDrop::•() in block {
+    } =>#t3){(core::String, pb::BarKeep) → void};
+    [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<dart.core::String, library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::ZopDrop>] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapDrop] [@vm.inferred-type.metadata=!] #t1.{pb::FooKeep::mapDrop}{core::Map<core::String, pb::ZopDrop>}.{core::Map::[]=}("zop", let final pb::ZopDrop #t4 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::ZopDrop] pb::ZopDrop::•() in block {
       [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::ZopDrop.aDrop] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pb::ZopDrop::aDrop} = 3;
-    } =>#t4){(core::String*, pb::ZopDrop*) →* void};
+    } =>#t4){(core::String, pb::ZopDrop) → void};
     [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::aKeep} = 43;
     [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.hasKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::hasKeep} = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::HasKeep] pb::HasKeep::•();
     [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.clearKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::clearKeep} = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::ClearKeep] pb::ClearKeep::•();
   } =>#t1;
-  final typ::Uint8List* buffer = [@vm.direct-call.metadata=protobuf::GeneratedMessage.writeToBuffer] [@vm.inferred-type.metadata=dart.typed_data::_Uint8List (skip check)] foo.{pro::GeneratedMessage::writeToBuffer}(){() →* typ::Uint8List*};
+  final typ::Uint8List buffer = [@vm.direct-call.metadata=protobuf::GeneratedMessage.writeToBuffer] [@vm.inferred-type.metadata=dart.typed_data::_Uint8List (skip check)] foo.{pro::GeneratedMessage::writeToBuffer}(){() → typ::Uint8List};
   core::print("List<int> buffer = <int>[");
-  for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=dart.typed_data::_TypedListBase.length] [@vm.inferred-type.metadata=dart.core::_Smi] buffer.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(5){(core::num*) →* core::int*}) {
-    final core::String* numbers = [@vm.direct-call.metadata=dart.typed_data::_TypedListBase.join] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=dart.typed_data::__Uint8List&_TypedList&_IntListMixin&_TypedIntListMixin.sublist] [@vm.inferred-type.metadata=dart.typed_data::_Uint8List (skip check)] buffer.{typ::Uint8List::sublist}(i, [@vm.inferred-type.metadata=int] math::min<core::int*>([@vm.direct-call.metadata=dart.typed_data::_TypedListBase.length] [@vm.inferred-type.metadata=dart.core::_Smi] buffer.{core::List::length}{core::int*}, [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(5){(core::num*) →* core::int*})){(core::int*, [core::int*]) →* typ::Uint8List*}.{core::Iterable::join}(", "){([core::String*]) →* core::String*};
-    core::print("  ${numbers},${[@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i =={core::num::==}{(core::Object*) →* core::bool*} 0 ?{core::String*} " //" : ""}");
+  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=dart.typed_data::_TypedListBase.length] [@vm.inferred-type.metadata=dart.core::_Smi] buffer.{core::List::length}{core::int}){(core::num) → core::bool}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(5){(core::num) → core::int}) {
+    final core::String numbers = [@vm.direct-call.metadata=dart.typed_data::_TypedListBase.join] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=dart.typed_data::__Uint8List&_TypedList&_IntListMixin&_TypedIntListMixin.sublist] [@vm.inferred-type.metadata=dart.typed_data::_Uint8List (skip check)] buffer.{typ::Uint8List::sublist}(i, [@vm.inferred-type.metadata=int] math::min<core::int>([@vm.direct-call.metadata=dart.typed_data::_TypedListBase.length] [@vm.inferred-type.metadata=dart.core::_Smi] buffer.{core::List::length}{core::int}, [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(5){(core::num) → core::int})){(core::int, [core::int?]) → typ::Uint8List}.{core::Iterable::join}(", "){([core::String]) → core::String};
+    core::print("  ${numbers},${[@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i =={core::num::==}{(core::Object) → core::bool} 0 ?{core::String} " //" : ""}");
   }
   core::print("];");
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart
index 0529e4a..8d7567e 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart
@@ -14,7 +14,7 @@
   test('Freezing a message works', () {
     foo.freeze();
     expect(foo.barKeep.aKeep, 5);
-    expect(foo.mapKeep['foo'].aKeep, 2);
+    expect(foo.mapKeep['foo']!.aKeep, 2);
     expect(foo.hasHasKeep(), false);
     expect(foo.aKeep, 43);
     expect(() => foo.clearClearKeep(),
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
index ee0cdfc..aec44f7 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
@@ -1,4 +1,4 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "generated/foo.pb.dart" as pb;
 import "dart:core" as core;
@@ -11,22 +11,22 @@
 import "file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart";
 
 static method main() → dynamic {
-  pb::FooKeep* foo = let final pb::FooKeep* #t1 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep] pb::FooKeep::•() in block {
-    [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::barKeep} = let final pb::BarKeep* #t2 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep] pb::BarKeep::•() in block {
+  pb::FooKeep foo = let final pb::FooKeep #t1 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep] pb::FooKeep::•() in block {
+    [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::barKeep} = let final pb::BarKeep #t2 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep] pb::BarKeep::•() in block {
       [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pb::BarKeep::aKeep} = 5;
     } =>#t2;
-    [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<dart.core::String*, library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep*>*] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] #t1.{pb::FooKeep::mapKeep}{core::Map<core::String*, pb::BarKeep*>*}.{core::Map::[]=}("foo", let final pb::BarKeep* #t3 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep] pb::BarKeep::•() in block {
+    [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<dart.core::String, library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep>] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] #t1.{pb::FooKeep::mapKeep}{core::Map<core::String, pb::BarKeep>}.{core::Map::[]=}("foo", let final pb::BarKeep #t3 = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep] pb::BarKeep::•() in block {
       [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pb::BarKeep::aKeep} = 2;
-    } =>#t3){(core::String*, pb::BarKeep*) →* void};
+    } =>#t3){(core::String, pb::BarKeep) → void};
     [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::aKeep} = 43;
   } =>#t1;
   sca::test(() → Null {
-    [@vm.direct-call.metadata=protobuf::GeneratedMessage.freeze] [@vm.inferred-type.metadata=!? (skip check)] foo.{pro::GeneratedMessage::freeze}(){() →* pro::GeneratedMessage*};
-    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}{pb::BarKeep*}.{pb::BarKeep::aKeep}{core::int*}, 5);
-    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}{core::Map<core::String*, pb::BarKeep*>*}.{core::Map::[]}("foo"){(core::Object*) →* pb::BarKeep*}.{pb::BarKeep::aKeep}{core::int*}, 2);
-    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.hasHasKeep] [@vm.inferred-type.metadata=dart.core::bool (skip check)] foo.{pb::FooKeep::hasHasKeep}(){() →* core::bool*}, false);
-    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=int] foo.{pb::FooKeep::aKeep}{core::int*}, 43);
-    exp::expect(() → void => [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.clearClearKeep] [@vm.inferred-type.metadata=!? (skip check)] foo.{pb::FooKeep::clearClearKeep}(){() →* void}, [@vm.inferred-type.metadata=library package:test_api/src/expect/throws_matcher.dart::Throws] thr::throwsA());
+    [@vm.direct-call.metadata=protobuf::GeneratedMessage.freeze] [@vm.inferred-type.metadata=!? (skip check)] foo.{pro::GeneratedMessage::freeze}(){() → pro::GeneratedMessage};
+    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}{pb::BarKeep}.{pb::BarKeep::aKeep}{core::int}, 5);
+    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}{core::Map<core::String, pb::BarKeep>}.{core::Map::[]}("foo"){(core::Object?) → pb::BarKeep?}!.{pb::BarKeep::aKeep}{core::int}, 2);
+    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.hasHasKeep] [@vm.inferred-type.metadata=dart.core::bool (skip check)] foo.{pb::FooKeep::hasHasKeep}(){() → core::bool}, false);
+    exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=int] foo.{pb::FooKeep::aKeep}{core::int}, 43);
+    exp::expect(() → void => [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.clearClearKeep] [@vm.inferred-type.metadata=!? (skip check)] foo.{pb::FooKeep::clearClearKeep}(){() → void}, [@vm.inferred-type.metadata=library package:test_api/src/expect/throws_matcher.dart::Throws] thr::throwsA());
   });
 }
 library foo.pb.dart /*isNonNullableByDefault*/;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/name_mangling_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/name_mangling_test.dart.expect
index 7489bcb..fb4225c 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/name_mangling_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/name_mangling_test.dart.expect
@@ -1,4 +1,4 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "generated/name_mangling.pb.dart" as pb;
 import "dart:core" as core;
@@ -7,8 +7,8 @@
 import "file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/name_mangling.pb.dart";
 
 static method main() → dynamic {
-  pb::NameManglingKeep* n = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/name_mangling.pb.dart::NameManglingKeep] pb::NameManglingKeep::fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::_GrowableList::•<core::int*>(0));
-  if([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/name_mangling.pb.dart::NameManglingKeep.hasClone_10] [@vm.inferred-type.metadata=dart.core::bool (skip check)] n.{pb::NameManglingKeep::hasClone_10}(){() →* core::bool*}) {
+  pb::NameManglingKeep n = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/name_mangling.pb.dart::NameManglingKeep] pb::NameManglingKeep::fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::•<core::int>(0));
+  if([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/name_mangling.pb.dart::NameManglingKeep.hasClone_10] [@vm.inferred-type.metadata=dart.core::bool (skip check)] n.{pb::NameManglingKeep::hasClone_10}(){() → core::bool}) {
     core::print("Has clone field");
   }
 }
@@ -41,7 +41,7 @@
   constructor _() → self::NameManglingKeep
     : super pro::GeneratedMessage::•()
     ;
-  static factory fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::List<core::int> i) → self::NameManglingKeep
+  static factory fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::List<core::int> i) → self::NameManglingKeep
     return let final self::NameManglingKeep #t3 = [@vm.inferred-type.metadata=name_mangling.pb.dart::NameManglingKeep] self::NameManglingKeep::create() in block {
       [@vm.direct-call.metadata=protobuf::GeneratedMessage.mergeFromBuffer] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::GeneratedMessage::mergeFromBuffer}(i){(core::List<core::int>, [pro::ExtensionRegistry]) → void};
     } =>#t3;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/nop_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/nop_test.dart.expect
index 7512991..0762979 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/nop_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/nop_test.dart.expect
@@ -1,4 +1,4 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
index 2d0f29f..7de8f83 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
@@ -1,31 +1,31 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  final field core::List<dynamic>* afield;
-  constructor •(core::List<dynamic>* afield) → self::A*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  final field core::List<dynamic> afield;
+  constructor •(core::List<dynamic> afield) → self::A
     : self::A::afield = afield, super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  method toString() → core::String*
-    return [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.direct-call.metadata=#lib::A.afield] this.{self::A::afield}{core::List<dynamic>*}.{core::Object::toString}(){() →* core::String*};
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  method toString() → core::String
+    return [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.direct-call.metadata=#lib::A.afield] this.{self::A::afield}{core::List<dynamic>}.{core::Object::toString}(){() → core::String};
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  method _foo([@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>] core::Iterator<core::int*>* iter) → core::List<dynamic>* {
-    core::List<dynamic>* result = [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::•<dynamic>(0);
-    while ([@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] iter.{core::Iterator::moveNext}(){() →* core::bool*}) {
-      if([@vm.direct-call.metadata=dart.core::_IntegerImplementation.<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart._internal::ListIterator.current] [@vm.inferred-type.metadata=int?] iter.{core::Iterator::current}{core::int*}.{core::num::<}(0){(core::num*) →* core::bool*}) {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  method _foo([@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int>] core::Iterator<core::int> iter) → core::List<dynamic> {
+    core::List<dynamic> result = [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::•<dynamic>(0);
+    while ([@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] iter.{core::Iterator::moveNext}(){() → core::bool}) {
+      if([@vm.direct-call.metadata=dart.core::_IntegerImplementation.<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart._internal::ListIterator.current] [@vm.inferred-type.metadata=int?] iter.{core::Iterator::current}{core::int}.{core::num::<}(0){(core::num) → core::bool}) {
         return result;
       }
-      [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dynamic>*] [@vm.direct-call.metadata=dart.core::_GrowableList.add] [@vm.inferred-type.metadata=!? (skip check)] result.{core::List::add}(new self::A::•([@vm.direct-call.metadata=#lib::B._foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::B::_foo}(iter){(core::Iterator<core::int*>*) →* core::List<dynamic>*})){(dynamic) →* void};
+      [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dynamic>] [@vm.direct-call.metadata=dart.core::_GrowableList.add] [@vm.inferred-type.metadata=!? (skip check)] result.{core::List::add}(new self::A::•([@vm.direct-call.metadata=#lib::B._foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::B::_foo}(iter){(core::Iterator<core::int>) → core::List<dynamic>})){(dynamic) → void};
     }
     return result;
   }
 }
 static method main() → void {
-  core::List<dynamic>* list = [@vm.direct-call.metadata=#lib::B._foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] new self::B::•().{self::B::_foo}([@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>] [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::_GrowableList::_literal3<core::int*>(1, 2, 3).{core::Iterable::iterator}{core::Iterator<core::int*>*}){(core::Iterator<core::int*>*) →* core::List<dynamic>*};
+  core::List<dynamic> list = [@vm.direct-call.metadata=#lib::B._foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] new self::B::•().{self::B::_foo}([@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int>] [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::_literal3<core::int>(1, 2, 3).{core::Iterable::iterator}{core::Iterator<core::int>}){(core::Iterator<core::int>) → core::List<dynamic>};
   core::print(list);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
index 577315f..35c9ce8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
@@ -1,8 +1,8 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-[@vm.unboxing-info.metadata=(b)->i]static method foo([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::List<core::int*>* x) → dynamic
-  return [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=int? (skip check)] x.{core::List::[]}(0){(core::int*) →* core::int*}){(core::num*) →* core::int*};
+[@vm.unboxing-info.metadata=(b)->i]static method foo([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::List<core::int> x) → dynamic
+  return [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=int? (skip check)] x.{core::List::[]}(0){(core::int) → core::int}){(core::num) → core::int};
 static method main() → dynamic
-  return [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::print([@vm.inferred-type.metadata=int] self::foo([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::_GrowableList::_literal1<core::int*>(1)));
+  return [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::print([@vm.inferred-type.metadata=int] self::foo([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::_literal1<core::int>(1)));
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_42413.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_42413.dart.expect
index b0bcba0..e29a055 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_42413.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_42413.dart.expect
@@ -1,25 +1,25 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] [@vm.unboxing-info.metadata=()->i]  get x() → dynamic
     return 0;
 }
 class A extends core::Object {
-[@vm.inferred-type.metadata=dart.core::_GrowableList?<#lib::B*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  field dynamic list = null;
-  constructor •() → self::A*
+[@vm.inferred-type.metadata=dart.core::_GrowableList?<#lib::B>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  field dynamic list = null;
+  constructor •() → self::A
     : super core::Object::•() {
-    [@vm.direct-call.metadata=#lib::A.list] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A::list} = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::B*>] core::_GrowableList::_literal1<self::B*>(new self::B::•());
+    [@vm.direct-call.metadata=#lib::A.list] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A::list} = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::B>] core::_GrowableList::_literal1<self::B>(new self::B::•());
   }
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  @#C3
   method forIn() → void {
     {
-      core::Iterator<dynamic>* :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator??] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::B*>] _in::unsafeCast<core::Iterable<dynamic>*>([@vm.direct-call.metadata=#lib::A.list] [@vm.inferred-type.metadata=dart.core::_GrowableList?<#lib::B*>] this.{self::A::list}{dynamic}).{core::Iterable::iterator}{core::Iterator<dynamic>*};
+      core::Iterator<dynamic> :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator??] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::B>] _in::unsafeCast<core::Iterable<dynamic>>([@vm.direct-call.metadata=#lib::A.list] [@vm.inferred-type.metadata=dart.core::_GrowableList?<#lib::B>] this.{self::A::list}{dynamic}).{core::Iterable::iterator}{core::Iterator<dynamic>};
       for (; [@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         dynamic e = [@vm.direct-call.metadata=dart._internal::ListIterator.current] [@vm.inferred-type.metadata=#lib::B?] :sync-for-iterator.{core::Iterator::current}{dynamic};
         core::print([@vm.direct-call.metadata=#lib::B.x??] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0) (receiver not int)] e{dynamic}.x);
@@ -28,15 +28,15 @@
   }
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  @#C3
   method cLoop() → void {
-    for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(_in::unsafeCast<core::num*>([@vm.direct-call.metadata=dart.core::_GrowableList.length??] [@vm.inferred-type.metadata=dart.core::_Smi (receiver not int)] [@vm.direct-call.metadata=#lib::A.list] [@vm.inferred-type.metadata=dart.core::_GrowableList?<#lib::B*>] this.{self::A::list}{dynamic}{dynamic}.length)){(core::num*) →* core::bool*}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num*) →* core::int*}) {
-      final dynamic e = [@vm.direct-call.metadata=dart.core::_GrowableList.[]??] [@vm.inferred-type.metadata=#lib::B? (receiver not int)] [@vm.direct-call.metadata=#lib::A.list] [@vm.inferred-type.metadata=dart.core::_GrowableList?<#lib::B*>] this.{self::A::list}{dynamic}{dynamic}.[](i);
+    for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=dart.core::_GrowableList.length??] [@vm.inferred-type.metadata=dart.core::_Smi (receiver not int)] [@vm.direct-call.metadata=#lib::A.list] [@vm.inferred-type.metadata=dart.core::_GrowableList?<#lib::B>] this.{self::A::list}{dynamic}{dynamic}.length)){(core::num) → core::bool}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num) → core::int}) {
+      final dynamic e = [@vm.direct-call.metadata=dart.core::_GrowableList.[]??] [@vm.inferred-type.metadata=#lib::B? (receiver not int)] [@vm.direct-call.metadata=#lib::A.list] [@vm.inferred-type.metadata=dart.core::_GrowableList?<#lib::B>] this.{self::A::list}{dynamic}{dynamic}.[](i);
       core::print([@vm.direct-call.metadata=#lib::B.x??] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0) (receiver not int)] e{dynamic}.x);
     }
   }
 }
 static method main() → void {
-  [@vm.direct-call.metadata=#lib::A.forIn] [@vm.inferred-type.metadata=!? (skip check)] new self::A::•().{self::A::forIn}(){() →* void};
-  [@vm.direct-call.metadata=#lib::A.cLoop] [@vm.inferred-type.metadata=!? (skip check)] new self::A::•().{self::A::cLoop}(){() →* void};
+  [@vm.direct-call.metadata=#lib::A.forIn] [@vm.inferred-type.metadata=!? (skip check)] new self::A::•().{self::A::forIn}(){() → void};
+  [@vm.direct-call.metadata=#lib::A.cLoop] [@vm.inferred-type.metadata=!? (skip check)] new self::A::•().{self::A::cLoop}(){() → void};
 }
 constants  {
   #C1 = "vm:never-inline"
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_42418_1_test.dart b/pkg/vm/testcases/transformations/type_flow/transformer/regress_42418_1_test.dart
index 65d7485..76df937 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_42418_1_test.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_42418_1_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:math';
 
 import 'package:expect/expect.dart';
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_42418_2_test.dart b/pkg/vm/testcases/transformations/type_flow/transformer/regress_42418_2_test.dart
index 824ac78..45943ff 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_42418_2_test.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_42418_2_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 import 'dart:math';
 
 import 'package:expect/expect.dart';
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_45324.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_45324.dart.expect
index f097822..a7e00ed 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_45324.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_45324.dart.expect
@@ -1,20 +1,20 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object /*hasConstConstructor*/  {
-[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] [@vm.unboxing-info.metadata=()->i]  final field core::int* targetPlatform;
+[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] [@vm.unboxing-info.metadata=()->i]  final field core::int targetPlatform;
 }
 class X extends core::Object implements self::A {
-  synthetic constructor •() → self::X*
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] [@vm.unboxing-info.metadata=()->i]  get targetPlatform() → core::int*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] [@vm.unboxing-info.metadata=()->i]  get targetPlatform() → core::int
     return 2;
 }
-[@vm.inferred-type.metadata=#lib::X?]static field self::A* a = new self::X::•();
+[@vm.inferred-type.metadata=#lib::X?]static field self::A a = new self::X::•();
 static method main() → void {
-  core::print([@vm.direct-call.metadata=#lib::X.targetPlatform??] [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] [@vm.inferred-type.metadata=#lib::X?] self::a.{self::A::targetPlatform}{core::int*});
+  core::print([@vm.direct-call.metadata=#lib::X.targetPlatform??] [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] [@vm.inferred-type.metadata=#lib::X?] self::a.{self::A::targetPlatform}{core::int});
   core::print(#C2);
 }
 constants  {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart
index 81c386e..fcc1c23 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart
@@ -5,6 +5,8 @@
 // Regression test for https://github.com/flutter/flutter/issues/16182
 // Verifies that TFA correctly handles calls via fields/getters.
 
+// @dart=2.9
+
 import "package:expect/expect.dart";
 
 bool ok;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter57213.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter57213.dart.expect
index 4e27a60..a079cbe 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter57213.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter57213.dart.expect
@@ -1,30 +1,30 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 @#C3
 class A extends core::Object {
-  constructor •() → self::A*
+  constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → self::B*
+  constructor •() → self::B
     : super self::A::•()
     ;
 }
 abstract class C extends core::Object {
-  constructor •() → self::C*
+  constructor •() → self::C
     : super core::Object::•()
     ;
 }
 abstract class D extends self::C {
-  constructor •() → self::D*
+  constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends self::D {
-  constructor •() → self::E*
+  constructor •() → self::E
     : super self::D::•()
     ;
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter81068.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter81068.dart.expect
index a63904b..82edbf6 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter81068.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter81068.dart.expect
@@ -1,41 +1,41 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
 
 import "dart:async";
 
-abstract class A<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T*>*
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object* = dynamic> extends self::A<core::String*> implements asy::Future<self::B::T*> {
-  synthetic constructor •() → self::B<self::B::T*>*
+class B<T extends core::Object? = dynamic> extends self::A<core::String> implements asy::Future<self::B::T%> {
+  synthetic constructor •() → self::B<self::B::T%>
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method noSuchMethod(core::Invocation* i) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method noSuchMethod(core::Invocation i) → dynamic
     return throw "Not implemented";
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  no-such-method-forwarder method then<R extends core::Object* = dynamic>((self::B::T*) →* FutureOr<self::B::then::R*>* onValue, {core::Function* onError = #C1}) → asy::Future<self::B::then::R*>*
-    return [@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=! (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, core::List::unmodifiable<core::Type*>([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::Type*>] core::_GrowableList::_literal1<core::Type*>(self::B::then::R*)), core::List::unmodifiable<dynamic>([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::_literal1<dynamic>(onValue)), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C3: onError}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::B::then::R*>*;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  no-such-method-forwarder method catchError(core::Function* onError, {[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (core::Object*) →* core::bool* test = #C1}) → asy::Future<self::B::T*>*
-    return [@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=! (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C4, 0, #C5, core::List::unmodifiable<dynamic>([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::_literal1<dynamic>(onError)), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C6: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::B::T*>*;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::B::T*>*
-    return [@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=! (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C5, core::List::unmodifiable<dynamic>([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::_literal1<dynamic>(action)), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C9))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::B::T*>*;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (core::Object) →? core::bool test = #C1}) → asy::Future<self::B::T%>
+    return [@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=! (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::_literal1<dynamic>(onError)), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::B::T%>;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → FutureOr<void>action) → asy::Future<self::B::T%>
+    return [@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=! (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::_literal1<dynamic>(action)), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::B::T%>;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ then<R extends core::Object? = dynamic>((self::B::T%) → FutureOr<self::B::then::R%>onValue, {core::Function? onError = #C1}) → asy::Future<self::B::then::R%>
+    return [@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=! (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, core::List::unmodifiable<core::Type*>([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::Type*>] core::_GrowableList::_literal1<core::Type*>(self::B::then::R%)), core::List::unmodifiable<dynamic>([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::_GrowableList::_literal1<dynamic>(onValue)), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onError}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::B::then::R%>;
 }
-static method createB<T extends core::Object* = dynamic>() → self::B<dynamic>*
-  return new self::B::•<self::createB::T*>();
+static method createB<T extends core::Object? = dynamic>() → self::B<dynamic>
+  return new self::B::•<self::createB::T%>();
 static method main() → void {
-  core::print([@vm.inferred-type.metadata=#lib::B<?>] self::createB<core::int*>() as FutureOr<core::double*>*);
+  core::print([@vm.inferred-type.metadata=#lib::B<?>] self::createB<core::int>() as{ForNonNullableByDefault} FutureOr<core::double>);
 }
 constants  {
   #C1 = null
-  #C2 = #then
-  #C3 = #onError
-  #C4 = #catchError
-  #C5 = <core::Type*>[]
-  #C6 = #test
-  #C7 = #whenComplete
-  #C8 = <dynamic>[]
-  #C9 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C8}
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #then
+  #C9 = #onError
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/selector_id_assignments.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/selector_id_assignments.dart.expect
index 39043c5..bba93d0 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/selector_id_assignments.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/selector_id_assignments.dart.expect
@@ -1,11 +1,11 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 abstract class X extends core::Object {
 }
 class A1 extends core::Object {
-  synthetic constructor •() → self::A1*
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → void {
@@ -13,12 +13,12 @@
   }
 }
 class B1 extends self::A1 {
-  synthetic constructor •() → self::B1*
+  synthetic constructor •() → self::B1
     : super self::A1::•()
     ;
 }
 class C1 extends self::B1 {
-  synthetic constructor •() → self::C1*
+  synthetic constructor •() → self::C1
     : super self::B1::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → void {
@@ -26,7 +26,7 @@
   }
 }
 class A2 extends core::Object {
-  synthetic constructor •() → self::A2*
+  synthetic constructor •() → self::A2
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method foo() → void {
@@ -34,7 +34,7 @@
   }
 }
 class B2 extends self::A2 implements self::X {
-  synthetic constructor •() → self::B2*
+  synthetic constructor •() → self::B2
     : super self::A2::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method foo() → void {
@@ -42,13 +42,13 @@
   }
 }
 abstract class A3 extends core::Object {
-  synthetic constructor •() → self::A3*
+  synthetic constructor •() → self::A3
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  abstract method foo() → void;
 }
 class B3 extends self::A3 implements self::X {
-  synthetic constructor •() → self::B3*
+  synthetic constructor •() → self::B3
     : super self::A3::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method foo() → void {
@@ -56,7 +56,7 @@
   }
 }
 class C3 extends core::Object implements self::A3 {
-  synthetic constructor •() → self::C3*
+  synthetic constructor •() → self::C3
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method foo() → void {
@@ -64,7 +64,7 @@
   }
 }
 class A4 extends core::Object {
-  synthetic constructor •() → self::A4*
+  synthetic constructor •() → self::A4
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method foo() → void {
@@ -72,7 +72,7 @@
   }
 }
 class B4 extends core::Object {
-  synthetic constructor •() → self::B4*
+  synthetic constructor •() → self::B4
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method foo() → void {
@@ -80,7 +80,7 @@
   }
 }
 class C4 extends core::Object {
-  synthetic constructor •() → self::C4*
+  synthetic constructor •() → self::C4
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method foo() → void {
@@ -88,7 +88,7 @@
   }
 }
 class D4 extends self::A4 implements self::B4 {
-  synthetic constructor •() → self::D4*
+  synthetic constructor •() → self::D4
     : super self::A4::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method foo() → void {
@@ -96,57 +96,57 @@
   }
 }
 class E4 extends self::C4 implements self::B4 {
-  synthetic constructor •() → self::E4*
+  synthetic constructor •() → self::E4
     : super self::C4::•()
     ;
 }
 static method main() → dynamic {
-  core::List<self::A1*>* x1 = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::A1*>] core::_GrowableList::_literal3<self::A1*>(new self::A1::•(), new self::B1::•(), new self::C1::•());
+  core::List<self::A1> x1 = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::A1>] core::_GrowableList::_literal3<self::A1>(new self::A1::•(), new self::B1::•(), new self::C1::•());
   {
-    core::Iterator<self::A1*>* :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::A1*>] x1.{core::Iterable::iterator}{core::Iterator<self::A1*>*};
+    core::Iterator<self::A1> :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::A1>] x1.{core::Iterable::iterator}{core::Iterator<self::A1>};
     for (; [@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
-      self::A1* o = [@vm.direct-call.metadata=dart._internal::ListIterator.current] :sync-for-iterator.{core::Iterator::current}{self::A1*};
-      o.{self::A1::foo}(){() →* void};
+      self::A1 o = [@vm.direct-call.metadata=dart._internal::ListIterator.current] :sync-for-iterator.{core::Iterator::current}{self::A1};
+      o.{self::A1::foo}(){() → void};
     }
   }
-  core::List<self::A2*>* x2 = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::A2*>] core::_GrowableList::_literal2<self::A2*>(new self::A2::•(), new self::B2::•());
+  core::List<self::A2> x2 = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::A2>] core::_GrowableList::_literal2<self::A2>(new self::A2::•(), new self::B2::•());
   {
-    core::Iterator<self::A2*>* :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::A2*>] x2.{core::Iterable::iterator}{core::Iterator<self::A2*>*};
+    core::Iterator<self::A2> :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::A2>] x2.{core::Iterable::iterator}{core::Iterator<self::A2>};
     for (; [@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
-      self::A2* o = [@vm.direct-call.metadata=dart._internal::ListIterator.current] :sync-for-iterator.{core::Iterator::current}{self::A2*};
-      o.{self::A2::foo}(){() →* void};
+      self::A2 o = [@vm.direct-call.metadata=dart._internal::ListIterator.current] :sync-for-iterator.{core::Iterator::current}{self::A2};
+      o.{self::A2::foo}(){() → void};
     }
   }
-  core::List<self::A3*>* x3 = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::A3*>] core::_GrowableList::_literal2<self::A3*>(new self::B3::•(), new self::C3::•());
+  core::List<self::A3> x3 = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::A3>] core::_GrowableList::_literal2<self::A3>(new self::B3::•(), new self::C3::•());
   {
-    core::Iterator<self::A3*>* :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::A3*>] x3.{core::Iterable::iterator}{core::Iterator<self::A3*>*};
+    core::Iterator<self::A3> :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::A3>] x3.{core::Iterable::iterator}{core::Iterator<self::A3>};
     for (; [@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
-      self::A3* o = [@vm.direct-call.metadata=dart._internal::ListIterator.current] :sync-for-iterator.{core::Iterator::current}{self::A3*};
-      o.{self::A3::foo}(){() →* void};
+      self::A3 o = [@vm.direct-call.metadata=dart._internal::ListIterator.current] :sync-for-iterator.{core::Iterator::current}{self::A3};
+      o.{self::A3::foo}(){() → void};
     }
   }
-  core::List<self::A4*>* x4 = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::A4*>] core::_GrowableList::_literal2<self::A4*>(new self::A4::•(), new self::D4::•());
+  core::List<self::A4> x4 = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::A4>] core::_GrowableList::_literal2<self::A4>(new self::A4::•(), new self::D4::•());
   {
-    core::Iterator<self::A4*>* :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::A4*>] x4.{core::Iterable::iterator}{core::Iterator<self::A4*>*};
+    core::Iterator<self::A4> :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::A4>] x4.{core::Iterable::iterator}{core::Iterator<self::A4>};
     for (; [@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
-      self::A4* o = [@vm.direct-call.metadata=dart._internal::ListIterator.current] :sync-for-iterator.{core::Iterator::current}{self::A4*};
-      o.{self::A4::foo}(){() →* void};
+      self::A4 o = [@vm.direct-call.metadata=dart._internal::ListIterator.current] :sync-for-iterator.{core::Iterator::current}{self::A4};
+      o.{self::A4::foo}(){() → void};
     }
   }
-  core::List<self::B4*>* y4 = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::B4*>] core::_GrowableList::_literal3<self::B4*>(new self::B4::•(), new self::D4::•(), new self::E4::•());
+  core::List<self::B4> y4 = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::B4>] core::_GrowableList::_literal3<self::B4>(new self::B4::•(), new self::D4::•(), new self::E4::•());
   {
-    core::Iterator<self::B4*>* :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::B4*>] y4.{core::Iterable::iterator}{core::Iterator<self::B4*>*};
+    core::Iterator<self::B4> :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::B4>] y4.{core::Iterable::iterator}{core::Iterator<self::B4>};
     for (; [@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
-      self::B4* o = [@vm.direct-call.metadata=dart._internal::ListIterator.current] :sync-for-iterator.{core::Iterator::current}{self::B4*};
-      o.{self::B4::foo}(){() →* void};
+      self::B4 o = [@vm.direct-call.metadata=dart._internal::ListIterator.current] :sync-for-iterator.{core::Iterator::current}{self::B4};
+      o.{self::B4::foo}(){() → void};
     }
   }
-  core::List<self::C4*>* z4 = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::C4*>] core::_GrowableList::_literal2<self::C4*>(new self::C4::•(), new self::E4::•());
+  core::List<self::C4> z4 = [@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::C4>] core::_GrowableList::_literal2<self::C4>(new self::C4::•(), new self::E4::•());
   {
-    core::Iterator<self::C4*>* :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::C4*>] z4.{core::Iterable::iterator}{core::Iterator<self::C4*>*};
+    core::Iterator<self::C4> :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::C4>] z4.{core::Iterable::iterator}{core::Iterator<self::C4>};
     for (; [@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
-      self::C4* o = [@vm.direct-call.metadata=dart._internal::ListIterator.current] :sync-for-iterator.{core::Iterator::current}{self::C4*};
-      [@vm.direct-call.metadata=#lib::C4.foo??] [@vm.inferred-type.metadata=!? (skip check)] o.{self::C4::foo}(){() →* void};
+      self::C4 o = [@vm.direct-call.metadata=dart._internal::ListIterator.current] :sync-for-iterator.{core::Iterator::current}{self::C4};
+      [@vm.direct-call.metadata=#lib::C4.foo??] [@vm.inferred-type.metadata=!? (skip check)] o.{self::C4::foo}(){() → void};
     }
   }
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect
index 76714d7..464d851 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect
@@ -1,4 +1,4 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:collection" as col;
@@ -6,29 +6,29 @@
 import "dart:collection";
 import "dart:core";
 
-[@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dynamic>]static field core::Set<dynamic>* globalSet = new col::_CompactLinkedHashSet::•<dynamic>();
-[@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet?<dynamic>]static field core::Set<dynamic>* identitySet = [@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet<dynamic>] col::LinkedHashSet::identity<dynamic>();
-[@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dart.core::String*>]static field core::Set<core::String*>* linkedSet = new col::_CompactLinkedHashSet::•<core::String*>();
-static field core::Set<core::String*>* linkedIdentitySet = [@vm.inferred-type.metadata=!] col::LinkedHashSet::•<core::String*>(#C1, #C2);
-static field core::Set<core::String*>* linkedCustomSet = let final (core::String*, core::String*) →* core::bool* #t1 = (core::String* a, core::String* b) → core::bool* => [@vm.inferred-type.metadata=!? (receiver not int)] a =={core::String::==}{(core::Object*) →* core::bool*} b in let final (core::String*) →* core::int* #t2 = (core::String* o) → core::int* => o.{core::String::hashCode}{core::int*} in let final (dynamic) →* core::bool* #t3 = (dynamic o) → core::bool* => true in [@vm.inferred-type.metadata=!] col::LinkedHashSet::•<core::String*>(#t1, #t2, isValidKey: #t3);
-[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* globalMap = [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<dynamic, dynamic>] core::Map::•<dynamic, dynamic>();
-[@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* identityMap = [@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap<dynamic, dynamic>] col::LinkedHashMap::identity<dynamic, dynamic>();
-[@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* unmodifiableMap = [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dynamic, dynamic>] core::Map::unmodifiable<dynamic, dynamic>([@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>] self::identityMap);
-[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* globalMapLiteral = <dynamic, dynamic>{};
-[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dart.core::String*, dart.core::String*>]static field core::Map<core::String*, core::String*>* linkedMap = new col::_InternalLinkedHashMap::•<core::String*, core::String*>();
-static field core::Map<core::String*, core::String*>* linkedIdentityMap = [@vm.inferred-type.metadata=!] col::LinkedHashMap::•<core::String*, core::String*>(#C1, #C2);
-static field core::Map<core::String*, core::String*>* linkedCustomMap = let final (core::String*, core::String*) →* core::bool* #t4 = (core::String* a, core::String* b) → core::bool* => [@vm.inferred-type.metadata=!? (receiver not int)] a =={core::String::==}{(core::Object*) →* core::bool*} b in let final (core::String*) →* core::int* #t5 = (core::String* o) → core::int* => o.{core::String::hashCode}{core::int*} in let final (dynamic) →* core::bool* #t6 = (dynamic o) → core::bool* => true in [@vm.inferred-type.metadata=!] col::LinkedHashMap::•<core::String*, core::String*>(#t4, #t5, isValidKey: #t6);
+[@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dynamic>]static field core::Set<dynamic> globalSet = new col::_CompactLinkedHashSet::•<dynamic>();
+[@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet?<dynamic>]static field core::Set<dynamic> identitySet = [@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet<dynamic>] col::LinkedHashSet::identity<dynamic>();
+[@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dart.core::String>]static field core::Set<core::String> linkedSet = new col::_CompactLinkedHashSet::•<core::String>();
+static field core::Set<core::String> linkedIdentitySet = [@vm.inferred-type.metadata=!] col::LinkedHashSet::•<core::String>(#C1, #C2);
+static field core::Set<core::String> linkedCustomSet = let final (core::String, core::String) → core::bool #t1 = (core::String a, core::String b) → core::bool => [@vm.inferred-type.metadata=!? (receiver not int)] a =={core::String::==}{(core::Object) → core::bool} b in let final (core::String) → core::int #t2 = (core::String o) → core::int => o.{core::String::hashCode}{core::int} in let final (dynamic) → core::bool #t3 = (dynamic o) → core::bool => true in [@vm.inferred-type.metadata=!] col::LinkedHashSet::•<core::String>(#t1, #t2, isValidKey: #t3);
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic> globalMap = [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<dynamic, dynamic>] core::Map::•<dynamic, dynamic>();
+[@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic> identityMap = [@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap<dynamic, dynamic>] col::LinkedHashMap::identity<dynamic, dynamic>();
+[@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView?<dynamic, dynamic>]static field core::Map<dynamic, dynamic> unmodifiableMap = [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dynamic, dynamic>] core::Map::unmodifiable<dynamic, dynamic>([@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>] self::identityMap);
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic> globalMapLiteral = <dynamic, dynamic>{};
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dart.core::String, dart.core::String>]static field core::Map<core::String, core::String> linkedMap = new col::_InternalLinkedHashMap::•<core::String, core::String>();
+static field core::Map<core::String, core::String> linkedIdentityMap = [@vm.inferred-type.metadata=!] col::LinkedHashMap::•<core::String, core::String>(#C1, #C2);
+static field core::Map<core::String, core::String> linkedCustomMap = let final (core::String, core::String) → core::bool #t4 = (core::String a, core::String b) → core::bool => [@vm.inferred-type.metadata=!? (receiver not int)] a =={core::String::==}{(core::Object) → core::bool} b in let final (core::String) → core::int #t5 = (core::String o) → core::int => o.{core::String::hashCode}{core::int} in let final (dynamic) → core::bool #t6 = (dynamic o) → core::bool => true in [@vm.inferred-type.metadata=!] col::LinkedHashMap::•<core::String, core::String>(#t4, #t5, isValidKey: #t6);
 static method main() → dynamic {
   core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dynamic>] self::globalSet);
   core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet?<dynamic>] self::identitySet);
-  core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dart.core::String*>] self::linkedSet);
+  core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dart.core::String>] self::linkedSet);
   core::print(self::linkedIdentitySet);
   core::print(self::linkedCustomSet);
   core::print([@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>] self::globalMap);
   core::print([@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>] self::globalMapLiteral);
   core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>] self::identityMap);
   core::print([@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView?<dynamic, dynamic>] self::unmodifiableMap);
-  core::print([@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dart.core::String*, dart.core::String*>] self::linkedMap);
+  core::print([@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dart.core::String, dart.core::String>] self::linkedMap);
   core::print(self::linkedIdentityMap);
   core::print(self::linkedCustomMap);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart
index 2d22fe6..717504a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 A aa = new B();
 
 dynamic knownResult() => new B();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart
index 5ce46d8..74cf279 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 A aa = new B();
 
 dynamic knownResult() => new B();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart
index ebe01db..a63ec2a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 A aa = new B();
 
 dynamic knownResult() => new B();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/type_cast_elimination.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/type_cast_elimination.dart.expect
index 7f83b39..c5846d8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/type_cast_elimination.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/type_cast_elimination.dart.expect
@@ -1,58 +1,58 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-class A<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T*>*
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object* = dynamic> extends self::A<self::B::T*> {
-  synthetic constructor •() → self::B<self::B::T*>*
+class B<T extends core::Object? = dynamic> extends self::A<self::B::T%> {
+  synthetic constructor •() → self::B<self::B::T%>
     : super self::A::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=()->i]  method testT1() → dynamic
-    return _in::unsafeCast<self::B::T*>(#C1);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method testT2negative([@vm.inferred-type.metadata=#lib::A<dart.core::String*>] dynamic x) → dynamic
-    return x as self::B::T*;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method testAOfT1([@vm.inferred-type.metadata=#lib::A<#lib::A<dart.core::int*>*>] dynamic x) → dynamic
-    return _in::unsafeCast<self::A<self::B::T*>*>(x);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method testAOfT2negative([@vm.inferred-type.metadata=#lib::A<#lib::A<dart.core::num*>*>] dynamic x) → dynamic
-    return x as self::A<self::B::T*>*;
+    return _in::unsafeCast<self::B::T%>(#C1);
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method testT2negative([@vm.inferred-type.metadata=#lib::A<dart.core::String>] dynamic x) → dynamic
+    return x as{ForNonNullableByDefault} self::B::T%;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method testAOfT1([@vm.inferred-type.metadata=#lib::A<#lib::A<dart.core::int>>] dynamic x) → dynamic
+    return _in::unsafeCast<self::A<self::B::T%>>(x);
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method testAOfT2negative([@vm.inferred-type.metadata=#lib::A<#lib::A<dart.core::num>>] dynamic x) → dynamic
+    return x as{ForNonNullableByDefault} self::A<self::B::T%>;
 }
 [@vm.unboxing-info.metadata=()->i]static method testInt1() → dynamic
-  return _in::unsafeCast<core::int*>(#C1);
+  return _in::unsafeCast<core::int>(#C1);
 static method testInt2() → dynamic
-  return _in::unsafeCast<core::int*>(#C2);
+  return _in::unsafeCast<core::int>(#C2);
 static method testDynamic() → dynamic
   return _in::unsafeCast<dynamic>(#C3);
 static method testObject() → dynamic
   return #C4;
-static method testBOfInt([@vm.inferred-type.metadata=#lib::B<dart.core::int*>] dynamic x) → dynamic
-  return _in::unsafeCast<self::B<core::int*>*>(x);
-static method testAOfInt([@vm.inferred-type.metadata=#lib::B<dart.core::int*>] dynamic x) → dynamic
-  return _in::unsafeCast<self::A<core::int*>*>(x);
-static method testAOfNum([@vm.inferred-type.metadata=#lib::B<dart.core::int*>] dynamic x) → dynamic
-  return _in::unsafeCast<self::A<core::num*>*>(x);
-static method testAOfAOfB1([@vm.inferred-type.metadata=#lib::A<#lib::A<#lib::B<dynamic>*>*>] dynamic x) → dynamic
-  return _in::unsafeCast<self::A<self::A<self::B<dynamic>*>*>*>(x);
-static method testAOfAOfB2negative([@vm.inferred-type.metadata=#lib::A<#lib::A<#lib::A<dynamic>*>*>] dynamic x) → dynamic
-  return x as self::A<self::A<self::B<dynamic>*>*>*;
+static method testBOfInt([@vm.inferred-type.metadata=#lib::B<dart.core::int>] dynamic x) → dynamic
+  return _in::unsafeCast<self::B<core::int>>(x);
+static method testAOfInt([@vm.inferred-type.metadata=#lib::B<dart.core::int>] dynamic x) → dynamic
+  return _in::unsafeCast<self::A<core::int>>(x);
+static method testAOfNum([@vm.inferred-type.metadata=#lib::B<dart.core::int>] dynamic x) → dynamic
+  return _in::unsafeCast<self::A<core::num>>(x);
+static method testAOfAOfB1([@vm.inferred-type.metadata=#lib::A<#lib::A<#lib::B<dynamic>>>] dynamic x) → dynamic
+  return _in::unsafeCast<self::A<self::A<self::B<dynamic>>>>(x);
+static method testAOfAOfB2negative([@vm.inferred-type.metadata=#lib::A<#lib::A<#lib::A<dynamic>>>] dynamic x) → dynamic
+  return x as{ForNonNullableByDefault} self::A<self::A<self::B<dynamic>>>;
 static method main() → void {
   self::testInt1();
   self::testInt2();
   self::testDynamic();
   self::testObject();
-  self::testBOfInt(new self::B::•<core::int*>());
-  self::testAOfInt(new self::B::•<core::int*>());
-  self::testAOfNum(new self::B::•<core::int*>());
-  self::testAOfAOfB1(new self::A::•<self::A<self::B<dynamic>*>*>());
-  self::testAOfAOfB2negative(new self::A::•<self::A<self::A<dynamic>*>*>());
-  [@vm.direct-call.metadata=#lib::B.testT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int*>().{self::B::testT1}(){(dynamic) →* dynamic};
-  [@vm.direct-call.metadata=#lib::B.testT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int*>*>().{self::B::testT2negative}(new self::A::•<core::String*>()){(dynamic) →* dynamic};
-  [@vm.direct-call.metadata=#lib::B.testAOfT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int*>*>().{self::B::testAOfT1}(new self::A::•<self::A<core::int*>*>()){(dynamic) →* dynamic};
-  [@vm.direct-call.metadata=#lib::B.testAOfT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int*>*>().{self::B::testAOfT2negative}(new self::A::•<self::A<core::num*>*>()){(dynamic) →* dynamic};
+  self::testBOfInt(new self::B::•<core::int>());
+  self::testAOfInt(new self::B::•<core::int>());
+  self::testAOfNum(new self::B::•<core::int>());
+  self::testAOfAOfB1(new self::A::•<self::A<self::B<dynamic>>>());
+  self::testAOfAOfB2negative(new self::A::•<self::A<self::A<dynamic>>>());
+  [@vm.direct-call.metadata=#lib::B.testT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testT1}(){(dynamic) → dynamic};
+  [@vm.direct-call.metadata=#lib::B.testT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int>>().{self::B::testT2negative}(new self::A::•<core::String>()){(dynamic) → dynamic};
+  [@vm.direct-call.metadata=#lib::B.testAOfT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int>>().{self::B::testAOfT1}(new self::A::•<self::A<core::int>>()){(dynamic) → dynamic};
+  [@vm.direct-call.metadata=#lib::B.testAOfT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int>>().{self::B::testAOfT2negative}(new self::A::•<self::A<core::num>>()){(dynamic) → dynamic};
 }
 constants  {
   #C1 = 42
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_getters.dart b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_getters.dart
index 726b6c9..65a5a2d 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_getters.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_getters.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 final bool kTrue = int.parse('1') == 1 ? true : false;
 final bool kFalse = int.parse('1') == 2 ? true : false;
 int get mint => 0xaabbccddaabbccdd;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_fields.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_fields.dart.expect
index a3d1769b..4cddb45 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_fields.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_fields.dart.expect
@@ -1,9 +1,9 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class X extends core::Object {
-  synthetic constructor •() → self::X*
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
@@ -17,30 +17,30 @@
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  field dynamic boxedNullableIntOrDouble;
 [@vm.inferred-type.metadata=#lib::X?] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  field dynamic boxedNullableX;
 [@vm.inferred-type.metadata=#lib::X] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  field dynamic boxedX;
-[@vm.unboxing-info.metadata=(i,i,d,b,b,b,b,b,b)->b]  constructor •([@vm.inferred-type.metadata=dart.core::_Smi] dynamic unboxedSmi, [@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=!] dynamic boxedNonNullableIntOrDouble, dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → self::A*
+[@vm.unboxing-info.metadata=(i,i,d,b,b,b,b,b,b)->b]  constructor •([@vm.inferred-type.metadata=dart.core::_Smi] dynamic unboxedSmi, [@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=!] dynamic boxedNonNullableIntOrDouble, dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → self::A
     : self::A::unboxedSmi = unboxedSmi, self::A::unboxedInt = unboxedInt, self::A::unboxedDouble = unboxedDouble, self::A::boxedNullableInt = boxedNullableInt, self::A::boxedNullableDouble = boxedNullableDouble, self::A::boxedNonNullableIntOrDouble = boxedNonNullableIntOrDouble, self::A::boxedNullableIntOrDouble = boxedNullableIntOrDouble, self::A::boxedNullableX = boxedNullableX, self::A::boxedX = boxedX, super core::Object::•()
     ;
 }
-[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kTrue = [@vm.inferred-type.metadata=dart.core::bool] [@vm.inferred-type.metadata=int?] core::int::parse("1") =={core::num::==}{(core::Object*) →* core::bool*} 1 ?{core::bool*} true : false;
-[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kFalse = [@vm.inferred-type.metadata=dart.core::bool] [@vm.inferred-type.metadata=int?] core::int::parse("1") =={core::num::==}{(core::Object*) →* core::bool*} 2 ?{core::bool*} true : false;
+[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool kTrue = [@vm.inferred-type.metadata=dart.core::bool] [@vm.inferred-type.metadata=int?] core::int::parse("1") =={core::num::==}{(core::Object) → core::bool} 1 ?{core::bool} true : false;
+[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool kFalse = [@vm.inferred-type.metadata=dart.core::bool] [@vm.inferred-type.metadata=int?] core::int::parse("1") =={core::num::==}{(core::Object) → core::bool} 2 ?{core::bool} true : false;
 static field dynamic usedObject;
-[@vm.unboxing-info.metadata=()->i]static get mint() → core::int*
+[@vm.unboxing-info.metadata=()->i]static get mint() → core::int
   return -6144092014192636707;
-[@vm.unboxing-info.metadata=()->i]static get smiOrMint() → core::int*
-  return [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : [@vm.inferred-type.metadata=int] self::mint;
+[@vm.unboxing-info.metadata=()->i]static get smiOrMint() → core::int
+  return [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int} 1 : [@vm.inferred-type.metadata=int] self::mint;
 static method use(dynamic object) → void {
   self::usedObject == null ?{dynamic} self::usedObject = object : null;
 }
 static method main() → dynamic {
-  final self::A* a = new self::A::•([@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null, new self::X::•());
-  [@vm.direct-call.metadata=#lib::A.unboxedSmi] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedSmi} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2;
-  [@vm.direct-call.metadata=#lib::A.unboxedInt] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedInt} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2;
-  [@vm.direct-call.metadata=#lib::A.unboxedDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2;
-  [@vm.direct-call.metadata=#lib::A.boxedNullableInt] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableInt} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null;
-  [@vm.direct-call.metadata=#lib::A.boxedNullableDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null;
-  [@vm.direct-call.metadata=#lib::A.boxedNonNullableIntOrDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNonNullableIntOrDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1;
-  [@vm.direct-call.metadata=#lib::A.boxedNullableIntOrDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableIntOrDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null;
-  [@vm.direct-call.metadata=#lib::A.boxedNullableX] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableX} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null;
+  final self::A a = new self::A::•([@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int} 1 : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int} [@vm.inferred-type.metadata=int] self::smiOrMint : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double} 1.1 : 2.2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int?} [@vm.inferred-type.metadata=int] self::smiOrMint : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double?} 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num?} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X?} new self::X::•() : null, new self::X::•());
+  [@vm.direct-call.metadata=#lib::A.unboxedSmi] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedSmi} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int} 1 : 2;
+  [@vm.direct-call.metadata=#lib::A.unboxedInt] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedInt} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int} [@vm.inferred-type.metadata=int] self::smiOrMint : 2;
+  [@vm.direct-call.metadata=#lib::A.unboxedDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double} 1.1 : 2.2;
+  [@vm.direct-call.metadata=#lib::A.boxedNullableInt] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableInt} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int?} [@vm.inferred-type.metadata=int] self::smiOrMint : null;
+  [@vm.direct-call.metadata=#lib::A.boxedNullableDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double?} 1.1 : null;
+  [@vm.direct-call.metadata=#lib::A.boxedNonNullableIntOrDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNonNullableIntOrDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1;
+  [@vm.direct-call.metadata=#lib::A.boxedNullableIntOrDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableIntOrDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num?} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null;
+  [@vm.direct-call.metadata=#lib::A.boxedNullableX] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableX} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X?} new self::X::•() : null;
   [@vm.direct-call.metadata=#lib::A.boxedX] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedX} = new self::X::•();
   self::use([@vm.direct-call.metadata=#lib::A.unboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi] a.{self::A::unboxedSmi}{dynamic});
   self::use([@vm.direct-call.metadata=#lib::A.unboxedInt] [@vm.inferred-type.metadata=int] a.{self::A::unboxedInt}{dynamic});
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method.dart b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method.dart
index f37b67e..63321f0 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 final bool kTrue = int.parse('1') == 1 ? true : false;
 final bool kFalse = int.parse('1') == 2 ? true : false;
 int get mint => 0xaabbccddaabbccdd;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method_tearoff.dart b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method_tearoff.dart
index ddbf2a0..ba97287 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method_tearoff.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method_tearoff.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 final bool kTrue = int.parse('1') == 1 ? true : false;
 final bool kFalse = int.parse('1') == 2 ? true : false;
 int get mint => 0xaabbccddaabbccdd;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method.dart b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method.dart
index 5151f2e..0142249 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 final bool kTrue = int.parse('1') == 1 ? true : false;
 final bool kFalse = int.parse('1') == 2 ? true : false;
 int get mint => 0xaabbccddaabbccdd;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method_tearoff.dart b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method_tearoff.dart
index f20e0ce..6245c0d 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method_tearoff.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method_tearoff.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 final bool kTrue = int.parse('1') == 1 ? true : false;
 final bool kFalse = int.parse('1') == 2 ? true : false;
 int get mint => 0xaabbccddaabbccdd;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect
index 74d3bb3..ed5a63a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect
@@ -1,9 +1,9 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
@@ -13,7 +13,7 @@
   return new self::A::•();
 static method bad() → dynamic
   return throw "No return!";
-static method main(core::List<core::String*>* args) → dynamic {
+static method main(core::List<core::String> args) → dynamic {
   core::print([@vm.inferred-type.metadata=#lib::A?] self::static_field_good);
   core::print([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::static_field_bad);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
index 0ed46d3..96487b0 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
@@ -1,4 +1,4 @@
-library #lib;
+library #lib /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
@@ -7,16 +7,16 @@
 abstract class A extends core::Object implements self::I {
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
-[@vm.inferred-type.metadata=#lib::B?]static field self::I* ii = new self::B::•();
-static method bar([@vm.inferred-type.metadata=#lib::B?] self::I* i) → void {
-  if(i is self::A*) {
+[@vm.inferred-type.metadata=#lib::B?]static field self::I ii = new self::B::•();
+static method bar([@vm.inferred-type.metadata=#lib::B?] self::I i) → void {
+  if(i is{ForNonNullableByDefault} self::A) {
     throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
   }
 }
-static method main(core::List<core::String*>* args) → dynamic {
+static method main(core::List<core::String> args) → dynamic {
   self::bar([@vm.inferred-type.metadata=#lib::B?] self::ii);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart
index 6abe2d5..0f85cb8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart
@@ -5,6 +5,8 @@
 // Tests tree shaking of field initializer for a write-only field.
 // Regression test for https://github.com/dart-lang/sdk/issues/35632.
 
+// @dart=2.9
+
 class A {
   A() {
     print('A');
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart
index af6a9b8..ec7e83f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart
@@ -4,6 +4,8 @@
 
 // Test for tree shaking of write-only fields.
 
+// @dart=2.9
+
 import "package:expect/expect.dart";
 
 foo() {}
diff --git a/pkg/vm/testcases/transformations/unreachable_code_elimination/uce_testcases.dart b/pkg/vm/testcases/transformations/unreachable_code_elimination/uce_testcases.dart
index 6115eb3..41fdccc 100644
--- a/pkg/vm/testcases/transformations/unreachable_code_elimination/uce_testcases.dart
+++ b/pkg/vm/testcases/transformations/unreachable_code_elimination/uce_testcases.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart=2.9
+
 const bool constTrue = const bool.fromEnvironment('test.define.isTrue');
 const bool constFalse = const bool.fromEnvironment('test.define.isFalse');
 const bool constTrue2 = !constFalse;
diff --git a/tools/VERSION b/tools/VERSION
index b0a5cb0..4b7a145 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 336
+PRERELEASE 337
 PRERELEASE_PATCH 0
\ No newline at end of file