Add SystemUI container DEX benchmark

Bug: b/422947619

Change-Id: Iba6bee59b287feab44b773e5af5e71836b0b676b
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkConfig.java b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkConfig.java
index bb462ed..0c1197b 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkConfig.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkConfig.java
@@ -90,6 +90,7 @@
     private int fromRevision = -1;
     private BenchmarkTimeout timeout = null;
     private boolean measureWarmup = false;
+    private boolean enableDex2Oat = true;
     private boolean enableDex2OatVerification = true;
 
     private Builder() {}
@@ -138,6 +139,7 @@
           dependencies,
           timeout,
           measureWarmup,
+          enableDex2Oat,
           enableDex2OatVerification);
     }
 
@@ -196,6 +198,11 @@
       return this;
     }
 
+    public Builder setEnableDex2Oat(boolean enableDex2Oat) {
+      this.enableDex2Oat = enableDex2Oat;
+      return this;
+    }
+
     public Builder setEnableDex2OatVerification(boolean enableDex2OatVerification) {
       this.enableDex2OatVerification = enableDex2OatVerification;
       return this;
@@ -243,6 +250,7 @@
   private final int fromRevision;
   private final BenchmarkTimeout timeout;
   private final boolean measureWarmup;
+  private final boolean enableDex2Oat;
   private final boolean enableDex2OatVerification;
 
   private BenchmarkConfig(
@@ -255,6 +263,7 @@
       Collection<BenchmarkDependency> dependencies,
       BenchmarkTimeout timeout,
       boolean measureWarmup,
+      boolean enableDex2Oat,
       boolean enableDex2OatVerification) {
     this.id = new BenchmarkIdentifier(name, target);
     this.method = benchmarkMethod;
@@ -264,6 +273,7 @@
     this.dependencies = dependencies;
     this.timeout = timeout;
     this.measureWarmup = measureWarmup;
+    this.enableDex2Oat = enableDex2Oat;
     this.enableDex2OatVerification = enableDex2OatVerification;
   }
 
@@ -328,6 +338,10 @@
     return timeout;
   }
 
+  public boolean isDex2OatEnabled() {
+    return enableDex2Oat;
+  }
+
   public boolean isDex2OatVerificationEnabled() {
     return enableDex2OatVerification;
   }
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 dc7a609..77e83f2 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
@@ -68,6 +68,9 @@
   private CompilationMode compilationMode;
   private boolean enableLibraryDesugaring = true;
   private boolean enableResourceShrinking = false;
+  private boolean enableContainerDex = false;
+  private boolean enableDex2Oat = true;
+  private boolean enableDex2OatVerification = true;
   private boolean runtimeOnly = false;
   private int warmupIterations = 1;
   private final List<String> programPackages = new ArrayList<>();
@@ -96,6 +99,24 @@
     return this;
   }
 
