Version 2.11.0-190.0.dev

Merge commit '6aa5e7881929482086c8d9e6449f3626a40f9c71' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e6e8fc7..291fc7c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -35,6 +35,18 @@
 * Fixed `unawaited_futures` to handle `Future` subtypes.
 * New lint: `avoid_type_to_string`.
 
+## 2.10.1 - 2020-10-06
+
+This is a patch release that fixes the following issues:
+* crashes when developing Flutter applications (issue [#43464][]).
+* non-deterministic incorrect program behaviour and/or crashes (issue
+  [flutter/flutter#66672][]).
+* uncaught TypeErrors in DDC (issue [#43661][]).
+
+[#43464]: https://github.com/dart-lang/sdk/issues/43464
+[flutter/flutter#66672]: https://github.com/flutter/flutter/issues/66672
+[#43661]: https://github.com/dart-lang/sdk/issues/43661
+
 ## 2.10.0 - 2020-09-28
 
 ### Core libraries
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index 340d7da..c3b0dc7 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -178,12 +178,21 @@
   "flutter_goldens_client": {
     ExperimentalFlag.nonNullable,
   },
+  "http": {
+    ExperimentalFlag.nonNullable,
+  },
+  "http_parser": {
+    ExperimentalFlag.nonNullable,
+  },
   "intl": {
     ExperimentalFlag.nonNullable,
   },
   "js": {
     ExperimentalFlag.nonNullable,
   },
+  "logging": {
+    ExperimentalFlag.nonNullable,
+  },
   "matcher": {
     ExperimentalFlag.nonNullable,
   },
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index d799e39..8618dbe 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -2549,6 +2549,9 @@
 
   bool isSubtype(Constant constant, DartType type, SubtypeCheckMode mode) {
     DartType constantType = constant.getType(_staticTypeContext);
+    if (mode == SubtypeCheckMode.ignoringNullabilities) {
+      constantType = rawLegacyErasure(coreTypes, constantType) ?? constantType;
+    }
     bool result = typeEnvironment.isSubtypeOf(constantType, type, mode);
     if (targetingJavaScript && !result) {
       if (constantType is InterfaceType &&
diff --git a/pkg/front_end/test/fasta/types/shared_type_tests.dart b/pkg/front_end/test/fasta/types/shared_type_tests.dart
index 37a43e8..fa1d750 100644
--- a/pkg/front_end/test/fasta/types/shared_type_tests.dart
+++ b/pkg/front_end/test/fasta/types/shared_type_tests.dart
@@ -696,7 +696,7 @@
     // Tests for bottom and top types.
     isSubtype('Null', 'Null');
     isNotSubtype('Null', 'bottom');
-    isNotSubtype('Null', 'Never');
+    isObliviousSubtype('Null', 'Never');
     isSubtype('bottom', 'Null');
     isSubtype('bottom', 'bottom');
     isSubtype('bottom', 'Never');
@@ -889,7 +889,7 @@
     isSubtype('Never', 'Id<Object>');
     isSubtype('Never', 'Id<Never>');
     isSubtype('Id<Never>', 'Never');
-    isNotSubtype('Null', 'Id<Never>');
+    isObliviousSubtype('Null', 'Id<Never>');
     isSubtype('Id<Never>', 'Null');
     isNotSubtype('Id<Object>', 'Never');
     isSubtype('Id<int>', 'num');
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 17ed18c..16c406d 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -851,6 +851,7 @@
 r'\u
 r'\v
 r0i
+r0j
 r1i
 r2i
 ra
@@ -1309,6 +1310,7 @@
 xdfff
 xef
 xi
+xj
 xk
 xm
 xn
@@ -1328,6 +1330,7 @@
 yaml
 yb
 yet
+yi
 yielding
 yields
 yn
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index eaf2af5..bef5e7f 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -216,6 +216,7 @@
 eoo
 epoch
 erase
+erased
 err
 esc
 everytime
@@ -440,9 +441,12 @@
 nonexisting
 noo
 numerator
+ob
+obool
 observable
 oh
 okay
+ol
 onull
 ooo
 operate
@@ -453,6 +457,7 @@
 out2
 outbound
 overlay
+ox
 pack
 paging
 paint
@@ -679,3 +684,4 @@
 y's
 year
 yxxx
+yy
diff --git a/pkg/front_end/testcases/nnbd/const_is.dart b/pkg/front_end/testcases/nnbd/const_is.dart
new file mode 100644
index 0000000..ccafc28
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/const_is.dart
@@ -0,0 +1,181 @@
+// Copyright (c) 2020, 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.
+
+// Tests derived from co19/Language/Types/Function_Types/subtype_named_args_t04
+// and language/nnbd/subtyping/function_type_required_params_test
+
+bool inStrongMode = <int?>[] is! List<int>;
+
+int f({required int i}) {
+  return i + 1;
+}
+
+int g({int i = 1}) {
+  return i + 1;
+}
+
+typedef int fType({required int i});
+typedef int gType({int i});
+typedef int bigType(
+    {required int i1,
+    required int i2,
+    required int i3,
+    required int i4,
+    required int i5,
+    required int i6,
+    required int i7,
+    required int i8,
+    required int i9,
+    required int i10,
+    required int i11,
+    required int i12,
+    required int i13,
+    required int i14,
+    required int i15,
+    required int i16,
+    required int i17,
+    required int i18,
+    required int i19,
+    required int i20,
+    required int i21,
+    required int i22,
+    required int i23,
+    required int i24,
+    required int i25,
+    required int i26,
+    required int i27,
+    required int i28,
+    required int i29,
+    required int i30,
+    required int i31,
+    required int i32,
+    required int i33,
+    required int i34,
+    required int i35,
+    required int i36,
+    required int i37,
+    required int i38,
+    required int i39,
+    required int i40,
+    required int i41,
+    required int i42,
+    required int i43,
+    required int i44,
+    required int i45,
+    required int i46,
+    required int i47,
+    required int i48,
+    required int i49,
+    required int i50,
+    required int i51,
+    required int i52,
+    required int i53,
+    required int i54,
+    required int i55,
+    required int i56,
+    required int i57,
+    required int i58,
+    required int i59,
+    required int i60,
+    required int i61,
+    required int i62,
+    required int i63,
+    required int i64,
+    required int i65,
+    required int i66,
+    required int i67,
+    required int i68,
+    required int i69,
+    required int i70});
+
+class A {}
+
+class A1 {}
+
+class A2 {}
+
+class B implements A, A1, A2 {}
+
+class C implements B {}
+
+class D implements C {}
+
+typedef B func(Object o);
+typedef B t1(int i, B b, Map<int, num> m, var x,
+    {required var ox,
+    required B ob,
+    required List<num> ol,
+    required bool obool});
+
+B f1(int i, B b, Map<int, num> m, var x,
+        {required extraParam,
+        required bool obool,
+        required var ox,
+        required D ob,
+        required List<num>? ol}) =>
+    new B();
+D f2(int i, D b, Map<int, int> m, func x,
+        {required func ox,
+        required D ob,
+        required List<int> ol,
+        required bool obool}) =>
+    new D();
+C f3(num i, A b, Map<Object, Object> m, var x,
+        {required var ox,
+        required extraParam,
+        required A2 ob,
+        required List ol,
+        required Object obool}) =>
+    new C();
+C f4(num i, A b, Map<Object, Object> m, var x,
+        {required var ox,
+        required A2 ob,
+        required List ol,
+        required bool obool,
+        required A xx,
+        required B yy}) =>
+    new C();
+C f5(int i, A b, Map<Object, Object> m, var x,
+        {required ox, required B ob, required List ol, required obool}) =>
+    new C();
+
+const f_is_fType = f is fType;
+const f_is_gType = f is gType;
+const g_is_fType = g is fType;
+const g_is_gType = g is gType;
+const f_is_bigType = f is bigType;
+
+const f1_is_t1 = f1 is t1;
+const f2_is_t1 = f2 is t1;
+const f3_is_t1 = f3 is t1;
+const f4_is_t1 = f4 is t1;
+const f5_is_t1 = f5 is t1;
+
+main() {
+  expect(true, f_is_fType);
+  expect(f is fType, f_is_fType);
+  expect(!inStrongMode, f_is_gType);
+  expect(f is gType, f_is_gType);
+  expect(true, g_is_fType);
+  expect(g is fType, g_is_fType);
+  expect(true, g_is_gType);
+  expect(g is gType, g_is_gType);
+  expect(false, f_is_bigType);
+  expect(f is bigType, f_is_bigType);
+
+  expect(false, f1_is_t1);
+  expect(f1 is t1, f1_is_t1);
+  expect(false, f2_is_t1);
+  expect(f2 is t1, f2_is_t1);
+  expect(!inStrongMode, f3_is_t1);
+  expect(f3 is t1, f3_is_t1);
+  expect(!inStrongMode, f4_is_t1);
+  expect(f4 is t1, f4_is_t1);
+  expect(true, f5_is_t1);
+  expect(f5 is t1, f5_is_t1);
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw "Expected $expected, actual $actual";
+}
diff --git a/pkg/front_end/testcases/nnbd/const_is.dart.outline.expect b/pkg/front_end/testcases/nnbd/const_is.dart.outline.expect
new file mode 100644
index 0000000..46bacdc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/const_is.dart.outline.expect
@@ -0,0 +1,76 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef fType = ({required i: core::int}) → core::int;
+typedef gType = ({i: core::int}) → core::int;
+typedef bigType = ({required i1: core::int, required i10: core::int, required i11: core::int, required i12: core::int, required i13: core::int, required i14: core::int, required i15: core::int, required i16: core::int, required i17: core::int, required i18: core::int, required i19: core::int, required i2: core::int, required i20: core::int, required i21: core::int, required i22: core::int, required i23: core::int, required i24: core::int, required i25: core::int, required i26: core::int, required i27: core::int, required i28: core::int, required i29: core::int, required i3: core::int, required i30: core::int, required i31: core::int, required i32: core::int, required i33: core::int, required i34: core::int, required i35: core::int, required i36: core::int, required i37: core::int, required i38: core::int, required i39: core::int, required i4: core::int, required i40: core::int, required i41: core::int, required i42: core::int, required i43: core::int, required i44: core::int, required i45: core::int, required i46: core::int, required i47: core::int, required i48: core::int, required i49: core::int, required i5: core::int, required i50: core::int, required i51: core::int, required i52: core::int, required i53: core::int, required i54: core::int, required i55: core::int, required i56: core::int, required i57: core::int, required i58: core::int, required i59: core::int, required i6: core::int, required i60: core::int, required i61: core::int, required i62: core::int, required i63: core::int, required i64: core::int, required i65: core::int, required i66: core::int, required i67: core::int, required i68: core::int, required i69: core::int, required i7: core::int, required i70: core::int, required i8: core::int, required i9: core::int}) → core::int;
+typedef func = (core::Object) → self::B;
+typedef t1 = (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B;
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+}
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1
+    ;
+}
+class A2 extends core::Object {
+  synthetic constructor •() → self::A2
+    ;
+}
+class B extends core::Object implements self::A, self::A1, self::A2 {
+  synthetic constructor •() → self::B
+    ;
+}
+class C extends core::Object implements self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+class D extends core::Object implements self::C {
+  synthetic constructor •() → self::D
+    ;
+}
+static field core::bool inStrongMode;
+static const field core::bool f_is_fType = self::f is{ForNonNullableByDefault} ({required i: core::int}) → core::int;
+static const field core::bool f_is_gType = self::f is{ForNonNullableByDefault} ({i: core::int}) → core::int;
+static const field core::bool g_is_fType = self::g is{ForNonNullableByDefault} ({required i: core::int}) → core::int;
+static const field core::bool g_is_gType = self::g is{ForNonNullableByDefault} ({i: core::int}) → core::int;
+static const field core::bool f_is_bigType = self::f is{ForNonNullableByDefault} ({required i1: core::int, required i10: core::int, required i11: core::int, required i12: core::int, required i13: core::int, required i14: core::int, required i15: core::int, required i16: core::int, required i17: core::int, required i18: core::int, required i19: core::int, required i2: core::int, required i20: core::int, required i21: core::int, required i22: core::int, required i23: core::int, required i24: core::int, required i25: core::int, required i26: core::int, required i27: core::int, required i28: core::int, required i29: core::int, required i3: core::int, required i30: core::int, required i31: core::int, required i32: core::int, required i33: core::int, required i34: core::int, required i35: core::int, required i36: core::int, required i37: core::int, required i38: core::int, required i39: core::int, required i4: core::int, required i40: core::int, required i41: core::int, required i42: core::int, required i43: core::int, required i44: core::int, required i45: core::int, required i46: core::int, required i47: core::int, required i48: core::int, required i49: core::int, required i5: core::int, required i50: core::int, required i51: core::int, required i52: core::int, required i53: core::int, required i54: core::int, required i55: core::int, required i56: core::int, required i57: core::int, required i58: core::int, required i59: core::int, required i6: core::int, required i60: core::int, required i61: core::int, required i62: core::int, required i63: core::int, required i64: core::int, required i65: core::int, required i66: core::int, required i67: core::int, required i68: core::int, required i69: core::int, required i7: core::int, required i70: core::int, required i8: core::int, required i9: core::int}) → core::int;
+static const field core::bool f1_is_t1 = self::f1 is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B;
+static const field core::bool f2_is_t1 = self::f2 is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B;
+static const field core::bool f3_is_t1 = self::f3 is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B;
+static const field core::bool f4_is_t1 = self::f4 is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B;
+static const field core::bool f5_is_t1 = self::f5 is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B;
+static method f({required core::int i}) → core::int
+  ;
+static method g({core::int i}) → core::int
+  ;
+static method f1(core::int i, self::B b, core::Map<core::int, core::num> m, dynamic x, {required dynamic extraParam, required core::bool obool, required dynamic ox, required self::D ob, required core::List<core::num>? ol}) → self::B
+  ;
+static method f2(core::int i, self::D b, core::Map<core::int, core::int> m, (core::Object) → self::B x, {required (core::Object) → self::B ox, required self::D ob, required core::List<core::int> ol, required core::bool obool}) → self::D
+  ;
+static method f3(core::num i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox, required dynamic extraParam, required self::A2 ob, required core::List<dynamic> ol, required core::Object obool}) → self::C
+  ;
+static method f4(core::num i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox, required self::A2 ob, required core::List<dynamic> ol, required core::bool obool, required self::A xx, required self::B yy}) → self::C
+  ;
+static method f5(core::int i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox, required self::B ob, required core::List<dynamic> ol, required dynamic obool}) → self::C
+  ;
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:143:22 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:144:22 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:145:22 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:146:22 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:147:24 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:149:21 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:150:21 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:151:21 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:152:21 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:153:21 -> BoolConstant(true)
+Extra constant evaluation: evaluated: 10, effectively constant: 10
diff --git a/pkg/front_end/testcases/nnbd/const_is.dart.strong.expect b/pkg/front_end/testcases/nnbd/const_is.dart.strong.expect
new file mode 100644
index 0000000..ecdde5d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/const_is.dart.strong.expect
@@ -0,0 +1,106 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef fType = ({required i: core::int}) → core::int;
+typedef gType = ({i: core::int}) → core::int;
+typedef bigType = ({required i1: core::int, required i10: core::int, required i11: core::int, required i12: core::int, required i13: core::int, required i14: core::int, required i15: core::int, required i16: core::int, required i17: core::int, required i18: core::int, required i19: core::int, required i2: core::int, required i20: core::int, required i21: core::int, required i22: core::int, required i23: core::int, required i24: core::int, required i25: core::int, required i26: core::int, required i27: core::int, required i28: core::int, required i29: core::int, required i3: core::int, required i30: core::int, required i31: core::int, required i32: core::int, required i33: core::int, required i34: core::int, required i35: core::int, required i36: core::int, required i37: core::int, required i38: core::int, required i39: core::int, required i4: core::int, required i40: core::int, required i41: core::int, required i42: core::int, required i43: core::int, required i44: core::int, required i45: core::int, required i46: core::int, required i47: core::int, required i48: core::int, required i49: core::int, required i5: core::int, required i50: core::int, required i51: core::int, required i52: core::int, required i53: core::int, required i54: core::int, required i55: core::int, required i56: core::int, required i57: core::int, required i58: core::int, required i59: core::int, required i6: core::int, required i60: core::int, required i61: core::int, required i62: core::int, required i63: core::int, required i64: core::int, required i65: core::int, required i66: core::int, required i67: core::int, required i68: core::int, required i69: core::int, required i7: core::int, required i70: core::int, required i8: core::int, required i9: core::int}) → core::int;
+typedef func = (core::Object) → self::B;
+typedef t1 = (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B;
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1
+    : super core::Object::•()
+    ;
+}
+class A2 extends core::Object {
+  synthetic constructor •() → self::A2
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A, self::A1, self::A2 {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object implements self::C {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+static field core::bool inStrongMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static const field core::bool f_is_fType = #C1;
+static const field core::bool f_is_gType = #C2;
+static const field core::bool g_is_fType = #C1;
+static const field core::bool g_is_gType = #C1;
+static const field core::bool f_is_bigType = #C2;
+static const field core::bool f1_is_t1 = #C2;
+static const field core::bool f2_is_t1 = #C2;
+static const field core::bool f3_is_t1 = #C2;
+static const field core::bool f4_is_t1 = #C2;
+static const field core::bool f5_is_t1 = #C1;
+static method f({required core::int i = #C3}) → core::int {
+  return i.{core::num::+}(1);
+}
+static method g({core::int i = #C4}) → core::int {
+  return i.{core::num::+}(1);
+}
+static method f1(core::int i, self::B b, core::Map<core::int, core::num> m, dynamic x, {required dynamic extraParam = #C3, required core::bool obool = #C3, required dynamic ox = #C3, required self::D ob = #C3, required core::List<core::num>? ol = #C3}) → self::B
+  return new self::B::•();
+static method f2(core::int i, self::D b, core::Map<core::int, core::int> m, (core::Object) → self::B x, {required (core::Object) → self::B ox = #C3, required self::D ob = #C3, required core::List<core::int> ol = #C3, required core::bool obool = #C3}) → self::D
+  return new self::D::•();
+static method f3(core::num i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required dynamic extraParam = #C3, required self::A2 ob = #C3, required core::List<dynamic> ol = #C3, required core::Object obool = #C3}) → self::C
+  return new self::C::•();
+static method f4(core::num i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required self::A2 ob = #C3, required core::List<dynamic> ol = #C3, required core::bool obool = #C3, required self::A xx = #C3, required self::B yy = #C3}) → self::C
+  return new self::C::•();
+static method f5(core::int i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required self::B ob = #C3, required core::List<dynamic> ol = #C3, required dynamic obool = #C3}) → self::C
+  return new self::C::•();
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect((#C5) is{ForNonNullableByDefault} ({required i: core::int}) → core::int, #C1);
+  self::expect(!self::inStrongMode, #C2);
+  self::expect((#C5) is{ForNonNullableByDefault} ({i: core::int}) → core::int, #C2);
+  self::expect(true, #C1);
+  self::expect((#C6) is{ForNonNullableByDefault} ({required i: core::int}) → core::int, #C1);
+  self::expect(true, #C1);
+  self::expect((#C6) is{ForNonNullableByDefault} ({i: core::int}) → core::int, #C1);
+  self::expect(false, #C2);
+  self::expect((#C5) is{ForNonNullableByDefault} ({required i1: core::int, required i10: core::int, required i11: core::int, required i12: core::int, required i13: core::int, required i14: core::int, required i15: core::int, required i16: core::int, required i17: core::int, required i18: core::int, required i19: core::int, required i2: core::int, required i20: core::int, required i21: core::int, required i22: core::int, required i23: core::int, required i24: core::int, required i25: core::int, required i26: core::int, required i27: core::int, required i28: core::int, required i29: core::int, required i3: core::int, required i30: core::int, required i31: core::int, required i32: core::int, required i33: core::int, required i34: core::int, required i35: core::int, required i36: core::int, required i37: core::int, required i38: core::int, required i39: core::int, required i4: core::int, required i40: core::int, required i41: core::int, required i42: core::int, required i43: core::int, required i44: core::int, required i45: core::int, required i46: core::int, required i47: core::int, required i48: core::int, required i49: core::int, required i5: core::int, required i50: core::int, required i51: core::int, required i52: core::int, required i53: core::int, required i54: core::int, required i55: core::int, required i56: core::int, required i57: core::int, required i58: core::int, required i59: core::int, required i6: core::int, required i60: core::int, required i61: core::int, required i62: core::int, required i63: core::int, required i64: core::int, required i65: core::int, required i66: core::int, required i67: core::int, required i68: core::int, required i69: core::int, required i7: core::int, required i70: core::int, required i8: core::int, required i9: core::int}) → core::int, #C2);
+  self::expect(false, #C2);
+  self::expect((#C7) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(false, #C2);
+  self::expect((#C8) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(!self::inStrongMode, #C2);
+  self::expect((#C9) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(!self::inStrongMode, #C2);
+  self::expect((#C10) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(true, #C1);
+  self::expect((#C11) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = null
+  #C4 = 1
+  #C5 = tearoff self::f
+  #C6 = tearoff self::g
+  #C7 = tearoff self::f1
+  #C8 = tearoff self::f2
+  #C9 = tearoff self::f3
+  #C10 = tearoff self::f4
+  #C11 = tearoff self::f5
+}
diff --git a/pkg/front_end/testcases/nnbd/const_is.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/const_is.dart.strong.transformed.expect
new file mode 100644
index 0000000..1ba909d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/const_is.dart.strong.transformed.expect
@@ -0,0 +1,119 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef fType = ({required i: core::int}) → core::int;
+typedef gType = ({i: core::int}) → core::int;
+typedef bigType = ({required i1: core::int, required i10: core::int, required i11: core::int, required i12: core::int, required i13: core::int, required i14: core::int, required i15: core::int, required i16: core::int, required i17: core::int, required i18: core::int, required i19: core::int, required i2: core::int, required i20: core::int, required i21: core::int, required i22: core::int, required i23: core::int, required i24: core::int, required i25: core::int, required i26: core::int, required i27: core::int, required i28: core::int, required i29: core::int, required i3: core::int, required i30: core::int, required i31: core::int, required i32: core::int, required i33: core::int, required i34: core::int, required i35: core::int, required i36: core::int, required i37: core::int, required i38: core::int, required i39: core::int, required i4: core::int, required i40: core::int, required i41: core::int, required i42: core::int, required i43: core::int, required i44: core::int, required i45: core::int, required i46: core::int, required i47: core::int, required i48: core::int, required i49: core::int, required i5: core::int, required i50: core::int, required i51: core::int, required i52: core::int, required i53: core::int, required i54: core::int, required i55: core::int, required i56: core::int, required i57: core::int, required i58: core::int, required i59: core::int, required i6: core::int, required i60: core::int, required i61: core::int, required i62: core::int, required i63: core::int, required i64: core::int, required i65: core::int, required i66: core::int, required i67: core::int, required i68: core::int, required i69: core::int, required i7: core::int, required i70: core::int, required i8: core::int, required i9: core::int}) → core::int;
+typedef func = (core::Object) → self::B;
+typedef t1 = (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B;
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1
+    : super core::Object::•()
+    ;
+}
+class A2 extends core::Object {
+  synthetic constructor •() → self::A2
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A, self::A1, self::A2 {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object implements self::C {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+static field core::bool inStrongMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static const field core::bool f_is_fType = #C1;
+static const field core::bool f_is_gType = #C2;
+static const field core::bool g_is_fType = #C1;
+static const field core::bool g_is_gType = #C1;
+static const field core::bool f_is_bigType = #C2;
+static const field core::bool f1_is_t1 = #C2;
+static const field core::bool f2_is_t1 = #C2;
+static const field core::bool f3_is_t1 = #C2;
+static const field core::bool f4_is_t1 = #C2;
+static const field core::bool f5_is_t1 = #C1;
+static method f({required core::int i = #C3}) → core::int {
+  return i.{core::num::+}(1);
+}
+static method g({core::int i = #C4}) → core::int {
+  return i.{core::num::+}(1);
+}
+static method f1(core::int i, self::B b, core::Map<core::int, core::num> m, dynamic x, {required dynamic extraParam = #C3, required core::bool obool = #C3, required dynamic ox = #C3, required self::D ob = #C3, required core::List<core::num>? ol = #C3}) → self::B
+  return new self::B::•();
+static method f2(core::int i, self::D b, core::Map<core::int, core::int> m, (core::Object) → self::B x, {required (core::Object) → self::B ox = #C3, required self::D ob = #C3, required core::List<core::int> ol = #C3, required core::bool obool = #C3}) → self::D
+  return new self::D::•();
+static method f3(core::num i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required dynamic extraParam = #C3, required self::A2 ob = #C3, required core::List<dynamic> ol = #C3, required core::Object obool = #C3}) → self::C
+  return new self::C::•();
+static method f4(core::num i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required self::A2 ob = #C3, required core::List<dynamic> ol = #C3, required core::bool obool = #C3, required self::A xx = #C3, required self::B yy = #C3}) → self::C
+  return new self::C::•();
+static method f5(core::int i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required self::B ob = #C3, required core::List<dynamic> ol = #C3, required dynamic obool = #C3}) → self::C
+  return new self::C::•();
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect((#C5) is{ForNonNullableByDefault} ({required i: core::int}) → core::int, #C1);
+  self::expect(!self::inStrongMode, #C2);
+  self::expect((#C5) is{ForNonNullableByDefault} ({i: core::int}) → core::int, #C2);
+  self::expect(true, #C1);
+  self::expect((#C6) is{ForNonNullableByDefault} ({required i: core::int}) → core::int, #C1);
+  self::expect(true, #C1);
+  self::expect((#C6) is{ForNonNullableByDefault} ({i: core::int}) → core::int, #C1);
+  self::expect(false, #C2);
+  self::expect((#C5) is{ForNonNullableByDefault} ({required i1: core::int, required i10: core::int, required i11: core::int, required i12: core::int, required i13: core::int, required i14: core::int, required i15: core::int, required i16: core::int, required i17: core::int, required i18: core::int, required i19: core::int, required i2: core::int, required i20: core::int, required i21: core::int, required i22: core::int, required i23: core::int, required i24: core::int, required i25: core::int, required i26: core::int, required i27: core::int, required i28: core::int, required i29: core::int, required i3: core::int, required i30: core::int, required i31: core::int, required i32: core::int, required i33: core::int, required i34: core::int, required i35: core::int, required i36: core::int, required i37: core::int, required i38: core::int, required i39: core::int, required i4: core::int, required i40: core::int, required i41: core::int, required i42: core::int, required i43: core::int, required i44: core::int, required i45: core::int, required i46: core::int, required i47: core::int, required i48: core::int, required i49: core::int, required i5: core::int, required i50: core::int, required i51: core::int, required i52: core::int, required i53: core::int, required i54: core::int, required i55: core::int, required i56: core::int, required i57: core::int, required i58: core::int, required i59: core::int, required i6: core::int, required i60: core::int, required i61: core::int, required i62: core::int, required i63: core::int, required i64: core::int, required i65: core::int, required i66: core::int, required i67: core::int, required i68: core::int, required i69: core::int, required i7: core::int, required i70: core::int, required i8: core::int, required i9: core::int}) → core::int, #C2);
+  self::expect(false, #C2);
+  self::expect((#C7) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(false, #C2);
+  self::expect((#C8) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(!self::inStrongMode, #C2);
+  self::expect((#C9) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(!self::inStrongMode, #C2);
+  self::expect((#C10) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(true, #C1);
+  self::expect((#C11) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = null
+  #C4 = 1
+  #C5 = tearoff self::f
+  #C6 = tearoff self::g
+  #C7 = tearoff self::f1
+  #C8 = tearoff self::f2
+  #C9 = tearoff self::f3
+  #C10 = tearoff self::f4
+  #C11 = tearoff self::f5
+}
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:157:12 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:159:12 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:161:12 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:163:12 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:165:12 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:168:13 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:170:13 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:172:13 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:174:13 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:176:13 -> BoolConstant(true)
+Extra constant evaluation: evaluated: 56, effectively constant: 10
diff --git a/pkg/front_end/testcases/nnbd/const_is.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/const_is.dart.textual_outline.expect
new file mode 100644
index 0000000..48d1d0a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/const_is.dart.textual_outline.expect
@@ -0,0 +1,138 @@
+bool inStrongMode = <int?>[] is! List<int>;
+int f({required int i}) {}
+int g({int i = 1}) {}
+typedef int fType({required int i});
+typedef int gType({int i});
+typedef int bigType(
+    {required int i1,
+    required int i2,
+    required int i3,
+    required int i4,
+    required int i5,
+    required int i6,
+    required int i7,
+    required int i8,
+    required int i9,
+    required int i10,
+    required int i11,
+    required int i12,
+    required int i13,
+    required int i14,
+    required int i15,
+    required int i16,
+    required int i17,
+    required int i18,
+    required int i19,
+    required int i20,
+    required int i21,
+    required int i22,
+    required int i23,
+    required int i24,
+    required int i25,
+    required int i26,
+    required int i27,
+    required int i28,
+    required int i29,
+    required int i30,
+    required int i31,
+    required int i32,
+    required int i33,
+    required int i34,
+    required int i35,
+    required int i36,
+    required int i37,
+    required int i38,
+    required int i39,
+    required int i40,
+    required int i41,
+    required int i42,
+    required int i43,
+    required int i44,
+    required int i45,
+    required int i46,
+    required int i47,
+    required int i48,
+    required int i49,
+    required int i50,
+    required int i51,
+    required int i52,
+    required int i53,
+    required int i54,
+    required int i55,
+    required int i56,
+    required int i57,
+    required int i58,
+    required int i59,
+    required int i60,
+    required int i61,
+    required int i62,
+    required int i63,
+    required int i64,
+    required int i65,
+    required int i66,
+    required int i67,
+    required int i68,
+    required int i69,
+    required int i70});
+
+class A {}
+
+class A1 {}
+
+class A2 {}
+
+class B implements A, A1, A2 {}
+
+class C implements B {}
+
+class D implements C {}
+
+typedef B func(Object o);
+typedef B t1(int i, B b, Map<int, num> m, var x,
+    {required var ox,
+    required B ob,
+    required List<num> ol,
+    required bool obool});
+B f1(int i, B b, Map<int, num> m, var x,
+        {required extraParam,
+        required bool obool,
+        required var ox,
+        required D ob,
+        required List<num>? ol}) =>
+    new B();
+D f2(int i, D b, Map<int, int> m, func x,
+        {required func ox,
+        required D ob,
+        required List<int> ol,
+        required bool obool}) =>
+    new D();
+C f3(num i, A b, Map<Object, Object> m, var x,
+        {required var ox,
+        required extraParam,
+        required A2 ob,
+        required List ol,
+        required Object obool}) =>
+    new C();
+C f4(num i, A b, Map<Object, Object> m, var x,
+        {required var ox,
+        required A2 ob,
+        required List ol,
+        required bool obool,
+        required A xx,
+        required B yy}) =>
+    new C();
+C f5(int i, A b, Map<Object, Object> m, var x,
+        {required ox, required B ob, required List ol, required obool}) =>
+    new C();
+const f_is_fType = f is fType;
+const f_is_gType = f is gType;
+const g_is_fType = g is fType;
+const g_is_gType = g is gType;
+const f_is_bigType = f is bigType;
+const f1_is_t1 = f1 is t1;
+const f2_is_t1 = f2 is t1;
+const f3_is_t1 = f3 is t1;
+const f4_is_t1 = f4 is t1;
+const f5_is_t1 = f5 is t1;
+main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/nnbd/const_is.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/const_is.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5e166ea
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/const_is.dart.textual_outline_modelled.expect
@@ -0,0 +1,138 @@
+B f1(int i, B b, Map<int, num> m, var x,
+        {required extraParam,
+        required bool obool,
+        required var ox,
+        required D ob,
+        required List<num>? ol}) =>
+    new B();
+C f3(num i, A b, Map<Object, Object> m, var x,
+        {required var ox,
+        required extraParam,
+        required A2 ob,
+        required List ol,
+        required Object obool}) =>
+    new C();
+C f4(num i, A b, Map<Object, Object> m, var x,
+        {required var ox,
+        required A2 ob,
+        required List ol,
+        required bool obool,
+        required A xx,
+        required B yy}) =>
+    new C();
+C f5(int i, A b, Map<Object, Object> m, var x,
+        {required ox, required B ob, required List ol, required obool}) =>
+    new C();
+D f2(int i, D b, Map<int, int> m, func x,
+        {required func ox,
+        required D ob,
+        required List<int> ol,
+        required bool obool}) =>
+    new D();
+bool inStrongMode = <int?>[] is! List<int>;
+
+class A {}
+
+class A1 {}
+
+class A2 {}
+
+class B implements A, A1, A2 {}
+
+class C implements B {}
+
+class D implements C {}
+
+const f1_is_t1 = f1 is t1;
+const f2_is_t1 = f2 is t1;
+const f3_is_t1 = f3 is t1;
+const f4_is_t1 = f4 is t1;
+const f5_is_t1 = f5 is t1;
+const f_is_bigType = f is bigType;
+const f_is_fType = f is fType;
+const f_is_gType = f is gType;
+const g_is_fType = g is fType;
+const g_is_gType = g is gType;
+expect(expected, actual) {}
+int f({required int i}) {}
+int g({int i = 1}) {}
+main() {}
+typedef B func(Object o);
+typedef B t1(int i, B b, Map<int, num> m, var x,
+    {required var ox,
+    required B ob,
+    required List<num> ol,
+    required bool obool});
+typedef int bigType(
+    {required int i1,
+    required int i2,
+    required int i3,
+    required int i4,
+    required int i5,
+    required int i6,
+    required int i7,
+    required int i8,
+    required int i9,
+    required int i10,
+    required int i11,
+    required int i12,
+    required int i13,
+    required int i14,
+    required int i15,
+    required int i16,
+    required int i17,
+    required int i18,
+    required int i19,
+    required int i20,
+    required int i21,
+    required int i22,
+    required int i23,
+    required int i24,
+    required int i25,
+    required int i26,
+    required int i27,
+    required int i28,
+    required int i29,
+    required int i30,
+    required int i31,
+    required int i32,
+    required int i33,
+    required int i34,
+    required int i35,
+    required int i36,
+    required int i37,
+    required int i38,
+    required int i39,
+    required int i40,
+    required int i41,
+    required int i42,
+    required int i43,
+    required int i44,
+    required int i45,
+    required int i46,
+    required int i47,
+    required int i48,
+    required int i49,
+    required int i50,
+    required int i51,
+    required int i52,
+    required int i53,
+    required int i54,
+    required int i55,
+    required int i56,
+    required int i57,
+    required int i58,
+    required int i59,
+    required int i60,
+    required int i61,
+    required int i62,
+    required int i63,
+    required int i64,
+    required int i65,
+    required int i66,
+    required int i67,
+    required int i68,
+    required int i69,
+    required int i70});
+typedef int fType({required int i});
+typedef int gType({int i});
diff --git a/pkg/front_end/testcases/nnbd/const_is.dart.weak.expect b/pkg/front_end/testcases/nnbd/const_is.dart.weak.expect
new file mode 100644
index 0000000..f6c3bba
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/const_is.dart.weak.expect
@@ -0,0 +1,106 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef fType = ({required i: core::int}) → core::int;
+typedef gType = ({i: core::int}) → core::int;
+typedef bigType = ({required i1: core::int, required i10: core::int, required i11: core::int, required i12: core::int, required i13: core::int, required i14: core::int, required i15: core::int, required i16: core::int, required i17: core::int, required i18: core::int, required i19: core::int, required i2: core::int, required i20: core::int, required i21: core::int, required i22: core::int, required i23: core::int, required i24: core::int, required i25: core::int, required i26: core::int, required i27: core::int, required i28: core::int, required i29: core::int, required i3: core::int, required i30: core::int, required i31: core::int, required i32: core::int, required i33: core::int, required i34: core::int, required i35: core::int, required i36: core::int, required i37: core::int, required i38: core::int, required i39: core::int, required i4: core::int, required i40: core::int, required i41: core::int, required i42: core::int, required i43: core::int, required i44: core::int, required i45: core::int, required i46: core::int, required i47: core::int, required i48: core::int, required i49: core::int, required i5: core::int, required i50: core::int, required i51: core::int, required i52: core::int, required i53: core::int, required i54: core::int, required i55: core::int, required i56: core::int, required i57: core::int, required i58: core::int, required i59: core::int, required i6: core::int, required i60: core::int, required i61: core::int, required i62: core::int, required i63: core::int, required i64: core::int, required i65: core::int, required i66: core::int, required i67: core::int, required i68: core::int, required i69: core::int, required i7: core::int, required i70: core::int, required i8: core::int, required i9: core::int}) → core::int;
+typedef func = (core::Object) → self::B;
+typedef t1 = (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B;
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1
+    : super core::Object::•()
+    ;
+}
+class A2 extends core::Object {
+  synthetic constructor •() → self::A2
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A, self::A1, self::A2 {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object implements self::C {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+static field core::bool inStrongMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static const field core::bool f_is_fType = #C1;
+static const field core::bool f_is_gType = #C1;
+static const field core::bool g_is_fType = #C1;
+static const field core::bool g_is_gType = #C1;
+static const field core::bool f_is_bigType = #C2;
+static const field core::bool f1_is_t1 = #C2;
+static const field core::bool f2_is_t1 = #C2;
+static const field core::bool f3_is_t1 = #C1;
+static const field core::bool f4_is_t1 = #C1;
+static const field core::bool f5_is_t1 = #C1;
+static method f({required core::int i = #C3}) → core::int {
+  return i.{core::num::+}(1);
+}
+static method g({core::int i = #C4}) → core::int {
+  return i.{core::num::+}(1);
+}
+static method f1(core::int i, self::B b, core::Map<core::int, core::num> m, dynamic x, {required dynamic extraParam = #C3, required core::bool obool = #C3, required dynamic ox = #C3, required self::D ob = #C3, required core::List<core::num>? ol = #C3}) → self::B
+  return new self::B::•();
+static method f2(core::int i, self::D b, core::Map<core::int, core::int> m, (core::Object) → self::B x, {required (core::Object) → self::B ox = #C3, required self::D ob = #C3, required core::List<core::int> ol = #C3, required core::bool obool = #C3}) → self::D
+  return new self::D::•();
+static method f3(core::num i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required dynamic extraParam = #C3, required self::A2 ob = #C3, required core::List<dynamic> ol = #C3, required core::Object obool = #C3}) → self::C
+  return new self::C::•();
+static method f4(core::num i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required self::A2 ob = #C3, required core::List<dynamic> ol = #C3, required core::bool obool = #C3, required self::A xx = #C3, required self::B yy = #C3}) → self::C
+  return new self::C::•();
+static method f5(core::int i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required self::B ob = #C3, required core::List<dynamic> ol = #C3, required dynamic obool = #C3}) → self::C
+  return new self::C::•();
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect((#C5) is{ForNonNullableByDefault} ({required i: core::int}) → core::int, #C1);
+  self::expect(!self::inStrongMode, #C1);
+  self::expect((#C5) is{ForNonNullableByDefault} ({i: core::int}) → core::int, #C1);
+  self::expect(true, #C1);
+  self::expect((#C6) is{ForNonNullableByDefault} ({required i: core::int}) → core::int, #C1);
+  self::expect(true, #C1);
+  self::expect((#C6) is{ForNonNullableByDefault} ({i: core::int}) → core::int, #C1);
+  self::expect(false, #C2);
+  self::expect((#C5) is{ForNonNullableByDefault} ({required i1: core::int, required i10: core::int, required i11: core::int, required i12: core::int, required i13: core::int, required i14: core::int, required i15: core::int, required i16: core::int, required i17: core::int, required i18: core::int, required i19: core::int, required i2: core::int, required i20: core::int, required i21: core::int, required i22: core::int, required i23: core::int, required i24: core::int, required i25: core::int, required i26: core::int, required i27: core::int, required i28: core::int, required i29: core::int, required i3: core::int, required i30: core::int, required i31: core::int, required i32: core::int, required i33: core::int, required i34: core::int, required i35: core::int, required i36: core::int, required i37: core::int, required i38: core::int, required i39: core::int, required i4: core::int, required i40: core::int, required i41: core::int, required i42: core::int, required i43: core::int, required i44: core::int, required i45: core::int, required i46: core::int, required i47: core::int, required i48: core::int, required i49: core::int, required i5: core::int, required i50: core::int, required i51: core::int, required i52: core::int, required i53: core::int, required i54: core::int, required i55: core::int, required i56: core::int, required i57: core::int, required i58: core::int, required i59: core::int, required i6: core::int, required i60: core::int, required i61: core::int, required i62: core::int, required i63: core::int, required i64: core::int, required i65: core::int, required i66: core::int, required i67: core::int, required i68: core::int, required i69: core::int, required i7: core::int, required i70: core::int, required i8: core::int, required i9: core::int}) → core::int, #C2);
+  self::expect(false, #C2);
+  self::expect((#C7) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(false, #C2);
+  self::expect((#C8) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(!self::inStrongMode, #C1);
+  self::expect((#C9) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C1);
+  self::expect(!self::inStrongMode, #C1);
+  self::expect((#C10) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C1);
+  self::expect(true, #C1);
+  self::expect((#C11) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = null
+  #C4 = 1
+  #C5 = tearoff self::f
+  #C6 = tearoff self::g
+  #C7 = tearoff self::f1
+  #C8 = tearoff self::f2
+  #C9 = tearoff self::f3
+  #C10 = tearoff self::f4
+  #C11 = tearoff self::f5
+}
diff --git a/pkg/front_end/testcases/nnbd/const_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/const_is.dart.weak.transformed.expect
new file mode 100644
index 0000000..5d2b393
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/const_is.dart.weak.transformed.expect
@@ -0,0 +1,119 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef fType = ({required i: core::int}) → core::int;
+typedef gType = ({i: core::int}) → core::int;
+typedef bigType = ({required i1: core::int, required i10: core::int, required i11: core::int, required i12: core::int, required i13: core::int, required i14: core::int, required i15: core::int, required i16: core::int, required i17: core::int, required i18: core::int, required i19: core::int, required i2: core::int, required i20: core::int, required i21: core::int, required i22: core::int, required i23: core::int, required i24: core::int, required i25: core::int, required i26: core::int, required i27: core::int, required i28: core::int, required i29: core::int, required i3: core::int, required i30: core::int, required i31: core::int, required i32: core::int, required i33: core::int, required i34: core::int, required i35: core::int, required i36: core::int, required i37: core::int, required i38: core::int, required i39: core::int, required i4: core::int, required i40: core::int, required i41: core::int, required i42: core::int, required i43: core::int, required i44: core::int, required i45: core::int, required i46: core::int, required i47: core::int, required i48: core::int, required i49: core::int, required i5: core::int, required i50: core::int, required i51: core::int, required i52: core::int, required i53: core::int, required i54: core::int, required i55: core::int, required i56: core::int, required i57: core::int, required i58: core::int, required i59: core::int, required i6: core::int, required i60: core::int, required i61: core::int, required i62: core::int, required i63: core::int, required i64: core::int, required i65: core::int, required i66: core::int, required i67: core::int, required i68: core::int, required i69: core::int, required i7: core::int, required i70: core::int, required i8: core::int, required i9: core::int}) → core::int;
+typedef func = (core::Object) → self::B;
+typedef t1 = (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B;
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1
+    : super core::Object::•()
+    ;
+}
+class A2 extends core::Object {
+  synthetic constructor •() → self::A2
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A, self::A1, self::A2 {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object implements self::C {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+static field core::bool inStrongMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static const field core::bool f_is_fType = #C1;
+static const field core::bool f_is_gType = #C1;
+static const field core::bool g_is_fType = #C1;
+static const field core::bool g_is_gType = #C1;
+static const field core::bool f_is_bigType = #C2;
+static const field core::bool f1_is_t1 = #C2;
+static const field core::bool f2_is_t1 = #C2;
+static const field core::bool f3_is_t1 = #C1;
+static const field core::bool f4_is_t1 = #C1;
+static const field core::bool f5_is_t1 = #C1;
+static method f({required core::int i = #C3}) → core::int {
+  return i.{core::num::+}(1);
+}
+static method g({core::int i = #C4}) → core::int {
+  return i.{core::num::+}(1);
+}
+static method f1(core::int i, self::B b, core::Map<core::int, core::num> m, dynamic x, {required dynamic extraParam = #C3, required core::bool obool = #C3, required dynamic ox = #C3, required self::D ob = #C3, required core::List<core::num>? ol = #C3}) → self::B
+  return new self::B::•();
+static method f2(core::int i, self::D b, core::Map<core::int, core::int> m, (core::Object) → self::B x, {required (core::Object) → self::B ox = #C3, required self::D ob = #C3, required core::List<core::int> ol = #C3, required core::bool obool = #C3}) → self::D
+  return new self::D::•();
+static method f3(core::num i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required dynamic extraParam = #C3, required self::A2 ob = #C3, required core::List<dynamic> ol = #C3, required core::Object obool = #C3}) → self::C
+  return new self::C::•();
+static method f4(core::num i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required self::A2 ob = #C3, required core::List<dynamic> ol = #C3, required core::bool obool = #C3, required self::A xx = #C3, required self::B yy = #C3}) → self::C
+  return new self::C::•();
+static method f5(core::int i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required self::B ob = #C3, required core::List<dynamic> ol = #C3, required dynamic obool = #C3}) → self::C
+  return new self::C::•();
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect((#C5) is{ForNonNullableByDefault} ({required i: core::int}) → core::int, #C1);
+  self::expect(!self::inStrongMode, #C1);
+  self::expect((#C5) is{ForNonNullableByDefault} ({i: core::int}) → core::int, #C1);
+  self::expect(true, #C1);
+  self::expect((#C6) is{ForNonNullableByDefault} ({required i: core::int}) → core::int, #C1);
+  self::expect(true, #C1);
+  self::expect((#C6) is{ForNonNullableByDefault} ({i: core::int}) → core::int, #C1);
+  self::expect(false, #C2);
+  self::expect((#C5) is{ForNonNullableByDefault} ({required i1: core::int, required i10: core::int, required i11: core::int, required i12: core::int, required i13: core::int, required i14: core::int, required i15: core::int, required i16: core::int, required i17: core::int, required i18: core::int, required i19: core::int, required i2: core::int, required i20: core::int, required i21: core::int, required i22: core::int, required i23: core::int, required i24: core::int, required i25: core::int, required i26: core::int, required i27: core::int, required i28: core::int, required i29: core::int, required i3: core::int, required i30: core::int, required i31: core::int, required i32: core::int, required i33: core::int, required i34: core::int, required i35: core::int, required i36: core::int, required i37: core::int, required i38: core::int, required i39: core::int, required i4: core::int, required i40: core::int, required i41: core::int, required i42: core::int, required i43: core::int, required i44: core::int, required i45: core::int, required i46: core::int, required i47: core::int, required i48: core::int, required i49: core::int, required i5: core::int, required i50: core::int, required i51: core::int, required i52: core::int, required i53: core::int, required i54: core::int, required i55: core::int, required i56: core::int, required i57: core::int, required i58: core::int, required i59: core::int, required i6: core::int, required i60: core::int, required i61: core::int, required i62: core::int, required i63: core::int, required i64: core::int, required i65: core::int, required i66: core::int, required i67: core::int, required i68: core::int, required i69: core::int, required i7: core::int, required i70: core::int, required i8: core::int, required i9: core::int}) → core::int, #C2);
+  self::expect(false, #C2);
+  self::expect((#C7) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(false, #C2);
+  self::expect((#C8) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(!self::inStrongMode, #C1);
+  self::expect((#C9) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C1);
+  self::expect(!self::inStrongMode, #C1);
+  self::expect((#C10) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C1);
+  self::expect(true, #C1);
+  self::expect((#C11) is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = null
+  #C4 = 1
+  #C5 = tearoff self::f
+  #C6 = tearoff self::g
+  #C7 = tearoff self::f1
+  #C8 = tearoff self::f2
+  #C9 = tearoff self::f3
+  #C10 = tearoff self::f4
+  #C11 = tearoff self::f5
+}
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:157:12 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:159:12 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:161:12 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:163:12 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:165:12 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:168:13 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:170:13 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:172:13 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:174:13 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:176:13 -> BoolConstant(true)
+Extra constant evaluation: evaluated: 56, effectively constant: 10
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart b/pkg/front_end/testcases/nnbd_mixed/const_is.dart
new file mode 100644
index 0000000..9649a2d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2020, 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.
+
+// Test derived from language/nnbd/subtyping/function_type_bounds_weak_test
+
+import 'const_is_lib.dart';
+
+main() {
+  // void fn<T extends Object>() is void Function<T extends Object?>()
+  // Should pass with weak checking because when the nullability information on
+  // Object and Object? are erased the type bounds are equivalent.
+  expect(true, fnWithNonNullObjectBound is fnTypeWithNullableObjectBound);
+  const test1 = fnWithNonNullObjectBound is fnTypeWithNullableObjectBound;
+  expect(true, test1);
+
+  // void fn<T extends Null>() is void Function<T extends Never>()
+  // Should pass with weak checking because because Null becomes equivalent to
+  // the bottom type.
+  expect(true, fnWithNullBound is fnTypeWithNeverBound);
+  const test2 = fnWithNullBound is fnTypeWithNeverBound;
+  expect(true, test2);
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw "Expected $expected, actual $actual";
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.textual_outline.expect
new file mode 100644
index 0000000..2b71bf0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+import 'const_is_lib.dart';
+
+main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..0d90c13
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.textual_outline_modelled.expect
@@ -0,0 +1,4 @@
+import 'const_is_lib.dart';
+
+expect(expected, actual) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect
new file mode 100644
index 0000000..a139d60
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///const_is_lib.dart";
+
+static method main() → dynamic {
+  self::expect(true, (#C1) is{ForNonNullableByDefault} <T extends core::Object? = core::Object?>() → void);
+  self::expect(true, #C2);
+  self::expect(true, (#C3) is{ForNonNullableByDefault} <T extends Never = dynamic>() → void);
+  self::expect(true, #C2);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+typedef fnTypeWithNullableObjectBound = <T extends core::Object? = core::Object?>() → void;
+typedef fnTypeWithNeverBound = <T extends Never = dynamic>() → void;
+static method fnWithNonNullObjectBound<T extends core::Object = core::Object>() → void
+  return null;
+static method fnWithNullBound<T extends core::Null? = core::Null?>() → void
+  return null;
+
+constants  {
+  #C1 = tearoff self2::fnWithNonNullObjectBound
+  #C2 = true
+  #C3 = tearoff self2::fnWithNullBound
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect
new file mode 100644
index 0000000..9c0d806
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///const_is_lib.dart";
+
+static method main() → dynamic {
+  self::expect(true, (#C1) is{ForNonNullableByDefault} <T extends core::Object? = core::Object?>() → void);
+  self::expect(true, #C2);
+  self::expect(true, (#C3) is{ForNonNullableByDefault} <T extends Never = dynamic>() → void);
+  self::expect(true, #C2);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+typedef fnTypeWithNullableObjectBound = <T extends core::Object? = core::Object?>() → void;
+typedef fnTypeWithNeverBound = <T extends Never = dynamic>() → void;
+static method fnWithNonNullObjectBound<T extends core::Object = core::Object>() → void
+  return null;
+static method fnWithNullBound<T extends core::Null? = core::Null?>() → void
+  return null;
+
+constants  {
+  #C1 = tearoff self2::fnWithNonNullObjectBound
+  #C2 = true
+  #C3 = tearoff self2::fnWithNullBound
+}
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:13:41 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///const_is.dart:20:32 -> BoolConstant(true)
+Extra constant evaluation: evaluated: 14, effectively constant: 2
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is_lib.dart b/pkg/front_end/testcases/nnbd_mixed/const_is_lib.dart
new file mode 100644
index 0000000..e3d0d48
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is_lib.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2020, 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.
+
+/// A null safe library of helper methods to construct types and values
+/// containing non-nullable and nullable (question ?) types.
+
+typedef fnTypeWithNullableObjectBound = void Function<T extends Object?>();
+typedef fnTypeWithNeverBound = void Function<T extends Never>();
+
+void fnWithNonNullObjectBound<T extends Object>() => null;
+void fnWithNullBound<T extends Null>() => null;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
index 4fa35c5..48c54ae 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
@@ -7,10 +7,10 @@
 
 static method main() → void {
   core::Null? nil;
-  iss::x = null as{TypeError} Never;
-  iss::x = nil as{TypeError} Never;
-  iss::takesNever(null as{TypeError} Never);
-  iss::takesNever(nil as{TypeError} Never);
+  iss::x = null;
+  iss::x = nil;
+  iss::takesNever(null);
+  iss::takesNever(nil);
   iss::takesTakesNull(#C1);
   iss::f = (Never* x) → core::Null? {};
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
index 4fa35c5..48c54ae 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
@@ -7,10 +7,10 @@
 
 static method main() → void {
   core::Null? nil;
-  iss::x = null as{TypeError} Never;
-  iss::x = nil as{TypeError} Never;
-  iss::takesNever(null as{TypeError} Never);
-  iss::takesNever(nil as{TypeError} Never);
+  iss::x = null;
+  iss::x = nil;
+  iss::takesNever(null);
+  iss::takesNever(nil);
   iss::takesTakesNull(#C1);
   iss::f = (Never* x) → core::Null? {};
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.expect
index a1b69ec..973cfd4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.expect
@@ -75,10 +75,8 @@
   abstract member-signature method method4c([core::int? a = #C1, core::int? b = #C1]) → core::int?; -> opt::LegacyClass::method4c
   abstract member-signature method method5a(core::int a, {core::int b = #C1}) → core::int; -> opt::LegacyClass::method5a
   abstract member-signature method method5b({core::int a = #C1, core::int b = #C1}) → core::int; -> opt::LegacyClass::method5b
-  abstract member-signature method method5c({core::int a = #C1, core::int b = #C1}) → core::int; -> opt::LegacyClass::method5c
   abstract member-signature method method6a(core::int? a, {core::int? b = #C1}) → core::int?; -> opt::LegacyClass::method6a
   abstract member-signature method method6b({core::int? a = #C1, core::int? b = #C1}) → core::int?; -> opt::LegacyClass::method6b
-  abstract member-signature method method6c({core::int? a = #C1, core::int? b = #C1}) → core::int?; -> opt::LegacyClass::method6c
   abstract member-signature get getter1() → core::int; -> opt::LegacyClass::getter1
   abstract member-signature get getter2() → core::int?; -> opt::LegacyClass::getter2
   abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.transformed.expect
index a1b69ec..973cfd4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.transformed.expect
@@ -75,10 +75,8 @@
   abstract member-signature method method4c([core::int? a = #C1, core::int? b = #C1]) → core::int?; -> opt::LegacyClass::method4c
   abstract member-signature method method5a(core::int a, {core::int b = #C1}) → core::int; -> opt::LegacyClass::method5a
   abstract member-signature method method5b({core::int a = #C1, core::int b = #C1}) → core::int; -> opt::LegacyClass::method5b
-  abstract member-signature method method5c({core::int a = #C1, core::int b = #C1}) → core::int; -> opt::LegacyClass::method5c
   abstract member-signature method method6a(core::int? a, {core::int? b = #C1}) → core::int?; -> opt::LegacyClass::method6a
   abstract member-signature method method6b({core::int? a = #C1, core::int? b = #C1}) → core::int?; -> opt::LegacyClass::method6b
-  abstract member-signature method method6c({core::int? a = #C1, core::int? b = #C1}) → core::int?; -> opt::LegacyClass::method6c
   abstract member-signature get getter1() → core::int; -> opt::LegacyClass::getter1
   abstract member-signature get getter2() → core::int?; -> opt::LegacyClass::getter2
   abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
index 3c9a505..1977f90 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
@@ -73,19 +73,19 @@
   inferredLocalNever = localNever;
   localNever = self::optOutNever;
   self::optOutNever = self::optOutNever;
-  nev::optInNever = self::optOutNever as{TypeError} Never;
+  nev::optInNever = self::optOutNever;
   localNull = self::optOutNever;
   self::inferredOptOutNever = self::optOutNever;
   inferredLocalNever = self::optOutNever;
   localNever = nev::optInNever;
   self::optOutNever = nev::optInNever;
-  nev::optInNever = nev::optInNever as{TypeError} Never;
+  nev::optInNever = nev::optInNever;
   localNull = nev::optInNever;
   self::inferredOptOutNever = nev::optInNever;
   inferredLocalNever = nev::optInNever;
   localNever = localNull;
   self::optOutNever = localNull;
-  nev::optInNever = localNull as{TypeError} Never;
+  nev::optInNever = localNull;
   localNull = localNull;
   self::inferredOptOutNever = localNull;
   inferredLocalNever = localNull;
@@ -104,7 +104,7 @@
   self::throws(() → core::Null? => self::optOutNever = nev::throwing());
   self::throws(() → core::Null? => localNever = nev::throwing());
   self::throws(() → core::Null? => self::optOutNever = nev::throwing());
-  self::throws(() → core::Null? => nev::optInNever = nev::throwing() as{TypeError} Never);
+  self::throws(() → core::Null? => nev::optInNever = nev::throwing());
   self::throws(() → core::Null? => self::inferredOptOutNever = nev::throwing());
   self::throws(() → core::Null? => inferredLocalNever = nev::throwing());
 }
@@ -119,14 +119,6 @@
 }
 
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart:19:28: Error: A value of type 'Type' can't be returned from a function with return type 'Null'.
-//  - 'Type' is from 'dart:core'.
-//   Null get nullProperty => Null;
-//                            ^
-//
 import self as nev;
 import "dart:core" as core;
 import "dart:_internal" as _in;
@@ -148,10 +140,7 @@
   method nullMethod(core::Null? value) → core::Null?
     return value;
   get nullProperty() → core::Null?
-    return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart:19:28: Error: A value of type 'Type' can't be returned from a function with return type 'Null'.
- - 'Type' is from 'dart:core'.
-  Null get nullProperty => Null;
-                           ^" in core::Null? as{TypeError,ForNonNullableByDefault} core::Null?;
+    return null;
   set nullProperty(core::Null? value) → void {}
 }
 static field Never optInNever = self::optOutNever;
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
index bf726fb..1977f90 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
@@ -1,16 +1,70 @@
 library;
 import self as self;
-import "dart:core" as core;
 import "never_opt_out_lib.dart" as nev;
+import "dart:core" as core;
 
 import "org-dartlang-testcase:///never_opt_out_lib.dart";
 
+class B extends nev::A {
+  field core::Null? neverField = null;
+  field core::Null? nullField = null;
+  synthetic constructor •() → self::B*
+    : super nev::A::•()
+    ;
+  method neverMethod(core::Null? value) → core::Null?
+    return value;
+  get neverProperty() → core::Null?
+    return null;
+  set neverProperty(core::Null? value) → void {}
+  method nullMethod(core::Null? value) → core::Null?
+    return value;
+  get nullProperty() → core::Null?
+    return null;
+  set nullProperty(core::Null? value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends nev::A {
+  field Never* neverField = null;
+  field Never* nullField = null;
+  synthetic constructor •() → self::C*
+    : super nev::A::•()
+    ;
+  method neverMethod(Never* value) → Never*
+    return value;
+  get neverProperty() → Never*
+    return null;
+  set neverProperty(Never* value) → void {}
+  method nullMethod(Never* value) → Never*
+    return value;
+  get nullProperty() → Never*
+    return null;
+  set nullProperty(Never* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
 static field Never* optOutNever;
-static field core::Null? inferredOptOutNever = nev::optInNever;
+static field dynamic inferredOptOutNever = nev::optInNever;
 static method main() → dynamic {
   Never* localNever = null;
   core::Null? localNull = null;
-  Never inferredLocalNever = nev::optInNever;
+  dynamic inferredLocalNever = nev::optInNever;
   localNever = localNever;
   self::optOutNever = localNever;
   nev::optInNever = localNever;
@@ -31,28 +85,28 @@
   inferredLocalNever = nev::optInNever;
   localNever = localNull;
   self::optOutNever = localNull;
-  nev::optInNever = localNull as{TypeError} Never;
+  nev::optInNever = localNull;
   localNull = localNull;
   self::inferredOptOutNever = localNull;
-  inferredLocalNever = localNull as{TypeError} Never;
-  localNever = self::inferredOptOutNever;
-  self::optOutNever = self::inferredOptOutNever;
-  nev::optInNever = self::inferredOptOutNever as{TypeError} Never;
-  localNull = self::inferredOptOutNever;
+  inferredLocalNever = localNull;
+  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
+  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
+  nev::optInNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never;
+  localNull = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
   self::inferredOptOutNever = self::inferredOptOutNever;
-  inferredLocalNever = self::inferredOptOutNever as{TypeError} Never;
-  localNever = inferredLocalNever;
-  self::optOutNever = inferredLocalNever;
-  nev::optInNever = inferredLocalNever;
-  localNull = inferredLocalNever;
+  inferredLocalNever = self::inferredOptOutNever;
+  localNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
+  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
+  nev::optInNever = inferredLocalNever as{TypeError,ForDynamic} Never;
+  localNull = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
   self::inferredOptOutNever = inferredLocalNever;
   inferredLocalNever = inferredLocalNever;
-  self::throws(() → Never => self::optOutNever = nev::throwing());
-  self::throws(() → Never => localNever = nev::throwing());
-  self::throws(() → Never => self::optOutNever = nev::throwing());
-  self::throws(() → Never => nev::optInNever = nev::throwing());
-  self::throws(() → Never => self::inferredOptOutNever = nev::throwing());
-  self::throws(() → Never => inferredLocalNever = nev::throwing());
+  self::throws(() → core::Null? => self::optOutNever = nev::throwing());
+  self::throws(() → core::Null? => localNever = nev::throwing());
+  self::throws(() → core::Null? => self::optOutNever = nev::throwing());
+  self::throws(() → core::Null? => nev::optInNever = nev::throwing());
+  self::throws(() → core::Null? => self::inferredOptOutNever = nev::throwing());
+  self::throws(() → core::Null? => inferredLocalNever = nev::throwing());
 }
 static method throws(() →* void f) → dynamic {
   try {
@@ -66,10 +120,29 @@
 
 library /*isNonNullableByDefault*/;
 import self as nev;
+import "dart:core" as core;
+import "dart:_internal" as _in;
 import "never_opt_out.dart" as self;
 
 import "org-dartlang-testcase:///never_opt_out.dart";
 
+class A extends core::Object {
+  field Never neverField = throw "Should not reach here";
+  field core::Null? nullField = null;
+  synthetic constructor •() → nev::A
+    : super core::Object::•()
+    ;
+  method neverMethod(Never value) → Never
+    return let final Never #t1 = value in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  get neverProperty() → Never
+    return throw "Should not reach here";
+  set neverProperty(Never value) → void {}
+  method nullMethod(core::Null? value) → core::Null?
+    return value;
+  get nullProperty() → core::Null?
+    return null;
+  set nullProperty(core::Null? value) → void {}
+}
 static field Never optInNever = self::optOutNever;
 static method throwing() → Never
   return throw "Never!";
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart b/pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart
index 06c5c16..a519e50 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart
@@ -16,6 +16,6 @@
 
   Null nullField = null;
   Null nullMethod(Null value) => value;
-  Null get nullProperty => Null;
+  Null get nullProperty => null;
   void set nullProperty(Null value) {}
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
index 3a8e857..919f10f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
@@ -256,7 +256,7 @@
   uns::unnecessaryNullAwareAccess(() → core::Null? => null);
   self::throws(() → dynamic => uns::callReturningNever(() → <BottomType>=> throw "foo"), (core::Object* e) → core::bool* => e.{core::Object::==}("foo"));
   () →* core::Null? f = () → core::Null? => null;
-  self::throws(() → dynamic => uns::callReturningNever(f as{TypeError} () → Never));
+  self::throws(() → dynamic => uns::callReturningNever(f));
   uns::switchOnEnum(#C3);
   uns::switchOnEnum(#C6);
   self::throws(() → dynamic => uns::switchOnEnum(null));
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
index eacb84d..908eb54 100644
--- a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
@@ -256,7 +256,7 @@
   uns::unnecessaryNullAwareAccess(() → core::Null? => null);
   self::throws(() → dynamic => uns::callReturningNever(() → <BottomType>=> throw "foo"), (core::Object* e) → core::bool* => e.{core::Object::==}("foo"));
   () →* core::Null? f = () → core::Null? => null;
-  self::throws(() → dynamic => uns::callReturningNever(f as{TypeError} () → Never));
+  self::throws(() → dynamic => uns::callReturningNever(f));
   uns::switchOnEnum(#C3);
   uns::switchOnEnum(#C6);
   self::throws(() → dynamic => uns::switchOnEnum(null));
@@ -639,4 +639,4 @@
 Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:39:56 -> IntConstant(42)
 Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:134:5 -> IntConstant(0)
 Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:134:5 -> IntConstant(0)
-Extra constant evaluation: evaluated: 720, effectively constant: 18
+Extra constant evaluation: evaluated: 719, effectively constant: 18
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 689551d..e652cfc 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -73,7 +73,6 @@
 nnbd_mixed/issue41567: TypeCheckError
 nnbd_mixed/messages_with_types_opt_in: TypeCheckError
 nnbd_mixed/messages_with_types_opt_out: TypeCheckError
-nnbd_mixed/never_opt_out: TypeCheckError
 value_class/simple: RuntimeError # Expected
 value_class/value_extends_non_value: RuntimeError # Expected
 value_class/value_implements_non_value: RuntimeError # Expected
diff --git a/pkg/kernel/lib/src/types.dart b/pkg/kernel/lib/src/types.dart
index 88e6940..2ab1891 100644
--- a/pkg/kernel/lib/src/types.dart
+++ b/pkg/kernel/lib/src/types.dart
@@ -482,9 +482,9 @@
         return const IsSubtypeOf.never();
       }
     }
-    List<NamedType> sNamed = s.namedParameters;
-    List<NamedType> tNamed = t.namedParameters;
-    if (sNamed.isNotEmpty || tNamed.isNotEmpty) {
+    List<NamedType> sNamedParameters = s.namedParameters;
+    List<NamedType> tNamedParameters = t.namedParameters;
+    if (sNamedParameters.isNotEmpty || tNamedParameters.isNotEmpty) {
       // Rule 16, the number of positional parameters must be the same.
       if (sPositional.length != tPositional.length) {
         return const IsSubtypeOf.never();
@@ -497,17 +497,46 @@
       // [s]. Also, for the intersection, the type of the parameter of [t] must
       // be a subtype of the type of the parameter of [s].
       int sCount = 0;
-      for (int tCount = 0; tCount < tNamed.length; tCount++) {
-        String name = tNamed[tCount].name;
-        for (; sCount < sNamed.length; sCount++) {
-          if (sNamed[sCount].name == name) break;
+      for (int tCount = 0; tCount < tNamedParameters.length; tCount++) {
+        NamedType tNamedParameter = tNamedParameters[tCount];
+        String name = tNamedParameter.name;
+        NamedType sNamedParameter;
+        for (; sCount < sNamedParameters.length; sCount++) {
+          sNamedParameter = sNamedParameters[sCount];
+          if (sNamedParameter.name == name) {
+            break;
+          } else if (sNamedParameter.isRequired) {
+            /// From the NNBD spec: For each j such that r0j is required, then
+            /// there exists an i in n+1...q such that xj = yi, and r1i is
+            /// required
+            result =
+                result.and(const IsSubtypeOf.onlyIfIgnoringNullabilities());
+          }
         }
-        if (sCount == sNamed.length) return const IsSubtypeOf.never();
+        if (sCount == sNamedParameters.length) return const IsSubtypeOf.never();
+        // Increment [sCount] so we don't check [sNamedParameter] again in the
+        // loop above or below and assume it is an extra (unmatched) parameter.
+        sCount++;
         result = result.and(types.performNullabilityAwareSubtypeCheck(
-            tNamed[tCount].type, sNamed[sCount].type));
+            tNamedParameter.type, sNamedParameter.type));
         if (!result.isSubtypeWhenIgnoringNullabilities()) {
           return const IsSubtypeOf.never();
         }
+
+        /// From the NNBD spec: For each j such that r0j is required, then there
+        /// exists an i in n+1...q such that xj = yi, and r1i is required
+        if (sNamedParameter.isRequired && !tNamedParameter.isRequired) {
+          result = result.and(const IsSubtypeOf.onlyIfIgnoringNullabilities());
+        }
+      }
+      for (; sCount < sNamedParameters.length; sCount++) {
+        NamedType sNamedParameter = sNamedParameters[sCount];
+        if (sNamedParameter.isRequired) {
+          /// From the NNBD spec: For each j such that r0j is required, then
+          /// there exists an i in n+1...q such that xj = yi, and r1i is
+          /// required
+          result = result.and(const IsSubtypeOf.onlyIfIgnoringNullabilities());
+        }
       }
     }
     return result.and(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
@@ -899,7 +928,7 @@
         return const IsSubtypeOf.always();
       }
       if (t.nullability == Nullability.nonNullable) {
-        return const IsSubtypeOf.never();
+        return const IsSubtypeOf.onlyIfIgnoringNullabilities();
       }
       throw new StateError(
           "Unexpected nullability '$t.nullability' of type Never");
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index e45c42d..f015232 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -23,7 +23,7 @@
       Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
   const char* msg = instance.ToCString();
   OS::PrintErr("Fatal error in dart:async: %s\n", msg);
-  FATAL(msg);
+  FATAL("%s", msg);
   return Object::null();
 }
 
diff --git a/runtime/platform/assert.h b/runtime/platform/assert.h
index 6b5d634..c31c1cc 100644
--- a/runtime/platform/assert.h
+++ b/runtime/platform/assert.h
@@ -208,7 +208,15 @@
 
 }  // namespace dart
 
-#define FATAL(error) dart::Assert(__FILE__, __LINE__).Fail("%s", error)
+#if defined(_MSC_VER)
+#define FATAL(format, ...)                                                     \
+  dart::Assert(__FILE__, __LINE__).Fail(format, __VA_ARGS__);
+#else
+#define FATAL(format, ...)                                                     \
+  dart::Assert(__FILE__, __LINE__).Fail(format, ##__VA_ARGS__);
+#endif
+
+// Leaving old non-varargs versions to avoid having to rewrite all uses.
 
 #define FATAL1(format, p1) dart::Assert(__FILE__, __LINE__).Fail(format, (p1))
 
diff --git a/runtime/vm/compiler/offsets_extractor.cc b/runtime/vm/compiler/offsets_extractor.cc
index a75c847..c89ff54 100644
--- a/runtime/vm/compiler/offsets_extractor.cc
+++ b/runtime/vm/compiler/offsets_extractor.cc
@@ -38,6 +38,16 @@
 class OffsetsExtractor : public AllStatic {
  public:
   static void DumpOffsets() {
+// Currently we have two different axes for offset generation:
+//
+//  * Target architecture
+//  * DART_PRECOMPILED_RUNTIME (i.e, AOT vs. JIT)
+//
+// TODO(dartbug.com/43646): Add DART_PRECOMPILER as another axis.
+
+// This doesn't use any special constants, just method calls, so no output.
+#define PRINT_PAYLOAD_SIZEOF(Class, Name, HeaderSize)
+
 #if defined(DART_PRECOMPILED_RUNTIME)
 
 #define PRINT_FIELD_OFFSET(Class, Name)                                        \
@@ -119,18 +129,19 @@
             << Class::Name << ";\n";
 
     JIT_OFFSETS_LIST(PRINT_FIELD_OFFSET, PRINT_ARRAY_LAYOUT, PRINT_SIZEOF,
-                     PRINT_RANGE, PRINT_CONSTANT)
+                     PRINT_PAYLOAD_SIZEOF, PRINT_RANGE, PRINT_CONSTANT)
 
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
     COMMON_OFFSETS_LIST(PRINT_FIELD_OFFSET, PRINT_ARRAY_LAYOUT, PRINT_SIZEOF,
-                        PRINT_RANGE, PRINT_CONSTANT)
+                        PRINT_PAYLOAD_SIZEOF, PRINT_RANGE, PRINT_CONSTANT)
 
 #undef PRINT_FIELD_OFFSET
 #undef PRINT_ARRAY_LAYOUT
 #undef PRINT_SIZEOF
 #undef PRINT_RANGE
 #undef PRINT_CONSTANT
+#undef PRINT_PAYLOAD_SIZEOF
   }
 };
 
diff --git a/runtime/vm/compiler/relocation.cc b/runtime/vm/compiler/relocation.cc
index d84a679..a14f615 100644
--- a/runtime/vm/compiler/relocation.cc
+++ b/runtime/vm/compiler/relocation.cc
@@ -22,7 +22,7 @@
 
 const intptr_t kTrampolineSize =
     Utils::RoundUp(PcRelativeTrampolineJumpPattern::kLengthInBytes,
-                   ImageWriter::kBareInstructionsAlignment);
+                   compiler::target::Instructions::kBarePayloadAlignment);
 
 CodeRelocator::CodeRelocator(Thread* thread,
                              GrowableArray<CodePtr>* code_objects,
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index c313f53..06bf60c 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -512,8 +512,21 @@
   return TranslateOffsetInWords(dart::Context::variable_offset(n));
 }
 
+// Currently we have two different axes for offset generation:
+//
+//  * Target architecture
+//  * DART_PRECOMPILED_RUNTIME (i.e, AOT vs. JIT)
+//
+// TODO(dartbug.com/43646): Add DART_PRECOMPILER as another axis.
+
 #define DEFINE_CONSTANT(Class, Name) const word Class::Name = Class##_##Name;
 
+#define DEFINE_PAYLOAD_SIZEOF(clazz, name, header)                             \
+  word clazz::name() { return 0; }                                             \
+  word clazz::name(word payload_size) {                                        \
+    return RoundedAllocationSize(clazz::header() + payload_size);              \
+  }
+
 #if defined(TARGET_ARCH_IA32)
 
 #define DEFINE_FIELD(clazz, name)                                              \
@@ -536,12 +549,14 @@
 JIT_OFFSETS_LIST(DEFINE_FIELD,
                  DEFINE_ARRAY,
                  DEFINE_SIZEOF,
+                 DEFINE_PAYLOAD_SIZEOF,
                  DEFINE_RANGE,
                  DEFINE_CONSTANT)
 
 COMMON_OFFSETS_LIST(DEFINE_FIELD,
                     DEFINE_ARRAY,
                     DEFINE_SIZEOF,
+                    DEFINE_PAYLOAD_SIZEOF,
                     DEFINE_RANGE,
                     DEFINE_CONSTANT)
 
@@ -586,6 +601,7 @@
 JIT_OFFSETS_LIST(DEFINE_JIT_FIELD,
                  DEFINE_JIT_ARRAY,
                  DEFINE_JIT_SIZEOF,
+                 DEFINE_PAYLOAD_SIZEOF,
                  DEFINE_JIT_RANGE,
                  DEFINE_CONSTANT)
 
@@ -628,6 +644,7 @@
 COMMON_OFFSETS_LIST(DEFINE_FIELD,
                     DEFINE_ARRAY,
                     DEFINE_SIZEOF,
+                    DEFINE_PAYLOAD_SIZEOF,
                     DEFINE_RANGE,
                     DEFINE_CONSTANT)
 
@@ -637,19 +654,44 @@
 #undef DEFINE_ARRAY
 #undef DEFINE_SIZEOF
 #undef DEFINE_RANGE
+#undef DEFINE_PAYLOAD_SIZEOF
 #undef DEFINE_CONSTANT
 
 const word StoreBufferBlock::kSize = dart::StoreBufferBlock::kSize;
 
 const word MarkingStackBlock::kSize = dart::MarkingStackBlock::kSize;
 
+// For InstructionsSections and Instructions, we define these by hand, because
+// they depend on flags or #defines.
+
 word InstructionsSection::HeaderSize() {
-  return Utils::RoundUp(InstructionsSection::UnalignedHeaderSize(),
-                        target::kWordSize);
+  // We only create InstructionsSections in precompiled mode.
+  ASSERT(FLAG_precompiled_mode);
+  return Utils::RoundUp(UnalignedHeaderSize(),
+                        Instructions::kBarePayloadAlignment);
+}
+
+// Used for Instructions methods, since we don't serialize Instructions objects
+// in bare instructions mode, just payloads.
+DART_FORCE_INLINE static bool BareInstructionsPayloads() {
+  return FLAG_precompiled_mode && FLAG_use_bare_instructions;
 }
 
 word Instructions::HeaderSize() {
-  return Utils::RoundUp(Instructions::UnalignedHeaderSize(), target::kWordSize);
+  return BareInstructionsPayloads()
+             ? 0
+             : Utils::RoundUp(UnalignedHeaderSize(), kNonBarePayloadAlignment);
+}
+
+word Instructions::InstanceSize() {
+  return 0;
+}
+
+word Instructions::InstanceSize(word payload_size) {
+  const intptr_t alignment = BareInstructionsPayloads()
+                                 ? kBarePayloadAlignment
+                                 : ObjectAlignment::kObjectAlignment;
+  return Utils::RoundUp(Instructions::HeaderSize() + payload_size, alignment);
 }
 
 word Thread::stack_overflow_shared_stub_entry_point_offset(bool fpu_regs) {
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index da31762..e4468ab 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -805,13 +805,17 @@
 
 class PcDescriptors : public AllStatic {
  public:
+  static word HeaderSize();
   static word InstanceSize();
+  static word InstanceSize(word payload_size);
   static word NextFieldOffset();
 };
 
 class CodeSourceMap : public AllStatic {
  public:
+  static word HeaderSize();
   static word InstanceSize();
+  static word InstanceSize(word payload_size);
   static word NextFieldOffset();
 };
 
@@ -819,6 +823,7 @@
  public:
   static word HeaderSize();
   static word InstanceSize();
+  static word InstanceSize(word payload_size);
   static word NextFieldOffset();
 };
 
@@ -1150,9 +1155,10 @@
 
 class InstructionsSection : public AllStatic {
  public:
-  static word HeaderSize();
   static word UnalignedHeaderSize();
+  static word HeaderSize();
   static word InstanceSize();
+  static word InstanceSize(word payload_size);
   static word NextFieldOffset();
 };
 
@@ -1162,9 +1168,12 @@
   static const word kPolymorphicEntryOffsetJIT;
   static const word kMonomorphicEntryOffsetAOT;
   static const word kPolymorphicEntryOffsetAOT;
-  static word HeaderSize();
+  static const word kBarePayloadAlignment;
+  static const word kNonBarePayloadAlignment;
   static word UnalignedHeaderSize();
+  static word HeaderSize();
   static word InstanceSize();
+  static word InstanceSize(word payload_size);
   static word NextFieldOffset();
 };
 
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 6ad8752..349f146 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -36,6 +36,10 @@
     Instructions_kMonomorphicEntryOffsetAOT = 0;
 static constexpr dart::compiler::target::word
     Instructions_kPolymorphicEntryOffsetAOT = 12;
+static constexpr dart::compiler::target::word
+    Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    Instructions_kNonBarePayloadAlignment = 4;
 static constexpr dart::compiler::target::word OldPage_kBytesPerCardLog2 = 9;
 static constexpr dart::compiler::target::word
     NativeEntry_kNumCallWrapperArguments = 2;
@@ -426,9 +430,7 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
 static constexpr dart::compiler::target::word Code_InstanceSize = 96;
-static constexpr dart::compiler::target::word CodeSourceMap_InstanceSize = 8;
-static constexpr dart::compiler::target::word CompressedStackMaps_InstanceSize =
-    8;
+static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
     8;
 static constexpr dart::compiler::target::word Context_InstanceSize = 12;
@@ -456,11 +458,8 @@
 static constexpr dart::compiler::target::word ICData_InstanceSize = 32;
 static constexpr dart::compiler::target::word ImageHeader_UnroundedSize = 20;
 static constexpr dart::compiler::target::word Instance_InstanceSize = 4;
-static constexpr dart::compiler::target::word Instructions_InstanceSize = 8;
 static constexpr dart::compiler::target::word Instructions_UnalignedHeaderSize =
     8;
-static constexpr dart::compiler::target::word InstructionsSection_InstanceSize =
-    8;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 8;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
@@ -488,7 +487,7 @@
 static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
     24;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
-static constexpr dart::compiler::target::word PcDescriptors_InstanceSize = 8;
+static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
 static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
@@ -543,6 +542,10 @@
     Instructions_kMonomorphicEntryOffsetAOT = 8;
 static constexpr dart::compiler::target::word
     Instructions_kPolymorphicEntryOffsetAOT = 22;
+static constexpr dart::compiler::target::word
+    Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    Instructions_kNonBarePayloadAlignment = 8;
 static constexpr dart::compiler::target::word OldPage_kBytesPerCardLog2 = 10;
 static constexpr dart::compiler::target::word
     NativeEntry_kNumCallWrapperArguments = 2;
@@ -939,9 +942,7 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word Code_InstanceSize = 176;
-static constexpr dart::compiler::target::word CodeSourceMap_InstanceSize = 16;
-static constexpr dart::compiler::target::word CompressedStackMaps_InstanceSize =
-    12;
+static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
     12;
 static constexpr dart::compiler::target::word Context_InstanceSize = 24;
@@ -969,11 +970,8 @@
 static constexpr dart::compiler::target::word ICData_InstanceSize = 56;
 static constexpr dart::compiler::target::word ImageHeader_UnroundedSize = 40;
 static constexpr dart::compiler::target::word Instance_InstanceSize = 8;
-static constexpr dart::compiler::target::word Instructions_InstanceSize = 12;
 static constexpr dart::compiler::target::word Instructions_UnalignedHeaderSize =
     12;
-static constexpr dart::compiler::target::word InstructionsSection_InstanceSize =
-    16;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
@@ -1001,7 +999,7 @@
 static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
     48;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
-static constexpr dart::compiler::target::word PcDescriptors_InstanceSize = 16;
+static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
 static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
@@ -1056,6 +1054,10 @@
     Instructions_kMonomorphicEntryOffsetAOT = 0;
 static constexpr dart::compiler::target::word
     Instructions_kPolymorphicEntryOffsetAOT = 0;
+static constexpr dart::compiler::target::word
+    Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    Instructions_kNonBarePayloadAlignment = 4;
 static constexpr dart::compiler::target::word OldPage_kBytesPerCardLog2 = 9;
 static constexpr dart::compiler::target::word
     NativeEntry_kNumCallWrapperArguments = 2;
@@ -1443,9 +1445,7 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
 static constexpr dart::compiler::target::word Code_InstanceSize = 96;
-static constexpr dart::compiler::target::word CodeSourceMap_InstanceSize = 8;
-static constexpr dart::compiler::target::word CompressedStackMaps_InstanceSize =
-    8;
+static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
     8;
 static constexpr dart::compiler::target::word Context_InstanceSize = 12;
@@ -1473,11 +1473,8 @@
 static constexpr dart::compiler::target::word ICData_InstanceSize = 32;
 static constexpr dart::compiler::target::word ImageHeader_UnroundedSize = 20;
 static constexpr dart::compiler::target::word Instance_InstanceSize = 4;
-static constexpr dart::compiler::target::word Instructions_InstanceSize = 8;
 static constexpr dart::compiler::target::word Instructions_UnalignedHeaderSize =
     8;
-static constexpr dart::compiler::target::word InstructionsSection_InstanceSize =
-    8;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 8;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
@@ -1505,7 +1502,7 @@
 static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
     24;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
-static constexpr dart::compiler::target::word PcDescriptors_InstanceSize = 8;
+static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
 static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
@@ -1560,6 +1557,10 @@
     Instructions_kMonomorphicEntryOffsetAOT = 8;
 static constexpr dart::compiler::target::word
     Instructions_kPolymorphicEntryOffsetAOT = 20;
+static constexpr dart::compiler::target::word
+    Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    Instructions_kNonBarePayloadAlignment = 8;
 static constexpr dart::compiler::target::word OldPage_kBytesPerCardLog2 = 10;
 static constexpr dart::compiler::target::word
     NativeEntry_kNumCallWrapperArguments = 2;
@@ -1957,9 +1958,7 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word Code_InstanceSize = 176;
-static constexpr dart::compiler::target::word CodeSourceMap_InstanceSize = 16;
-static constexpr dart::compiler::target::word CompressedStackMaps_InstanceSize =
-    12;
+static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
     12;
 static constexpr dart::compiler::target::word Context_InstanceSize = 24;
@@ -1987,11 +1986,8 @@
 static constexpr dart::compiler::target::word ICData_InstanceSize = 56;
 static constexpr dart::compiler::target::word ImageHeader_UnroundedSize = 40;
 static constexpr dart::compiler::target::word Instance_InstanceSize = 8;
-static constexpr dart::compiler::target::word Instructions_InstanceSize = 12;
 static constexpr dart::compiler::target::word Instructions_UnalignedHeaderSize =
     12;
-static constexpr dart::compiler::target::word InstructionsSection_InstanceSize =
-    16;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
@@ -2019,7 +2015,7 @@
 static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
     48;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
-static constexpr dart::compiler::target::word PcDescriptors_InstanceSize = 16;
+static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
 static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
@@ -2076,6 +2072,10 @@
     Instructions_kMonomorphicEntryOffsetAOT = 0;
 static constexpr dart::compiler::target::word
     Instructions_kPolymorphicEntryOffsetAOT = 12;
+static constexpr dart::compiler::target::word
+    Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    Instructions_kNonBarePayloadAlignment = 4;
 static constexpr dart::compiler::target::word OldPage_kBytesPerCardLog2 = 9;
 static constexpr dart::compiler::target::word
     NativeEntry_kNumCallWrapperArguments = 2;
@@ -2460,9 +2460,7 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
 static constexpr dart::compiler::target::word Code_InstanceSize = 76;
-static constexpr dart::compiler::target::word CodeSourceMap_InstanceSize = 8;
-static constexpr dart::compiler::target::word CompressedStackMaps_InstanceSize =
-    8;
+static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
     8;
 static constexpr dart::compiler::target::word Context_InstanceSize = 12;
@@ -2490,11 +2488,8 @@
 static constexpr dart::compiler::target::word ICData_InstanceSize = 32;
 static constexpr dart::compiler::target::word ImageHeader_UnroundedSize = 20;
 static constexpr dart::compiler::target::word Instance_InstanceSize = 4;
-static constexpr dart::compiler::target::word Instructions_InstanceSize = 8;
 static constexpr dart::compiler::target::word Instructions_UnalignedHeaderSize =
     8;
-static constexpr dart::compiler::target::word InstructionsSection_InstanceSize =
-    8;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 8;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
@@ -2522,7 +2517,7 @@
 static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
     24;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
-static constexpr dart::compiler::target::word PcDescriptors_InstanceSize = 8;
+static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
 static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
@@ -2577,6 +2572,10 @@
     Instructions_kMonomorphicEntryOffsetAOT = 8;
 static constexpr dart::compiler::target::word
     Instructions_kPolymorphicEntryOffsetAOT = 22;
+static constexpr dart::compiler::target::word
+    Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    Instructions_kNonBarePayloadAlignment = 8;
 static constexpr dart::compiler::target::word OldPage_kBytesPerCardLog2 = 10;
 static constexpr dart::compiler::target::word
     NativeEntry_kNumCallWrapperArguments = 2;
@@ -2967,9 +2966,7 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word Code_InstanceSize = 144;
-static constexpr dart::compiler::target::word CodeSourceMap_InstanceSize = 16;
-static constexpr dart::compiler::target::word CompressedStackMaps_InstanceSize =
-    12;
+static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
     12;
 static constexpr dart::compiler::target::word Context_InstanceSize = 24;
@@ -2997,11 +2994,8 @@
 static constexpr dart::compiler::target::word ICData_InstanceSize = 56;
 static constexpr dart::compiler::target::word ImageHeader_UnroundedSize = 40;
 static constexpr dart::compiler::target::word Instance_InstanceSize = 8;
-static constexpr dart::compiler::target::word Instructions_InstanceSize = 12;
 static constexpr dart::compiler::target::word Instructions_UnalignedHeaderSize =
     12;
-static constexpr dart::compiler::target::word InstructionsSection_InstanceSize =
-    16;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
@@ -3029,7 +3023,7 @@
 static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
     48;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
-static constexpr dart::compiler::target::word PcDescriptors_InstanceSize = 16;
+static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
 static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
@@ -3084,6 +3078,10 @@
     Instructions_kMonomorphicEntryOffsetAOT = 0;
 static constexpr dart::compiler::target::word
     Instructions_kPolymorphicEntryOffsetAOT = 0;
+static constexpr dart::compiler::target::word
+    Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    Instructions_kNonBarePayloadAlignment = 4;
 static constexpr dart::compiler::target::word OldPage_kBytesPerCardLog2 = 9;
 static constexpr dart::compiler::target::word
     NativeEntry_kNumCallWrapperArguments = 2;
@@ -3465,9 +3463,7 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
 static constexpr dart::compiler::target::word Code_InstanceSize = 76;
-static constexpr dart::compiler::target::word CodeSourceMap_InstanceSize = 8;
-static constexpr dart::compiler::target::word CompressedStackMaps_InstanceSize =
-    8;
+static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
     8;
 static constexpr dart::compiler::target::word Context_InstanceSize = 12;
@@ -3495,11 +3491,8 @@
 static constexpr dart::compiler::target::word ICData_InstanceSize = 32;
 static constexpr dart::compiler::target::word ImageHeader_UnroundedSize = 20;
 static constexpr dart::compiler::target::word Instance_InstanceSize = 4;
-static constexpr dart::compiler::target::word Instructions_InstanceSize = 8;
 static constexpr dart::compiler::target::word Instructions_UnalignedHeaderSize =
     8;
-static constexpr dart::compiler::target::word InstructionsSection_InstanceSize =
-    8;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 8;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
@@ -3527,7 +3520,7 @@
 static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
     24;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
-static constexpr dart::compiler::target::word PcDescriptors_InstanceSize = 8;
+static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
 static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
@@ -3582,6 +3575,10 @@
     Instructions_kMonomorphicEntryOffsetAOT = 8;
 static constexpr dart::compiler::target::word
     Instructions_kPolymorphicEntryOffsetAOT = 20;
+static constexpr dart::compiler::target::word
+    Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    Instructions_kNonBarePayloadAlignment = 8;
 static constexpr dart::compiler::target::word OldPage_kBytesPerCardLog2 = 10;
 static constexpr dart::compiler::target::word
     NativeEntry_kNumCallWrapperArguments = 2;
@@ -3973,9 +3970,7 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word Code_InstanceSize = 144;
-static constexpr dart::compiler::target::word CodeSourceMap_InstanceSize = 16;
-static constexpr dart::compiler::target::word CompressedStackMaps_InstanceSize =
-    12;
+static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
     12;
 static constexpr dart::compiler::target::word Context_InstanceSize = 24;
@@ -4003,11 +3998,8 @@
 static constexpr dart::compiler::target::word ICData_InstanceSize = 56;
 static constexpr dart::compiler::target::word ImageHeader_UnroundedSize = 40;
 static constexpr dart::compiler::target::word Instance_InstanceSize = 8;
-static constexpr dart::compiler::target::word Instructions_InstanceSize = 12;
 static constexpr dart::compiler::target::word Instructions_UnalignedHeaderSize =
     12;
-static constexpr dart::compiler::target::word InstructionsSection_InstanceSize =
-    16;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
@@ -4035,7 +4027,7 @@
 static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
     48;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
-static constexpr dart::compiler::target::word PcDescriptors_InstanceSize = 16;
+static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
 static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
@@ -4091,6 +4083,10 @@
     AOT_Instructions_kMonomorphicEntryOffsetAOT = 0;
 static constexpr dart::compiler::target::word
     AOT_Instructions_kPolymorphicEntryOffsetAOT = 12;
+static constexpr dart::compiler::target::word
+    AOT_Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    AOT_Instructions_kNonBarePayloadAlignment = 4;
 static constexpr dart::compiler::target::word AOT_OldPage_kBytesPerCardLog2 = 9;
 static constexpr dart::compiler::target::word
     AOT_NativeEntry_kNumCallWrapperArguments = 2;
@@ -4519,10 +4515,7 @@
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 28;
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 88;
-static constexpr dart::compiler::target::word AOT_CodeSourceMap_InstanceSize =
-    8;
-static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_InstanceSize = 8;
+static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word
     AOT_CompressedStackMaps_HeaderSize = 8;
 static constexpr dart::compiler::target::word AOT_Context_InstanceSize = 12;
@@ -4553,12 +4546,9 @@
 static constexpr dart::compiler::target::word AOT_ImageHeader_UnroundedSize =
     20;
 static constexpr dart::compiler::target::word AOT_Instance_InstanceSize = 4;
-static constexpr dart::compiler::target::word AOT_Instructions_InstanceSize = 8;
 static constexpr dart::compiler::target::word
     AOT_Instructions_UnalignedHeaderSize = 8;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsSection_InstanceSize = 8;
-static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 8;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 4;
@@ -4591,8 +4581,7 @@
 static constexpr dart::compiler::target::word
     AOT_ParameterTypeCheck_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 20;
-static constexpr dart::compiler::target::word AOT_PcDescriptors_InstanceSize =
-    8;
+static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
@@ -4653,6 +4642,10 @@
     AOT_Instructions_kMonomorphicEntryOffsetAOT = 8;
 static constexpr dart::compiler::target::word
     AOT_Instructions_kPolymorphicEntryOffsetAOT = 22;
+static constexpr dart::compiler::target::word
+    AOT_Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    AOT_Instructions_kNonBarePayloadAlignment = 8;
 static constexpr dart::compiler::target::word AOT_OldPage_kBytesPerCardLog2 =
     10;
 static constexpr dart::compiler::target::word
@@ -5084,10 +5077,7 @@
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 152;
-static constexpr dart::compiler::target::word AOT_CodeSourceMap_InstanceSize =
-    16;
-static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_InstanceSize = 12;
+static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
     AOT_CompressedStackMaps_HeaderSize = 12;
 static constexpr dart::compiler::target::word AOT_Context_InstanceSize = 24;
@@ -5118,13 +5108,9 @@
 static constexpr dart::compiler::target::word AOT_ImageHeader_UnroundedSize =
     40;
 static constexpr dart::compiler::target::word AOT_Instance_InstanceSize = 8;
-static constexpr dart::compiler::target::word AOT_Instructions_InstanceSize =
-    12;
 static constexpr dart::compiler::target::word
     AOT_Instructions_UnalignedHeaderSize = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsSection_InstanceSize = 16;
-static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
@@ -5157,8 +5143,7 @@
 static constexpr dart::compiler::target::word
     AOT_ParameterTypeCheck_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
-static constexpr dart::compiler::target::word AOT_PcDescriptors_InstanceSize =
-    16;
+static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
@@ -5222,6 +5207,10 @@
     AOT_Instructions_kMonomorphicEntryOffsetAOT = 8;
 static constexpr dart::compiler::target::word
     AOT_Instructions_kPolymorphicEntryOffsetAOT = 20;
+static constexpr dart::compiler::target::word
+    AOT_Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    AOT_Instructions_kNonBarePayloadAlignment = 8;
 static constexpr dart::compiler::target::word AOT_OldPage_kBytesPerCardLog2 =
     10;
 static constexpr dart::compiler::target::word
@@ -5654,10 +5643,7 @@
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 152;
-static constexpr dart::compiler::target::word AOT_CodeSourceMap_InstanceSize =
-    16;
-static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_InstanceSize = 12;
+static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
     AOT_CompressedStackMaps_HeaderSize = 12;
 static constexpr dart::compiler::target::word AOT_Context_InstanceSize = 24;
@@ -5688,13 +5674,9 @@
 static constexpr dart::compiler::target::word AOT_ImageHeader_UnroundedSize =
     40;
 static constexpr dart::compiler::target::word AOT_Instance_InstanceSize = 8;
-static constexpr dart::compiler::target::word AOT_Instructions_InstanceSize =
-    12;
 static constexpr dart::compiler::target::word
     AOT_Instructions_UnalignedHeaderSize = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsSection_InstanceSize = 16;
-static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
@@ -5727,8 +5709,7 @@
 static constexpr dart::compiler::target::word
     AOT_ParameterTypeCheck_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
-static constexpr dart::compiler::target::word AOT_PcDescriptors_InstanceSize =
-    16;
+static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
@@ -5791,6 +5772,10 @@
     AOT_Instructions_kMonomorphicEntryOffsetAOT = 0;
 static constexpr dart::compiler::target::word
     AOT_Instructions_kPolymorphicEntryOffsetAOT = 12;
+static constexpr dart::compiler::target::word
+    AOT_Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    AOT_Instructions_kNonBarePayloadAlignment = 4;
 static constexpr dart::compiler::target::word AOT_OldPage_kBytesPerCardLog2 = 9;
 static constexpr dart::compiler::target::word
     AOT_NativeEntry_kNumCallWrapperArguments = 2;
@@ -6212,10 +6197,7 @@
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 28;
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 64;
-static constexpr dart::compiler::target::word AOT_CodeSourceMap_InstanceSize =
-    8;
-static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_InstanceSize = 8;
+static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word
     AOT_CompressedStackMaps_HeaderSize = 8;
 static constexpr dart::compiler::target::word AOT_Context_InstanceSize = 12;
@@ -6246,12 +6228,9 @@
 static constexpr dart::compiler::target::word AOT_ImageHeader_UnroundedSize =
     20;
 static constexpr dart::compiler::target::word AOT_Instance_InstanceSize = 4;
-static constexpr dart::compiler::target::word AOT_Instructions_InstanceSize = 8;
 static constexpr dart::compiler::target::word
     AOT_Instructions_UnalignedHeaderSize = 8;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsSection_InstanceSize = 8;
-static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 8;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 4;
@@ -6284,8 +6263,7 @@
 static constexpr dart::compiler::target::word
     AOT_ParameterTypeCheck_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 20;
-static constexpr dart::compiler::target::word AOT_PcDescriptors_InstanceSize =
-    8;
+static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
@@ -6346,6 +6324,10 @@
     AOT_Instructions_kMonomorphicEntryOffsetAOT = 8;
 static constexpr dart::compiler::target::word
     AOT_Instructions_kPolymorphicEntryOffsetAOT = 22;
+static constexpr dart::compiler::target::word
+    AOT_Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    AOT_Instructions_kNonBarePayloadAlignment = 8;
 static constexpr dart::compiler::target::word AOT_OldPage_kBytesPerCardLog2 =
     10;
 static constexpr dart::compiler::target::word
@@ -6770,10 +6752,7 @@
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 120;
-static constexpr dart::compiler::target::word AOT_CodeSourceMap_InstanceSize =
-    16;
-static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_InstanceSize = 12;
+static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
     AOT_CompressedStackMaps_HeaderSize = 12;
 static constexpr dart::compiler::target::word AOT_Context_InstanceSize = 24;
@@ -6804,13 +6783,9 @@
 static constexpr dart::compiler::target::word AOT_ImageHeader_UnroundedSize =
     40;
 static constexpr dart::compiler::target::word AOT_Instance_InstanceSize = 8;
-static constexpr dart::compiler::target::word AOT_Instructions_InstanceSize =
-    12;
 static constexpr dart::compiler::target::word
     AOT_Instructions_UnalignedHeaderSize = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsSection_InstanceSize = 16;
-static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
@@ -6843,8 +6818,7 @@
 static constexpr dart::compiler::target::word
     AOT_ParameterTypeCheck_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
-static constexpr dart::compiler::target::word AOT_PcDescriptors_InstanceSize =
-    16;
+static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
@@ -6908,6 +6882,10 @@
     AOT_Instructions_kMonomorphicEntryOffsetAOT = 8;
 static constexpr dart::compiler::target::word
     AOT_Instructions_kPolymorphicEntryOffsetAOT = 20;
+static constexpr dart::compiler::target::word
+    AOT_Instructions_kBarePayloadAlignment = 4;
+static constexpr dart::compiler::target::word
+    AOT_Instructions_kNonBarePayloadAlignment = 8;
 static constexpr dart::compiler::target::word AOT_OldPage_kBytesPerCardLog2 =
     10;
 static constexpr dart::compiler::target::word
@@ -7333,10 +7311,7 @@
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 120;
-static constexpr dart::compiler::target::word AOT_CodeSourceMap_InstanceSize =
-    16;
-static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_InstanceSize = 12;
+static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
     AOT_CompressedStackMaps_HeaderSize = 12;
 static constexpr dart::compiler::target::word AOT_Context_InstanceSize = 24;
@@ -7367,13 +7342,9 @@
 static constexpr dart::compiler::target::word AOT_ImageHeader_UnroundedSize =
     40;
 static constexpr dart::compiler::target::word AOT_Instance_InstanceSize = 8;
-static constexpr dart::compiler::target::word AOT_Instructions_InstanceSize =
-    12;
 static constexpr dart::compiler::target::word
     AOT_Instructions_UnalignedHeaderSize = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsSection_InstanceSize = 16;
-static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
@@ -7406,8 +7377,7 @@
 static constexpr dart::compiler::target::word
     AOT_ParameterTypeCheck_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
-static constexpr dart::compiler::target::word AOT_PcDescriptors_InstanceSize =
-    16;
+static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 01874c4..fca139c 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -21,7 +21,11 @@
 // FIELD(Class, Name) Offset of a field within a class.
 // ARRAY(Class, Name) Offset of the first element and the size of the elements
 //     in an array of this class.
-// SIZEOF(Class, Name, What) Size of an object.
+// SIZEOF(Class, Name, What) Class::Name() is defined as sizeof(What).
+// PAYLOAD_SIZEOF(Class, Name, HeaderSize) Instance size for a payload object.
+//     Defines Class::Name(word payload_size) and uses Class::HeaderSize(),
+//     which should give the size of the header before the payload. Also
+//     defines Class::Name() (with no payload size argument) to be 0.
 // RANGE(Class, Name, Type, First, Last, Filter) An array of offsets generated
 //     by passing a value of the given Type in the range from First to Last to
 //     Class::Name() if Filter returns true for that value.
@@ -31,7 +35,11 @@
 // JIT_OFFSETS_LIST is for declarations that are only valid in JIT mode.
 // A declaration that is not valid in product mode can be wrapped with
 // NOT_IN_PRODUCT().
-#define COMMON_OFFSETS_LIST(FIELD, ARRAY, SIZEOF, RANGE, CONSTANT)             \
+//
+// TODO(dartbug.com/43646): Add DART_PRECOMPILER as another axis.
+
+#define COMMON_OFFSETS_LIST(FIELD, ARRAY, SIZEOF, PAYLOAD_SIZEOF, RANGE,       \
+                            CONSTANT)                                          \
   ARRAY(ObjectPool, element_offset)                                            \
   CONSTANT(Array, kMaxElements)                                                \
   CONSTANT(Array, kMaxNewSpaceElements)                                        \
@@ -39,6 +47,8 @@
   CONSTANT(Instructions, kPolymorphicEntryOffsetJIT)                           \
   CONSTANT(Instructions, kMonomorphicEntryOffsetAOT)                           \
   CONSTANT(Instructions, kPolymorphicEntryOffsetAOT)                           \
+  CONSTANT(Instructions, kBarePayloadAlignment)                                \
+  CONSTANT(Instructions, kNonBarePayloadAlignment)                             \
   CONSTANT(OldPage, kBytesPerCardLog2)                                         \
   CONSTANT(NativeEntry, kNumCallWrapperArguments)                              \
   CONSTANT(String, kMaxElements)                                               \
@@ -286,8 +296,7 @@
   SIZEOF(Closure, InstanceSize, ClosureLayout)                                 \
   SIZEOF(ClosureData, InstanceSize, ClosureDataLayout)                         \
   SIZEOF(Code, InstanceSize, CodeLayout)                                       \
-  SIZEOF(CodeSourceMap, InstanceSize, CodeSourceMapLayout)                     \
-  SIZEOF(CompressedStackMaps, InstanceSize, CompressedStackMapsLayout)         \
+  SIZEOF(CodeSourceMap, HeaderSize, CodeSourceMapLayout)                       \
   SIZEOF(CompressedStackMaps, HeaderSize, CompressedStackMapsLayout)           \
   SIZEOF(Context, InstanceSize, ContextLayout)                                 \
   SIZEOF(Context, header_size, ContextLayout)                                  \
@@ -308,9 +317,7 @@
   SIZEOF(ICData, InstanceSize, ICDataLayout)                                   \
   SIZEOF(ImageHeader, UnroundedSize, ImageHeaderLayout)                        \
   SIZEOF(Instance, InstanceSize, InstanceLayout)                               \
-  SIZEOF(Instructions, InstanceSize, InstructionsLayout)                       \
   SIZEOF(Instructions, UnalignedHeaderSize, InstructionsLayout)                \
-  SIZEOF(InstructionsSection, InstanceSize, InstructionsSectionLayout)         \
   SIZEOF(InstructionsSection, UnalignedHeaderSize, InstructionsSectionLayout)  \
   SIZEOF(Int32x4, InstanceSize, Int32x4Layout)                                 \
   SIZEOF(Integer, InstanceSize, IntegerLayout)                                 \
@@ -332,7 +339,7 @@
   SIZEOF(OneByteString, InstanceSize, OneByteStringLayout)                     \
   SIZEOF(ParameterTypeCheck, InstanceSize, ParameterTypeCheckLayout)           \
   SIZEOF(PatchClass, InstanceSize, PatchClassLayout)                           \
-  SIZEOF(PcDescriptors, InstanceSize, PcDescriptorsLayout)                     \
+  SIZEOF(PcDescriptors, HeaderSize, PcDescriptorsLayout)                       \
   SIZEOF(Pointer, InstanceSize, PointerLayout)                                 \
   SIZEOF(ReceivePort, InstanceSize, ReceivePortLayout)                         \
   SIZEOF(RedirectionData, InstanceSize, RedirectionDataLayout)                 \
@@ -361,9 +368,14 @@
   SIZEOF(UserTag, InstanceSize, UserTagLayout)                                 \
   SIZEOF(WeakProperty, InstanceSize, WeakPropertyLayout)                       \
   SIZEOF(WeakSerializationReference, InstanceSize,                             \
-         WeakSerializationReferenceLayout)
+         WeakSerializationReferenceLayout)                                     \
+  PAYLOAD_SIZEOF(CodeSourceMap, InstanceSize, HeaderSize)                      \
+  PAYLOAD_SIZEOF(CompressedStackMaps, InstanceSize, HeaderSize)                \
+  PAYLOAD_SIZEOF(InstructionsSection, InstanceSize, HeaderSize)                \
+  PAYLOAD_SIZEOF(PcDescriptors, InstanceSize, HeaderSize)
 
-#define JIT_OFFSETS_LIST(FIELD, ARRAY, SIZEOF, RANGE, CONSTANT)                \
+#define JIT_OFFSETS_LIST(FIELD, ARRAY, SIZEOF, PAYLOAD_SIZEOF, RANGE,          \
+                         CONSTANT)                                             \
   FIELD(Function, usage_counter_offset)                                        \
   FIELD(ICData, receivers_static_type_offset)
 
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 8805154..f271e57 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -107,6 +107,9 @@
     ok = false;                                                                \
   }
 
+// No consistency checks needed for this construct.
+#define CHECK_PAYLOAD_SIZEOF(Class, Name, HeaderSize)
+
 #if defined(DART_PRECOMPILED_RUNTIME)
 #define CHECK_FIELD(Class, Name)                                               \
   CHECK_OFFSET(Class::Name(), AOT_##Class##_##Name);
@@ -144,11 +147,12 @@
 #define CHECK_CONSTANT(Class, Name) CHECK_OFFSET(Class::Name, Class##_##Name);
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
-  COMMON_OFFSETS_LIST(CHECK_FIELD, CHECK_ARRAY, CHECK_SIZEOF, CHECK_RANGE,
-                      CHECK_CONSTANT)
+  COMMON_OFFSETS_LIST(CHECK_FIELD, CHECK_ARRAY, CHECK_SIZEOF,
+                      CHECK_PAYLOAD_SIZEOF, CHECK_RANGE, CHECK_CONSTANT)
 
-  NOT_IN_PRECOMPILED_RUNTIME(JIT_OFFSETS_LIST(
-      CHECK_FIELD, CHECK_ARRAY, CHECK_SIZEOF, CHECK_RANGE, CHECK_CONSTANT))
+  NOT_IN_PRECOMPILED_RUNTIME(
+      JIT_OFFSETS_LIST(CHECK_FIELD, CHECK_ARRAY, CHECK_SIZEOF,
+                       CHECK_PAYLOAD_SIZEOF, CHECK_RANGE, CHECK_CONSTANT))
 
   if (!ok) {
     FATAL(
@@ -162,6 +166,7 @@
 #undef CHECK_RANGE
 #undef CHECK_CONSTANT
 #undef CHECK_OFFSET
+#undef CHECK_PAYLOAD_SIZEOF
 #endif  // !defined(IS_SIMARM_X64)
 }
 
diff --git a/runtime/vm/datastream.cc b/runtime/vm/datastream.cc
index a87cf46..6d398fe 100644
--- a/runtime/vm/datastream.cc
+++ b/runtime/vm/datastream.cc
@@ -3,10 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/datastream.h"
+
+#include "vm/compiler/runtime_api.h"
 #include "vm/zone.h"
 
 namespace dart {
 
+void BaseWriteStream::WriteTargetWord(word value) {
+  ASSERT(compiler::target::kBitsPerWord == kBitsPerWord ||
+         Utils::IsAbsoluteUint(compiler::target::kBitsPerWord, value));
+  WriteFixed(static_cast<compiler::target::word>(value));
+}
+
 MallocWriteStream::~MallocWriteStream() {
   free(buffer_);
 }
diff --git a/runtime/vm/datastream.h b/runtime/vm/datastream.h
index 03fac70..c6b3e04 100644
--- a/runtime/vm/datastream.h
+++ b/runtime/vm/datastream.h
@@ -392,14 +392,7 @@
 
   void WriteWord(uword value) { WriteFixed(value); }
 
-  void WriteTargetWord(uword value) {
-#if defined(IS_SIMARM_X64)
-    RELEASE_ASSERT(Utils::IsInt(32, static_cast<word>(value)));
-    WriteFixed(static_cast<uint32_t>(value));
-#else
-    WriteFixed(value);
-#endif
-  }
+  void WriteTargetWord(word value);
 
   void Printf(const char* format, ...) PRINTF_ATTRIBUTE(2, 3) {
     va_list args;
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index ae8efbe..ba82175 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -221,104 +221,37 @@
   return offset;
 }
 
-static intptr_t InstructionsSizeInSnapshot(InstructionsPtr raw) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
-    // Currently, we align bare instruction payloads on 4 byte boundaries.
-    //
-    // If we later decide to align on larger boundaries to put entries at the
-    // start of cache lines, make sure to account for entry points that are
-    // _not_ at the start of the payload.
-    return Utils::RoundUp(Instructions::Size(raw),
-                          ImageWriter::kBareInstructionsAlignment);
-  }
-#if defined(IS_SIMARM_X64)
-  return Utils::RoundUp(
-      compiler::target::Instructions::HeaderSize() + Instructions::Size(raw),
-      compiler::target::ObjectAlignment::kObjectAlignment);
-#else
-  return raw->ptr()->HeapSize();
-#endif
-}
-
-#if defined(IS_SIMARM_X64)
-static intptr_t CompressedStackMapsSizeInSnapshot(intptr_t payload_size) {
-  const intptr_t unrounded_size_in_bytes =
-      compiler::target::CompressedStackMaps::HeaderSize() + payload_size;
-  return Utils::RoundUp(unrounded_size_in_bytes,
-                        compiler::target::ObjectAlignment::kObjectAlignment);
-}
-
-static intptr_t StringPayloadSize(intptr_t len, bool isOneByteString) {
-  return len * (isOneByteString ? OneByteString::kBytesPerElement
-                                : TwoByteString::kBytesPerElement);
-}
-
-static intptr_t StringSizeInSnapshot(intptr_t len, bool isOneByteString) {
-  const intptr_t unrounded_size_in_bytes =
-      (String::kSizeofRawString / 2) + StringPayloadSize(len, isOneByteString);
-  return Utils::RoundUp(unrounded_size_in_bytes,
-                        compiler::target::ObjectAlignment::kObjectAlignment);
-}
-
-static intptr_t CodeSourceMapSizeInSnapshot(intptr_t len) {
-  const intptr_t unrounded_size_in_bytes =
-      2 * compiler::target::kWordSize + len;
-  return Utils::RoundUp(unrounded_size_in_bytes,
-                        compiler::target::ObjectAlignment::kObjectAlignment);
-}
-
-static intptr_t PcDescriptorsSizeInSnapshot(intptr_t len) {
-  const intptr_t unrounded_size_in_bytes =
-      2 * compiler::target::kWordSize + len;
-  return Utils::RoundUp(unrounded_size_in_bytes,
-                        compiler::target::ObjectAlignment::kObjectAlignment);
-}
-
 intptr_t ImageWriter::SizeInSnapshot(ObjectPtr raw_object) {
   const classid_t cid = raw_object->GetClassId();
 
   switch (cid) {
     case kCompressedStackMapsCid: {
-      CompressedStackMapsPtr raw_maps =
-          static_cast<CompressedStackMapsPtr>(raw_object);
-      auto const payload_size = CompressedStackMaps::PayloadSizeOf(raw_maps);
-      return CompressedStackMapsSizeInSnapshot(payload_size);
-    }
-    case kOneByteStringCid:
-    case kTwoByteStringCid: {
-      StringPtr raw_str = static_cast<StringPtr>(raw_object);
-      return StringSizeInSnapshot(Smi::Value(raw_str->ptr()->length_),
-                                  cid == kOneByteStringCid);
+      auto raw_maps = CompressedStackMaps::RawCast(raw_object);
+      return compiler::target::CompressedStackMaps::InstanceSize(
+          CompressedStackMaps::PayloadSizeOf(raw_maps));
     }
     case kCodeSourceMapCid: {
-      CodeSourceMapPtr raw_map = static_cast<CodeSourceMapPtr>(raw_object);
-      return CodeSourceMapSizeInSnapshot(raw_map->ptr()->length_);
+      auto raw_map = CodeSourceMap::RawCast(raw_object);
+      return compiler::target::CodeSourceMap::InstanceSize(
+          raw_map->ptr()->length_);
     }
     case kPcDescriptorsCid: {
-      PcDescriptorsPtr raw_desc = static_cast<PcDescriptorsPtr>(raw_object);
-      return PcDescriptorsSizeInSnapshot(raw_desc->ptr()->length_);
+      auto raw_desc = PcDescriptors::RawCast(raw_object);
+      return compiler::target::PcDescriptors::InstanceSize(
+          raw_desc->ptr()->length_);
     }
     case kInstructionsCid: {
-      InstructionsPtr raw_insns = static_cast<InstructionsPtr>(raw_object);
-      return InstructionsSizeInSnapshot(raw_insns);
+      auto raw_insns = Instructions::RawCast(raw_object);
+      return compiler::target::Instructions::InstanceSize(
+          Instructions::Size(raw_insns));
     }
     default: {
       const Class& clazz = Class::Handle(Object::Handle(raw_object).clazz());
-      FATAL1("Unsupported class %s in rodata section.\n", clazz.ToCString());
+      FATAL("Unsupported class %s in rodata section.\n", clazz.ToCString());
       return 0;
     }
   }
 }
-#else   // defined(IS_SIMARM_X64)
-intptr_t ImageWriter::SizeInSnapshot(ObjectPtr raw) {
-  switch (raw->GetClassId()) {
-    case kInstructionsCid:
-      return InstructionsSizeInSnapshot(static_cast<InstructionsPtr>(raw));
-    default:
-      return raw->ptr()->HeapSize();
-  }
-}
-#endif  // defined(IS_SIMARM_X64)
 
 uint32_t ImageWriter::GetDataOffsetFor(ObjectPtr raw_object) {
   intptr_t snap_size = SizeInSnapshot(raw_object);
@@ -534,88 +467,76 @@
   for (intptr_t i = 0; i < objects_.length(); i++) {
     const Object& obj = *objects_[i].obj_;
     AutoTraceImage(obj, section_start, stream);
+    auto const object_start = stream->Position();
 
     NoSafepointScope no_safepoint;
-    uword start = static_cast<uword>(obj.raw()) - kHeapObjectTag;
 
     // Write object header with the mark and read-only bits set.
-    uword marked_tags = obj.raw()->ptr()->tags_;
-    marked_tags = ObjectLayout::OldBit::update(true, marked_tags);
-    marked_tags = ObjectLayout::OldAndNotMarkedBit::update(false, marked_tags);
-    marked_tags =
-        ObjectLayout::OldAndNotRememberedBit::update(true, marked_tags);
-    marked_tags = ObjectLayout::NewBit::update(false, marked_tags);
-#if defined(HASH_IN_OBJECT_HEADER)
-    marked_tags |= static_cast<uword>(obj.raw()->ptr()->hash_) << 32;
-#endif
-
-#if defined(IS_SIMARM_X64)
+    stream->WriteTargetWord(GetMarkedTags(obj));
     if (obj.IsCompressedStackMaps()) {
       const CompressedStackMaps& map = CompressedStackMaps::Cast(obj);
-      auto const object_start = stream->Position();
-
       const intptr_t payload_size = map.payload_size();
-      const intptr_t size_in_bytes =
-          CompressedStackMapsSizeInSnapshot(payload_size);
-      marked_tags = UpdateObjectSizeForTarget(size_in_bytes, marked_tags);
-
-      stream->WriteTargetWord(marked_tags);
       stream->WriteFixed<uint32_t>(map.raw()->ptr()->flags_and_size_);
       ASSERT_EQUAL(stream->Position() - object_start,
                    compiler::target::CompressedStackMaps::HeaderSize());
       stream->WriteBytes(map.raw()->ptr()->data(), payload_size);
-      stream->Align(compiler::target::ObjectAlignment::kObjectAlignment);
-    } else if (obj.IsString()) {
-      const String& str = String::Cast(obj);
-      RELEASE_ASSERT(String::GetCachedHash(str.raw()) != 0);
-      RELEASE_ASSERT(str.IsOneByteString() || str.IsTwoByteString());
-      const intptr_t size_in_bytes =
-          StringSizeInSnapshot(str.Length(), str.IsOneByteString());
-      marked_tags = UpdateObjectSizeForTarget(size_in_bytes, marked_tags);
-
-      stream->WriteTargetWord(marked_tags);
-      stream->WriteTargetWord(static_cast<uword>(str.raw()->ptr()->length_));
-      stream->WriteTargetWord(static_cast<uword>(str.raw()->ptr()->hash_));
-      stream->WriteBytes(
-          reinterpret_cast<const void*>(start + String::kSizeofRawString),
-          StringPayloadSize(str.Length(), str.IsOneByteString()));
-      stream->Align(compiler::target::ObjectAlignment::kObjectAlignment);
     } else if (obj.IsCodeSourceMap()) {
       const CodeSourceMap& map = CodeSourceMap::Cast(obj);
-      const intptr_t size_in_bytes = CodeSourceMapSizeInSnapshot(map.Length());
-      marked_tags = UpdateObjectSizeForTarget(size_in_bytes, marked_tags);
-
-      stream->WriteTargetWord(marked_tags);
       stream->WriteTargetWord(map.Length());
+      ASSERT_EQUAL(stream->Position() - object_start,
+                   compiler::target::CodeSourceMap::HeaderSize());
       stream->WriteBytes(map.Data(), map.Length());
-      stream->Align(compiler::target::ObjectAlignment::kObjectAlignment);
     } else if (obj.IsPcDescriptors()) {
       const PcDescriptors& desc = PcDescriptors::Cast(obj);
-
-      const intptr_t size_in_bytes = PcDescriptorsSizeInSnapshot(desc.Length());
-      marked_tags = UpdateObjectSizeForTarget(size_in_bytes, marked_tags);
-
-      stream->WriteTargetWord(marked_tags);
       stream->WriteTargetWord(desc.Length());
+      ASSERT_EQUAL(stream->Position() - object_start,
+                   compiler::target::PcDescriptors::HeaderSize());
       stream->WriteBytes(desc.raw()->ptr()->data(), desc.Length());
-      stream->Align(compiler::target::ObjectAlignment::kObjectAlignment);
     } else {
       const Class& clazz = Class::Handle(obj.clazz());
-      FATAL1("Unsupported class %s in rodata section.\n", clazz.ToCString());
+      FATAL("Unsupported class %s in rodata section.\n", clazz.ToCString());
     }
-#else   // defined(IS_SIMARM_X64)
-    const uword end = start + obj.raw()->ptr()->HeapSize();
-
-    stream->WriteWord(marked_tags);
-    start += sizeof(uword);
-    for (uword* cursor = reinterpret_cast<uword*>(start);
-         cursor < reinterpret_cast<uword*>(end); cursor++) {
-      stream->WriteWord(*cursor);
-    }
-#endif  // defined(IS_SIMARM_X64)
+    stream->Align(compiler::target::ObjectAlignment::kObjectAlignment);
+    ASSERT_EQUAL(stream->Position() - object_start, SizeInSnapshot(obj));
   }
 }
 
+static UNLESS_DEBUG(constexpr) const uword kReadOnlyGCBits =
+    ObjectLayout::OldBit::encode(true) |
+    ObjectLayout::OldAndNotMarkedBit::encode(false) |
+    ObjectLayout::OldAndNotRememberedBit::encode(true) |
+    ObjectLayout::NewBit::encode(false);
+
+uword ImageWriter::GetMarkedTags(classid_t cid, intptr_t size) {
+  // ObjectLayout::SizeTag expects a size divisible by kObjectAlignment and
+  // checks this in debug mode, but the size on the target machine may not be
+  // divisible by the host machine's object alignment if they differ.
+  //
+  // We define [adjusted_size] as [size] * m, where m is the host alignment
+  // divided by the target alignment. This means [adjusted_size] encodes on the
+  // host machine to the same bits that decode to [size] on the target machine.
+  // That is,
+  //    [adjusted_size] / host align ==
+  //    [size] * (host align / target align) / host align ==
+  //    [size] / target align
+  //
+  // Since alignments are always powers of 2, we use shifts and logs.
+  const intptr_t adjusted_size =
+      size << (kObjectAlignmentLog2 -
+               compiler::target::ObjectAlignment::kObjectAlignmentLog2);
+
+  return kReadOnlyGCBits | ObjectLayout::ClassIdTag::encode(cid) |
+         ObjectLayout::SizeTag::encode(adjusted_size);
+}
+
+uword ImageWriter::GetMarkedTags(const Object& obj) {
+  return
+#if defined(HASH_IN_OBJECT_HEADER)
+      static_cast<uword>(obj.raw()->ptr()->hash_) << kBitsPerInt32 |
+#endif
+      GetMarkedTags(obj.raw()->GetClassId(), SizeInSnapshot(obj));
+}
+
 #if defined(DART_PRECOMPILER)
 class DwarfAssemblyStream : public DwarfWriteStream {
  public:
@@ -964,15 +885,8 @@
           parent_id,
           {id, V8SnapshotProfileWriter::Reference::kElement, element_offset});
     }
-    const compiler::target::uword marked_tags =
-        ObjectLayout::OldBit::encode(true) |
-        ObjectLayout::OldAndNotMarkedBit::encode(false) |
-        ObjectLayout::OldAndNotRememberedBit::encode(true) |
-        ObjectLayout::NewBit::encode(false) |
-        ObjectLayout::SizeTag::encode(
-            AdjustObjectSizeForTarget(image_header_size)) |
-        ObjectLayout::ClassIdTag::encode(kImageHeaderCid);
-    text_offset += WriteWordLiteralText(marked_tags);
+    text_offset +=
+        WriteWordLiteralText(GetMarkedTags(kImageHeaderCid, image_header_size));
 
     // An ImageHeader has four fields:
     // 1) The BSS offset from this section.
@@ -1015,28 +929,26 @@
         parent_id = id;
       }
       const intptr_t section_size = image_size - text_offset;
-      // Add the RawInstructionsSection header.
-      const compiler::target::uword marked_tags =
-          ObjectLayout::OldBit::encode(true) |
-          ObjectLayout::OldAndNotMarkedBit::encode(false) |
-          ObjectLayout::OldAndNotRememberedBit::encode(true) |
-          ObjectLayout::NewBit::encode(false) |
-          ObjectLayout::SizeTag::encode(
-              AdjustObjectSizeForTarget(section_size)) |
-          ObjectLayout::ClassIdTag::encode(kInstructionsSectionCid);
-      text_offset += WriteWordLiteralText(marked_tags);
       // Calculated using next_text_offset_, which doesn't include post-payload
       // padding to object alignment.
       const intptr_t instructions_length =
-          next_text_offset_ - (text_offset + compiler::target::kWordSize);
+          next_text_offset_ - text_offset -
+          compiler::target::InstructionsSection::HeaderSize();
+      // Add the RawInstructionsSection header.
+      text_offset += WriteWordLiteralText(
+          GetMarkedTags(kInstructionsSectionCid, section_size));
       text_offset += WriteWordLiteralText(instructions_length);
+      text_offset += Align(
+          compiler::target::Instructions::kBarePayloadAlignment, text_offset);
     }
   }
 #endif
 
   FrameUnwindPrologue();
 
+#if defined(DART_PRECOMPILER)
   PcDescriptors& descriptors = PcDescriptors::Handle(zone);
+#endif
   SnapshotTextObjectNamer namer(zone);
 
   ASSERT(offset_space_ != V8SnapshotProfileWriter::kSnapshot);
@@ -1052,15 +964,14 @@
           assembly_dwarf_->AddCode(*data.code_, SegmentRelativeOffset(vm));
     }
 #endif
-
     const auto object_name = namer.SnapshotNameFor(dwarf_index, data);
 
 #if defined(DART_PRECOMPILER)
     if (profile_writer_ != nullptr) {
       const V8SnapshotProfileWriter::ObjectId id(offset_space_, text_offset);
       auto const type = is_trampoline ? trampoline_type_ : instructions_type_;
-      const intptr_t size = is_trampoline ? data.trampoline_length
-                                          : SizeInSnapshot(data.insns_->raw());
+      const intptr_t size =
+          is_trampoline ? data.trampoline_length : SizeInSnapshot(*data.insns_);
       profile_writer_->SetObjectTypeAndName(id, type, object_name);
       profile_writer_->AttributeBytesTo(id, size);
       const intptr_t element_offset = id.second - parent_id.second;
@@ -1080,12 +991,7 @@
     }
 
     const intptr_t instr_start = text_offset;
-
-    const auto& code = *data.code_;
     const auto& insns = *data.insns_;
-    descriptors = code.pc_descriptors();
-
-    const uword payload_start = insns.PayloadStart();
 
     // 1. Write from the object start to the payload start. This includes the
     // object header and the fixed fields.  Not written for AOT snapshots using
@@ -1094,39 +1000,18 @@
       NoSafepointScope no_safepoint;
 
       // Write Instructions with the mark and read-only bits set.
-      uword marked_tags = insns.raw_ptr()->tags_;
-      marked_tags = ObjectLayout::OldBit::update(true, marked_tags);
-      marked_tags =
-          ObjectLayout::OldAndNotMarkedBit::update(false, marked_tags);
-      marked_tags =
-          ObjectLayout::OldAndNotRememberedBit::update(true, marked_tags);
-      marked_tags = ObjectLayout::NewBit::update(false, marked_tags);
-#if defined(HASH_IN_OBJECT_HEADER)
-      // Can't use GetObjectTagsAndHash because the update methods discard the
-      // high bits.
-      marked_tags |= static_cast<uword>(insns.raw_ptr()->hash_) << 32;
-#endif
-
-#if defined(IS_SIMARM_X64)
-      const intptr_t size_in_bytes = InstructionsSizeInSnapshot(insns.raw());
-      marked_tags = UpdateObjectSizeForTarget(size_in_bytes, marked_tags);
-      WriteWordLiteralText(marked_tags);
-      text_offset += sizeof(compiler::target::uword);
-      WriteWordLiteralText(insns.raw_ptr()->size_and_flags_);
-      text_offset += sizeof(compiler::target::uword);
-#else  // defined(IS_SIMARM_X64)
-      uword object_start = reinterpret_cast<uword>(insns.raw_ptr());
-      WriteWordLiteralText(marked_tags);
-      object_start += sizeof(uword);
-      text_offset += sizeof(uword);
-      text_offset += WriteByteSequence(object_start, payload_start);
-#endif  // defined(IS_SIMARM_X64)
-
-      ASSERT((text_offset - instr_start) ==
-             compiler::target::Instructions::HeaderSize());
+      text_offset += WriteWordLiteralText(GetMarkedTags(insns));
+      text_offset += WriteWordLiteralText(insns.raw_ptr()->size_and_flags_);
+      text_offset +=
+          Align(compiler::target::Instructions::kNonBarePayloadAlignment,
+                text_offset);
     }
 
+    ASSERT_EQUAL(text_offset - instr_start,
+                 compiler::target::Instructions::HeaderSize());
+
 #if defined(DART_PRECOMPILER)
+    const auto& code = *data.code_;
     if (debug_elf_ != nullptr) {
       debug_elf_->dwarf()->AddCode(code, {vm, text_offset});
     }
@@ -1137,68 +1022,69 @@
 
     {
       // 3. Write from the payload start to payload end. For AOT snapshots
-      // with bare instructions, this is the only part serialized.
+      // with bare instructions, this is the only non-padding part serialized.
       NoSafepointScope no_safepoint;
-      assert(kBareInstructionsAlignment <=
-             compiler::target::ObjectAlignment::kObjectAlignment);
-      const auto payload_align = bare_instruction_payloads
-                                     ? kBareInstructionsAlignment
-                                     : sizeof(compiler::target::uword);
-      const uword payload_size = Utils::RoundUp(insns.Size(), payload_align);
+      const uword payload_start = insns.PayloadStart();
+      // Double-check the payload alignment, since we will load and write
+      // target-sized words starting from that address.
+      ASSERT(Utils::IsAligned(payload_start, compiler::target::kWordSize));
+      const uword payload_size = insns.Size();
       const uword payload_end = payload_start + payload_size;
 
-      ASSERT(Utils::IsAligned(text_offset, payload_align));
-
 #if defined(DART_PRECOMPILER)
+      descriptors = code.pc_descriptors();
       PcDescriptors::Iterator iterator(descriptors,
                                        PcDescriptorsLayout::kBSSRelocation);
-      uword next_reloc_offset = iterator.MoveNext() ? iterator.PcOffset() : -1;
 
-      // We only generate BSS relocations that are word-sized and at
-      // word-aligned offsets in the payload.
-      auto const possible_relocations_end =
-          Utils::RoundDown(payload_end, sizeof(compiler::target::uword));
-      for (uword cursor = payload_start; cursor < possible_relocations_end;
-           cursor += sizeof(compiler::target::uword)) {
-        uword data = *reinterpret_cast<compiler::target::uword*>(cursor);
-        if ((cursor - payload_start) == next_reloc_offset) {
-          assembly_stream_->Printf("%s %s - (.) + %" Pu "\n", kLiteralPrefix,
-                                   bss_symbol, /*addend=*/data);
-          text_offset += compiler::target::kWordSize;
-          next_reloc_offset = iterator.MoveNext() ? iterator.PcOffset() : -1;
-        } else {
-          text_offset += WriteWordLiteralText(data);
-        }
+      uword cursor = payload_start;
+      while (iterator.MoveNext()) {
+        const uword next_reloc_address = payload_start + iterator.PcOffset();
+        // We only generate BSS relocations that are target word-sized and at
+        // target word-aligned offsets in the payload. Double-check this.
+        ASSERT(
+            Utils::IsAligned(next_reloc_address, compiler::target::kWordSize));
+        text_offset += WriteByteSequence(cursor, next_reloc_address);
+        const word addend =
+            *reinterpret_cast<compiler::target::word*>(next_reloc_address);
+        assembly_stream_->Printf("%s %s - (.) + %" Pd "\n", kLiteralPrefix,
+                                 bss_symbol, addend);
+        text_offset += compiler::target::kWordSize;
+        cursor = next_reloc_address + compiler::target::kWordSize;
       }
-      assert(next_reloc_offset != (possible_relocations_end - payload_start));
-      text_offset += WriteByteSequence(possible_relocations_end, payload_end);
+      text_offset += WriteByteSequence(cursor, payload_end);
 #else
       text_offset += WriteByteSequence(payload_start, payload_end);
 #endif
-
-      // 4. Write from the payload end to object end. Note we can't simply copy
-      // from the object because the host object may have less alignment filler
-      // than the target object in the cross-word case. Not written for AOT
-      // snapshots using bare instructions.
-      if (!bare_instruction_payloads) {
-        uword unaligned_size =
-            compiler::target::Instructions::HeaderSize() + payload_size;
-        uword alignment_size =
-            Utils::RoundUp(
-                unaligned_size,
-                compiler::target::ObjectAlignment::kObjectAlignment) -
-            unaligned_size;
-        while (alignment_size > 0) {
-          text_offset += WriteWordLiteralText(kBreakInstructionFiller);
-          alignment_size -= sizeof(compiler::target::uword);
-        }
-
-        ASSERT(kWordSize != compiler::target::kWordSize ||
-               (text_offset - instr_start) == insns.raw()->ptr()->HeapSize());
-      }
     }
 
-    ASSERT((text_offset - instr_start) == SizeInSnapshot(insns.raw()));
+    // 4. Write from the payload end to object end. Note we can't simply copy
+    // from the object because the host object may have less alignment filler
+    // than the target object in the cross-word case.
+    uword unpadded_end = text_offset - instr_start;
+    uword padding_size = SizeInSnapshot(insns) - unpadded_end;
+    for (; padding_size >= compiler::target::kWordSize;
+         padding_size -= compiler::target::kWordSize) {
+      text_offset += WriteWordLiteralText(kBreakInstructionFiller);
+    }
+#if defined(TARGET_ARCH_ARM)
+    // ARM never needs more padding, as instructions are word sized and all
+    // alignments are multiples of the word size.
+    ASSERT_EQUAL(padding_size, 0);
+#elif defined(TARGET_ARCH_ARM64)
+    // ARM64 may need 4 bytes of padding, but the break instruction filler
+    // is two copies of the 4-byte break instruction, so this works.
+    ASSERT(padding_size == 0 || padding_size == 4);
+#elif defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_IA32)
+    // The break instruction filler is the same single byte instruction filling
+    // a uword, so no checks needed.
+#else
+#error Unexpected target architecture.
+#endif
+    text_offset += WriteByteSequence(
+        reinterpret_cast<uword>(&kBreakInstructionFiller),
+        reinterpret_cast<uword>(&kBreakInstructionFiller) + padding_size);
+
+    ASSERT_EQUAL(text_offset - instr_start, SizeInSnapshot(insns.raw()));
   }
 
   // Should be a no-op unless writing bare instruction payloads, in which case
@@ -1376,7 +1262,7 @@
 #if defined(DART_PRECOMPILER)
   // We don't actually write a BSS segment, it's created as part of the
   // Elf constructor, but make sure it has an non-zero start.
-  ASSERT(elf_->BssStart(vm) != 0);
+  ASSERT(elf_ == nullptr || elf_->BssStart(vm) != 0);
 #endif
 }
 
@@ -1475,15 +1361,8 @@
           parent_id,
           {id, V8SnapshotProfileWriter::Reference::kElement, element_offset});
     }
-    const compiler::target::uword marked_tags =
-        ObjectLayout::OldBit::encode(true) |
-        ObjectLayout::OldAndNotMarkedBit::encode(false) |
-        ObjectLayout::OldAndNotRememberedBit::encode(true) |
-        ObjectLayout::NewBit::encode(false) |
-        ObjectLayout::SizeTag::encode(
-            AdjustObjectSizeForTarget(image_header_size)) |
-        ObjectLayout::ClassIdTag::encode(kImageHeaderCid);
-    instructions_blob_stream_->WriteTargetWord(marked_tags);
+    instructions_blob_stream_->WriteTargetWord(
+        GetMarkedTags(kImageHeaderCid, image_header_size));
 
     ASSERT(elf_ != nullptr);
     // An ImageHeader has four fields:
@@ -1529,21 +1408,16 @@
         parent_id = id;
       }
       const intptr_t section_size = image_size - text_offset;
-      // Add the RawInstructionsSection header.
-      const compiler::target::uword marked_tags =
-          ObjectLayout::OldBit::encode(true) |
-          ObjectLayout::OldAndNotMarkedBit::encode(false) |
-          ObjectLayout::OldAndNotRememberedBit::encode(true) |
-          ObjectLayout::NewBit::encode(false) |
-          ObjectLayout::SizeTag::encode(
-              AdjustObjectSizeForTarget(section_size)) |
-          ObjectLayout::ClassIdTag::encode(kInstructionsSectionCid);
-      instructions_blob_stream_->WriteTargetWord(marked_tags);
       // Uses next_text_offset_ to avoid any post-payload padding.
       const intptr_t instructions_length =
           next_text_offset_ - text_offset -
           compiler::target::InstructionsSection::HeaderSize();
+      // Add the RawInstructionsSection header.
+      instructions_blob_stream_->WriteTargetWord(
+          GetMarkedTags(kInstructionsSectionCid, section_size));
       instructions_blob_stream_->WriteTargetWord(instructions_length);
+      instructions_blob_stream_->Align(
+          compiler::target::Instructions::kBarePayloadAlignment);
       ASSERT_EQUAL(instructions_blob_stream_->Position() - text_offset,
                    compiler::target::InstructionsSection::HeaderSize());
       text_offset += compiler::target::InstructionsSection::HeaderSize();
@@ -1583,130 +1457,116 @@
 #endif
 
     if (is_trampoline) {
-      const auto start = reinterpret_cast<uword>(data.trampoline_bytes);
-      const auto end = start + data.trampoline_length;
-      text_offset += WriteByteSequence(start, end);
+      instructions_blob_stream_->WriteBytes(
+          reinterpret_cast<const void*>(data.trampoline_bytes),
+          data.trampoline_length);
+      text_offset += data.trampoline_length;
       delete[] data.trampoline_bytes;
       data.trampoline_bytes = nullptr;
       continue;
     }
 
-    const intptr_t instr_start = text_offset;
-
     const auto& insns = *data.insns_;
-    const uword payload_start = insns.PayloadStart();
-
-    ASSERT(Utils::IsAligned(payload_start, sizeof(compiler::target::uword)));
-
-    // Write Instructions with the mark and read-only bits set.
-    uword marked_tags = insns.raw_ptr()->tags_;
-    marked_tags = ObjectLayout::OldBit::update(true, marked_tags);
-    marked_tags = ObjectLayout::OldAndNotMarkedBit::update(false, marked_tags);
-    marked_tags =
-        ObjectLayout::OldAndNotRememberedBit::update(true, marked_tags);
-    marked_tags = ObjectLayout::NewBit::update(false, marked_tags);
-#if defined(HASH_IN_OBJECT_HEADER)
-    // Can't use GetObjectTagsAndHash because the update methods discard the
-    // high bits.
-    marked_tags |= static_cast<uword>(insns.raw_ptr()->hash_) << 32;
-#endif
-
-#if defined(IS_SIMARM_X64)
-    const intptr_t start_offset = instructions_blob_stream_->bytes_written();
+    const intptr_t instr_start = instructions_blob_stream_->Position();
 
     if (!bare_instruction_payloads) {
-      const intptr_t size_in_bytes = InstructionsSizeInSnapshot(insns.raw());
-      marked_tags = UpdateObjectSizeForTarget(size_in_bytes, marked_tags);
-      instructions_blob_stream_->WriteTargetWord(marked_tags);
+      // Write Instructions with the mark and read-only bits set.
+      instructions_blob_stream_->WriteTargetWord(GetMarkedTags(insns));
       instructions_blob_stream_->WriteFixed<uint32_t>(
           insns.raw_ptr()->size_and_flags_);
-    } else {
-      ASSERT(Utils::IsAligned(instructions_blob_stream_->Position(),
-                              kBareInstructionsAlignment));
+      instructions_blob_stream_->Align(
+          compiler::target::Instructions::kNonBarePayloadAlignment);
     }
-    const intptr_t payload_offset = instructions_blob_stream_->Position();
-    instructions_blob_stream_->WriteBytes(
-        reinterpret_cast<const void*>(insns.PayloadStart()), insns.Size());
-    const intptr_t alignment =
-        bare_instruction_payloads
-            ? kBareInstructionsAlignment
-            : compiler::target::ObjectAlignment::kObjectAlignment;
-    instructions_blob_stream_->Align(alignment);
-    const intptr_t end_offset = instructions_blob_stream_->bytes_written();
-    text_offset += (end_offset - start_offset);
-#else  // defined(IS_SIMARM_X64)
-    // Only payload is output in AOT snapshots.
-    const uword header_size =
-        bare_instruction_payloads
-            ? 0
-            : compiler::target::Instructions::HeaderSize();
-    const uword payload_size = SizeInSnapshot(insns.raw()) - header_size;
-    const uword object_end = payload_start + payload_size;
-    if (!bare_instruction_payloads) {
-      uword object_start = reinterpret_cast<uword>(insns.raw_ptr());
-      instructions_blob_stream_->WriteWord(marked_tags);
-      text_offset += sizeof(uword);
-      object_start += sizeof(uword);
-      text_offset += WriteByteSequence(object_start, payload_start);
-    } else {
-      ASSERT(Utils::IsAligned(instructions_blob_stream_->Position(),
-                              kBareInstructionsAlignment));
-    }
-    const intptr_t payload_offset = instructions_blob_stream_->Position();
-    text_offset += WriteByteSequence(payload_start, object_end);
-#endif
+
+    ASSERT_EQUAL(instructions_blob_stream_->Position() - instr_start,
+                 compiler::target::Instructions::HeaderSize());
 
 #if defined(DART_PRECOMPILER)
     const auto& code = *data.code_;
+    auto const payload_offset = instructions_blob_stream_->Position();
     if (elf_ != nullptr && elf_->dwarf() != nullptr) {
       elf_->dwarf()->AddCode(code, {vm, payload_offset});
     }
     if (debug_elf_ != nullptr) {
       debug_elf_->dwarf()->AddCode(code, {vm, payload_offset});
     }
+#endif
 
+    auto const payload_start =
+        reinterpret_cast<const uint8_t*>(insns.PayloadStart());
+    // Double-check the payload alignment, since we will load and write
+    // target-sized words starting from that address.
+    ASSERT(Utils::IsAligned(payload_start, compiler::target::kWordSize));
+    const intptr_t payload_size = insns.Size();
     // Don't patch the relocation if we're not generating ELF. The regular blobs
     // format does not yet support these relocations. Use
     // Code::VerifyBSSRelocations to check whether the relocations are patched
     // or not after loading.
     if (elf_ != nullptr) {
-      const intptr_t current_stream_position =
-          instructions_blob_stream_->Position();
-
+#if defined(DART_PRECOMPILER)
       descriptors = code.pc_descriptors();
-
       PcDescriptors::Iterator iterator(
           descriptors, /*kind_mask=*/PcDescriptorsLayout::kBSSRelocation);
 
+      auto const payload_end = payload_start + payload_size;
       const intptr_t bss_offset = elf_->BssStart(vm) - segment_base;
+      auto cursor = payload_start;
       while (iterator.MoveNext()) {
-        const intptr_t reloc_offset = iterator.PcOffset();
+        auto const next_reloc_offset = iterator.PcOffset();
+        auto const next_reloc_address = payload_start + next_reloc_offset;
+        // We only generate BSS relocations that are target word-sized and at
+        // target word-aligned offsets in the payload. Double-check this..
+        ASSERT(
+            Utils::IsAligned(next_reloc_address, compiler::target::kWordSize));
+        instructions_blob_stream_->WriteBytes(cursor,
+                                              next_reloc_address - cursor);
 
         // The instruction stream at the relocation position holds an offset
         // into BSS corresponding to the symbol being resolved. This addend is
         // factored into the relocation.
-        const auto addend = *reinterpret_cast<compiler::target::word*>(
-            insns.PayloadStart() + reloc_offset);
+        const auto addend = *reinterpret_cast<const compiler::target::word*>(
+            next_reloc_address);
 
-        // Overwrite the relocation position in the instruction stream with the
-        // offset of the BSS segment from the relocation position plus the
-        // addend in the relocation.
-        auto const reloc_pos = payload_offset + reloc_offset;
-        instructions_blob_stream_->SetPosition(reloc_pos);
-
-        const compiler::target::word offset = bss_offset - reloc_pos + addend;
-        instructions_blob_stream_->WriteTargetWord(offset);
+        const word reloc_value =
+            bss_offset + addend - (payload_offset + next_reloc_offset);
+        instructions_blob_stream_->WriteTargetWord(reloc_value);
+        cursor = next_reloc_address + compiler::target::kWordSize;
       }
-
-      // Restore stream position after the relocation was patched.
-      instructions_blob_stream_->SetPosition(current_stream_position);
-    }
-#else
-    USE(payload_offset);
+      instructions_blob_stream_->WriteBytes(cursor, payload_end - cursor);
 #endif
+    } else {
+      instructions_blob_stream_->WriteBytes(payload_start, payload_size);
+    }
 
-    ASSERT((text_offset - instr_start) ==
-           ImageWriter::SizeInSnapshot(insns.raw()));
+    // Create padding containing break instructions. Instead of copying it out
+    // of the object, we recreate it to handle the crossword case where the
+    // amount of padding may differ.
+    uword unpadded_end = instructions_blob_stream_->Position() - instr_start;
+    uword padding_size = SizeInSnapshot(insns) - unpadded_end;
+    for (; padding_size >= compiler::target::kWordSize;
+         padding_size -= compiler::target::kWordSize) {
+      instructions_blob_stream_->WriteTargetWord(kBreakInstructionFiller);
+    }
+#if defined(TARGET_ARCH_ARM)
+    // ARM never needs more padding, as instructions are word sized and all
+    // alignments are multiples of the word size.
+    ASSERT_EQUAL(padding_size, 0);
+#elif defined(TARGET_ARCH_ARM64)
+    // ARM64 may need 4 bytes of padding, but the break instruction filler
+    // is two copies of the 4-byte break instruction, so this works.
+    ASSERT(padding_size == 0 || padding_size == 4);
+#elif defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_IA32)
+    // The break instruction filler is the same single byte instruction filling
+    // a uword, so no checks needed.
+#else
+#error Unexpected target architecture.
+#endif
+    instructions_blob_stream_->WriteBytes(
+        reinterpret_cast<const void*>(&kBreakInstructionFiller), padding_size);
+
+    const intptr_t instr_end = instructions_blob_stream_->Position();
+    ASSERT_EQUAL(instr_end - instr_start, SizeInSnapshot(insns.raw()));
+    text_offset += instr_end - instr_start;
   }
 
   // Should be a no-op unless writing bare instruction payloads, in which case
@@ -1717,7 +1577,7 @@
   text_offset = Utils::RoundUp(
       text_offset, compiler::target::ObjectAlignment::kObjectAlignment);
 
-  ASSERT_EQUAL(text_offset, instructions_blob_stream_->bytes_written());
+  ASSERT_EQUAL(text_offset, instructions_blob_stream_->Position());
   ASSERT_EQUAL(text_offset, image_size);
 
 #if defined(DART_PRECOMPILER)
@@ -1758,17 +1618,20 @@
 
 #if defined(DART_PRECOMPILED_RUNTIME)
 uword ImageReader::GetBareInstructionsAt(uint32_t offset) const {
-  ASSERT(Utils::IsAligned(offset, ImageWriter::kBareInstructionsAlignment));
+  ASSERT(FLAG_use_bare_instructions);
+  ASSERT(Utils::IsAligned(offset, Instructions::kBarePayloadAlignment));
   return reinterpret_cast<uword>(instructions_image_) + offset;
 }
 
 uword ImageReader::GetBareInstructionsEnd() const {
+  ASSERT(FLAG_use_bare_instructions);
   Image image(instructions_image_);
   return reinterpret_cast<uword>(image.object_start()) + image.object_size();
 }
 #endif
 
 InstructionsPtr ImageReader::GetInstructionsAt(uint32_t offset) const {
+  ASSERT(!FLAG_precompiled_mode || !FLAG_use_bare_instructions);
   ASSERT(Utils::IsAligned(offset, kObjectAlignment));
 
   ObjectPtr result = ObjectLayout::FromAddr(
diff --git a/runtime/vm/image_snapshot.h b/runtime/vm/image_snapshot.h
index 44673a3..0190cae 100644
--- a/runtime/vm/image_snapshot.h
+++ b/runtime/vm/image_snapshot.h
@@ -294,35 +294,8 @@
   void TraceInstructions(const Instructions& instructions);
 
   static intptr_t SizeInSnapshot(ObjectPtr object);
-  static const intptr_t kBareInstructionsAlignment = 4;
-
-  static_assert(
-      (kObjectAlignmentLog2 -
-       compiler::target::ObjectAlignment::kObjectAlignmentLog2) >= 0,
-      "Target object alignment is larger than the host object alignment");
-
-  // Converts the target object size (in bytes) to an appropriate argument for
-  // ObjectLayout::SizeTag methods on the host machine.
-  //
-  // ObjectLayout::SizeTag expects a size divisible by kObjectAlignment and
-  // checks this in debug mode, but the size on the target machine may not be
-  // divisible by the host machine's object alignment if they differ.
-  //
-  // If target_size = n, we convert it to n * m, where m is the host alignment
-  // divided by the target alignment. This means AdjustObjectSizeForTarget(n)
-  // encodes on the host machine to the same bits that decode to n on the target
-  // machine. That is:
-  //    n * (host align / target align) / host align => n / target align
-  static constexpr intptr_t AdjustObjectSizeForTarget(intptr_t target_size) {
-    return target_size
-           << (kObjectAlignmentLog2 -
-               compiler::target::ObjectAlignment::kObjectAlignmentLog2);
-  }
-
-  static UNLESS_DEBUG(constexpr) compiler::target::uword
-      UpdateObjectSizeForTarget(intptr_t size, uword marked_tags) {
-    return ObjectLayout::SizeTag::update(AdjustObjectSizeForTarget(size),
-                                         marked_tags);
+  static intptr_t SizeInSnapshot(const Object& object) {
+    return SizeInSnapshot(object.raw());
   }
 
   // Returns nullptr if there is no profile writer.
@@ -334,6 +307,9 @@
   virtual void WriteROData(NonStreamingWriteStream* clustered_stream, bool vm);
   virtual void WriteText(bool vm) = 0;
 
+  static uword GetMarkedTags(classid_t cid, intptr_t size);
+  static uword GetMarkedTags(const Object& obj);
+
   void DumpInstructionStats();
   void DumpInstructionsSizes();
 
@@ -484,16 +460,12 @@
   const char* kLiteralPrefix = ".long";
 #endif
 
-  intptr_t WriteWordLiteralText(uword value) {
-#if defined(IS_SIMARM_X64)
-    ASSERT(value <= kMaxUint32);
-#endif
+  intptr_t WriteWordLiteralText(word value) {
+    ASSERT(compiler::target::kBitsPerWord == kBitsPerWord ||
+           Utils::IsAbsoluteUint(compiler::target::kBitsPerWord, value));
     // Padding is helpful for comparing the .S with --disassemble.
-#if defined(TARGET_ARCH_IS_64_BIT)
-    assembly_stream_->Printf(".quad 0x%0.16" Px "\n", value);
-#else
-    assembly_stream_->Printf(".long 0x%0.8" Px "\n", value);
-#endif
+    assembly_stream_->Printf("%s 0x%0.*" Px "\n", kLiteralPrefix,
+                             2 * compiler::target::kWordSize, value);
     return compiler::target::kWordSize;
   }
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 38e8461..9577ff4 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -5510,21 +5510,50 @@
       (kMaxInt32 - (sizeof(InstructionsLayout) + sizeof(ObjectLayout) +
                     (2 * kMaxObjectAlignment)));
 
+  // Currently, we align bare instruction payloads on 4 byte boundaries.
+  //
+  // If we later decide to align on larger boundaries to put entries at the
+  // start of cache lines, make sure to account for entry points that are
+  // _not_ at the start of the payload.
+  static const intptr_t kBarePayloadAlignment = 4;
+
+  // In non-bare mode, we align the payloads on word boundaries.
+  static const intptr_t kNonBarePayloadAlignment = kWordSize;
+
+  // In the precompiled runtime when running in bare instructions mode,
+  // Instructions objects don't exist, just their bare payloads, so we
+  // mark them as unreachable in that case.
+
+  static intptr_t HeaderSize() {
+#if defined(DART_PRECOMPILED_RUNTIME)
+    if (FLAG_use_bare_instructions) {
+      UNREACHABLE();
+    }
+#endif
+    return Utils::RoundUp(sizeof(InstructionsLayout), kNonBarePayloadAlignment);
+  }
+
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(InstructionsLayout) ==
-           OFFSET_OF_RETURNED_VALUE(InstructionsLayout, data));
+    ASSERT_EQUAL(sizeof(InstructionsLayout),
+                 OFFSET_OF_RETURNED_VALUE(InstructionsLayout, data));
     return 0;
   }
 
   static intptr_t InstanceSize(intptr_t size) {
-    return Utils::RoundUp(HeaderSize() + size, kObjectAlignment);
-  }
-
-  static intptr_t HeaderSize() {
-    return Utils::RoundUp(sizeof(InstructionsLayout), kWordSize);
+#if defined(DART_PRECOMPILED_RUNTIME)
+    if (FLAG_use_bare_instructions) {
+      UNREACHABLE();
+    }
+#endif
+    return RoundedAllocationSize(HeaderSize() + size);
   }
 
   static InstructionsPtr FromPayloadStart(uword payload_start) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+    if (FLAG_use_bare_instructions) {
+      UNREACHABLE();
+    }
+#endif
     return static_cast<InstructionsPtr>(payload_start - HeaderSize() +
                                         kHeapObjectTag);
   }
@@ -5592,7 +5621,8 @@
   }
 
   static intptr_t HeaderSize() {
-    return Utils::RoundUp(sizeof(InstructionsSectionLayout), kWordSize);
+    return Utils::RoundUp(sizeof(InstructionsSectionLayout),
+                          Instructions::kBarePayloadAlignment);
   }
 
  private:
@@ -5645,15 +5675,14 @@
   static const intptr_t kBytesPerElement = 1;
   static const intptr_t kMaxElements = kMaxInt32 / kBytesPerElement;
 
+  static intptr_t HeaderSize() { return sizeof(PcDescriptorsLayout); }
   static intptr_t UnroundedSize(PcDescriptorsPtr desc) {
     return UnroundedSize(desc->ptr()->length_);
   }
-  static intptr_t UnroundedSize(intptr_t len) {
-    return sizeof(PcDescriptorsLayout) + len;
-  }
+  static intptr_t UnroundedSize(intptr_t len) { return HeaderSize() + len; }
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(PcDescriptorsLayout) ==
-           OFFSET_OF_RETURNED_VALUE(PcDescriptorsLayout, data));
+    ASSERT_EQUAL(sizeof(PcDescriptorsLayout),
+                 OFFSET_OF_RETURNED_VALUE(PcDescriptorsLayout, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
@@ -5784,15 +5813,14 @@
   static const intptr_t kBytesPerElement = 1;
   static const intptr_t kMaxElements = kMaxInt32 / kBytesPerElement;
 
+  static intptr_t HeaderSize() { return sizeof(CodeSourceMapLayout); }
   static intptr_t UnroundedSize(CodeSourceMapPtr map) {
     return UnroundedSize(map->ptr()->length_);
   }
-  static intptr_t UnroundedSize(intptr_t len) {
-    return sizeof(CodeSourceMapLayout) + len;
-  }
+  static intptr_t UnroundedSize(intptr_t len) { return HeaderSize() + len; }
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(CodeSourceMapLayout) ==
-           OFFSET_OF_RETURNED_VALUE(CodeSourceMapLayout, data));
+    ASSERT_EQUAL(sizeof(CodeSourceMapLayout),
+                 OFFSET_OF_RETURNED_VALUE(CodeSourceMapLayout, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
@@ -5849,15 +5877,16 @@
   bool Equals(const CompressedStackMaps* other) const { return Equals(*other); }
   intptr_t Hashcode() const;
 
+  static intptr_t HeaderSize() { return sizeof(CompressedStackMapsLayout); }
   static intptr_t UnroundedSize(CompressedStackMapsPtr maps) {
     return UnroundedSize(CompressedStackMaps::PayloadSizeOf(maps));
   }
   static intptr_t UnroundedSize(intptr_t length) {
-    return sizeof(CompressedStackMapsLayout) + length;
+    return HeaderSize() + length;
   }
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(CompressedStackMapsLayout) ==
-           OFFSET_OF_RETURNED_VALUE(CompressedStackMapsLayout, data));
+    ASSERT_EQUAL(sizeof(CompressedStackMapsLayout),
+                 OFFSET_OF_RETURNED_VALUE(CompressedStackMapsLayout, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t length) {
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 82b9df0..cb853c6 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -23,6 +23,17 @@
 #include "vm/token.h"
 #include "vm/token_position.h"
 
+// Currently we have two different axes for offset generation:
+//
+//  * Target architecture
+//  * DART_PRECOMPILED_RUNTIME (i.e, AOT vs. JIT)
+//
+// That is, fields in ObjectLayout and its subclasses should only be included or
+// excluded conditionally based on these factors. Otherwise, the generated
+// offsets can be wrong (which should be caught by offset checking in dart.cc).
+//
+// TODO(dartbug.com/43646): Add DART_PRECOMPILER as another axis.
+
 namespace dart {
 
 // For now there are no compressed pointers.
diff --git a/sdk/lib/_internal/allowed_experiments.json b/sdk/lib/_internal/allowed_experiments.json
index c967d66..aadacfe 100644
--- a/sdk/lib/_internal/allowed_experiments.json
+++ b/sdk/lib/_internal/allowed_experiments.json
@@ -70,12 +70,21 @@
     "flutter_goldens_client": {
       "experimentSet": "nullSafety"
     },
+    "http": {
+      "experimentSet": "nullSafety"
+    },
+    "http_parser": {
+      "experimentSet": "nullSafety"
+    },
     "intl": {
       "experimentSet": "nullSafety"
     },
     "js": {
       "experimentSet": "nullSafety"
     },
+    "logging": {
+      "experimentSet": "nullSafety"
+    },
     "matcher": {
       "experimentSet": "nullSafety"
     },
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index f93ebee..f764342 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -26,7 +26,6 @@
 Language/Statements/Expression_Statements/syntax_t06: Skip # Type aliases are not fully implemented
 Language/Types/Type_Aliases/built-in_types_t11: Skip # Triple shift is not implemented yet
 LanguageFeatures/Extension-methods/explicit_extension_member_invocation_A15_t09: Skip # Triple shift is not implemented yet
-LanguageFeatures/Instantiate-to-bound/class/static/*: Skip # Not migrated to NNBD
 LanguageFeatures/Instantiate-to-bound/nonfunction_typedef/static/*: Skip # Not migrated to NNBD
 LanguageFeatures/Instantiate-to-bound/typedef/static/*: Skip # Not migrated to NNBD
 LanguageFeatures/Simple-bounds/dynamic/type-aliases/*: Skip # Type aliases are not fully implemented
diff --git a/tools/VERSION b/tools/VERSION
index b629cdf0..e706233 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 189
+PRERELEASE 190
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 605c4d5..1115d5e 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -891,8 +891,7 @@
           "testRunner": true,
           "arguments": [
             "pkg/front_end/test/unit_test_suites.dart",
-            "-ncfe-unittest-asserts-${mode}-${system}",
-            "--verbose"
+            "-ncfe-unittest-asserts-${mode}-${system}"
           ]
         }
       ]
diff --git a/tools/run_offsets_extractor.sh b/tools/run_offsets_extractor.sh
index 8675fea..d3fd6ec9 100755
--- a/tools/run_offsets_extractor.sh
+++ b/tools/run_offsets_extractor.sh
@@ -14,13 +14,17 @@
   exit 1
 fi
 
-# We're regenerating the file, but we want to keep all the comments etc at the
-# top of the file. So just delete everything after the first "#if defined".
-LINE=$(grep "#if " "$FILE" -n | head -n 1 | sed "s/^\([0-9]*\):.*/\1/")
 TEMP="${FILE}.temp"
 TEMP_HEADER="${FILE}.header.temp"
 TEMP_JIT="${FILE}.jit.temp"
 TEMP_AOT="${FILE}.aot.temp"
+
+# Remove old temp files if the previous run was stopped prematurely.
+rm -rf "${TEMP}" "${TEMP_HEADER}" "${TEMP_JIT}" "${TEMP_AOT}"
+
+# We're regenerating the file, but we want to keep all the comments etc at the
+# top of the file. So just delete everything after the first "#if defined".
+LINE=$(grep "#if " "$FILE" -n | head -n 1 | sed "s/^\([0-9]*\):.*/\1/")
 head -n $(expr $LINE - 1) "$FILE" >"$TEMP_HEADER"
 
 # Run offsets_extractor for every architecture and append the results.