diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index 4888037..17c84a4 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -197,14 +197,12 @@
 
 class _Environment implements Environment {
   final Map<String, String> definitions;
-  Map<String, String> _completeMap;
   Set<String> supportedLibraries;
 
   _Environment(this.definitions);
 
   @override
   String valueOf(String name) {
-    if (_completeMap != null) return _completeMap[name];
     var result = definitions[name];
     if (result != null || definitions.containsKey(name)) return result;
     if (!name.startsWith(_dartLibraryEnvironmentPrefix)) return null;
@@ -216,22 +214,6 @@
     if (supportedLibraries.contains(libraryName)) return "true";
     return null;
   }
-
-  @override
-  Map<String, String> toMap() {
-    if (_completeMap == null) {
-      _completeMap = new Map<String, String>.from(definitions);
-      for (String libraryName in supportedLibraries) {
-        if (!libraryName.startsWith("_")) {
-          String key = '${_dartLibraryEnvironmentPrefix}${libraryName}';
-          if (!definitions.containsKey(key)) {
-            _completeMap[key] = "true";
-          }
-        }
-      }
-    }
-    return _completeMap;
-  }
 }
 
 /// For every 'dart:' library, a corresponding environment variable is set
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 39c73a8..2eb6455 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -981,9 +981,6 @@
 
   @override
   String valueOf(String key) => null;
-
-  @override
-  Map<String, String> toMap() => const {};
 }
 
 /// Interface for showing progress during compilation.
diff --git a/pkg/compiler/lib/src/environment.dart b/pkg/compiler/lib/src/environment.dart
index 67db9ac..29c9861 100644
--- a/pkg/compiler/lib/src/environment.dart
+++ b/pkg/compiler/lib/src/environment.dart
@@ -13,7 +13,4 @@
   /// Note that `bool.fromEnvironment` and `int.fromEnvironment` are also
   /// implemented in terms of `String.fromEnvironment`.
   String valueOf(String key);
-
-  /// Returns the full environment as map.
-  Map<String, String> toMap();
 }
diff --git a/pkg/compiler/lib/src/ir/constants.dart b/pkg/compiler/lib/src/ir/constants.dart
deleted file mode 100644
index 5783f3a..0000000
--- a/pkg/compiler/lib/src/ir/constants.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:kernel/ast.dart' as ir;
-import 'package:kernel/type_environment.dart' as ir;
-import 'package:kernel/transformations/constants.dart' as ir;
-
-import '../kernel/dart2js_target.dart';
-
-class Dart2jsConstantEvaluator extends ir.ConstantEvaluator {
-  Dart2jsConstantEvaluator(ir.TypeEnvironment typeEnvironment,
-      {bool enableAsserts, Map<String, String> environment: const {}})
-      : super(const Dart2jsConstantsBackend(), environment, typeEnvironment,
-            enableAsserts, const DevNullErrorReporter());
-
-  @override
-  ir.Constant evaluate(ir.Expression node, {bool requireConstant: true}) {
-    if (node is ir.ConstantExpression) {
-      ir.Constant constant = node.constant;
-      if (constant is ir.UnevaluatedConstant) {
-        return node.constant = super.evaluate(constant.expression);
-      }
-      return constant;
-    }
-    if (requireConstant) {
-      // TODO(johnniwinther): Handle reporting of compile-time constant
-      // evaluation errors.
-      return super.evaluate(node);
-    } else {
-      try {
-        return super.evaluate(node);
-      } catch (e) {
-        return null;
-      }
-    }
-  }
-}
-
-class DevNullErrorReporter extends ir.SimpleErrorReporter {
-  const DevNullErrorReporter();
-
-  @override
-  String report(List<ir.TreeNode> context, String what, ir.TreeNode node) =>
-      what;
-}
diff --git a/pkg/compiler/lib/src/ir/impact_data.dart b/pkg/compiler/lib/src/ir/impact_data.dart
index 49bba79..cf3ab20 100644
--- a/pkg/compiler/lib/src/ir/impact_data.dart
+++ b/pkg/compiler/lib/src/ir/impact_data.dart
@@ -968,11 +968,6 @@
             data.node, data.kind, data.receiverType, data.argumentType);
       }
     }
-    if (_constants != null) {
-      for (ir.ConstantExpression data in _constants) {
-        registry.registerConstant(data);
-      }
-    }
 
     // TODO(johnniwinther): Remove these when CFE provides constants.
     if (_constructorNodes != null) {
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index 217ab9a..e084b4c 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -219,13 +219,6 @@
       _backendUsage.registerBackendFunctionUse(helper);
       impactBuilder
           .registerTypeUse(new TypeUse.instantiation(_commonElements.typeType));
-    } else if (constant.isConstructedObject) {
-      ConstructedConstantValue constructed = constant;
-      impactBuilder
-          .registerTypeUse(new TypeUse.instantiation(constructed.type));
-      constructed.fields.forEach((FieldEntity field, _) {
-        impactBuilder.registerStaticUse(new StaticUse.fieldInit(field));
-      });
     }
   }
 
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 0debe8b..cc810d1 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -10,8 +10,7 @@
 import 'package:kernel/core_types.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/target/targets.dart';
-import 'package:kernel/transformations/constants.dart'
-    show ConstantsBackend, NumberSemantics;
+import 'package:kernel/transformations/constants.dart' show ConstantsBackend;
 import 'invocation_mirror_constants.dart';
 
 const Iterable<String> _allowedDartSchemePaths = const <String>[
@@ -148,9 +147,10 @@
     return new ir.InvalidExpression(null);
   }
 
+  // TODO(askesc): Return specialized dart2js constants backend.
   @override
   ConstantsBackend constantsBackend(CoreTypes coreTypes) =>
-      const Dart2jsConstantsBackend();
+      const ConstantsBackend();
 }
 
 // TODO(sigmund): this "extraRequiredLibraries" needs to be removed...
@@ -195,10 +195,3 @@
     'dart:mirrors',
   ]
 };
-
-class Dart2jsConstantsBackend extends ConstantsBackend {
-  const Dart2jsConstantsBackend();
-
-  @override
-  NumberSemantics get numberSemantics => NumberSemantics.js;
-}
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 8f4569d..6f2491d 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -11,7 +11,6 @@
 import 'package:kernel/core_types.dart' as ir;
 import 'package:kernel/type_algebra.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
-import 'package:kernel/transformations/constants.dart' as ir;
 
 import '../common.dart';
 import '../common/names.dart';
@@ -29,7 +28,6 @@
 import '../environment.dart';
 import '../frontend_strategy.dart';
 import '../ir/annotations.dart';
-import '../ir/constants.dart';
 import '../ir/debug.dart';
 import '../ir/element_map.dart';
 import '../ir/impact.dart';
@@ -69,7 +67,6 @@
   final CompilerOptions options;
   @override
   final DiagnosticReporter reporter;
-  final Environment _environment;
   CommonElementsImpl _commonElements;
   KernelElementEnvironment _elementEnvironment;
   DartTypeConverter _typeConverter;
@@ -77,7 +74,6 @@
   KernelDartTypes _types;
   ir.TypeEnvironment _typeEnvironment;
   ir.ClassHierarchy _classHierarchy;
-  ir.ConstantEvaluator _constantEvaluator;
 
   /// Library environment. Used for fast lookup.
   KProgramEnv env = new KProgramEnv();
@@ -119,11 +115,11 @@
 
   Map<KMember, Map<ir.Expression, TypeMap>> typeMapsForTesting;
 
