Add a SystemUI R8 partial benchmark

Bug: b/414306892
Change-Id: I281e16c5690f6ac9e48cdc5c6d4c843989165730
diff --git a/src/main/java/com/android/tools/r8/desugar/covariantreturntype/CovariantReturnTypeAnnotationTransformer.java b/src/main/java/com/android/tools/r8/desugar/covariantreturntype/CovariantReturnTypeAnnotationTransformer.java
index c163752..33ce553 100644
--- a/src/main/java/com/android/tools/r8/desugar/covariantreturntype/CovariantReturnTypeAnnotationTransformer.java
+++ b/src/main/java/com/android/tools/r8/desugar/covariantreturntype/CovariantReturnTypeAnnotationTransformer.java
@@ -117,7 +117,7 @@
     converter.optimizeSynthesizedMethods(
         covariantReturnTypeMethods,
         MethodProcessorEventConsumer.empty(),
-        MethodConversionOptions.forD8(appView),
+        method -> MethodConversionOptions.forD8(appView, method),
         executorService);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index f1afa41..120ee81 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -99,6 +99,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Function;
 
 public class IRConverter {
 
@@ -357,7 +358,7 @@
   public void optimizeSynthesizedMethods(
       List<ProgramMethod> programMethods,
       MethodProcessorEventConsumer eventConsumer,
-      MutableMethodConversionOptions conversionOptions,
+      Function<ProgramMethod, MutableMethodConversionOptions> conversionOptions,
       ExecutorService executorService)
       throws ExecutionException {
     // Process the generated class, but don't apply any outlining.
@@ -365,31 +366,10 @@
     processMethodsConcurrently(methods, eventConsumer, conversionOptions, executorService);
   }
 
-  public void optimizeSynthesizedMethod(
-      ProgramMethod synthesizedMethod,
-      MethodProcessorEventConsumer eventConsumer,
-      MutableMethodConversionOptions conversionOptions,
-      Timing timing) {
-    if (!synthesizedMethod.getDefinition().isProcessed()) {
-      // Process the generated method, but don't apply any outlining.
-      OneTimeMethodProcessor methodProcessor =
-          OneTimeMethodProcessor.create(synthesizedMethod, eventConsumer, appView);
-      methodProcessor.forEachWaveWithExtension(
-          (method, methodProcessingContext) ->
-              processDesugaredMethod(
-                  method,
-                  delayedOptimizationFeedback,
-                  methodProcessor,
-                  methodProcessingContext,
-                  conversionOptions,
-                  timing));
-    }
-  }
-
   public void processClassesConcurrently(
       Collection<DexProgramClass> classes,
       MethodProcessorEventConsumer eventConsumer,
-      MutableMethodConversionOptions conversionOptions,
+      Function<ProgramMethod, MutableMethodConversionOptions> conversionOptions,
       ExecutorService executorService)
       throws ExecutionException {
     ProgramMethodSet wave = ProgramMethodSet.create();
@@ -402,7 +382,7 @@
   public void processMethodsConcurrently(
       ProgramMethodSet wave,
       MethodProcessorEventConsumer eventConsumer,
-      MutableMethodConversionOptions conversionOptions,
+      Function<ProgramMethod, MutableMethodConversionOptions> conversionOptions,
       ExecutorService executorService)
       throws ExecutionException {
     if (!wave.isEmpty()) {
@@ -415,7 +395,7 @@
                   delayedOptimizationFeedback,
                   methodProcessor,
                   methodProcessingContext,
-                  conversionOptions,
+                  conversionOptions.apply(method),
                   Timing.empty()),
           appView.options().getThreadingModule(),
           executorService);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
index f9fc66e..bfb866c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
@@ -1394,7 +1394,7 @@
       converter.optimizeSynthesizedMethods(
           outlineMethods,
           methodProcessorEventConsumer,
-          MethodConversionOptions.forLirPhase(appView),
+          ignore -> MethodConversionOptions.forLirPhase(appView),
           executorService);
       feedback.updateVisibleOptimizationInfo();
       forEachSelectedOutliningMethod(
diff --git a/src/main/java/com/android/tools/r8/kotlin/Kotlin.java b/src/main/java/com/android/tools/r8/kotlin/Kotlin.java
index eb3af79..355bcc1 100644
--- a/src/main/java/com/android/tools/r8/kotlin/Kotlin.java
+++ b/src/main/java/com/android/tools/r8/kotlin/Kotlin.java
@@ -30,8 +30,6 @@
   public static final String NAME = "kotlin";
   public static final String PACKAGE_PREFIX = "L" + NAME + "/";
 
-  public final DexString kotlinJvmTypePrefix;
-
   public static final class ClassClassifiers {
 
     public static final String arrayBinaryName = NAME + "/Array";
@@ -96,7 +94,6 @@
     this.intrinsics = new Intrinsics();
     this.metadata = new Metadata();
     this.assertions = new _Assertions();
-    kotlinJvmTypePrefix = factory.createString("Lkotlin/jvm/");
   }
 
   public final class Functional {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataMembersTracker.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataMembersTracker.java
index 98dc167..b826ebd 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataMembersTracker.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataMembersTracker.java
@@ -6,8 +6,6 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexMember;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.utils.IterableUtils;
 import com.google.common.collect.Sets;
 import com.google.common.collect.Sets.SetView;
 import java.util.Set;
@@ -33,6 +31,11 @@
     if (count != tracker.count) {
       return false;
     }
+    assert verifyReferencesDiff(tracker, appView);
+    return true;
+  }
+
+  private boolean verifyReferencesDiff(KotlinMetadataMembersTracker tracker, AppView<?> appView) {
     if (references != null) {
       assert tracker.references != null;
       assert references.size() == tracker.references.size();
@@ -41,10 +44,6 @@
       if (!diffComparedToRewritten.isEmpty()) {
         SetView<DexMember<?, ?>> diffComparedToOriginal =
             Sets.difference(tracker.references, references);
-        // Known kotlin types may not exist directly in the way they are annotated in the metadata.
-        // As an example kotlin.Function2 exists in the metadata but the concrete type is
-        // kotlin.jvm.functions.Function2. As a result we may not rewrite metadata but the
-        // underlying types are changed.
         diffComparedToRewritten.forEach(
             diff -> {
               DexMember<?, ?> rewrittenReference =
@@ -52,16 +51,9 @@
                       .graphLens()
                       .getRenamedMemberSignature(diff, appView.getKotlinMetadataLens());
               assert diffComparedToOriginal.contains(rewrittenReference);
-              assert IterableUtils.findOrDefault(
-                      diff.getReferencedTypes(), type -> isKotlinJvmType(appView, type), null)
-                  != null;
             });
       }
     }
     return true;
   }
-
-  private boolean isKotlinJvmType(AppView<?> appView, DexType type) {
-    return type.descriptor.startsWith(appView.dexItemFactory().kotlin.kotlinJvmTypePrefix);
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java b/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java
index 8aaf1a4..5a1971e 100644
--- a/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java
@@ -112,7 +112,7 @@
     converter.processClassesConcurrently(
         extraProgramClasses,
         eventConsumer,
-        MethodConversionOptions.forD8(appView),
+        method -> MethodConversionOptions.forD8(appView, method),
         executorService);
 
     DexApplication newApplication =
diff --git a/src/test/java/com/android/tools/r8/benchmarks/appdumps/AppDumpBenchmarkBuilder.java b/src/test/java/com/android/tools/r8/benchmarks/appdumps/AppDumpBenchmarkBuilder.java
index 0571820..0f53591 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/appdumps/AppDumpBenchmarkBuilder.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/appdumps/AppDumpBenchmarkBuilder.java
@@ -67,6 +67,7 @@
   private int fromRevision = -1;
   private CompilationMode compilationMode;
   private boolean enableLibraryDesugaring = true;
+  private boolean enableResourceShrinking = false;
   private boolean runtimeOnly = false;
   private final List<String> programPackages = new ArrayList<>();
 
@@ -92,6 +93,11 @@
     return this;
   }
 
+  public AppDumpBenchmarkBuilder setEnableResourceShrinking(boolean enableResourceShrinking) {
+    this.enableResourceShrinking = enableResourceShrinking;
+    return this;
+  }
+
   public AppDumpBenchmarkBuilder setName(String name) {
     this.name = name;
     return this;
@@ -135,21 +141,33 @@
 
   public BenchmarkConfig buildR8(ThrowableConsumer<? super R8FullTestBuilder> configuration) {
     verify();
-    return BenchmarkConfig.builder()
-        .setName(name)
-        .setTarget(BenchmarkTarget.R8)
-        .setSuite(BenchmarkSuite.OPENSOURCE_BENCHMARKS)
-        .setMethod(runR8(this, configuration))
-        .setFromRevision(fromRevision)
-        .addDependency(dumpDependency)
-        .measureRunTime()
-        .measureCodeSize()
-        .measureInstructionCodeSize()
-        .measureComposableInstructionCodeSize()
-        .measureDexSegmentsCodeSize()
-        .measureDex2OatCodeSize()
-        .setTimeout(10, TimeUnit.MINUTES)
-        .build();
+    BenchmarkConfig.Builder builder =
+        BenchmarkConfig.builder()
+            .setName(name)
+            .setTarget(BenchmarkTarget.R8)
+            .setSuite(BenchmarkSuite.OPENSOURCE_BENCHMARKS)
+            .setMethod(runR8(this, configuration))
+            .setFromRevision(fromRevision)
+            .addDependency(dumpDependency)
+            .measureRunTime()
+            .measureCodeSize()
+            .measureInstructionCodeSize()
+            .measureComposableInstructionCodeSize()
+            .measureDexSegmentsCodeSize()
+            .measureDex2OatCodeSize()
+            // TODO(b/373550435): Update dex2oat to enable checking absence of verification errors
+            //  on SystemUI.
+            .setEnableDex2OatVerification(!name.equals("SystemUIApp"))
+            .setTimeout(10, TimeUnit.MINUTES);
+    if (!runtimeOnly) {
+      builder
+          .measureCodeSize()
+          .measureInstructionCodeSize()
+          .measureComposableInstructionCodeSize()
+          .measureDexSegmentsCodeSize()
+          .measureDex2OatCodeSize();
+    }
+    return builder.build();
   }
 
   public BenchmarkConfig buildR8WithPartialShrinking() {
@@ -178,14 +196,13 @@
         .measureComposableInstructionCodeSize()
         .measureDexSegmentsCodeSize()
         .measureDex2OatCodeSize()
+        // TODO(b/373550435): Update dex2oat to enable checking absence of verification errors
+        //  on SystemUI.
+        .setEnableDex2OatVerification(!name.equals("SystemUIAppPartialShrinking"))
         .setTimeout(10, TimeUnit.MINUTES)
         .build();
   }
 
-  public BenchmarkConfig buildR8WithResourceShrinking() {
-    return buildR8WithResourceShrinking(getDefaultR8Configuration());
-  }
-
   public BenchmarkConfig buildR8WithResourceShrinking(
       ThrowableConsumer<? super R8FullTestBuilder> configuration) {
     verify();
@@ -194,7 +211,7 @@
             .setName(name)
             .setTarget(BenchmarkTarget.R8)
             .setSuite(BenchmarkSuite.OPENSOURCE_BENCHMARKS)
-            .setMethod(runR8WithResourceShrinking(this, configuration))
+            .setMethod(runR8(this, configuration))
             .setFromRevision(fromRevision)
             .addDependency(dumpDependency)
             // TODO(b/368282141): Also measure resource size.
@@ -269,11 +286,6 @@
   }
 
   private CompilerDump getExtractedDump(BenchmarkEnvironment environment) throws IOException {
-    return getExtractedDump(environment, false);
-  }
-
-  private CompilerDump getExtractedDump(
-      BenchmarkEnvironment environment, boolean enableResourceShrinking) throws IOException {
     String dumpName = enableResourceShrinking ? "dump_app_res.zip" : "dump_app.zip";
     Path dump = dumpDependency.getRoot(environment).resolve(dumpName);
     return CompilerDump.fromArchive(dump, environment.getTemp().newFolder().toPath());
@@ -325,7 +337,7 @@
 
   private static BenchmarkMethod runR8(
       AppDumpBenchmarkBuilder builder, ThrowableConsumer<? super R8FullTestBuilder> configuration) {
-    return internalRunR8(builder, false, configuration);
+    return internalRunR8(builder, configuration);
   }
 
   private static BenchmarkMethod runR8WithPartialShrinking(
@@ -335,22 +347,15 @@
     return internalRunR8Partial(builder, configuration, compileResultConsumer);
   }
 
-  private static BenchmarkMethod runR8WithResourceShrinking(
-      AppDumpBenchmarkBuilder builder, ThrowableConsumer<? super R8FullTestBuilder> configuration) {
-    return internalRunR8(builder, true, configuration);
-  }
-
   private static BenchmarkMethod internalRunR8(
       AppDumpBenchmarkBuilder builder,
-      boolean enableResourceShrinking,
       ThrowableConsumer<? super R8FullTestBuilder> configuration) {
     return environment ->
         BenchmarkBase.runner(environment)
             .setWarmupIterations(1)
             .run(
                 results -> {
-                  CompilerDump dump =
-                      builder.getExtractedDump(environment, enableResourceShrinking);
+                  CompilerDump dump = builder.getExtractedDump(environment);
                   DumpOptions dumpProperties = dump.getBuildProperties();
                   TestBase.testForR8(environment.getTemp(), Backend.DEX)
                       .addProgramFiles(dump.getProgramArchive())
@@ -376,7 +381,7 @@
                           environment.getConfig().containsComposableCodeSizeMetric(),
                           getKeepComposableAnnotationsConfiguration())
                       .applyIf(
-                          enableResourceShrinking,
+                          builder.enableResourceShrinking,
                           b ->
                               b.enableOptimizedShrinking()
                                   .setAndroidResourcesFromPath(dump.getAndroidResources()))
@@ -406,7 +411,7 @@
       ThrowableConsumer<? super R8PartialTestCompileResult> compileResultConsumer) {
     return environment ->
         BenchmarkBase.runner(environment)
-            .setWarmupIterations(1)
+            .setWarmupIterations(0)
             .run(
                 results -> {
                   CompilerDump dump = builder.getExtractedDump(environment);
@@ -451,6 +456,11 @@
                       .applyIf(
                           environment.getConfig().containsComposableCodeSizeMetric(),
                           getKeepComposableAnnotationsConfiguration())
+                      .applyIf(
+                          builder.enableResourceShrinking,
+                          b ->
+                              b.enableOptimizedShrinking()
+                                  .setAndroidResourcesFromPath(dump.getAndroidResources()))
                       .apply(
                           r ->
                               r.benchmarkCompile(results)
diff --git a/src/test/java/com/android/tools/r8/benchmarks/appdumps/NowInAndroidBenchmarks.java b/src/test/java/com/android/tools/r8/benchmarks/appdumps/NowInAndroidBenchmarks.java
index 2cb5f7f..48d2f56 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/appdumps/NowInAndroidBenchmarks.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/appdumps/NowInAndroidBenchmarks.java
@@ -90,8 +90,9 @@
         AppDumpBenchmarkBuilder.builder()
             .setName("NowInAndroidAppWithResourceShrinking")
             .setDumpDependencyPath(dump)
+            .setEnableResourceShrinking(true)
             .setFromRevision(16017)
-            .buildR8WithResourceShrinking());
+            .buildR8());
   }
 
   @Ignore
diff --git a/src/test/java/com/android/tools/r8/internal/benchmarks/appdumps/SystemUIBenchmarks.java b/src/test/java/com/android/tools/r8/internal/benchmarks/appdumps/SystemUIBenchmarks.java
index 9ab0474..a3fc6a1 100644
--- a/src/test/java/com/android/tools/r8/internal/benchmarks/appdumps/SystemUIBenchmarks.java
+++ b/src/test/java/com/android/tools/r8/internal/benchmarks/appdumps/SystemUIBenchmarks.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.internal.benchmarks.appdumps;
 
 import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.R8PartialTestBuilder;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.benchmarks.BenchmarkBase;
@@ -41,14 +42,22 @@
         AppDumpBenchmarkBuilder.builder()
             .setName("SystemUIApp")
             .setDumpDependencyPath(dir)
+            .setEnableResourceShrinking(true)
             .setFromRevision(16457)
-            .buildR8WithResourceShrinking(SystemUIBenchmarks::configure),
+            .buildR8(SystemUIBenchmarks::configure),
+        AppDumpBenchmarkBuilder.builder()
+            .setName("SystemUIAppPartial")
+            .setDumpDependencyPath(dir)
+            .setEnableResourceShrinking(true)
+            .setFromRevision(16457)
+            .buildR8WithPartialShrinking(SystemUIBenchmarks::configurePartialShrinking),
         AppDumpBenchmarkBuilder.builder()
             .setName("SystemUIAppTreeShaking")
             .setDumpDependencyPath(dir)
+            .setEnableResourceShrinking(true)
             .setFromRevision(16457)
             .setRuntimeOnly()
-            .buildR8WithResourceShrinking(SystemUIBenchmarks::configureTreeShaking));
+            .buildR8(SystemUIBenchmarks::configureTreeShaking));
   }
 
   private static void configure(R8FullTestBuilder testBuilder) {
@@ -63,6 +72,17 @@
         .setAndroidPlatformBuild();
   }
 
+  private static void configurePartialShrinking(R8PartialTestBuilder testBuilder) {
+    testBuilder
+        .addR8PartialR8OptionsModification(
+            options -> options.getOpenClosedInterfacesOptions().suppressAllOpenInterfaces())
+        .allowDiagnosticMessages()
+        .allowUnusedDontWarnPatterns()
+        .allowUnusedProguardConfigurationRules()
+        .allowUnnecessaryDontWarnWildcards()
+        .setAndroidPlatformBuild();
+  }
+
   private static void configureTreeShaking(R8FullTestBuilder testBuilder) {
     configure(testBuilder);
     testBuilder.addOptionsModification(
@@ -92,4 +112,9 @@
   public void testSystemUIApp() throws Exception {
     testBenchmarkWithName("SystemUIApp");
   }
+
+  @Test
+  public void testSystemUIAppPartial() throws Exception {
+    testBenchmarkWithName("SystemUIAppPartial");
+  }
 }
diff --git a/tools/perf.py b/tools/perf.py
index 6215f3e..36e6cfc 100755
--- a/tools/perf.py
+++ b/tools/perf.py
@@ -104,6 +104,9 @@
     'SystemUIApp': {
         'targets': ['r8-full']
     },
+    'SystemUIAppPartial': {
+        'targets': ['r8-full']
+    },
 }
 # A collection of benchmarks that should not be run on the bots, but can be used
 # for running locally.