+  public AppDumpBenchmarkBuilder setEnableContainerDex(boolean enableContainerDex) {
+    this.enableContainerDex = enableContainerDex;
+    return this;
+  }
+
+  public AppDumpBenchmarkBuilder setEnableDex2Oat(boolean enableDex2Oat) {
+    this.enableDex2Oat = enableDex2Oat;
+    if (!enableDex2Oat) {
+      this.enableDex2OatVerification = enableDex2Oat;
+    }
+    return this;
+  }
+
+  public AppDumpBenchmarkBuilder setEnableDex2OatVerification(boolean enableDex2OatVerification) {
+    this.enableDex2OatVerification = enableDex2OatVerification;
+    return this;
+  }
+
   public AppDumpBenchmarkBuilder setName(String name) {
     this.name = name;
     return this;
@@ -153,9 +174,8 @@
             .setFromRevision(fromRevision)
             .addDependency(dumpDependency)
             .measureRunTime()
-            // TODO(b/373550435): Update dex2oat to enable checking absence of verification errors
-            //  on SystemUI.
-            .setEnableDex2OatVerification(!name.equals("SystemUIApp"))
+            .setEnableDex2Oat(enableDex2Oat)
+            .setEnableDex2OatVerification(enableDex2OatVerification)
             .setTimeout(10, TimeUnit.MINUTES);
     if (!runtimeOnly) {
       builder
@@ -198,9 +218,8 @@
             .measureComposableInstructionCodeSize()
             .measureDexSegmentsCodeSize()
             .measureDex2OatCodeSize()
-            // TODO(b/373550435): Update dex2oat to enable checking absence of verification errors
-            //  on SystemUI.
-            .setEnableDex2OatVerification(!name.equals("SystemUIAppPartialShrinking"))
+            .setEnableDex2Oat(enableDex2Oat)
+            .setEnableDex2OatVerification(enableDex2OatVerification)
             .setTimeout(10, TimeUnit.MINUTES);
     if (enableResourceShrinking) {
       builder.measureResourceSize();
@@ -362,6 +381,12 @@
                           b ->
                               b.enableOptimizedShrinking()
                                   .setAndroidResourcesFromPath(dump.getAndroidResources()))
+                      .applyIf(
+                          builder.enableContainerDex,
+                          b ->
+                              b.addOptionsModification(
+                                  options ->
+                                      options.getTestingOptions().forceDexContainerFormat = true))
                       .apply(
                           r -> {
                             try {
@@ -371,6 +396,7 @@
                                   .benchmarkDexSegmentsCodeSize(results)
                                   .benchmarkDex2OatCodeSize(
                                       results,
+                                      environment.getConfig().isDex2OatEnabled(),
                                       environment.getConfig().isDex2OatVerificationEnabled())
                                   .applyIf(
                                       environment
@@ -442,6 +468,12 @@
                           b ->
                               b.enableOptimizedShrinking()
                                   .setAndroidResourcesFromPath(dump.getAndroidResources()))
+                      .applyIf(
+                          builder.enableContainerDex,
+                          b ->
+                              b.addOptionsModification(
+                                  options ->
+                                      options.getTestingOptions().forceDexContainerFormat = true))
                       .apply(
                           r ->
                               r.benchmarkCompile(results)
@@ -450,6 +482,7 @@
                                   .benchmarkDexSegmentsCodeSize(results)
                                   .benchmarkDex2OatCodeSize(
                                       results,
+                                      environment.getConfig().isDex2OatEnabled(),
                                       environment.getConfig().isDex2OatVerificationEnabled())
                                   .applyIf(
                                       environment
@@ -475,6 +508,12 @@
                       .setMinApi(dumpProperties.getMinApi())
                       .setMode(builder.compilationMode)
                       .applyIf(builder.enableLibraryDesugaring, b -> addDesugaredLibrary(b, dump))
+                      .applyIf(
+                          builder.enableContainerDex,
+                          b ->
+                              b.addOptionsModification(
+                                  options ->
+                                      options.getTestingOptions().forceDexContainerFormat = true))
                       .benchmarkCompile(results)
                       .benchmarkCodeSize(results);
                 });
@@ -482,6 +521,7 @@
 
   private static BenchmarkMethod runIncrementalD8(AppDumpBenchmarkBuilder builder) {
     assert builder.compilationMode.isDebug();
+    assert !builder.enableContainerDex;
     return environment ->
         BenchmarkBase.runner(environment)
             .setWarmupIterations(builder.warmupIterations)
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 a3fc6a1..8db6c3a 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
@@ -43,12 +43,18 @@
             .setName("SystemUIApp")
             .setDumpDependencyPath(dir)
             .setEnableResourceShrinking(true)
+            // TODO(b/373550435): Update dex2oat to enable checking absence of verification errors
+            //  on SystemUI.
+            .setEnableDex2OatVerification(false)
             .setFromRevision(16457)
             .buildR8(SystemUIBenchmarks::configure),
         AppDumpBenchmarkBuilder.builder()
             .setName("SystemUIAppPartial")
             .setDumpDependencyPath(dir)
             .setEnableResourceShrinking(true)
+            // TODO(b/373550435): Update dex2oat to enable checking absence of verification errors
+            //  on SystemUI.
+            .setEnableDex2OatVerification(false)
             .setFromRevision(16457)
             .buildR8WithPartialShrinking(SystemUIBenchmarks::configurePartialShrinking),
         AppDumpBenchmarkBuilder.builder()
@@ -57,7 +63,16 @@
             .setEnableResourceShrinking(true)
             .setFromRevision(16457)
             .setRuntimeOnly()
-            .buildR8(SystemUIBenchmarks::configureTreeShaking));
+            .buildR8(SystemUIBenchmarks::configureTreeShaking),
+        AppDumpBenchmarkBuilder.builder()
+            .setName("SystemUIAppContainerDex")
+            .setDumpDependencyPath(dir)
+            .setEnableResourceShrinking(true)
+            .setEnableContainerDex(true)
+            // TODO(b/373550435): Update dex2oat to enable checking container DEX on SystemUI.
+            .setEnableDex2Oat(false)
+            .setFromRevision(16457)
+            .buildR8(SystemUIBenchmarks::configure));
   }
 
   private static void configure(R8FullTestBuilder testBuilder) {
diff --git a/src/test/testbase/java/com/android/tools/r8/R8TestCompileResultBase.java b/src/test/testbase/java/com/android/tools/r8/R8TestCompileResultBase.java
index fdf6a8c..083a743 100644
--- a/src/test/testbase/java/com/android/tools/r8/R8TestCompileResultBase.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8TestCompileResultBase.java
@@ -405,15 +405,21 @@
   }
 
   @Override
-  public CR benchmarkDex2OatCodeSize(BenchmarkResults results, boolean enableDex2OatVerification)
+  public CR benchmarkDex2OatCodeSize(
+      BenchmarkResults results, boolean enableDex2Oat, boolean enableDex2OatVerification)
       throws IOException {
     if (results.isBenchmarkingCodeSize()) {
-      Dex2OatTestRunResult dex2OatTestRunResult =
-          runDex2Oat(new DexRuntime(DexVm.Version.LATEST_DEX2OAT)).assertNoLockVerificationErrors();
-      if (enableDex2OatVerification) {
-        dex2OatTestRunResult.assertNoVerificationErrors();
+      if (enableDex2Oat) {
+        Dex2OatTestRunResult dex2OatTestRunResult =
+            runDex2Oat(new DexRuntime(DexVm.Version.LATEST_DEX2OAT))
+                .assertNoLockVerificationErrors();
+        if (enableDex2OatVerification) {
+          dex2OatTestRunResult.assertNoVerificationErrors();
+        }
+        results.addDex2OatSizeResult(dex2OatTestRunResult.getOatSizeOrDefault(0));
+      } else {
+        results.addDex2OatSizeResult(-1);
       }
-      results.addDex2OatSizeResult(dex2OatTestRunResult.getOatSizeOrDefault(0));
     }
     return self();
   }
diff --git a/src/test/testbase/java/com/android/tools/r8/TestCompileResult.java b/src/test/testbase/java/com/android/tools/r8/TestCompileResult.java
index 53fc424..dac774b 100644
--- a/src/test/testbase/java/com/android/tools/r8/TestCompileResult.java
+++ b/src/test/testbase/java/com/android/tools/r8/TestCompileResult.java
@@ -762,7 +762,8 @@
     throw new Unimplemented();
   }
 
-  public CR benchmarkDex2OatCodeSize(BenchmarkResults results, boolean enableDex2OatVerification)
+  public CR benchmarkDex2OatCodeSize(
+      BenchmarkResults results, boolean enableDex2Oat, boolean enableDex2OatVerification)
       throws IOException {
     throw new Unimplemented();
   }