-  KernelToElementMapImpl(
-      this.reporter, this._environment, this._frontendStrategy, this.options) {
+  KernelToElementMapImpl(this.reporter, Environment environment,
+      this._frontendStrategy, this.options) {
     _elementEnvironment = new KernelElementEnvironment(this);
     _commonElements = new CommonElementsImpl(_elementEnvironment);
-    _constantEnvironment = new KernelConstantEnvironment(this, _environment);
+    _constantEnvironment = new KernelConstantEnvironment(this, environment);
     _typeConverter = new DartTypeConverter(this);
     _types = new KernelDartTypes(this);
   }
@@ -746,19 +742,19 @@
 
   @override
   ir.TypeEnvironment get typeEnvironment {
-    return _typeEnvironment ??= new ir.TypeEnvironment(
-        new ir.CoreTypes(env.mainComponent), classHierarchy);
+    if (_typeEnvironment == null) {
+      _typeEnvironment ??= new ir.TypeEnvironment(
+          new ir.CoreTypes(env.mainComponent), classHierarchy);
+    }
+    return _typeEnvironment;
   }
 
   @override
   ir.ClassHierarchy get classHierarchy {
-    return _classHierarchy ??= new ir.ClassHierarchy(env.mainComponent);
-  }
-
-  Dart2jsConstantEvaluator get constantEvaluator {
-    return _constantEvaluator ??= new Dart2jsConstantEvaluator(typeEnvironment,
-        enableAsserts: options.enableUserAssertions,
-        environment: _environment.toMap());
+    if (_classHierarchy == null) {
+      _classHierarchy ??= new ir.ClassHierarchy(env.mainComponent);
+    }
+    return _classHierarchy;
   }
 
   @override
@@ -1025,17 +1021,7 @@
       bool implicitNull: false,
       bool checkCasts: true}) {
     if (node is ir.ConstantExpression) {
-      ir.Constant constant =
-          constantEvaluator.evaluate(node, requireConstant: requireConstant);
-      if (constant == null) {
-        if (requireConstant) {
-          throw new UnsupportedError(
-              'No constant for ${DebugPrinter.prettyPrint(node)}');
-        }
-        return null;
-      } else {
-        return constant.accept(new ConstantValuefier(this));
-      }
+      return node.constant.accept(new ConstantValuefier(this));
     }
 
     ConstantExpression constant;
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 75f2163..ba5118a 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -129,12 +129,15 @@
       .reportErrorMessage(spannable, MessageKind.GENERIC, {'text': message});
 }
 
+/// Display name used for compilation using the new common frontend.
+const String kernelName = 'kernel';
+
 /// Display name used for strong mode compilation using the new common frontend.
 const String strongName = 'strong mode';
 
 /// Display name used for strong mode compilation without implicit checks using
 /// the new common frontend.
-const String omitName = 'strong mode without implicit checks';
+const String trustName = 'strong mode without implicit checks';
 
 /// Compute actual data for all members defined in the program with the
 /// [entryPoint] and [memorySourceFiles].
@@ -418,25 +421,21 @@
         String expected = expectedValue?.toString() ?? '';
         String actual = dataValidator.getText(actualValue);
         int offset = getOffsetFromId(id, uri);
-        if (offset != null) {
-          String value1 = '${expected}';
-          String value2 = IdValue.idToString(id, '${actual}');
-          annotations
-              .putIfAbsent(offset, () => [])
-              .add(colorizeDiff(value1, ' | ', value2));
-        }
+        String value1 = '${expected}';
+        String value2 = IdValue.idToString(id, '${actual}');
+        annotations
+            .putIfAbsent(offset, () => [])
+            .add(colorizeDiff(value1, ' | ', value2));
       }
     });
     expectedMaps[uri].forEach((Id id, IdValue expected) {
       if (!actualMaps[uri].containsKey(id)) {
         int offset = getOffsetFromId(id, uri);
-        if (offset != null) {
-          String value1 = '${expected}';
-          String value2 = '---';
-          annotations
-              .putIfAbsent(offset, () => [])
-              .add(colorizeDiff(value1, ' | ', value2));
-        }
+        String value1 = '${expected}';
+        String value2 = '---';
+        annotations
+            .putIfAbsent(offset, () => [])
+            .add(colorizeDiff(value1, ' | ', value2));
       }
     });
     return withAnnotations(code[uri].sourceCode, annotations);
@@ -445,7 +444,7 @@
   int getOffsetFromId(Id id, Uri uri) {
     return compiler.reporter
         .spanFromSpannable(computeSpannable(elementEnvironment, uri, id))
-        ?.begin;
+        .begin;
   }
 }
 
@@ -531,7 +530,6 @@
     int shards: 1,
     int shardIndex: 0,
     bool testOmit: true,
