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.