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) {