-    bool testCFEConstants: false,
     void onTest(Uri uri)}) async {
   dataComputer.setup();
 
@@ -581,8 +579,6 @@
     Map<String, MemberAnnotations<IdValue>> expectedMaps = {
       strongMarker: new MemberAnnotations<IdValue>(),
       omitMarker: new MemberAnnotations<IdValue>(),
-      strongConstMarker: new MemberAnnotations<IdValue>(),
-      omitConstMarker: new MemberAnnotations<IdValue>(),
     };
     computeExpectedMap(entryPoint, code[entryPoint], expectedMaps);
     Map<String, String> memorySourceFiles = {
@@ -611,79 +607,51 @@
 
     if (setUpFunction != null) setUpFunction();
 
-    Future runTests({bool useCFEConstants: false}) async {
+    if (skipForStrong.contains(name)) {
+      print('--skipped for kernel (strong mode)----------------------------');
+    } else {
+      print('--from kernel (strong mode)-----------------------------------');
+      List<String> options = new List<String>.from(testOptions);
+      MemberAnnotations<IdValue> annotations = expectedMaps[strongMarker];
+      CompiledData<T> compiledData2 = await computeData(
+          entryPoint, memorySourceFiles, dataComputer,
+          options: options,
+          verbose: verbose,
+          printCode: printCode,
+          testFrontend: testFrontend,
+          forUserLibrariesOnly: forUserLibrariesOnly,
+          globalIds: annotations.globalData.keys);
+      if (await checkCode(strongName, entity.uri, code, annotations,
+          compiledData2, dataComputer.dataValidator,
+          filterActualData: filterActualData,
+          fatalErrors: !testAfterFailures)) {
+        hasFailures = true;
+      }
+    }
+    if (testOmit) {
       if (skipForStrong.contains(name)) {
-        print('--skipped for kernel (strong mode)----------------------------');
+        print('--skipped for kernel (strong mode, omit-implicit-checks)------');
       } else {
-        print('--from kernel (strong mode)-----------------------------------');
-        List<String> options = new List<String>.from(testOptions);
-        String marker = strongMarker;
-        if (useCFEConstants) {
-          marker = strongConstMarker;
-          options
-              .add('${Flags.enableLanguageExperiments}=constant-update-2018');
-        } else {
-          options.add(
-              '${Flags.enableLanguageExperiments}=no-constant-update-2018');
-        }
-        MemberAnnotations<IdValue> annotations = expectedMaps[marker];
+        print('--from kernel (strong mode, omit-implicit-checks)-------------');
+        List<String> options = [
+          Flags.omitImplicitChecks,
+          Flags.laxRuntimeTypeToString
+        ]..addAll(testOptions);
+        MemberAnnotations<IdValue> annotations = expectedMaps[omitMarker];
         CompiledData<T> compiledData2 = await computeData(
             entryPoint, memorySourceFiles, dataComputer,
             options: options,
             verbose: verbose,
-            printCode: printCode,
             testFrontend: testFrontend,
             forUserLibrariesOnly: forUserLibrariesOnly,
             globalIds: annotations.globalData.keys);
-        if (await checkCode(strongName, entity.uri, code, annotations,
+        if (await checkCode(trustName, entity.uri, code, annotations,
             compiledData2, dataComputer.dataValidator,
             filterActualData: filterActualData,
             fatalErrors: !testAfterFailures)) {
           hasFailures = true;
         }
       }
-      if (testOmit) {
-        if (skipForStrong.contains(name)) {
-          print(
-              '--skipped for kernel (strong mode, omit-implicit-checks)------');
-        } else {
-          print(
-              '--from kernel (strong mode, omit-implicit-checks)-------------');
-          List<String> options = [
-            Flags.omitImplicitChecks,
-            Flags.laxRuntimeTypeToString
-          ]..addAll(testOptions);
-          String marker = omitMarker;
-          if (useCFEConstants) {
-            marker = omitConstMarker;
-            options
-                .add('${Flags.enableLanguageExperiments}=constant-update-2018');
-          } else {
-            options.add(
-                '${Flags.enableLanguageExperiments}=no-constant-update-2018');
-          }
-          MemberAnnotations<IdValue> annotations = expectedMaps[marker];
-          CompiledData<T> compiledData2 = await computeData(
-              entryPoint, memorySourceFiles, dataComputer,
-              options: options,
-              verbose: verbose,
-              testFrontend: testFrontend,
-              forUserLibrariesOnly: forUserLibrariesOnly,
-              globalIds: annotations.globalData.keys);
-          if (await checkCode(omitName, entity.uri, code, annotations,
-              compiledData2, dataComputer.dataValidator,
-              filterActualData: filterActualData,
-              fatalErrors: !testAfterFailures)) {
-            hasFailures = true;
-          }
-        }
-      }
-    }
-
-    await runTests();
-    if (testCFEConstants) {
-      print('--use cfe constants---------------------------------------------');
-      await runTests(useCFEConstants: true);
     }
   }
   Expect.isFalse(hasFailures, 'Errors found.');
@@ -958,11 +926,10 @@
     }
     LibraryEntity library = elementEnvironment.lookupLibrary(mainUri);
     if (id.className != null) {
-      ClassEntity cls = elementEnvironment.lookupClass(library, id.className);
+      ClassEntity cls =
+          elementEnvironment.lookupClass(library, id.className, required: true);
       if (cls == null) {
-        // Constant expression in CFE might remove inlined parts of sources.
-        print("No class '${id.className}' in $mainUri.");
-        return NO_LOCATION_SPANNABLE;
+        throw new ArgumentError("No class '${id.className}' in $mainUri.");
       }
       MemberEntity member = elementEnvironment
           .lookupClassMember(cls, memberName, setter: isSetter);
@@ -970,9 +937,7 @@
         ConstructorEntity constructor =
             elementEnvironment.lookupConstructor(cls, memberName);
         if (constructor == null) {
-          // Constant expression in CFE might remove inlined parts of sources.
-          print("No class member '${memberName}' in $cls.");
-          return NO_LOCATION_SPANNABLE;
+          throw new ArgumentError("No class member '${memberName}' in $cls.");
         }
         return constructor;
       }
@@ -981,19 +946,16 @@
       MemberEntity member = elementEnvironment
           .lookupLibraryMember(library, memberName, setter: isSetter);
       if (member == null) {
-        // Constant expression in CFE might remove inlined parts of sources.
-        print("No member '${memberName}' in $mainUri.");
-        return NO_LOCATION_SPANNABLE;
+        throw new ArgumentError("No member '${memberName}' in $mainUri.");
       }
       return member;
     }
   } else if (id is ClassId) {
     LibraryEntity library = elementEnvironment.lookupLibrary(mainUri);
-    ClassEntity cls = elementEnvironment.lookupClass(library, id.className);
+    ClassEntity cls =
+        elementEnvironment.lookupClass(library, id.className, required: true);
     if (cls == null) {
-      // Constant expression in CFE might remove inlined parts of sources.
-      print("No class '${id.className}' in $mainUri.");
-      return NO_LOCATION_SPANNABLE;
+      throw new ArgumentError("No class '${id.className}' in $mainUri.");
     }
     return cls;
   }
@@ -1002,8 +964,6 @@
 
 const String strongMarker = 'strong.';
 const String omitMarker = 'omit.';
-const String strongConstMarker = 'strongConst.';
-const String omitConstMarker = 'omitConst.';
 
 /// Compute three [MemberAnnotations] objects from [code] specifying the
 /// expected annotations we anticipate encountering; one corresponding to the
@@ -1020,7 +980,7 @@
 /// annotations without prefixes.
 void computeExpectedMap(Uri sourceUri, AnnotatedCode code,
     Map<String, MemberAnnotations<IdValue>> maps) {
-  List<String> mapKeys = maps.keys.toList();
+  List<String> mapKeys = [strongMarker, omitMarker];
   Map<String, AnnotatedCode> split = splitByPrefixes(code, mapKeys);
 
   split.forEach((String marker, AnnotatedCode code) {
diff --git a/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart b/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart
index 27a4a61..b2eb74d 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart
@@ -3,13 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 enum Enum {
-  /*strong.element: Enum.a:constant=ConstructedConstant(Enum(_name=StringConstant("Enum.a"),index=IntConstant(0)))*/
+  /*element: Enum.a:constant=ConstructedConstant(Enum(_name=StringConstant("Enum.a"),index=IntConstant(0)))*/
   a,
 
-  /*strong.element: Enum.b:constant=ConstructedConstant(Enum(_name=StringConstant("Enum.b"),index=IntConstant(1)))*/
+  /*element: Enum.b:constant=ConstructedConstant(Enum(_name=StringConstant("Enum.b"),index=IntConstant(1)))*/
   b,
 
-  /*strong.element: Enum.c:constant=ConstructedConstant(Enum(_name=StringConstant("Enum.c"),index=IntConstant(2)))*/
+  /*element: Enum.c:constant=ConstructedConstant(Enum(_name=StringConstant("Enum.c"),index=IntConstant(2)))*/
   c,
 }
 
diff --git a/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart b/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
index a04f242..f7fd886 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
@@ -113,7 +113,7 @@
   use(c2.field13b);
 }
 
-/*strong.element: const1:constant=BoolConstant(true)*/
+/*element: const1:constant=BoolConstant(true)*/
 const bool const1 = true;
 
 class Class1 {
diff --git a/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart b/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart
index deb273c..4e0c97f 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart
@@ -134,7 +134,7 @@
 /*element: field4b:constant=IntConstant(5)*/
 var field4b = 2 + 3;
 
-/*strong.element: field4c:constant=IntConstant(5)*/
+/*element: field4c:constant=IntConstant(5)*/
 const field4c = 2 + 3;
 
 /*element: field5a:constant=FunctionConstant(method)*/
@@ -143,7 +143,7 @@
 /*element: field5b:constant=FunctionConstant(method)*/
 var field5b = method;
 
-/*strong.element: field5c:constant=FunctionConstant(method)*/
+/*element: field5c:constant=FunctionConstant(method)*/
 const field5c = method;
 
 /*element: field6a:constant=ConstructedConstant(Class())*/
diff --git a/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart b/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
index 79b4cb0..09870a6 100644
--- a/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
+++ b/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
@@ -18,7 +18,7 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('jdata'));
     await checkTests(dataDir, const JAllocatorAnalysisDataComputer(),
-        args: args, testOmit: false, testCFEConstants: true);
+        args: args, testOmit: false);
   });
 }
 
diff --git a/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart b/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart
index f6bff5f..8bf8e47 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart
@@ -7,7 +7,7 @@
   new Class2();
 }
 
