Introduce an extra round of vertical class merging

Change-Id: I056b832fc6fe499a9d77060e4e7e34e1f772034f
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 0b8ab6c..2717f8a 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -503,7 +503,7 @@
 
       assert ArtProfileCompletenessChecker.verify(appView);
 
-      VerticalClassMerger.createForInitialClassMerging(appViewWithLiveness)
+      VerticalClassMerger.createForInitialClassMerging(appViewWithLiveness, timing)
           .runIfNecessary(executorService, timing);
       HorizontalClassMerger.createForInitialClassMerging(appViewWithLiveness)
           .runIfNecessary(
@@ -746,7 +746,7 @@
         assert appView.dexItemFactory().verifyNoCachedTypeElements();
 
         if (appView.hasLiveness()) {
-          VerticalClassMerger.createForFinalClassMerging(appView.withLiveness())
+          VerticalClassMerger.createForIntermediateClassMerging(appView.withLiveness(), timing)
               .runIfNecessary(executorService, timing);
           assert appView.dexItemFactory().verifyNoCachedTypeElements();
         }
@@ -765,6 +765,10 @@
         assert appView.dexItemFactory().verifyNoCachedTypeElements();
 
         if (appView.hasLiveness()) {
+          VerticalClassMerger.createForFinalClassMerging(appView.withLiveness(), timing)
+              .runIfNecessary(executorService, timing);
+          assert appView.dexItemFactory().verifyNoCachedTypeElements();
+
           new ProtoNormalizer(appViewWithLiveness).run(executorService, timing);
         }
       }
diff --git a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMerger.java
index 67bc83a..b19cfe0 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMerger.java
@@ -60,18 +60,25 @@
   }
 
   public static VerticalClassMerger createForInitialClassMerging(
-      AppView<AppInfoWithLiveness> appView) {
+      AppView<AppInfoWithLiveness> appView, Timing timing) {
+    timing.begin("VerticalClassMerger (1/3)");
     return new VerticalClassMerger(appView, ClassMergerMode.INITIAL);
   }
 
+  public static VerticalClassMerger createForIntermediateClassMerging(
+      AppView<AppInfoWithLiveness> appView, Timing timing) {
+    timing.begin("VerticalClassMerger (2/3)");
+    return new VerticalClassMerger(appView, ClassMergerMode.FINAL);
+  }
+
   public static VerticalClassMerger createForFinalClassMerging(
-      AppView<AppInfoWithLiveness> appView) {
+      AppView<AppInfoWithLiveness> appView, Timing timing) {
+    timing.begin("VerticalClassMerger (3/3)");
     return new VerticalClassMerger(appView, ClassMergerMode.FINAL);
   }
 
   public void runIfNecessary(ExecutorService executorService, Timing timing)
       throws ExecutionException {
-    timing.begin("VerticalClassMerger (" + mode.toString() + ")");
     if (shouldRun()) {
       run(executorService, timing);
     } else {
diff --git a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerOptions.java b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerOptions.java
index 55b3b41..aaeae0e 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerOptions.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerOptions.java
@@ -27,7 +27,11 @@
   }
 
   public boolean isEnabled(ClassMergerMode mode) {
-    if (!enabled || !options.isOptimizing() || !options.isShrinking()) {
+    if (!enabled
+        || options.debug
+        || options.intermediate
+        || !options.isOptimizing()
+        || !options.isShrinking()) {
       return false;
     }
     if (mode.isInitial() && !enableInitial) {