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(