-/*strong.element: const1:complexity=constant,initial=BoolConstant(true)*/
+/*element: const1:complexity=constant,initial=BoolConstant(true)*/
 const bool const1 = true;
 
 class Class1 {
diff --git a/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart b/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart
index 4096f9e..6f393ef 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart
@@ -65,7 +65,7 @@
 /*element: field1b:complexity=constant,initial=IntConstant(0)*/
 var field1b = 0;
 
-/*strong.element: field1c:complexity=constant,initial=IntConstant(0)*/
+/*element: field1c:complexity=constant,initial=IntConstant(0)*/
 const field1c = 0;
 
 /*element: field2a:complexity=constant,initial=ListConstant([])*/
@@ -74,7 +74,7 @@
 /*element: field2b:complexity=constant,initial=ListConstant([])*/
 var field2b = const [];
 
-/*strong.element: field2c:complexity=constant,initial=ListConstant([])*/
+/*element: field2c:complexity=constant,initial=ListConstant([])*/
 const field2c = const [];
 
 /*element: field3a:complexity=eager*/
@@ -125,7 +125,7 @@
 /*element: field4b:complexity=lazy,initial=IntConstant(5)*/
 var field4b = 2 + 3;
 
-/*strong.element: field4c:complexity=lazy,initial=IntConstant(5)*/
+/*element: field4c:complexity=lazy,initial=IntConstant(5)*/
 const field4c = 2 + 3;
 
 /*element: field5a:complexity=constant,initial=FunctionConstant(method)*/
@@ -134,7 +134,7 @@
 /*element: field5b:complexity=constant,initial=FunctionConstant(method)*/
 var field5b = method;
 
-/*strong.element: field5c:complexity=constant,initial=FunctionConstant(method)*/
+/*element: field5c:complexity=constant,initial=FunctionConstant(method)*/
 const field5c = method;
 
 /*element: field6a:complexity=constant,initial=ConstructedConstant(Class())*/
diff --git a/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart b/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
index 559810d..dbcfcfd 100644
--- a/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
+++ b/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
@@ -18,10 +18,7 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('kdata'));
     await checkTests(dataDir, const KAllocatorAnalysisDataComputer(),
-        args: args,
-        testOmit: false,
-        testFrontend: true,
-        testCFEConstants: true);
+        args: args, testOmit: false, testFrontend: true);
   });
 }
 
diff --git a/tests/compiler/dart2js/impact/data/async.dart b/tests/compiler/dart2js/impact/data/async.dart
index 69792ef..b8cb04a 100644
--- a/tests/compiler/dart2js/impact/data/async.dart
+++ b/tests/compiler/dart2js/impact/data/async.dart
@@ -64,7 +64,7 @@
 */
 testAsyncStar() async* {}
 
-/*element: testLocalSyncStar:
+/*strong.element: testLocalSyncStar:
  static=[
   _IterationMarker.endOfIteration(0),
   _IterationMarker.uncaughtError(1),
@@ -88,7 +88,7 @@
   return local;
 }
 
-/*element: testLocalAsync:
+/*strong.element: testLocalAsync:
  static=[
   StreamIterator.(1),
   _asyncAwait(2),
@@ -115,7 +115,7 @@
   return local;
 }
 
-/*element: testLocalAsyncStar:
+/*strong.element: testLocalAsyncStar:
  static=[
   StreamIterator.(1),
   _IterationMarker.yieldSingle(1),
@@ -142,7 +142,7 @@
   return local;
 }
 
-/*element: testAnonymousSyncStar:
+/*strong.element: testAnonymousSyncStar:
  static=[
   _IterationMarker.endOfIteration(0),
   _IterationMarker.uncaughtError(1),
@@ -165,7 +165,7 @@
   return () sync* {};
 }
 
-/*element: testAnonymousAsync:
+/*strong.element: testAnonymousAsync:
  static=[
   StreamIterator.(1),
   _asyncAwait(2),
@@ -191,7 +191,7 @@
   return () async {};
 }
 
-/*element: testAnonymousAsyncStar:
+/*strong.element: testAnonymousAsyncStar:
  static=[
   StreamIterator.(1),
   _IterationMarker.yieldSingle(1),
@@ -217,7 +217,7 @@
   return () async* {};
 }
 
-/*element: testAsyncForIn:
+/*strong.element: testAsyncForIn:
  dynamic=[
   cancel(0),
   current,
@@ -241,7 +241,7 @@
   await for (var e in o) {}
 }
 
-/*element: testAsyncForInTyped:
+/*strong.element: testAsyncForInTyped:
  dynamic=[
   cancel(0),
   current,
diff --git a/tests/compiler/dart2js/impact/data/classes.dart b/tests/compiler/dart2js/impact/data/classes.dart
index 05ee3e1..ca5fc71 100644
--- a/tests/compiler/dart2js/impact/data/classes.dart
+++ b/tests/compiler/dart2js/impact/data/classes.dart
@@ -137,7 +137,7 @@
 testForwardingConstructor() => new ForwardingConstructorClass(null);
 
 class ForwardingConstructorTypedSuperClass {
-  /*element: ForwardingConstructorTypedSuperClass.:
+  /*strong.element: ForwardingConstructorTypedSuperClass.:
    static=[Object.(0)],
    type=[inst:JSBool,param:int]
   */
@@ -154,7 +154,7 @@
 testForwardingConstructorTyped() => new ForwardingConstructorTypedClass(null);
 
 class ForwardingConstructorGenericSuperClass<T> {
-  /*element: ForwardingConstructorGenericSuperClass.:
+  /*strong.element: ForwardingConstructorGenericSuperClass.:
    static=[
     Object.(0),
     checkSubtype(4),
@@ -206,11 +206,10 @@
   A
 }
 
-/*strong.element: testEnum:static=[Enum.A]*/
-/*strongConst.element: testEnum:constant=[Enum(_name="Enum.A",index=0)]*/
+/*element: testEnum:static=[Enum.A]*/
 testEnum() => Enum.A;
 
-/*element: staticGenericMethod:
+/*strong.element: staticGenericMethod:
  static=[
   checkSubtype(4),
   checkSubtypeOfRuntimeType(2),
@@ -232,7 +231,7 @@
 */
 List<T> staticGenericMethod<T>(T arg) => [arg];
 
-/*element: testStaticGenericMethod:
+/*strong.element: testStaticGenericMethod:
   static=[staticGenericMethod<bool>(1)],
   type=[inst:JSBool]
 */
@@ -240,7 +239,7 @@
   staticGenericMethod<bool>(true);
 }
 
-/*element: testInstanceGenericMethod:
+/*strong.element: testInstanceGenericMethod:
  dynamic=[exact:GenericClass.genericMethod<bool>(1)],
  static=[
   GenericClass.generative(0),
@@ -256,7 +255,7 @@
   // ignore: UNUSED_FIELD
   final _field;
 
-  /*element: AbstractClass.:type=[inst:JSNull]*/
+  /*strong.element: AbstractClass.:type=[inst:JSNull]*/
   factory AbstractClass() => null;
 }
 
