Remove subtyping info from abstract method remover
Change-Id: Ic028527b9a7b6479803278df114a66f9d640196a
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 5b08837..8ffd211 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -444,9 +444,7 @@
.notifyTreePrunerFinished(Enqueuer.Mode.INITIAL_TREE_SHAKING);
// Recompute the subtyping information.
- new AbstractMethodRemover(
- appViewWithLiveness, appViewWithLiveness.appInfo().computeSubtypingInfo())
- .run();
+ new AbstractMethodRemover(appViewWithLiveness).run();
AnnotationRemover annotationRemover =
annotationRemoverBuilder.build(appViewWithLiveness, prunedItems.getRemovedClasses());
diff --git a/src/main/java/com/android/tools/r8/shaking/AbstractMethodRemover.java b/src/main/java/com/android/tools/r8/shaking/AbstractMethodRemover.java
index a5854e2..51e9b02 100644
--- a/src/main/java/com/android/tools/r8/shaking/AbstractMethodRemover.java
+++ b/src/main/java/com/android/tools/r8/shaking/AbstractMethodRemover.java
@@ -3,13 +3,13 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.shaking;
+import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
+
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.ImmediateProgramSubtypingInfo;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.graph.SubtypingInfo;
import com.android.tools.r8.shaking.ScopedDexMethodSet.AddMethodIfMoreVisibleResult;
import java.util.HashSet;
import java.util.Set;
@@ -26,28 +26,39 @@
public class AbstractMethodRemover {
private final AppView<AppInfoWithLiveness> appView;
- private final SubtypingInfo subtypingInfo;
+ private final ImmediateProgramSubtypingInfo immediateSubtypingInfo;
+
private ScopedDexMethodSet scope = new ScopedDexMethodSet();
- public AbstractMethodRemover(AppView<AppInfoWithLiveness> appView, SubtypingInfo subtypingInfo) {
+ public AbstractMethodRemover(AppView<AppInfoWithLiveness> appView) {
this.appView = appView;
- this.subtypingInfo = subtypingInfo;
+ this.immediateSubtypingInfo = ImmediateProgramSubtypingInfo.create(appView);
}
public void run() {
- assert scope.getParent() == null;
- processClass(appView.dexItemFactory().objectType);
+ for (DexProgramClass clazz : appView.appInfo().classes()) {
+ assert scope.getParent() == null;
+ if (isRoot(clazz)) {
+ processClass(clazz);
+ }
+ }
appView.notifyOptimizationFinishedForTesting();
}
- private void processClass(DexType type) {
- DexClass holder = appView.definitionFor(type);
- scope = scope.newNestedScope();
- if (holder != null && holder.isProgramClass()) {
- processMethods(holder.asProgramClass());
+ private boolean isRoot(DexProgramClass clazz) {
+ if (clazz.isInterface()) {
+ return false;
}
- // TODO(b/154881041): Does this need the full subtype hierarchy of referenced types!?
- subtypingInfo.forAllImmediateExtendsSubtypes(type, this::processClass);
+ if (!clazz.hasSuperType()) {
+ return true;
+ }
+ return asProgramClassOrNull(appView.definitionFor(clazz.getSuperType(), clazz)) == null;
+ }
+
+ private void processClass(DexProgramClass clazz) {
+ scope = scope.newNestedScope();
+ processMethods(clazz);
+ immediateSubtypingInfo.getSubclasses(clazz).forEach(this::processClass);
scope = scope.getParent();
}
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index c522643..b701cdf 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -48,7 +48,6 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.PrunedItems;
import com.android.tools.r8.graph.SingleDispatchTargetLookupResult;
-import com.android.tools.r8.graph.SubtypingInfo;
import com.android.tools.r8.graph.UnknownDispatchTargetLookupResult;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
@@ -1448,10 +1447,6 @@
return clazz.isNotProgramClass() || isInstantiatedInterface(clazz.asProgramClass());
}
- public SubtypingInfo computeSubtypingInfo() {
- return SubtypingInfo.create(this);
- }
-
public boolean verifyNoIteratingOverPrunedClasses() {
classes()
.forEach(