Emit a diagnostic telling the amount of non-startup code in startup dex

Bug: b/298617875
Change-Id: I2babb7ddeb5a884e064cc6de02e9d2a3415889f6
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index 72c0e2a..e0b77cb 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.dex;
 
+import static com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic.Factory.createStartupClassesNonStartupFractionDiagnostic;
 import static com.android.tools.r8.errors.StartupClassesOverflowDiagnostic.Factory.createStartupClassesOverflowDiagnostic;
 import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
 import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
@@ -1397,6 +1398,7 @@
     private final DexItemFactory dexItemFactory;
     private final InternalOptions options;
     private final VirtualFileCycler cycler;
+    private final StartupProfile startupProfile;
 
     PackageSplitPopulator(
         List<VirtualFile> files,
@@ -1412,6 +1414,7 @@
       this.dexItemFactory = appView.dexItemFactory();
       this.options = appView.options();
       this.cycler = new VirtualFileCycler(files, filesForDistribution, appView, nextFileId);
+      this.startupProfile = startupProfile;
     }
 
     static boolean coveredByPrefix(String originalName, String currentPrefix) {
@@ -1474,6 +1477,10 @@
             createStartupClassesOverflowDiagnostic(cycler.filesForDistribution.size()));
       }
 
+      options.reporter.info(
+          createStartupClassesNonStartupFractionDiagnostic(
+              classPartioning.getStartupClasses(), startupProfile));
+
       if (options.getStartupOptions().isMinimalStartupDexEnabled()) {
         cycler.clearFilesForDistribution();
       } else {
diff --git a/src/main/java/com/android/tools/r8/errors/StartupClassesNonStartupFractionDiagnostic.java b/src/main/java/com/android/tools/r8/errors/StartupClassesNonStartupFractionDiagnostic.java
new file mode 100644
index 0000000..e024130
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/errors/StartupClassesNonStartupFractionDiagnostic.java
@@ -0,0 +1,131 @@
+// Copyright (c) 2023, the R8 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.
+
+package com.android.tools.r8.errors;
+
+import com.android.tools.r8.Diagnostic;
+import com.android.tools.r8.Keep;
+import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.Position;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
+import it.unimi.dsi.fastutil.ints.Int2IntMap;
+import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
+import java.util.List;
+
+@Keep
+public class StartupClassesNonStartupFractionDiagnostic implements Diagnostic {
+
+  private final int numberOfStartupClasses;
+  private final int numberOfStartupMethods;
+  private final int numberOfNonStartupMethods;
+
+  private final Int2IntMap numberOfStartupClassesByNumberOfStartupMethods;
+
+  StartupClassesNonStartupFractionDiagnostic(
+      int numberOfStartupClasses,
+      int numberOfStartupMethods,
+      int numberOfNonStartupMethods,
+      Int2IntMap numberOfStartupClassesByNumberOfStartupMethods) {
+    this.numberOfStartupClasses = numberOfStartupClasses;
+    this.numberOfStartupMethods = numberOfStartupMethods;
+    this.numberOfNonStartupMethods = numberOfNonStartupMethods;
+    this.numberOfStartupClassesByNumberOfStartupMethods =
+        numberOfStartupClassesByNumberOfStartupMethods;
+  }
+
+  @Override
+  public Origin getOrigin() {
+    return Origin.unknown();
+  }
+
+  @Override
+  public Position getPosition() {
+    return Position.UNKNOWN;
+  }
+
+  @Override
+  public String getDiagnosticMessage() {
+    return String.format(
+        "Startup DEX files contains %d classes and %d methods of which %d (%d%%) are non-startup "
+            + "methods. Distribution of classes by their number of startup methods:\n"
+            + "0: %d classes\n"
+            + "1: %d classes\n"
+            + "2-3: %d classes\n"
+            + "4-5: %d classes\n"
+            + "6-10: %d classes\n"
+            + "11+: %d classes\n",
+        numberOfStartupClasses,
+        numberOfStartupMethods + numberOfNonStartupMethods,
+        numberOfNonStartupMethods,
+        Math.round(
+            (((double) numberOfNonStartupMethods)
+                    / (numberOfStartupMethods + numberOfNonStartupMethods))
+                * 100.0),
+        numberOfStartupClassesByNumberOfStartupMethods.get(0),
+        numberOfStartupClassesByNumberOfStartupMethods.get(1),
+        numberOfStartupClassesByNumberOfStartupMethods.get(2)
+            + numberOfStartupClassesByNumberOfStartupMethods.get(3),
+        numberOfStartupClassesByNumberOfStartupMethods.get(4)
+            + numberOfStartupClassesByNumberOfStartupMethods.get(5),
+        numberOfStartupClassesByNumberOfStartupMethods.get(6)
+            + numberOfStartupClassesByNumberOfStartupMethods.get(7)
+            + numberOfStartupClassesByNumberOfStartupMethods.get(8)
+            + numberOfStartupClassesByNumberOfStartupMethods.get(9)
+            + numberOfStartupClassesByNumberOfStartupMethods.get(10),
+        numberOfStartupClassesByNumberOfStartupMethods.int2IntEntrySet().stream()
+            .map(entry -> entry.getIntKey() > 10 ? entry.getIntValue() : 0)
+            .reduce(0, Integer::sum));
+  }
+
+  // Public factory to keep the constructor of the diagnostic out of the public API.
+  public static class Factory {
+
+    public static StartupClassesNonStartupFractionDiagnostic
+        createStartupClassesNonStartupFractionDiagnostic(
+            List<DexProgramClass> startupClasses, StartupProfile startupProfile) {
+      assert !startupClasses.isEmpty();
+      assert !startupProfile.isEmpty();
+      int numberOfStartupClasses = startupClasses.size();
+      int numberOfStartupMethods = 0;
+      int numberOfNonStartupMethods = 0;
+      Int2IntMap numberOfStartupClassesByNumberOfStartupMethods = new Int2IntOpenHashMap();
+      numberOfStartupClassesByNumberOfStartupMethods.defaultReturnValue(0);
+      for (DexProgramClass clazz : startupClasses) {
+        assert startupProfile.isStartupClass(clazz.getType());
+        int numberOfStartupMethodsInClass = 0;
+        for (DexEncodedMethod method : clazz.methods()) {
+          if (startupProfile.containsMethodRule(method.getReference())) {
+            numberOfStartupMethodsInClass++;
+          } else {
+            numberOfNonStartupMethods++;
+          }
+        }
+        numberOfStartupMethods += numberOfStartupMethodsInClass;
+        numberOfStartupClassesByNumberOfStartupMethods.put(
+            numberOfStartupMethodsInClass,
+            numberOfStartupClassesByNumberOfStartupMethods.get(numberOfStartupMethodsInClass) + 1);
+      }
+      return createStartupClassesNonStartupFractionDiagnostic(
+          numberOfStartupClasses,
+          numberOfStartupMethods,
+          numberOfNonStartupMethods,
+          numberOfStartupClassesByNumberOfStartupMethods);
+    }
+
+    public static StartupClassesNonStartupFractionDiagnostic
+        createStartupClassesNonStartupFractionDiagnostic(
+            int numberOfStartupClasses,
+            int numberOfStartupMethods,
+            int numberOfNonStartupMethods,
+            Int2IntMap numberOfStartupClassesByNumberOfStartupMethods) {
+      return new StartupClassesNonStartupFractionDiagnostic(
+          numberOfStartupClasses,
+          numberOfStartupMethods,
+          numberOfNonStartupMethods,
+          numberOfStartupClassesByNumberOfStartupMethods);
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java
index a2d7c56..ed922db 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java
@@ -4,9 +4,12 @@
 
 package com.android.tools.r8.classmerging.horizontal;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
+
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
@@ -82,9 +85,14 @@
                 return Origin.unknown();
               }
             })
+        .allowDiagnosticInfoMessages()
         .enableInliningAnnotations()
         .setMinApi(parameters)
         .compile()
+        .inspectDiagnosticMessages(
+            diagnostics ->
+                diagnostics.assertInfosMatch(
+                    diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("StartupA", "StartupB");
   }
diff --git a/src/test/java/com/android/tools/r8/startup/DuplicateDescriptorsInStartupProfileTest.java b/src/test/java/com/android/tools/r8/startup/DuplicateDescriptorsInStartupProfileTest.java
index 668c2a3..e477b40 100644
--- a/src/test/java/com/android/tools/r8/startup/DuplicateDescriptorsInStartupProfileTest.java
+++ b/src/test/java/com/android/tools/r8/startup/DuplicateDescriptorsInStartupProfileTest.java
@@ -4,12 +4,14 @@
 
 package com.android.tools.r8.startup;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.Reference;
@@ -44,6 +46,7 @@
     testForR8(Backend.DEX)
         .addInnerClasses(getClass())
         .addKeepAllClassesRule()
+        .allowDiagnosticMessages()
         .apply(
             testBuilder ->
                 StartupTestingUtils.addStartupProfile(
@@ -74,6 +77,10 @@
                             .build())))
         .setMinApi(AndroidApiLevel.L)
         .compile()
+        .inspectDiagnosticMessages(
+            diagnostics ->
+                diagnostics.assertInfosMatch(
+                    diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
         .inspectMultiDex(
             primaryInspector -> assertThat(primaryInspector.clazz(Main.class), isPresent()),
             secondaryInspector ->
diff --git a/src/test/java/com/android/tools/r8/startup/ForceInlineAfterVerticalClassMergingStartupTest.java b/src/test/java/com/android/tools/r8/startup/ForceInlineAfterVerticalClassMergingStartupTest.java
index b3951cc..2afd17f 100644
--- a/src/test/java/com/android/tools/r8/startup/ForceInlineAfterVerticalClassMergingStartupTest.java
+++ b/src/test/java/com/android/tools/r8/startup/ForceInlineAfterVerticalClassMergingStartupTest.java
@@ -4,10 +4,12 @@
 
 package com.android.tools.r8.startup;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.startup.profile.ExternalStartupClass;
 import com.android.tools.r8.startup.profile.ExternalStartupItem;
@@ -55,9 +57,14 @@
         .addKeepMainRule(Main.class)
         .addVerticallyMergedClassesInspector(
             inspector -> inspector.assertMergedIntoSubtype(A.class))
+        .allowDiagnosticInfoMessages()
         .apply(testBuilder -> StartupTestingUtils.addStartupProfile(testBuilder, startupProfile))
         .setMinApi(parameters)
         .compile()
+        .inspectDiagnosticMessages(
+            diagnostics ->
+                diagnostics.assertInfosMatch(
+                    diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("B");
   }
diff --git a/src/test/java/com/android/tools/r8/startup/InliningOutOfStartupPartitionTest.java b/src/test/java/com/android/tools/r8/startup/InliningOutOfStartupPartitionTest.java
index ba065b7..ca5a25d 100644
--- a/src/test/java/com/android/tools/r8/startup/InliningOutOfStartupPartitionTest.java
+++ b/src/test/java/com/android/tools/r8/startup/InliningOutOfStartupPartitionTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.startup;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -11,6 +12,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.startup.profile.ExternalStartupClass;
 import com.android.tools.r8.startup.profile.ExternalStartupItem;
@@ -50,6 +52,7 @@
     testForR8(parameters.getBackend())
         .addInnerClasses(getClass())
         .addKeepMainRule(Main.class)
+        .allowDiagnosticInfoMessages()
         .apply(testBuilder -> StartupTestingUtils.addStartupProfile(testBuilder, startupItems))
         .setMinApi(parameters)
         .compile()
@@ -68,6 +71,10 @@
                   postStartupClassSubject.uniqueMethodWithOriginalName("runPostStartup"),
                   isPresent());
             })
+        .inspectDiagnosticMessages(
+            diagnostics ->
+                diagnostics.assertInfosMatch(
+                    diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Hello, world!");
   }
diff --git a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexFromStartupMethodRuleTest.java b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexFromStartupMethodRuleTest.java
index 20e850f..cbe1eb7 100644
--- a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexFromStartupMethodRuleTest.java
+++ b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexFromStartupMethodRuleTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.startup;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
 
@@ -11,6 +12,7 @@
 import com.android.tools.r8.TestCompilerBuilder;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
 import com.android.tools.r8.startup.profile.ExternalStartupMethod;
 import com.android.tools.r8.startup.utils.StartupTestingUtils;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -44,7 +46,8 @@
 
   @Test
   public void testR8() throws Exception {
-    runTest(testForR8(parameters.getBackend()).addKeepAllClassesRule());
+    runTest(
+        testForR8(parameters.getBackend()).addKeepAllClassesRule().allowDiagnosticInfoMessages());
   }
 
   @SuppressWarnings("unchecked")
@@ -54,6 +57,10 @@
         .apply(this::configureStartupConfiguration)
         .setMinApi(parameters)
         .compile()
+        .inspectDiagnosticMessages(
+            diagnostics ->
+                diagnostics.assertInfosMatch(
+                    diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
         .inspectMultiDex(
             primaryDexInspector -> {
               ClassSubject mainClassSubject = primaryDexInspector.clazz(Main.class);
diff --git a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
index 91f9d7d..c0df783 100644
--- a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
+++ b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.startup;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static junit.framework.TestCase.assertTrue;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -12,6 +13,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
 import com.android.tools.r8.startup.profile.ExternalStartupItem;
 import com.android.tools.r8.startup.utils.StartupTestingUtils;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -66,10 +68,15 @@
                     .getStartupOptions()
                     .setEnableMinimalStartupDex(true)
                     .setEnableStartupCompletenessCheckForTesting())
+        .allowDiagnosticInfoMessages()
         .enableInliningAnnotations()
         .apply(testBuilder -> StartupTestingUtils.addStartupProfile(testBuilder, startupList))
         .setMinApi(parameters)
         .compile()
+        .inspectDiagnosticMessages(
+            diagnostics ->
+                diagnostics.assertInfosMatch(
+                    diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
         .inspectMultiDex(
             primaryDexInspector -> {
               // Main should be in the primary dex.
diff --git a/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java b/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
index 697aa2d..3c11f22 100644
--- a/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
+++ b/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.startup;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static com.android.tools.r8.startup.utils.StartupTestingMatchers.isEqualToClassDataLayout;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.notIf;
@@ -17,6 +18,7 @@
 import com.android.tools.r8.TestCompileResult;
 import com.android.tools.r8.TestCompilerBuilder;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.ir.desugar.LambdaClass;
 import com.android.tools.r8.references.ClassReference;
@@ -52,11 +54,6 @@
 @RunWith(Parameterized.class)
 public class StartupSyntheticPlacementTest extends TestBase {
 
-  private enum Compiler {
-    D8,
-    R8
-  }
-
   @Parameter(0)
   public TestParameters parameters;
 
@@ -160,12 +157,17 @@
         .addInnerClasses(getClass())
         .addKeepMainRule(Main.class)
         .addKeepClassAndMembersRules(A.class, B.class, C.class)
+        .allowDiagnosticMessages()
         .apply(
             testBuilder ->
                 configureStartupOptions(
                     testBuilder, instrumentationCompileResult.inspector(), startupList))
         .setMinApi(parameters)
         .compile()
+        .inspectDiagnosticMessages(
+            diagnostics ->
+                diagnostics.assertInfosMatch(
+                    diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
         .inspectMultiDex(this::inspectPrimaryDex, this::inspectSecondaryDex)
         .apply(this::checkCompleteness)
         .run(parameters.getRuntime(), Main.class, Boolean.toString(useLambda))
diff --git a/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java b/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java
index 6b21589..f3fe2e0 100644
--- a/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java
+++ b/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.startup;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static com.android.tools.r8.startup.utils.StartupTestingMatchers.isEqualToClassDataLayout;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
@@ -14,6 +15,7 @@
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
@@ -92,9 +94,14 @@
                   .getTestingOptions()
                   .setMixedSectionLayoutStrategyInspector(getMixedSectionLayoutInspector());
             })
+        .allowDiagnosticInfoMessages()
         .apply(testBuilder -> StartupTestingUtils.addStartupProfile(testBuilder, startupList))
         .setMinApi(parameters)
         .compile()
+        .inspectDiagnosticMessages(
+            diagnostics ->
+                diagnostics.assertInfosMatch(
+                    diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
         .inspectMultiDex(this::inspectPrimaryDex, this::inspectSecondaryDex)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines(getExpectedOutput());
diff --git a/src/test/java/com/android/tools/r8/startup/dump/DumpStartupProfileProvidersTest.java b/src/test/java/com/android/tools/r8/startup/dump/DumpStartupProfileProvidersTest.java
index edec3b4..4726e0b 100644
--- a/src/test/java/com/android/tools/r8/startup/dump/DumpStartupProfileProvidersTest.java
+++ b/src/test/java/com/android/tools/r8/startup/dump/DumpStartupProfileProvidersTest.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.startup.dump;
 
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -12,6 +13,7 @@
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.startup.StartupProfileBuilder;
@@ -90,7 +92,8 @@
                       diagnosticMessage(containsString("Dumped compilation inputs to:")));
                 } else {
                   diagnostics.assertInfosMatch(
-                      diagnosticMessage(containsString("Dumped compilation inputs to:")));
+                      diagnosticMessage(containsString("Dumped compilation inputs to:")),
+                      diagnosticType(StartupClassesNonStartupFractionDiagnostic.class));
                 }
               });
       assertFalse("Expected compilation to fail", dumpInputFlags.shouldFailCompilation());