@@ -293,7 +292,7 @@
 class GenericClass<X, Y> {
   const GenericClass.generative();
 
-  /*element: GenericClass.genericMethod:
+  /*strong.element: GenericClass.genericMethod:
    static=[
     checkSubtype(4),
     checkSubtypeOfRuntimeType(2),
diff --git a/tests/compiler/dart2js/impact/data/constructors.dart b/tests/compiler/dart2js/impact/data/constructors.dart
index 78631c3..60fb2ae 100644
--- a/tests/compiler/dart2js/impact/data/constructors.dart
+++ b/tests/compiler/dart2js/impact/data/constructors.dart
@@ -104,26 +104,22 @@
   new GenericClass<dynamic, dynamic>.redirect();
 }
 
-/*strong.element: testConstRedirectingFactoryInvoke:static=[Class.generative(0)]*/
-/*strongConst.element: testConstRedirectingFactoryInvoke:constant=[Class()]*/
+/*element: testConstRedirectingFactoryInvoke:static=[Class.generative(0)]*/
 testConstRedirectingFactoryInvoke() {
   const Class.redirect();
 }
 
-/*strong.element: testConstRedirectingFactoryInvokeGeneric:static=[GenericClass.generative(0),assertIsSubtype(5),throwTypeError(1)]*/
-/*strongConst.element: testConstRedirectingFactoryInvokeGeneric:constant=[GenericClass<int, String>()]*/
+/*element: testConstRedirectingFactoryInvokeGeneric:static=[GenericClass.generative(0),assertIsSubtype(5),throwTypeError(1)]*/
 testConstRedirectingFactoryInvokeGeneric() {
   const GenericClass<int, String>.redirect();
 }
 
-/*strong.element: testConstRedirectingFactoryInvokeGenericRaw:static=[GenericClass.generative(0)]*/
-/*strongConst.element: testConstRedirectingFactoryInvokeGenericRaw:constant=[GenericClass()]*/
+/*element: testConstRedirectingFactoryInvokeGenericRaw:static=[GenericClass.generative(0)]*/
 testConstRedirectingFactoryInvokeGenericRaw() {
   const GenericClass.redirect();
 }
 
-/*strong.element: testConstRedirectingFactoryInvokeGenericDynamic:static=[GenericClass.generative(0)]*/
-/*strongConst.element: testConstRedirectingFactoryInvokeGenericDynamic:constant=[GenericClass()]*/
+/*element: testConstRedirectingFactoryInvokeGenericDynamic:static=[GenericClass.generative(0)]*/
 testConstRedirectingFactoryInvokeGenericDynamic() {
   const GenericClass<dynamic, dynamic>.redirect();
 }
@@ -135,7 +131,7 @@
 testImplicitConstructor() => new ClassImplicitConstructor();
 
 class ClassFactoryConstructor {
-  /*element: ClassFactoryConstructor.:type=[inst:JSNull]*/
+  /*strong.element: ClassFactoryConstructor.:type=[inst:JSNull]*/
   factory ClassFactoryConstructor() => null;
 }
 
@@ -146,7 +142,7 @@
   /*element: Class.generative:static=[Object.(0)]*/
   const Class.generative();
 
-  /*element: Class.fact:type=[inst:JSNull]*/
+  /*strong.element: Class.fact:type=[inst:JSNull]*/
   factory Class.fact() => null;
 
   const factory Class.redirect() = Class.generative;
@@ -156,7 +152,7 @@
   /*element: GenericClass.generative:static=[Object.(0)]*/
   const GenericClass.generative();
 
-  /*element: GenericClass.fact:type=[inst:JSBool,inst:JSNull,param:Object]*/
+  /*strong.element: GenericClass.fact:type=[inst:JSBool,inst:JSNull,param:Object]*/
   factory GenericClass.fact() => null;
 
   const factory GenericClass.redirect() = GenericClass<X, Y>.generative;
diff --git a/tests/compiler/dart2js/impact/data/initializers.dart b/tests/compiler/dart2js/impact/data/initializers.dart
index b27ae7c..d8e2fd5 100644
--- a/tests/compiler/dart2js/impact/data/initializers.dart
+++ b/tests/compiler/dart2js/impact/data/initializers.dart
@@ -29,11 +29,9 @@
 }
 
 /*strong.element: testDefaultValuesPositional:type=[inst:JSBool,param:bool]*/
-/*strongConst.element: testDefaultValuesPositional:constant=[false],type=[inst:JSBool,param:bool]*/
 testDefaultValuesPositional([bool value = false]) {}
 
 /*strong.element: testDefaultValuesNamed:type=[inst:JSBool,param:bool]*/
-/*strongConst.element: testDefaultValuesNamed:constant=[false],type=[inst:JSBool,param:bool]*/
 testDefaultValuesNamed({bool value: false}) {}
 
 class ClassFieldInitializer1 {
@@ -86,7 +84,7 @@
 
 /*element: ClassInstanceFieldWithInitializer.:static=[Object.(0)]*/
 class ClassInstanceFieldWithInitializer {
-  /*element: ClassInstanceFieldWithInitializer.field:type=[inst:JSBool,param:bool]*/
+  /*strong.element: ClassInstanceFieldWithInitializer.field:type=[inst:JSBool,param:bool]*/
   var field = false;
 }
 
@@ -95,7 +93,7 @@
 
 /*element: ClassInstanceFieldTyped.:static=[Object.(0)]*/
 class ClassInstanceFieldTyped {
-  /*element: ClassInstanceFieldTyped.field:type=[inst:JSBool,inst:JSNull,param:int]*/
+  /*strong.element: ClassInstanceFieldTyped.field:type=[inst:JSBool,inst:JSNull,param:int]*/
   int field;
 }
 
@@ -122,7 +120,7 @@
 testSuperInitializer() => new ClassSuperInitializer();
 
 class ClassGeneric<T> {
-  /*element: ClassGeneric.:
+  /*strong.element: ClassGeneric.:
    static=[
     Object.(0),
     checkSubtype(4),
diff --git a/tests/compiler/dart2js/impact/data/injected_cast.dart b/tests/compiler/dart2js/impact/data/injected_cast.dart
index d1f6e23..526414c 100644
--- a/tests/compiler/dart2js/impact/data/injected_cast.dart
+++ b/tests/compiler/dart2js/impact/data/injected_cast.dart
@@ -54,8 +54,7 @@
 
 /*element: Class3.:static=[Object.(0)]*/
 class Class3 {
-  /*strong.element: Class3.method3:type=[inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
-  /*strongConst.element: Class3.method3:constant=[null],type=[inst:JSBool,param:A,param:B,param:C]*/
+  /*element: Class3.method3:type=[inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
   method3(A a, [B b, C c]) {}
 }
 
@@ -75,13 +74,9 @@
 
 /*element: Class4.:static=[Object.(0)]*/
 class Class4 {
-  /*strong.element: Class4.method4:
+  /*element: Class4.method4:
    type=[inst:JSBool,inst:JSNull,param:A,param:B,param:C]
   */
-  /*strongConst.element: Class4.method4:
-    constant=[null],
-    type=[inst:JSBool,param:A,param:B,param:C]
-  */
   method4(A a, {B b, C c}) {}
 }
 
@@ -101,19 +96,7 @@
 
 /*element: Class5.:static=[Object.(0)]*/
 class Class5<T1, T2> {
-  /*strong.element: Class5.method5:
-   static=*,
-   type=[
-    inst:*,
-    param:C,
-    param:Class5.T1,
-    param:Class5.T2,
-    param:Object,
-    param:method5.S1,
-    param:method5.S2]
-  */
-  /*strongConst.element: Class5.method5:
-   constant=[null],
+  /*element: Class5.method5:
    static=*,
    type=[
     inst:*,
@@ -146,19 +129,7 @@
 
 /*element: Class6.:static=[Object.(0)]*/
 class Class6<T1, T2> {
-  /*strong.element: Class6.method6:
-   static=*,
-   type=[
-    inst:*,
-    param:C,
-    param:Class6.T1,
-    param:Class6.T2,
-    param:Object,
-    param:method6.S1,
-    param:method6.S2]
-  */
-  /*strongConst.element: Class6.method6:
-   constant=[null],
+  /*element: Class6.method6:
    static=*,
    type=[
     inst:*,
diff --git a/tests/compiler/dart2js/impact/data/invokes.dart b/tests/compiler/dart2js/impact/data/invokes.dart
index 3a3d115..aa2b472 100644
--- a/tests/compiler/dart2js/impact/data/invokes.dart
+++ b/tests/compiler/dart2js/impact/data/invokes.dart
@@ -78,12 +78,10 @@
 /*element: topLevelFunction1:*/
 topLevelFunction1(a) {}
 
-/*strong.element: topLevelFunction2:type=[inst:JSNull]*/
-/*strongConst.element: topLevelFunction2:constant=[null]*/
+/*element: topLevelFunction2:type=[inst:JSNull]*/
 topLevelFunction2(a, [b, c]) {}
 
-/*strong.element: topLevelFunction3:type=[inst:JSNull]*/
-/*strongConst.element: topLevelFunction3:constant=[null]*/
+/*element: topLevelFunction3:type=[inst:JSNull]*/
 topLevelFunction3(a, {b, c}) {}
 
 /*element: testTopLevelInvoke:
@@ -117,7 +115,7 @@
   topLevelFunction3(15, c: 16, b: 17);
 }
 
-/*element: topLevelFunction1Typed:type=[inst:JSBool,param:int]*/
+/*strong.element: topLevelFunction1Typed:type=[inst:JSBool,param:int]*/
 void topLevelFunction1Typed(int a) {}
 
 /*strong.element: topLevelFunction2Typed:
@@ -128,15 +126,6 @@
   param:double,
   param:num]
 */
-/*strongConst.element: topLevelFunction2Typed:
- constant=[null],
- type=[
-  inst:JSBool,
-  inst:JSNull,
-  param:String,
-  param:double,
-  param:num]
-*/
 int topLevelFunction2Typed(String a, [num b, double c]) => null;
 
 /*strong.element: topLevelFunction3Typed:
@@ -159,32 +148,11 @@
   param:Map<String,bool>,
   param:bool]
 */
-/*strongConst.element: topLevelFunction3Typed:
- constant=[null],
- static=[
-  checkSubtype(4),
-  getRuntimeTypeArgument(3),
-  getRuntimeTypeArgumentIntercepted(4),
-  getRuntimeTypeInfo(1),
-  getTypeArgumentByIndex(2),
-  setRuntimeTypeInfo(2)],
- type=[
-  inst:JSArray<dynamic>,
-  inst:JSBool,
-  inst:JSExtendableArray<dynamic>,
-  inst:JSFixedArray<dynamic>,
-  inst:JSMutableArray<dynamic>,
-  inst:JSNull,
-  inst:JSUnmodifiableArray<dynamic>,
-  param:List<int>,
-  param:Map<String,bool>,
-  param:bool]
-*/
 double topLevelFunction3Typed(bool a, {List<int> b, Map<String, bool> c}) {
   return null;
 }
 
-/*element: testTopLevelInvokeTyped:
+/*strong.element: testTopLevelInvokeTyped:
  static=[
   topLevelFunction1Typed(1),
   topLevelFunction2Typed(1),
@@ -220,7 +188,7 @@
   topLevelFunction3Typed(false, c: {'16': false}, b: [17]);
 }
 
-/*element: topLevelFunctionTyped1:
+/*strong.element: topLevelFunctionTyped1:
  static=[
   checkSubtype(4),
   getRuntimeTypeArgument(3),
@@ -239,7 +207,7 @@
 */
 topLevelFunctionTyped1(void a(num b)) {}
 
-/*element: topLevelFunctionTyped2:
+/*strong.element: topLevelFunctionTyped2:
  static=[
   checkSubtype(4),
   getRuntimeTypeArgument(3),
@@ -258,7 +226,7 @@
 */
 topLevelFunctionTyped2(void a(num b, [String c])) {}
 
-/*element: topLevelFunctionTyped3:
+/*strong.element: topLevelFunctionTyped3:
  static=[
   checkSubtype(4),
   getRuntimeTypeArgument(3),
@@ -277,7 +245,7 @@
 */
 topLevelFunctionTyped3(void a(num b, {String c, int d})) {}
 
-/*element: topLevelFunctionTyped4:
+/*strong.element: topLevelFunctionTyped4:
  static=[
   checkSubtype(4),
   getRuntimeTypeArgument(3),
@@ -311,8 +279,7 @@
   topLevelFunctionTyped4(null);
 }
 
-/*strong.element: testTopLevelFunctionGet:static=[topLevelFunction1]*/
-/*strongConst.element: testTopLevelFunctionGet:constant=[topLevelFunction1]*/
+/*element: testTopLevelFunctionGet:static=[topLevelFunction1]*/
 testTopLevelFunctionGet() => topLevelFunction1;
 
 /*element: topLevelGetter:type=[inst:JSNull]*/
@@ -321,7 +288,7 @@
 /*element: testTopLevelGetterGet:static=[topLevelGetter]*/
 testTopLevelGetterGet() => topLevelGetter;
 
-/*element: topLevelGetterTyped:type=[inst:JSNull]*/
+/*strong.element: topLevelGetterTyped:type=[inst:JSNull]*/
 int get topLevelGetterTyped => null;
 
 /*element: testTopLevelGetterGetTyped:static=[topLevelGetterTyped]*/
@@ -333,7 +300,7 @@
 /*element: testTopLevelSetterSet:static=[set:topLevelSetter],type=[inst:JSNull]*/
 testTopLevelSetterSet() => topLevelSetter = null;
 
-/*element: topLevelSetterTyped=:type=[inst:JSBool,param:int]*/
+/*strong.element: topLevelSetterTyped=:type=[inst:JSBool,param:int]*/
 void set topLevelSetterTyped(int value) {}
 
 /*element: testTopLevelSetterSetTyped:static=[set:topLevelSetterTyped],type=[inst:JSNull]*/
@@ -351,11 +318,10 @@
 /*element: testTopLevelFieldLazy:static=[topLevelFieldLazy]*/
 testTopLevelFieldLazy() => topLevelFieldLazy;
 
-/*strong.element: topLevelFieldConst:type=[inst:JSNull]*/
+/*element: topLevelFieldConst:type=[inst:JSNull]*/
 const topLevelFieldConst = null;
 
-/*strong.element: testTopLevelFieldConst:static=[topLevelFieldConst]*/
-/*strongConst.element: testTopLevelFieldConst:constant=[null]*/
+/*element: testTopLevelFieldConst:static=[topLevelFieldConst]*/
 testTopLevelFieldConst() => topLevelFieldConst;
 
 /*element: topLevelFieldFinal:static=[throwCyclicInit(1),topLevelFunction1(1)],type=[inst:JSNull]*/
@@ -364,25 +330,25 @@
 /*element: testTopLevelFieldFinal:static=[topLevelFieldFinal]*/
 testTopLevelFieldFinal() => topLevelFieldFinal;
 
-/*element: topLevelFieldTyped:type=[inst:JSBool,inst:JSNull,param:int]*/
+/*strong.element: topLevelFieldTyped:type=[inst:JSBool,inst:JSNull,param:int]*/
 int topLevelFieldTyped;
 
 /*element: testTopLevelFieldTyped:static=[topLevelFieldTyped]*/
 testTopLevelFieldTyped() => topLevelFieldTyped;
 
-/*element: topLevelFieldGeneric1:type=[inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
+/*strong.element: topLevelFieldGeneric1:type=[inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
 GenericClass topLevelFieldGeneric1;
 
 /*element: testTopLevelFieldGeneric1:static=[topLevelFieldGeneric1]*/
 testTopLevelFieldGeneric1() => topLevelFieldGeneric1;
 
-/*element: topLevelFieldGeneric2:type=[inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
+/*strong.element: topLevelFieldGeneric2:type=[inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
 GenericClass<dynamic, dynamic> topLevelFieldGeneric2;
 
 /*element: testTopLevelFieldGeneric2:static=[topLevelFieldGeneric2]*/
 testTopLevelFieldGeneric2() => topLevelFieldGeneric2;
 
-/*element: topLevelFieldGeneric3:
+/*strong.element: topLevelFieldGeneric3:
  static=[
   checkSubtype(4),
   getRuntimeTypeArgument(3),
@@ -413,8 +379,7 @@
   static foo() {}
 }
 
-/*strong.element: testStaticFunctionGet:static=[StaticFunctionGetClass.foo]*/
-/*strongConst.element: testStaticFunctionGet:constant=[StaticFunctionGetClass.foo]*/
+/*element: testStaticFunctionGet:static=[StaticFunctionGetClass.foo]*/
 testStaticFunctionGet() => StaticFunctionGetClass.foo;
 
 /*element: testDynamicInvoke:
@@ -491,7 +456,7 @@
   var l = 42;
 }
 
-/*element: testLocalWithInitializerTyped:
+/*strong.element: testLocalWithInitializerTyped:
  type=[
   inst:JSDouble,
   inst:JSInt,
@@ -505,7 +470,7 @@
   int l = 42;
 }
 
-/*element: testLocalFunction:
+/*strong.element: testLocalFunction:
  static=[
   computeSignature(3),
   def:localFunction,
@@ -525,7 +490,7 @@
   localFunction() {}
 }
 
-/*element: testLocalFunctionTyped:
+/*strong.element: testLocalFunctionTyped:
  static=[
   computeSignature(3),
   def:localFunction,
@@ -546,7 +511,7 @@
   int localFunction(String a) => null;
 }
 
-/*element: testLocalFunctionInvoke:
+/*strong.element: testLocalFunctionInvoke:
  dynamic=[call(0)],
  static=[computeSignature(3),
   def:localFunction,
@@ -565,7 +530,7 @@
   localFunction();
 }
 
-/*element: testLocalFunctionGet:static=[computeSignature(3),
+/*strong.element: testLocalFunctionGet:static=[computeSignature(3),
   def:localFunction,
   getRuntimeTypeArguments(3),
   getRuntimeTypeInfo(1),
@@ -581,7 +546,7 @@
   localFunction;
 }
 
-/*element: testClosure:static=[computeSignature(3),
+/*strong.element: testClosure:static=[computeSignature(3),
   def:<anonymous>,
   getRuntimeTypeArguments(3),
   getRuntimeTypeInfo(1),
@@ -596,7 +561,7 @@
   () {};
 }
 
-/*element: testClosureInvoke:
+/*strong.element: testClosureInvoke:
  dynamic=[call(0)],
  static=[computeSignature(3),
   def:<anonymous>,
@@ -637,14 +602,10 @@
 */
 testInvokeIndexSet(o) => o[42] = null;
 
-/*strong.element: testDynamicPrivateMethodInvoke:
+/*element: testDynamicPrivateMethodInvoke:
  dynamic=[_privateMethod(0),call(0)],
  type=[inst:JSNull]
 */
-/*strongConst.element: testDynamicPrivateMethodInvoke:
- constant=[null],
- dynamic=[_privateMethod(0),call(0)]
-*/
 testDynamicPrivateMethodInvoke([o]) => o._privateMethod();
 
 class GenericClass<X, Y> {}
diff --git a/tests/compiler/dart2js/impact/data/jsinterop.dart b/tests/compiler/dart2js/impact/data/jsinterop.dart
index e6e9adf..8e77d6ac 100644
--- a/tests/compiler/dart2js/impact/data/jsinterop.dart
+++ b/tests/compiler/dart2js/impact/data/jsinterop.dart
@@ -7,19 +7,14 @@
 
 import 'package:js/js.dart';
 
-/*element: main:
- static=[
-  testJsInteropClass(0),
-  testJsInteropMethod(0),
-  testOptionalGenericFunctionTypeArgument(0)]
-*/
+/*element: main:static=[testJsInteropClass(0),testJsInteropMethod(0),testOptionalGenericFunctionTypeArgument(0)]*/
 main() {
   testOptionalGenericFunctionTypeArgument();
   testJsInteropMethod();
   testJsInteropClass();
 }
 
-/*element: testJsInteropMethod:*/
+/*strong.element: testJsInteropMethod:*/
 @JS()
 external int testJsInteropMethod();
 
@@ -28,7 +23,7 @@
   /*element: JsInteropClass.:static=[JavaScriptObject.(0)]*/
   external JsInteropClass();
 
-  /*element: JsInteropClass.method:
+  /*strong.element: JsInteropClass.method:
    type=[
     native:ApplicationCacheErrorEvent,
     native:DomError,
@@ -48,7 +43,7 @@
   external double method();
 }
 
-/*element: testJsInteropClass:
+/*strong.element: testJsInteropClass:
  dynamic=[JavaScriptObject.method(0)],
  static=[JsInteropClass.(0)]
 */
@@ -77,28 +72,10 @@
     inst:JSUnmodifiableArray<dynamic>,
     param:void Function(GenericClass.T)]
   */
-  /*strongConst.element: GenericClass.method:
-   constant=[null],
-   static=[
-    checkSubtype(4),
-    getRuntimeTypeArgument(3),
-    getRuntimeTypeArgumentIntercepted(4),
-    getRuntimeTypeInfo(1),
-    getTypeArgumentByIndex(2),
-    setRuntimeTypeInfo(2)],
-   type=[
-    inst:JSArray<dynamic>,
-    inst:JSBool,
-    inst:JSExtendableArray<dynamic>,
-    inst:JSFixedArray<dynamic>,
-    inst:JSMutableArray<dynamic>,
-    inst:JSUnmodifiableArray<dynamic>,
-    param:void Function(GenericClass.T)]
-  */
   external GenericClass method([Callback<T> callback]);
 }
 
-/*element: testOptionalGenericFunctionTypeArgument:
+/*strong.element: testOptionalGenericFunctionTypeArgument:
  dynamic=[JavaScriptObject.method(0)],
  static=[GenericClass.(0)]
 */
diff --git a/tests/compiler/dart2js/impact/data/literals.dart b/tests/compiler/dart2js/impact/data/literals.dart
index 0c1710d..925896a0 100644
--- a/tests/compiler/dart2js/impact/data/literals.dart
+++ b/tests/compiler/dart2js/impact/data/literals.dart
@@ -86,11 +86,10 @@
 */
 testStringInterpolation() => '${true}';
 
-/*strong.element: testStringInterpolationConst:
+/*element: testStringInterpolationConst:
  dynamic=[toString(0)],
  static=[S(1)],type=[inst:JSBool,inst:JSString]
 */
-/*strongConst.element: testStringInterpolationConst:constant=["true"]*/
 testStringInterpolationConst() {
   const b = '${true}';
   return b;
@@ -103,15 +102,13 @@
 */
 testStringJuxtaposition() => 'a' 'b';
 
-/*strong.element: testSymbol:static=[Symbol.(1)],type=[inst:Symbol]*/
-/*strongConst.element: testSymbol:constant=[Symbol(_name="main")]*/
+/*element: testSymbol:static=[Symbol.(1)],type=[inst:Symbol]*/
 testSymbol() => #main;
 
-/*strong.element: testConstSymbol:
+/*element: testConstSymbol:
  static=[Symbol.(1),Symbol.(1),Symbol.validated(1)],
  type=[inst:JSString,inst:Symbol]
 */
-/*strongConst.element: testConstSymbol:constant=[Symbol(_name="main")]*/
 testConstSymbol() => const Symbol('main');
 
 /*strong.element: complexSymbolField1:
@@ -193,15 +190,13 @@
  static=[Symbol.(1),Symbol.(1),Symbol.validated(1),complexSymbolField],
  type=[impl:String,inst:JSBool,inst:Symbol]
 */
-/*strongConst.element: testComplexConstSymbol:constant=[Symbol(_name="truefalsetruenull")]*/
 testComplexConstSymbol() => const Symbol(complexSymbolField);
 
-/*strong.element: testIfNullConstSymbol:
+/*element: testIfNullConstSymbol:
  dynamic=[Null.==],
  static=[Symbol.(1),Symbol.(1),Symbol.validated(1)],
  type=[inst:JSNull,inst:JSString,inst:Symbol]
 */
-/*strongConst.element: testIfNullConstSymbol:constant=[Symbol(_name="foo")]*/
 testIfNullConstSymbol() => const Symbol(null ?? 'foo');
 
 /*element: testTypeLiteral:
@@ -210,8 +205,7 @@
 */
 testTypeLiteral() => Object;
 
-/*strong.element: testBoolFromEnvironment:static=[bool.fromEnvironment(1)],type=[inst:JSString]*/
-/*strongConst.element: testBoolFromEnvironment:constant=[false]*/
+/*element: testBoolFromEnvironment:static=[bool.fromEnvironment(1)],type=[inst:JSString]*/
 testBoolFromEnvironment() => const bool.fromEnvironment('FOO');
 
 /*element: testEmptyListLiteral:type=[inst:List<dynamic>]*/
@@ -220,14 +214,13 @@
 /*element: testEmptyListLiteralDynamic:type=[inst:List<dynamic>]*/
 testEmptyListLiteralDynamic() => <dynamic>[];
 
-/*element: testEmptyListLiteralTyped:type=[inst:List<String>]*/
+/*strong.element: testEmptyListLiteralTyped:type=[inst:List<String>]*/
 testEmptyListLiteralTyped() => <String>[];
 
-/*strong.element: testEmptyListLiteralConstant:type=[inst:List<dynamic>]*/
-/*strongConst.element: testEmptyListLiteralConstant:constant=[[]]*/
+/*element: testEmptyListLiteralConstant:type=[inst:List<dynamic>]*/
 testEmptyListLiteralConstant() => const [];
 
-/*element: testNonEmptyListLiteral:type=[inst:JSBool,inst:List<bool>]*/
+/*strong.element: testNonEmptyListLiteral:type=[inst:JSBool,inst:List<bool>]*/
 testNonEmptyListLiteral() => [true];
 
 /*element: testEmptyMapLiteral:type=[inst:Map<dynamic,dynamic>]*/
@@ -236,22 +229,21 @@
 /*element: testEmptyMapLiteralDynamic:type=[inst:Map<dynamic,dynamic>]*/
 testEmptyMapLiteralDynamic() => <dynamic, dynamic>{};
 
-/*element: testEmptyMapLiteralTyped:type=[inst:Map<String,int>]*/
+/*strong.element: testEmptyMapLiteralTyped:type=[inst:Map<String,int>]*/
 testEmptyMapLiteralTyped() => <String, int>{};
 
-/*strong.element: testEmptyMapLiteralConstant:
+/*element: testEmptyMapLiteralConstant:
 type=[
  inst:ConstantMap<dynamic,dynamic>,
  inst:ConstantProtoMap<dynamic,dynamic>,
  inst:ConstantStringMap<dynamic,dynamic>,
  inst:GeneralConstantMap<dynamic,dynamic>]*/
-/*strongConst.element: testEmptyMapLiteralConstant:constant=[{}]*/
 testEmptyMapLiteralConstant() => const {};
 
-/*element: testNonEmptyMapLiteral:type=[inst:JSBool,inst:JSNull,inst:Map<Null,bool>]*/
+/*strong.element: testNonEmptyMapLiteral:type=[inst:JSBool,inst:JSNull,inst:Map<Null,bool>]*/
 testNonEmptyMapLiteral() => {null: true};
 
 class GenericClass<X, Y> {
-  /*strong.element: GenericClass.generative:static=[Object.(0)]*/
+  /*element: GenericClass.generative:static=[Object.(0)]*/
   const GenericClass.generative();
 }
diff --git a/tests/compiler/dart2js/impact/data/native.dart b/tests/compiler/dart2js/impact/data/native.dart
index 2e67bb6..b314794 100644
--- a/tests/compiler/dart2js/impact/data/native.dart
+++ b/tests/compiler/dart2js/impact/data/native.dart
@@ -22,7 +22,7 @@
   testNativeMethodReturns();
 }
 
-/*element: testJSCall:
+/*strong.element: testJSCall:
  static=[JS<dynamic>(3)],
  type=[inst:JSNull,inst:JSString,native:bool,native:int]
 */
@@ -68,10 +68,6 @@
     native:int,
     param:Object]
   */
-  // TODO(johnniwinther): The metadata is defined in dart:html_common and
-  // therefore derived from platform.dill which doesn't currently include IR
-  // constants.
-  /*strongConst.element: NativeClass.field:type=[inst:JSBool,inst:JSNull,param:Object]*/
   @annotation_Creates_SerializedScriptValue
   final Object field;
 
@@ -80,7 +76,7 @@
   }
 }
 
-/*element: testNativeField:
+/*strong.element: testNativeField:
  dynamic=[NativeClass.field],
  static=[defineProperty(3)],
  type=[inst:JSBool,param:NativeClass]
diff --git a/tests/compiler/dart2js/impact/data/statements.dart b/tests/compiler/dart2js/impact/data/statements.dart
index 5385f1c..4603006 100644
--- a/tests/compiler/dart2js/impact/data/statements.dart
+++ b/tests/compiler/dart2js/impact/data/statements.dart
@@ -65,7 +65,7 @@
     return 1;
 }
 
-/*element: testForIn:
+/*strong.element: testForIn:
  dynamic=[
   current,
   iterator,
@@ -82,7 +82,7 @@
   for (var e in o) {}
 }
 
-/*element: testForInTyped:
+/*strong.element: testForInTyped:
  dynamic=[
   current,
   iterator,
@@ -142,21 +142,7 @@
   try {} finally {}
 }
 
-/*strong.element: testSwitchWithoutFallthrough:
- static=[
-  throwExpression(1),
-  wrapException(1)],
- type=[
-  inst:JSDouble,
-  inst:JSInt,
-  inst:JSNumber,
-  inst:JSPositiveInt,
-  inst:JSString,
-  inst:JSUInt31,
-  inst:JSUInt32]
-*/
-/*strongConst.element: testSwitchWithoutFallthrough:
- constant=[0,1,2,3,4],
+/*element: testSwitchWithoutFallthrough:
  static=[
   throwExpression(1),
   wrapException(1)],
diff --git a/tests/compiler/dart2js/impact/impact_test.dart b/tests/compiler/dart2js/impact/impact_test.dart
index 54694cd..1237e4c 100644
--- a/tests/compiler/dart2js/impact/impact_test.dart
+++ b/tests/compiler/dart2js/impact/impact_test.dart
@@ -30,10 +30,7 @@
     print('==================================================================');
     useImpactDataForTesting = true;
     await checkTests(dataDir, const ImpactDataComputer(),
-        args: args,
-        testOmit: false,
-        testFrontend: true,
-        testCFEConstants: true);
+        args: args, testOmit: false, testFrontend: true);
   });
 }
 
