Move startup profile to AppView

Change-Id: Ib6d849b4512fb1b0cd95f052c71812182c576b39
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index 99cb304..e2d9423 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -243,7 +243,7 @@
       // order is only used for writing the app, so we create it here for the first time.
       StartupOrder startupOrder =
           appView.appInfo().hasClassHierarchy()
-              ? appView.appInfoWithClassHierarchy().getStartupOrder()
+              ? appView.getStartupOrder()
               : StartupOrder.createInitialStartupOrderForD8(appView);
       distributor =
           new VirtualFile.FillFilesDistributor(
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupCompleteness.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupCompleteness.java
index 6ef463d..6291d1e 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupCompleteness.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupCompleteness.java
@@ -35,7 +35,7 @@
     this.appView = appView;
     this.startupOrder =
         appView.hasClassHierarchy()
-            ? appView.appInfoWithClassHierarchy().getStartupOrder()
+            ? appView.getStartupOrder()
             : StartupOrder.createInitialStartupOrder(
                 appView.options(), null, syntheticToSyntheticContextGeneralization);
   }
diff --git a/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java b/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
index fd710bb..84c8a96 100644
--- a/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
+++ b/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
@@ -106,10 +106,7 @@
   public Map<FeatureSplit, Set<DexProgramClass>> getFeatureSplitClasses(
       Set<DexProgramClass> classes, AppView<? extends AppInfoWithClassHierarchy> appView) {
     return getFeatureSplitClasses(
-        classes,
-        appView.options(),
-        appView.appInfo().getStartupOrder(),
-        appView.getSyntheticItems());
+        classes, appView.options(), appView.getStartupOrder(), appView.getSyntheticItems());
   }
 
   public Map<FeatureSplit, Set<DexProgramClass>> getFeatureSplitClasses(
@@ -130,10 +127,7 @@
   public FeatureSplit getFeatureSplit(
       ProgramDefinition definition, AppView<? extends AppInfoWithClassHierarchy> appView) {
     return getFeatureSplit(
-        definition,
-        appView.options(),
-        appView.appInfo().getStartupOrder(),
-        appView.getSyntheticItems());
+        definition, appView.options(), appView.getStartupOrder(), appView.getSyntheticItems());
   }
 
   public FeatureSplit getFeatureSplit(
@@ -147,7 +141,7 @@
   public FeatureSplit getFeatureSplit(
       DexType type, AppView<? extends AppInfoWithClassHierarchy> appView) {
     return getFeatureSplit(
-        type, appView.options(), appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
+        type, appView.options(), appView.getStartupOrder(), appView.getSyntheticItems());
   }
 
   public FeatureSplit getFeatureSplit(
@@ -199,7 +193,7 @@
   public boolean isInBase(
       DexProgramClass clazz, AppView<? extends AppInfoWithClassHierarchy> appView) {
     return isInBase(
-        clazz, appView.options(), appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
+        clazz, appView.options(), appView.getStartupOrder(), appView.getSyntheticItems());
   }
 
   public boolean isInBase(
@@ -215,11 +209,7 @@
       ProgramDefinition context,
       AppView<? extends AppInfoWithClassHierarchy> appView) {
     return isInBaseOrSameFeatureAs(
-        clazz,
-        context,
-        appView.options(),
-        appView.appInfo().getStartupOrder(),
-        appView.getSyntheticItems());
+        clazz, context, appView.options(), appView.getStartupOrder(), appView.getSyntheticItems());
   }
 
   public boolean isInBaseOrSameFeatureAs(
@@ -237,11 +227,7 @@
       ProgramDefinition context,
       AppView<? extends AppInfoWithClassHierarchy> appView) {
     return isInBaseOrSameFeatureAs(
-        clazz,
-        context,
-        appView.options(),
-        appView.appInfo().getStartupOrder(),
-        appView.getSyntheticItems());
+        clazz, context, appView.options(), appView.getStartupOrder(), appView.getSyntheticItems());
   }
 
   public boolean isInBaseOrSameFeatureAs(
@@ -266,7 +252,7 @@
   public boolean isInSameFeatureOrBothInSameBase(
       ProgramMethod a, ProgramMethod b, AppView<? extends AppInfoWithClassHierarchy> appView) {
     return isInSameFeatureOrBothInSameBase(
-        a, b, appView.options(), appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
+        a, b, appView.options(), appView.getStartupOrder(), appView.getSyntheticItems());
   }
 
   public boolean isInSameFeatureOrBothInSameBase(
@@ -282,7 +268,7 @@
   public boolean isInSameFeatureOrBothInSameBase(
       DexProgramClass a, DexProgramClass b, AppView<? extends AppInfoWithClassHierarchy> appView) {
     return isInSameFeatureOrBothInSameBase(
-        a, b, appView.options(), appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
+        a, b, appView.options(), appView.getStartupOrder(), appView.getSyntheticItems());
   }
 
   public boolean isInSameFeatureOrBothInSameBase(
@@ -335,9 +321,6 @@
       DexProgramClass clazz, AppView<? extends AppInfoWithClassHierarchy> appView) {
     return getMap(appView)
         .isInFeature(
-            clazz,
-            appView.options(),
-            appView.appInfo().getStartupOrder(),
-            appView.getSyntheticItems());
+            clazz, appView.options(), appView.getStartupOrder(), appView.getSyntheticItems());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java b/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
index 8e2fbb4..68cf4a9 100644
--- a/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
+++ b/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
@@ -66,7 +66,7 @@
     }
 
     // Next perform startup checks.
-    StartupOrder startupOrder = appView.appInfo().getStartupOrder();
+    StartupOrder startupOrder = appView.getStartupOrder();
     SyntheticItems syntheticItems = appView.getSyntheticItems();
     OptionalBool callerIsStartupMethod = isStartupMethod(caller, startupOrder, syntheticItems);
     if (callerIsStartupMethod.isTrue()) {
@@ -115,7 +115,7 @@
 
     // If the source class is a startup class then require that the target class is also a startup
     // class.
-    StartupOrder startupOrder = appView.appInfo().getStartupOrder();
+    StartupOrder startupOrder = appView.getStartupOrder();
     SyntheticItems syntheticItems = appView.getSyntheticItems();
     if (startupOrder.contains(sourceClass.getType(), syntheticItems)
         && !startupOrder.contains(targetClass.getType(), syntheticItems)) {
diff --git a/src/main/java/com/android/tools/r8/graph/AccessControl.java b/src/main/java/com/android/tools/r8/graph/AccessControl.java
index 9211db6..40bbf74 100644
--- a/src/main/java/com/android/tools/r8/graph/AccessControl.java
+++ b/src/main/java/com/android/tools/r8/graph/AccessControl.java
@@ -27,7 +27,7 @@
         context,
         appView.appInfo().getClassToFeatureSplitMap(),
         appView.options(),
-        appView.appInfo().getStartupOrder(),
+        appView.getStartupOrder(),
         appView.getSyntheticItems());
   }
 
@@ -58,37 +58,40 @@
   /** Intentionally package-private, use {@link MemberResolutionResult#isAccessibleFrom}. */
   static OptionalBool isMemberAccessible(
       SuccessfulMemberResolutionResult<?, ?> resolutionResult,
-      ProgramDefinition context,
+      Definition context,
+      AppView<?> appView,
       AppInfoWithClassHierarchy appInfo) {
     return isMemberAccessible(
         resolutionResult.getResolutionPair(),
         resolutionResult.getInitialResolutionHolder(),
-        context.getContextClass(),
+        context,
+        appView,
         appInfo);
   }
 
   public static OptionalBool isMemberAccessible(
       DexClassAndMember<?, ?> member,
-      DexClass initialResolutionHolder,
-      ProgramDefinition context,
+      Definition initialResolutionContext,
+      Definition context,
       AppView<? extends AppInfoWithClassHierarchy> appView) {
     return isMemberAccessible(
-        member, initialResolutionHolder, context.getContextClass(), appView.appInfo());
+        member, initialResolutionContext, context, appView, appView.appInfo());
   }
 
   static OptionalBool isMemberAccessible(
       DexClassAndMember<?, ?> member,
-      DexClass initialResolutionHolder,
-      DexClass context,
+      Definition initialResolutionContext,
+      Definition context,
+      AppView<?> appView,
       AppInfoWithClassHierarchy appInfo) {
     AccessFlags<?> memberFlags = member.getDefinition().getAccessFlags();
     OptionalBool classAccessibility =
         isClassAccessible(
-            initialResolutionHolder,
+            initialResolutionContext.getContextClass(),
             context,
             appInfo.getClassToFeatureSplitMap(),
             appInfo.options(),
-            appInfo.getStartupOrder(),
+            appView.getStartupOrder(),
             appInfo.getSyntheticItems());
     if (classAccessibility.isFalse()) {
       return OptionalBool.FALSE;
@@ -97,15 +100,16 @@
       return classAccessibility;
     }
     if (memberFlags.isPrivate()) {
-      if (!isNestMate(member.getHolder(), context)) {
+      if (!isNestMate(member.getHolder(), context.getContextClass())) {
         return OptionalBool.FALSE;
       }
       return classAccessibility;
     }
-    if (member.getHolderType().isSamePackage(context.getType())) {
+    if (member.getHolderType().isSamePackage(context.getContextType())) {
       return classAccessibility;
     }
-    if (memberFlags.isProtected() && appInfo.isSubtype(context.getType(), member.getHolderType())) {
+    if (memberFlags.isProtected()
+        && appInfo.isSubtype(context.getContextType(), member.getHolderType())) {
       return classAccessibility;
     }
     return OptionalBool.FALSE;
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
index 1536cd8..e834153 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
@@ -7,7 +7,6 @@
 import static com.android.tools.r8.utils.TraversalContinuation.doBreak;
 import static com.android.tools.r8.utils.TraversalContinuation.doContinue;
 
-import com.android.tools.r8.experimental.startup.StartupOrder;
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.ir.analysis.type.InterfaceCollection;
 import com.android.tools.r8.ir.analysis.type.InterfaceCollection.Builder;
@@ -50,18 +49,15 @@
       DexApplication application,
       ClassToFeatureSplitMap classToFeatureSplitMap,
       MainDexInfo mainDexInfo,
-      GlobalSyntheticsStrategy globalSyntheticsStrategy,
-      StartupOrder startupOrder) {
+      GlobalSyntheticsStrategy globalSyntheticsStrategy) {
     return new AppInfoWithClassHierarchy(
         SyntheticItems.createInitialSyntheticItems(application, globalSyntheticsStrategy),
         classToFeatureSplitMap,
         mainDexInfo,
-        MissingClasses.empty(),
-        startupOrder);
+        MissingClasses.empty());
   }
 
   private final ClassToFeatureSplitMap classToFeatureSplitMap;
-  private final StartupOrder startupOrder;
 
   /** Set of types that are mentioned in the program, but for which no definition exists. */
   // TODO(b/175659048): Consider hoisting to AppInfo to allow using MissingClasses in D8 desugar.
@@ -72,12 +68,10 @@
       CommittedItems committedItems,
       ClassToFeatureSplitMap classToFeatureSplitMap,
       MainDexInfo mainDexInfo,
-      MissingClasses missingClasses,
-      StartupOrder startupOrder) {
+      MissingClasses missingClasses) {
     super(committedItems, mainDexInfo);
     this.classToFeatureSplitMap = classToFeatureSplitMap;
     this.missingClasses = missingClasses;
-    this.startupOrder = startupOrder;
   }
 
   // For desugaring.
@@ -87,7 +81,6 @@
     // TODO(b/175659048): Migrate the reporting of missing classes in D8 desugar to MissingClasses,
     //  and use the missing classes from AppInfo instead of MissingClasses.empty().
     this.missingClasses = MissingClasses.empty();
-    this.startupOrder = StartupOrder.empty();
   }
 
   public static AppInfoWithClassHierarchy createForDesugaring(AppInfo appInfo) {
@@ -97,11 +90,7 @@
 
   public final AppInfoWithClassHierarchy rebuildWithClassHierarchy(CommittedItems commit) {
     return new AppInfoWithClassHierarchy(
-        commit,
-        getClassToFeatureSplitMap(),
-        getMainDexInfo(),
-        getMissingClasses(),
-        getStartupOrder());
+        commit, getClassToFeatureSplitMap(), getMainDexInfo(), getMissingClasses());
   }
 
   public AppInfoWithClassHierarchy rebuildWithClassHierarchy(
@@ -111,8 +100,7 @@
         getSyntheticItems().commit(fn.apply(app())),
         getClassToFeatureSplitMap(),
         getMainDexInfo(),
-        getMissingClasses(),
-        getStartupOrder());
+        getMissingClasses());
   }
 
   @Override
@@ -123,8 +111,7 @@
         getSyntheticItems().commit(app()),
         getClassToFeatureSplitMap(),
         mainDexInfo,
-        getMissingClasses(),
-        getStartupOrder());
+        getMissingClasses());
   }
 
   @Override
@@ -140,8 +127,7 @@
         getSyntheticItems().commitPrunedItems(prunedItems),
         getClassToFeatureSplitMap().withoutPrunedItems(prunedItems),
         getMainDexInfo().withoutPrunedItems(prunedItems),
-        getMissingClasses(),
-        getStartupOrder().withoutPrunedItems(prunedItems, getSyntheticItems()));
+        getMissingClasses());
   }
 
   public ClassToFeatureSplitMap getClassToFeatureSplitMap() {
@@ -152,10 +138,6 @@
     return missingClasses;
   }
 
-  public StartupOrder getStartupOrder() {
-    return startupOrder;
-  }
-
   @Override
   public boolean hasClassHierarchy() {
     assert checkIfObsolete();
@@ -621,14 +603,37 @@
    * @return The actual target for {@code method} or {@code null} if none found.
    */
   // TODO(b/155968472): This should take a parameter `boolean isInterface` and use resolveMethod().
-  public DexEncodedMethod lookupStaticTarget(DexMethod method, DexProgramClass context) {
+  public DexEncodedMethod lookupStaticTarget(
+      DexMethod method,
+      DexProgramClass context,
+      AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return lookupStaticTarget(method, context, appView, appView.appInfo());
+  }
+
+  public DexEncodedMethod lookupStaticTarget(
+      DexMethod method,
+      DexProgramClass context,
+      AppView<?> appView,
+      AppInfoWithClassHierarchy appInfo) {
     assert checkIfObsolete();
-    return unsafeResolveMethodDueToDexFormatLegacy(method).lookupInvokeStaticTarget(context, this);
+    return unsafeResolveMethodDueToDexFormatLegacy(method)
+        .lookupInvokeStaticTarget(context, appView, appInfo);
   }
 
   // TODO(b/155968472): This should take a parameter `boolean isInterface` and use resolveMethod().
-  public DexEncodedMethod lookupStaticTarget(DexMethod method, ProgramMethod context) {
-    return lookupStaticTarget(method, context.getHolder());
+  public DexEncodedMethod lookupStaticTarget(
+      DexMethod method,
+      ProgramMethod context,
+      AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return lookupStaticTarget(method, context.getHolder(), appView);
+  }
+
+  public DexEncodedMethod lookupStaticTarget(
+      DexMethod method,
+      ProgramMethod context,
+      AppView<?> appView,
+      AppInfoWithClassHierarchy appInfo) {
+    return lookupStaticTarget(method, context.getHolder(), appView, appInfo);
   }
 
   /**
@@ -642,14 +647,37 @@
    * @return The actual target for {@code method} or {@code null} if none found.
    */
   // TODO(b/155968472): This should take a parameter `boolean isInterface` and use resolveMethod().
-  public DexClassAndMethod lookupSuperTarget(DexMethod method, DexProgramClass context) {
+  public DexClassAndMethod lookupSuperTarget(
+      DexMethod method,
+      DexProgramClass context,
+      AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return lookupSuperTarget(method, context, appView, appView.appInfo());
+  }
+
+  public DexClassAndMethod lookupSuperTarget(
+      DexMethod method,
+      DexProgramClass context,
+      AppView<?> appView,
+      AppInfoWithClassHierarchy appInfo) {
     assert checkIfObsolete();
-    return unsafeResolveMethodDueToDexFormatLegacy(method).lookupInvokeSuperTarget(context, this);
+    return unsafeResolveMethodDueToDexFormatLegacy(method)
+        .lookupInvokeSuperTarget(context, appView, appInfo);
   }
 
   // TODO(b/155968472): This should take a parameter `boolean isInterface` and use resolveMethod().
-  public DexClassAndMethod lookupSuperTarget(DexMethod method, ProgramMethod context) {
-    return lookupSuperTarget(method, context.getHolder());
+  public final DexClassAndMethod lookupSuperTarget(
+      DexMethod method,
+      ProgramMethod context,
+      AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return lookupSuperTarget(method, context, appView, appView.appInfo());
+  }
+
+  public final DexClassAndMethod lookupSuperTarget(
+      DexMethod method,
+      ProgramMethod context,
+      AppView<?> appView,
+      AppInfoWithClassHierarchy appInfo) {
+    return lookupSuperTarget(method, context.getHolder(), appView, appInfo);
   }
 
   /**
@@ -661,14 +689,37 @@
    * @return The actual target for {@code method} or {@code null} if none found.
    */
   // TODO(b/155968472): This should take a parameter `boolean isInterface` and use resolveMethod().
-  public DexEncodedMethod lookupDirectTarget(DexMethod method, DexProgramClass context) {
+  public DexEncodedMethod lookupDirectTarget(
+      DexMethod method,
+      DexProgramClass context,
+      AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return lookupDirectTarget(method, context, appView, appView.appInfo());
+  }
+
+  public DexEncodedMethod lookupDirectTarget(
+      DexMethod method,
+      DexProgramClass context,
+      AppView<?> appView,
+      AppInfoWithClassHierarchy appInfo) {
     assert checkIfObsolete();
-    return unsafeResolveMethodDueToDexFormatLegacy(method).lookupInvokeDirectTarget(context, this);
+    return unsafeResolveMethodDueToDexFormatLegacy(method)
+        .lookupInvokeDirectTarget(context, appView, appInfo);
   }
 
   // TODO(b/155968472): This should take a parameter `boolean isInterface` and use resolveMethod().
-  public DexEncodedMethod lookupDirectTarget(DexMethod method, ProgramMethod context) {
-    return lookupDirectTarget(method, context.getHolder());
+  public DexEncodedMethod lookupDirectTarget(
+      DexMethod method,
+      ProgramMethod context,
+      AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return lookupDirectTarget(method, context, appView, appView.appInfo());
+  }
+
+  public DexEncodedMethod lookupDirectTarget(
+      DexMethod method,
+      ProgramMethod context,
+      AppView<?> appView,
+      AppInfoWithClassHierarchy appInfo) {
+    return lookupDirectTarget(method, context.getHolder(), appView, appInfo);
   }
 
   /**
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index 9560129..42a4744 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -87,6 +87,8 @@
   private ProguardCompatibilityActions proguardCompatibilityActions;
   private RootSet rootSet;
   private MainDexRootSet mainDexRootSet = null;
+  private StartupOrder startupOrder;
+
   // This should preferably always be obtained via AppInfoWithLiveness.
   // Currently however the liveness may be downgraded thus loosing the computed keep info.
   private KeepInfoCollection keepInfo = null;
@@ -138,14 +140,22 @@
   private AppView(
       T appInfo,
       ArtProfileCollection artProfileCollection,
+      StartupOrder startupOrder,
       WholeProgramOptimizations wholeProgramOptimizations,
       TypeRewriter mapper) {
-    this(appInfo, artProfileCollection, wholeProgramOptimizations, mapper, Timing.empty());
+    this(
+        appInfo,
+        artProfileCollection,
+        startupOrder,
+        wholeProgramOptimizations,
+        mapper,
+        Timing.empty());
   }
 
   private AppView(
       T appInfo,
       ArtProfileCollection artProfileCollection,
+      StartupOrder startupOrder,
       WholeProgramOptimizations wholeProgramOptimizations,
       TypeRewriter mapper,
       Timing timing) {
@@ -155,6 +165,7 @@
         timing.time(
             "Compilation context", () -> CompilationContext.createInitialContext(options()));
     this.artProfileCollection = artProfileCollection;
+    this.startupOrder = startupOrder;
     this.dontWarnConfiguration =
         timing.time(
             "Dont warn config",
@@ -200,6 +211,7 @@
     return new AppView<>(
         appInfo,
         ArtProfileCollection.createInitialArtProfileCollection(appInfo, appInfo.options()),
+        StartupOrder.empty(),
         WholeProgramOptimizations.OFF,
         defaultTypeRewriter(appInfo));
   }
@@ -208,6 +220,7 @@
     return new AppView<>(
         appInfo,
         ArtProfileCollection.empty(),
+        StartupOrder.empty(),
         WholeProgramOptimizations.OFF,
         defaultTypeRewriter(appInfo));
   }
@@ -217,6 +230,7 @@
     return new AppView<>(
         appInfo,
         ArtProfileCollection.createInitialArtProfileCollection(appInfo, appInfo.options()),
+        StartupOrder.empty(),
         WholeProgramOptimizations.OFF,
         mapper,
         timing);
@@ -230,17 +244,16 @@
       DexApplication application, MainDexInfo mainDexInfo) {
     ClassToFeatureSplitMap classToFeatureSplitMap =
         ClassToFeatureSplitMap.createInitialClassToFeatureSplitMap(application.options);
-    StartupOrder startupOrder = StartupOrder.createInitialStartupOrderForR8(application);
     AppInfoWithClassHierarchy appInfo =
         AppInfoWithClassHierarchy.createInitialAppInfoWithClassHierarchy(
             application,
             classToFeatureSplitMap,
             mainDexInfo,
-            GlobalSyntheticsStrategy.forSingleOutputMode(),
-            startupOrder);
+            GlobalSyntheticsStrategy.forSingleOutputMode());
     return new AppView<>(
         appInfo,
         ArtProfileCollection.createInitialArtProfileCollection(appInfo, appInfo.options()),
+        StartupOrder.createInitialStartupOrderForR8(application),
         WholeProgramOptimizations.ON,
         defaultTypeRewriter(appInfo));
   }
@@ -249,6 +262,7 @@
     return new AppView<>(
         appInfo,
         ArtProfileCollection.createInitialArtProfileCollection(appInfo, appInfo.options()),
+        StartupOrder.empty(),
         WholeProgramOptimizations.OFF,
         mapper);
   }
@@ -257,6 +271,7 @@
     return new AppView<>(
         appInfo,
         ArtProfileCollection.empty(),
+        StartupOrder.empty(),
         WholeProgramOptimizations.OFF,
         defaultTypeRewriter(appInfo));
   }
@@ -266,6 +281,7 @@
     return new AppView<>(
         appInfo,
         ArtProfileCollection.empty(),
+        StartupOrder.empty(),
         WholeProgramOptimizations.ON,
         defaultTypeRewriter(appInfo));
   }
@@ -361,6 +377,14 @@
     this.artProfileCollection = artProfileCollection;
   }
 
+  public StartupOrder getStartupOrder() {
+    return startupOrder;
+  }
+
+  public void setStartupOrder(StartupOrder startupOrder) {
+    this.startupOrder = startupOrder;
+  }
+
   public AssumeInfoCollection getAssumeInfoCollection() {
     return assumeInfoCollection;
   }
@@ -827,6 +851,7 @@
     if (hasRootSet()) {
       rootSet.pruneItems(prunedItems);
     }
+    setStartupOrder(getStartupOrder().withoutPrunedItems(prunedItems, getSyntheticItems()));
     if (hasMainDexRootSet()) {
       setMainDexRootSet(mainDexRootSet.withoutPrunedItems(prunedItems));
     }
@@ -946,6 +971,7 @@
           if (appView.hasRootSet()) {
             appView.setRootSet(appView.rootSet().rewrittenWithLens(lens));
           }
+          appView.setStartupOrder(appView.getStartupOrder().rewrittenWithLens(lens));
         });
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java b/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
index 196864a..9a6d7cb 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
@@ -197,8 +197,8 @@
 
     @Override
     public OptionalBool isAccessibleFrom(
-        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
-      return AccessControl.isMemberAccessible(this, context, appInfo);
+        ProgramDefinition context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
+      return AccessControl.isMemberAccessible(this, context, appView, appInfo);
     }
 
     @Override
@@ -382,7 +382,7 @@
 
     @Override
     public OptionalBool isAccessibleFrom(
-        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
+        ProgramDefinition context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       throw new Unimplemented("Should not be called on MultipleFieldResolutionResult");
     }
 
@@ -456,7 +456,7 @@
 
     @Override
     public OptionalBool isAccessibleFrom(
-        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
+        ProgramDefinition context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       return OptionalBool.FALSE;
     }
 
diff --git a/src/main/java/com/android/tools/r8/graph/MemberResolutionResult.java b/src/main/java/com/android/tools/r8/graph/MemberResolutionResult.java
index e5467ff..47f8a33 100644
--- a/src/main/java/com/android/tools/r8/graph/MemberResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/MemberResolutionResult.java
@@ -17,14 +17,14 @@
 
   public abstract SuccessfulMemberResolutionResult<D, R> asSuccessfulMemberResolutionResult();
 
-  public abstract OptionalBool isAccessibleFrom(
-      ProgramDefinition context, AppInfoWithClassHierarchy appInfo);
-
   public final OptionalBool isAccessibleFrom(
       ProgramDefinition context, AppView<? extends AppInfoWithClassHierarchy> appView) {
-    return isAccessibleFrom(context, appView.appInfo());
+    return isAccessibleFrom(context, appView, appView.appInfo());
   }
 
+  public abstract OptionalBool isAccessibleFrom(
+      ProgramDefinition context, AppView<?> appView, AppInfoWithClassHierarchy appInfo);
+
   /**
    * Returns true if resolution failed.
    *
diff --git a/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java b/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
index ef0d7ff..14c36c3 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
@@ -75,7 +75,13 @@
     return false;
   }
 
-  public boolean isNoSuchMethodErrorResult(DexClass context, AppInfoWithClassHierarchy appInfo) {
+  public final boolean isNoSuchMethodErrorResult(
+      DexClass context, AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return isNoSuchMethodErrorResult(context, appView, appView.appInfo());
+  }
+
+  public boolean isNoSuchMethodErrorResult(
+      DexClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
     return false;
   }
 
@@ -83,7 +89,13 @@
     return false;
   }
 
-  public boolean isIllegalAccessErrorResult(DexClass context, AppInfoWithClassHierarchy appInfo) {
+  public final boolean isIllegalAccessErrorResult(
+      DexClass context, AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return isIllegalAccessErrorResult(context, appView, appView.appInfo());
+  }
+
+  public boolean isIllegalAccessErrorResult(
+      DexClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
     return false;
   }
 
@@ -139,41 +151,57 @@
   }
 
   public abstract OptionalBool isAccessibleForVirtualDispatchFrom(
-      ProgramDefinition context, AppInfoWithClassHierarchy appInfo);
+      ProgramDefinition context, AppView<? extends AppInfoWithClassHierarchy> appView);
 
   public abstract boolean isVirtualTarget();
 
   /** Lookup the single target of an invoke-special on this resolution result if possible. */
   public abstract DexClassAndMethod lookupInvokeSpecialTarget(
-      DexProgramClass context, AppInfoWithClassHierarchy appInfo);
+      DexProgramClass context, AppView<? extends AppInfoWithClassHierarchy> appView);
+
+  public final DexClassAndMethod lookupInvokeSuperTarget(
+      DexProgramClass context, AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return lookupInvokeSuperTarget(context, appView, appView.appInfo());
+  }
 
   /** Lookup the single target of an invoke-super on this resolution result if possible. */
   public abstract DexClassAndMethod lookupInvokeSuperTarget(
-      DexProgramClass context, AppInfoWithClassHierarchy appInfo);
+      DexProgramClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo);
 
   /** Lookup the single target of an invoke-direct on this resolution result if possible. */
+  public final DexEncodedMethod lookupInvokeDirectTarget(
+      DexProgramClass context, AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return lookupInvokeDirectTarget(context, appView, appView.appInfo());
+  }
+
   public abstract DexEncodedMethod lookupInvokeDirectTarget(
-      DexProgramClass context, AppInfoWithClassHierarchy appInfo);
+      DexProgramClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo);
 
   /** Lookup the single target of an invoke-static on this resolution result if possible. */
+  public final DexEncodedMethod lookupInvokeStaticTarget(
+      DexProgramClass context, AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return lookupInvokeStaticTarget(context, appView, appView.appInfo());
+  }
+
   public abstract DexEncodedMethod lookupInvokeStaticTarget(
-      DexProgramClass context, AppInfoWithClassHierarchy appInfo);
+      DexProgramClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo);
 
   public abstract LookupResult lookupVirtualDispatchTargets(
       DexProgramClass context,
-      AppInfoWithClassHierarchy appInfo,
+      AppView<? extends AppInfoWithClassHierarchy> appView,
       InstantiatedSubTypeInfo instantiatedInfo,
       PinnedPredicate pinnedPredicate);
 
   public final LookupResult lookupVirtualDispatchTargets(
-      DexProgramClass context, AppInfoWithLiveness appInfo) {
+      DexProgramClass context, AppView<AppInfoWithLiveness> appView) {
+    AppInfoWithLiveness appInfo = appView.appInfo();
     return lookupVirtualDispatchTargets(
-        context, appInfo, appInfo, appInfo::isPinnedNotProgramOrLibraryOverride);
+        context, appView, appInfo, appInfo::isPinnedNotProgramOrLibraryOverride);
   }
 
   public abstract LookupResult lookupVirtualDispatchTargets(
       DexProgramClass context,
-      AppInfoWithLiveness appInfo,
+      AppView<AppInfoWithLiveness> appView,
       DexProgramClass refinedReceiverUpperBound,
       DexProgramClass refinedReceiverLowerBound);
 
@@ -309,15 +337,15 @@
 
     @Override
     public OptionalBool isAccessibleFrom(
-        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
-      return AccessControl.isMemberAccessible(this, context, appInfo);
+        ProgramDefinition context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
+      return AccessControl.isMemberAccessible(this, context, appView, appInfo);
     }
 
     @Override
     public OptionalBool isAccessibleForVirtualDispatchFrom(
-        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
+        ProgramDefinition context, AppView<? extends AppInfoWithClassHierarchy> appView) {
       if (resolvedMethod.isVirtualMethod()) {
-        return isAccessibleFrom(context, appInfo);
+        return isAccessibleFrom(context, appView, appView.appInfo());
       }
       return OptionalBool.FALSE;
     }
@@ -335,9 +363,10 @@
      */
     @Override
     public DexClassAndMethod lookupInvokeSpecialTarget(
-        DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
+        DexProgramClass context, AppView<? extends AppInfoWithClassHierarchy> appView) {
       // If the resolution is non-accessible then no target exists.
-      if (isAccessibleFrom(context, appInfo).isPossiblyTrue()) {
+      AppInfoWithClassHierarchy appInfo = appView.appInfo();
+      if (isAccessibleFrom(context, appView).isPossiblyTrue()) {
         return internalInvokeSpecialOrSuper(
             context, appInfo, (sup, sub) -> isSuperclass(sup, sub, appInfo));
       }
@@ -372,14 +401,14 @@
      */
     @Override
     public DexClassAndMethod lookupInvokeSuperTarget(
-        DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
+        DexProgramClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       if (resolvedMethod.isInstanceInitializer()
           || (initialResolutionHolder != context
               && !isSuperclass(initialResolutionHolder, context, appInfo))) {
         // If the target is <init> or not on a super class then the call is invalid.
         return null;
       }
-      if (isAccessibleFrom(context, appInfo).isPossiblyTrue()) {
+      if (isAccessibleFrom(context, appView, appInfo).isPossiblyTrue()) {
         return internalInvokeSpecialOrSuper(context, appInfo, (sup, sub) -> true);
       }
       return null;
@@ -397,8 +426,8 @@
      */
     @Override
     public DexEncodedMethod lookupInvokeStaticTarget(
-        DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
-      if (isAccessibleFrom(context, appInfo).isFalse()) {
+        DexProgramClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
+      if (isAccessibleFrom(context, appView, appInfo).isFalse()) {
         return null;
       }
       if (resolvedMethod.isStatic()) {
@@ -418,8 +447,8 @@
      */
     @Override
     public DexEncodedMethod lookupInvokeDirectTarget(
-        DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
-      if (isAccessibleFrom(context, appInfo).isFalse()) {
+        DexProgramClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
+      if (isAccessibleFrom(context, appView, appInfo).isFalse()) {
         return null;
       }
       if (resolvedMethod.isDirectMethod()) {
@@ -513,13 +542,14 @@
     @Override
     public LookupResult lookupVirtualDispatchTargets(
         DexProgramClass context,
-        AppInfoWithClassHierarchy appInfo,
+        AppView<? extends AppInfoWithClassHierarchy> appView,
         InstantiatedSubTypeInfo instantiatedInfo,
         PinnedPredicate pinnedPredicate) {
       // Check that the initial resolution holder is accessible from the context.
+      AppInfoWithClassHierarchy appInfo = appView.appInfo();
       assert appInfo.isSubtype(initialResolutionHolder.type, resolvedHolder.type)
           : initialResolutionHolder.type + " is not a subtype of " + resolvedHolder.type;
-      if (context != null && isAccessibleFrom(context, appInfo).isFalse()) {
+      if (context != null && isAccessibleFrom(context, appView).isFalse()) {
         return LookupResult.createFailedResult();
       }
       if (resolvedMethod.isPrivateMethod()) {
@@ -558,7 +588,7 @@
           },
           lambda -> {
             assert resolvedHolder.isInterface()
-                || resolvedHolder.type == appInfo.dexItemFactory().objectType;
+                || resolvedHolder.type == appView.dexItemFactory().objectType;
             LookupTarget target =
                 lookupVirtualDispatchTarget(
                     lambda,
@@ -582,9 +612,10 @@
     @Override
     public LookupResult lookupVirtualDispatchTargets(
         DexProgramClass context,
-        AppInfoWithLiveness appInfo,
+        AppView<AppInfoWithLiveness> appView,
         DexProgramClass refinedReceiverUpperBound,
         DexProgramClass refinedReceiverLowerBound) {
+      AppInfoWithLiveness appInfo = appView.appInfo();
       assert refinedReceiverUpperBound != null;
       assert appInfo.isSubtype(refinedReceiverUpperBound.type, initialResolutionHolder.type);
       assert refinedReceiverLowerBound == null
@@ -600,7 +631,7 @@
       LookupResult lookupResult =
           lookupVirtualDispatchTargets(
               context,
-              appInfo,
+              appView,
               instantiatedSubTypeInfo,
               appInfo::isPinnedNotProgramOrLibraryOverride);
       if (hasInstantiatedLambdas.get() && lookupResult.isLookupResultSuccess()) {
@@ -977,32 +1008,32 @@
 
     @Override
     public final DexClassAndMethod lookupInvokeSpecialTarget(
-        DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
+        DexProgramClass context, AppView<? extends AppInfoWithClassHierarchy> appView) {
       return null;
     }
 
     @Override
     public DexClassAndMethod lookupInvokeSuperTarget(
-        DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
+        DexProgramClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       return null;
     }
 
     @Override
     public DexEncodedMethod lookupInvokeStaticTarget(
-        DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
+        DexProgramClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       return null;
     }
 
     @Override
     public DexEncodedMethod lookupInvokeDirectTarget(
-        DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
+        DexProgramClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       return null;
     }
 
     @Override
     public LookupResult lookupVirtualDispatchTargets(
         DexProgramClass context,
-        AppInfoWithClassHierarchy appInfo,
+        AppView<? extends AppInfoWithClassHierarchy> appView,
         InstantiatedSubTypeInfo instantiatedInfo,
         PinnedPredicate pinnedPredicate) {
       return LookupResult.getIncompleteEmptyResult();
@@ -1011,7 +1042,7 @@
     @Override
     public LookupResult lookupVirtualDispatchTargets(
         DexProgramClass context,
-        AppInfoWithLiveness appInfo,
+        AppView<AppInfoWithLiveness> appView,
         DexProgramClass refinedReceiverUpperBound,
         DexProgramClass refinedReceiverLowerBound) {
       return LookupResult.getIncompleteEmptyResult();
@@ -1050,13 +1081,13 @@
 
     @Override
     public OptionalBool isAccessibleFrom(
-        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
+        ProgramDefinition context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       return OptionalBool.TRUE;
     }
 
     @Override
     public OptionalBool isAccessibleForVirtualDispatchFrom(
-        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
+        ProgramDefinition context, AppView<? extends AppInfoWithClassHierarchy> appView) {
       return OptionalBool.TRUE;
     }
 
@@ -1110,13 +1141,13 @@
 
     @Override
     public OptionalBool isAccessibleFrom(
-        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
+        ProgramDefinition context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       return OptionalBool.FALSE;
     }
 
     @Override
     public OptionalBool isAccessibleForVirtualDispatchFrom(
-        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
+        ProgramDefinition context, AppView<? extends AppInfoWithClassHierarchy> appView) {
       return OptionalBool.FALSE;
     }
 
@@ -1218,7 +1249,8 @@
     }
 
     @Override
-    public boolean isNoSuchMethodErrorResult(DexClass context, AppInfoWithClassHierarchy appInfo) {
+    public boolean isNoSuchMethodErrorResult(
+        DexClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       return true;
     }
 
@@ -1262,14 +1294,15 @@
     }
 
     @Override
-    public boolean isIllegalAccessErrorResult(DexClass context, AppInfoWithClassHierarchy appInfo) {
+    public boolean isIllegalAccessErrorResult(
+        DexClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       if (!hasMethodsCausingError()) {
         return false;
       }
       BooleanBox seenNoAccess = new BooleanBox(false);
       forEachFailureDependency(
           type ->
-              appInfo
+              appView
                   .contextIndependentDefinitionForWithResolutionResult(type)
                   .forEachClassResolutionResult(
                       clazz ->
@@ -1278,27 +1311,28 @@
                                       clazz,
                                       context,
                                       appInfo.getClassToFeatureSplitMap(),
-                                      appInfo.options(),
-                                      appInfo.getStartupOrder(),
-                                      appInfo.getSyntheticItems())
+                                      appView.options(),
+                                      appView.getStartupOrder(),
+                                      appView.getSyntheticItems())
                                   .isPossiblyFalse())),
           method -> {
-            DexClass holder = appInfo.definitionFor(method.getHolderType());
+            DexClass holder = appView.definitionFor(method.getHolderType());
             DexClassAndMethod classAndMethod = DexClassAndMethod.create(holder, method);
             seenNoAccess.or(
                 AccessControl.isMemberAccessible(
-                        classAndMethod, initialResolutionHolder, context, appInfo)
+                        classAndMethod, initialResolutionHolder, context, appView, appInfo)
                     .isPossiblyFalse());
           });
       return seenNoAccess.get();
     }
 
     @Override
-    public boolean isNoSuchMethodErrorResult(DexClass context, AppInfoWithClassHierarchy appInfo) {
+    public boolean isNoSuchMethodErrorResult(
+        DexClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       if (!hasMethodsCausingError()) {
         return true;
       }
-      if (isIllegalAccessErrorResult(context, appInfo)) {
+      if (isIllegalAccessErrorResult(context, appView, appInfo)) {
         return false;
       }
       // At this point we know we have methods causing errors but we have access to them. To be
@@ -1345,13 +1379,13 @@
 
     @Override
     public OptionalBool isAccessibleFrom(
-        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
+        ProgramDefinition context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       throw new Unreachable("Should not be called on MultipleFieldResolutionResult");
     }
 
     @Override
     public OptionalBool isAccessibleForVirtualDispatchFrom(
-        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
+        ProgramDefinition context, AppView<? extends AppInfoWithClassHierarchy> appView) {
       throw new Unreachable("Should not be called on MultipleFieldResolutionResult");
     }
 
@@ -1362,32 +1396,32 @@
 
     @Override
     public DexClassAndMethod lookupInvokeSpecialTarget(
-        DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
+        DexProgramClass context, AppView<? extends AppInfoWithClassHierarchy> appView) {
       throw new Unreachable("Should not be called on MultipleFieldResolutionResult");
     }
 
     @Override
     public DexClassAndMethod lookupInvokeSuperTarget(
-        DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
+        DexProgramClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       throw new Unreachable("Should not be called on MultipleFieldResolutionResult");
     }
 
     @Override
     public DexEncodedMethod lookupInvokeDirectTarget(
-        DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
+        DexProgramClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       throw new Unreachable("Should not be called on MultipleFieldResolutionResult");
     }
 
     @Override
     public DexEncodedMethod lookupInvokeStaticTarget(
-        DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
+        DexProgramClass context, AppView<?> appView, AppInfoWithClassHierarchy appInfo) {
       throw new Unreachable("Should not be called on MultipleFieldResolutionResult");
     }
 
     @Override
     public LookupResult lookupVirtualDispatchTargets(
         DexProgramClass context,
-        AppInfoWithClassHierarchy appInfo,
+        AppView<? extends AppInfoWithClassHierarchy> appView,
         InstantiatedSubTypeInfo instantiatedInfo,
         PinnedPredicate pinnedPredicate) {
       throw new Unreachable("Should not be called on MultipleFieldResolutionResult");
@@ -1396,7 +1430,7 @@
     @Override
     public LookupResult lookupVirtualDispatchTargets(
         DexProgramClass context,
-        AppInfoWithLiveness appInfo,
+        AppView<AppInfoWithLiveness> appView,
         DexProgramClass refinedReceiverUpperBound,
         DexProgramClass refinedReceiverLowerBound) {
       throw new Unreachable("Should not be called on MultipleFieldResolutionResult");
diff --git a/src/main/java/com/android/tools/r8/graph/UseRegistry.java b/src/main/java/com/android/tools/r8/graph/UseRegistry.java
index f5a1aad..be1b904c06 100644
--- a/src/main/java/com/android/tools/r8/graph/UseRegistry.java
+++ b/src/main/java/com/android/tools/r8/graph/UseRegistry.java
@@ -12,7 +12,7 @@
 
 public abstract class UseRegistry<T extends Definition> {
 
-  private final AppView<?> appView;
+  protected final AppView<?> appView;
   private final T context;
 
   private TraversalContinuation<?, ?> continuation = TraversalContinuation.doContinue();
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java
index b1ad665..2e0a307 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java
@@ -106,6 +106,10 @@
     this.appView = appView;
   }
 
+  private AppView<AppInfoWithLiveness> appView() {
+    return appView;
+  }
+
   // TODO(b/270398965): Replace LinkedList.
   @SuppressWarnings("JdkObsolete")
   @Override
@@ -407,7 +411,7 @@
     class TracerUseRegistry extends UseRegistry<ProgramMethod> {
 
       TracerUseRegistry(ProgramMethod context) {
-        super(appView, context);
+        super(appView(), context);
       }
 
       private void fail() {
@@ -431,7 +435,7 @@
       }
 
       private boolean isClassAlreadyInitializedInCurrentContext(DexProgramClass clazz) {
-        return appView.appInfo().isSubtype(getContext().getHolder(), clazz);
+        return appView().appInfo().isSubtype(getContext().getHolder(), clazz);
       }
 
       private void triggerClassInitializer(DexProgramClass root) {
@@ -481,7 +485,7 @@
         DexMethod rewrittenMethod =
             appView.graphLens().lookupInvokeDirect(method, getContext()).getReference();
         MethodResolutionResult resolutionResult =
-            appView.appInfo().resolveMethodOnClassHolderLegacy(rewrittenMethod);
+            appView().appInfo().resolveMethodOnClassHolderLegacy(rewrittenMethod);
         if (resolutionResult.isSingleResolution()
             && resolutionResult.getResolvedHolder().isProgramClass()) {
           enqueueMethod(resolutionResult.getResolvedProgramMethod());
@@ -493,7 +497,7 @@
         DexMethod rewrittenMethod =
             appView.graphLens().lookupInvokeInterface(method, getContext()).getReference();
         DexClassAndMethod resolvedMethod =
-            appView
+            appView()
                 .appInfo()
                 .resolveMethodOnInterfaceHolderLegacy(rewrittenMethod)
                 .getResolutionPair();
@@ -507,7 +511,7 @@
         DexMethod rewrittenMethod =
             appView.graphLens().lookupInvokeStatic(method, getContext()).getReference();
         ProgramMethod resolvedMethod =
-            appView
+            appView()
                 .appInfo()
                 .unsafeResolveMethodDueToDexFormatLegacy(rewrittenMethod)
                 .getResolvedProgramMethod();
@@ -523,7 +527,7 @@
             appView.graphLens().lookupInvokeSuper(method, getContext()).getReference();
         ProgramMethod superTarget =
             asProgramMethodOrNull(
-                appView.appInfo().lookupSuperTarget(rewrittenMethod, getContext()));
+                appView().appInfo().lookupSuperTarget(rewrittenMethod, getContext(), appView()));
         if (superTarget != null) {
           enqueueMethod(superTarget);
         }
@@ -534,7 +538,10 @@
         DexMethod rewrittenMethod =
             appView.graphLens().lookupInvokeVirtual(method, getContext()).getReference();
         DexClassAndMethod resolvedMethod =
-            appView.appInfo().resolveMethodOnClassHolderLegacy(rewrittenMethod).getResolutionPair();
+            appView()
+                .appInfo()
+                .resolveMethodOnClassHolderLegacy(rewrittenMethod)
+                .getResolutionPair();
         if (resolvedMethod != null) {
           if (!resolvedMethod.getHolder().isEffectivelyFinal(appView)) {
             fail();
@@ -569,7 +576,7 @@
 
       @Override
       public void registerCallSite(DexCallSite callSite) {
-        if (isLambdaMetafactoryMethod(callSite, appView.appInfo())) {
+        if (isLambdaMetafactoryMethod(callSite, appView().appInfo())) {
           // Use of lambda metafactory does not trigger any class initialization.
         } else {
           fail();
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
index acc6daa..4525030 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
@@ -82,6 +82,10 @@
     this.postMethodProcessorBuilder = postMethodProcessorBuilder;
   }
 
+  private AppView<AppInfoWithLiveness> appView() {
+    return appView;
+  }
+
   public void run(
       ExecutorService executorService, OptimizationFeedbackDelayed feedback, Timing timing)
       throws ExecutionException {
@@ -312,7 +316,7 @@
   class TrivialFieldAccessUseRegistry extends UseRegistry<ProgramMethod> {
 
     TrivialFieldAccessUseRegistry(ProgramMethod method) {
-      super(appView, method);
+      super(appView(), method);
     }
 
     private void registerFieldAccess(
@@ -320,7 +324,7 @@
         boolean isStatic,
         boolean isWrite,
         BytecodeInstructionMetadata metadata) {
-      FieldResolutionResult resolutionResult = appView.appInfo().resolveField(reference);
+      FieldResolutionResult resolutionResult = appView().appInfo().resolveField(reference);
       if (!resolutionResult.hasProgramResult()) {
         // We don't care about field accesses that may not resolve to a program field.
         return;
@@ -332,8 +336,8 @@
       if (definition.isStatic() != isStatic
           || appView.isCfByteCodePassThrough(getContext().getDefinition())
           || !resolutionResult.isSingleProgramFieldResolutionResult()
-          || resolutionResult.isAccessibleFrom(getContext(), appView).isPossiblyFalse()
-          || appView.appInfo().isNeverReprocessMethod(getContext())) {
+          || resolutionResult.isAccessibleFrom(getContext(), appView()).isPossiblyFalse()
+          || appView().appInfo().isNeverReprocessMethod(getContext())) {
         recordAccessThatCannotBeOptimized(field, definition);
         return;
       }
@@ -355,7 +359,7 @@
       }
 
       // Record access.
-      if (field.isProgramField() && appView.appInfo().mayPropagateValueFor(appView, field)) {
+      if (field.isProgramField() && appView().appInfo().mayPropagateValueFor(appView(), field)) {
         if (field.getAccessFlags().isStatic() == isStatic) {
           if (isWrite) {
             recordFieldAccessContext(definition, writtenFields, readFields);
@@ -400,7 +404,7 @@
     private void recordAccessThatCannotBeOptimized(
         DexClassAndField field, DexEncodedField definition) {
       constantFields.remove(definition);
-      if (field.isProgramField() && appView.appInfo().mayPropagateValueFor(appView, field)) {
+      if (field.isProgramField() && appView().appInfo().mayPropagateValueFor(appView(), field)) {
         destroyFieldAccessContexts(definition);
       }
     }
diff --git a/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java b/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java
index 3551561..86ef0d7 100644
--- a/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java
@@ -92,7 +92,7 @@
     // Check if the resolution target is accessible.
     if (singleFieldResolutionResult.getResolvedHolder() != context.getHolder()) {
       if (singleFieldResolutionResult
-          .isAccessibleFrom(context, appView.appInfo().withClassHierarchy())
+          .isAccessibleFrom(context, appView.withClassHierarchy())
           .isPossiblyFalse()) {
         return true;
       }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
index 4fa5742..92ecb73 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
@@ -25,6 +25,7 @@
 import com.android.tools.r8.ir.desugar.LambdaDescriptor;
 import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
 import com.android.tools.r8.ir.optimize.InliningConstraints;
+import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import java.util.List;
 
 public final class InvokeCustom extends Invoke {
@@ -70,8 +71,8 @@
     if (!appView.appInfo().hasLiveness()) {
       return returnType;
     }
-    List<DexType> lambdaInterfaces =
-        LambdaDescriptor.getInterfaces(callSite, appView.appInfo().withClassHierarchy());
+    AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
+    List<DexType> lambdaInterfaces = LambdaDescriptor.getInterfaces(callSite, appViewWithLiveness);
     if (lambdaInterfaces == null || lambdaInterfaces.isEmpty()) {
       return returnType;
     }
@@ -98,7 +99,7 @@
     assert verifyLambdaInterfaces(returnType, lambdaInterfaceSet, objectType);
 
     return ClassTypeElement.create(
-        objectType, Nullability.maybeNull(), appView.withClassHierarchy(), lambdaInterfaceSet);
+        objectType, Nullability.maybeNull(), appViewWithLiveness, lambdaInterfaceSet);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java b/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
index 146f61a..3891d20 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
@@ -140,9 +140,10 @@
       AppView<?> appView, ProgramMethod context, DynamicType dynamicReceiverType) {
     DexMethod invokedMethod = getInvokedMethod();
     DexEncodedMethod result;
-    if (appView.appInfo().hasLiveness()) {
-      AppInfoWithLiveness appInfo = appView.appInfo().withLiveness();
-      result = appInfo.lookupDirectTarget(invokedMethod, context);
+    if (appView.hasLiveness()) {
+      AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
+      AppInfoWithLiveness appInfo = appViewWithLiveness.appInfo();
+      result = appInfo.lookupDirectTarget(invokedMethod, context, appViewWithLiveness);
       assert verifyD8LookupResult(
           result, appView.appInfo().lookupDirectTargetOnItself(invokedMethod, context));
     } else {
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
index 7f5c809..b7a8fae 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
@@ -156,14 +156,9 @@
     if (refinedReceiverUpperBound != null) {
       lookupResult =
           resolutionResult.lookupVirtualDispatchTargets(
-              context.getHolder(),
-              appView.withLiveness().appInfo(),
-              refinedReceiverUpperBound,
-              refinedReceiverLowerBound);
+              context.getHolder(), appView, refinedReceiverUpperBound, refinedReceiverLowerBound);
     } else {
-      lookupResult =
-          resolutionResult.lookupVirtualDispatchTargets(
-              context.getHolder(), appView.withLiveness().appInfo());
+      lookupResult = resolutionResult.lookupVirtualDispatchTargets(context.getHolder(), appView);
     }
     if (lookupResult.isLookupResultFailure()) {
       return null;
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
index 1bf7eb7..c84568c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
@@ -120,10 +120,11 @@
     DexMethod invokedMethod = getInvokedMethod();
     DexEncodedMethod result;
     if (appView.appInfo().hasLiveness()) {
-      AppInfoWithLiveness appInfo = appView.appInfo().withLiveness();
-      result = appInfo.lookupStaticTarget(invokedMethod, context);
+      AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
+      AppInfoWithLiveness appInfo = appViewWithLiveness.appInfo();
+      result = appInfo.lookupStaticTarget(invokedMethod, context, appViewWithLiveness);
       assert verifyD8LookupResult(
-          result, appView.appInfo().lookupStaticTargetOnItself(invokedMethod, context));
+          result, appInfo.lookupStaticTargetOnItself(invokedMethod, context));
     } else {
       // Allow optimizing static library invokes in D8.
       DexClass clazz = appView.definitionForHolder(getInvokedMethod());
@@ -216,7 +217,7 @@
 
     // Verify that the target method is static and accessible.
     if (!singleTarget.getDefinition().isStatic()
-        || resolutionResult.isAccessibleFrom(context, appInfoWithLiveness).isPossiblyFalse()) {
+        || resolutionResult.isAccessibleFrom(context, appViewWithLiveness).isPossiblyFalse()) {
       return true;
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
index 0b7dce8..4eaae3c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
@@ -113,7 +113,7 @@
       AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
       AppInfoWithLiveness appInfo = appViewWithLiveness.appInfo();
       if (appInfo.isSubtype(context.getHolderType(), getInvokedMethod().holder)) {
-        return appInfo.lookupSuperTarget(getInvokedMethod(), context);
+        return appInfo.lookupSuperTarget(getInvokedMethod(), context, appViewWithLiveness);
       }
     }
     return null;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/callgraph/InvokeExtractor.java b/src/main/java/com/android/tools/r8/ir/conversion/callgraph/InvokeExtractor.java
index 3c940a6..34e00ef 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/callgraph/InvokeExtractor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/callgraph/InvokeExtractor.java
@@ -118,7 +118,7 @@
                   appView.appInfo().resolveMethodLegacy(method, isInterface);
               if (resolution.isVirtualTarget()) {
                 LookupResult lookupResult =
-                    resolution.lookupVirtualDispatchTargets(context.getHolder(), appView.appInfo());
+                    resolution.lookupVirtualDispatchTargets(context.getHolder(), appView);
                 if (lookupResult.isLookupResultSuccess()) {
                   ProgramMethodSet targets = ProgramMethodSet.create();
                   lookupResult
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
index df7be1b..bbd4fe0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
@@ -6,6 +6,7 @@
 
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexCallSite;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedMethod;
@@ -68,6 +69,7 @@
   }
 
   private LambdaDescriptor(
+      AppView<?> appView,
       AppInfoWithClassHierarchy appInfo,
       ProgramMethod context,
       DexCallSite callSite,
@@ -94,7 +96,8 @@
     this.captures = captures;
 
     this.interfaces.add(mainInterface);
-    DexEncodedMethod targetMethod = context == null ? null : lookupTargetMethod(appInfo, context);
+    DexEncodedMethod targetMethod =
+        context == null ? null : lookupTargetMethod(appView, appInfo, context);
     if (targetMethod != null) {
       targetAccessFlags = targetMethod.accessFlags.copy();
       targetHolder = targetMethod.getHolderType();
@@ -114,7 +117,7 @@
   }
 
   private DexEncodedMethod lookupTargetMethod(
-      AppInfoWithClassHierarchy appInfo, ProgramMethod context) {
+      AppView<?> appView, AppInfoWithClassHierarchy appInfo, ProgramMethod context) {
     assert context != null;
     // Find the lambda's impl-method target.
     DexMethod method = implHandle.asMethod();
@@ -126,7 +129,7 @@
                   .resolveMethodOnLegacy(getImplReceiverType(), method, implHandle.isInterface)
                   .getSingleTarget();
         if (target == null) {
-            target = appInfo.lookupDirectTarget(method, context);
+            target = appInfo.lookupDirectTarget(method, context, appView, appInfo);
         }
         assert target == null
             || (implHandle.type.isInvokeInstance() && isInstanceMethod(target))
@@ -136,13 +139,13 @@
       }
 
       case INVOKE_STATIC: {
-          DexEncodedMethod target = appInfo.lookupStaticTarget(method, context);
+          DexEncodedMethod target = appInfo.lookupStaticTarget(method, context, appView, appInfo);
         assert target == null || target.accessFlags.isStatic();
         return target;
       }
 
       case INVOKE_CONSTRUCTOR: {
-          DexEncodedMethod target = appInfo.lookupDirectTarget(method, context);
+          DexEncodedMethod target = appInfo.lookupDirectTarget(method, context, appView, appInfo);
         assert target == null || target.accessFlags.isConstructor();
         return target;
       }
@@ -267,8 +270,11 @@
    * information, or null if match failed.
    */
   public static LambdaDescriptor tryInfer(
-      DexCallSite callSite, AppInfoWithClassHierarchy appInfo, ProgramMethod context) {
-    LambdaDescriptor descriptor = infer(callSite, appInfo, context);
+      DexCallSite callSite,
+      AppView<?> appView,
+      AppInfoWithClassHierarchy appInfo,
+      ProgramMethod context) {
+    LambdaDescriptor descriptor = infer(callSite, appView, appInfo, context);
     return descriptor == MATCH_FAILED ? null : descriptor;
   }
 
@@ -294,7 +300,10 @@
    * information, or MATCH_FAILED if match failed.
    */
   static LambdaDescriptor infer(
-      DexCallSite callSite, AppInfoWithClassHierarchy appInfo, ProgramMethod context) {
+      DexCallSite callSite,
+      AppView<?> appView,
+      AppInfoWithClassHierarchy appInfo,
+      ProgramMethod context) {
     if (!isLambdaMetafactoryMethod(callSite, appInfo)) {
       return LambdaDescriptor.MATCH_FAILED;
     }
@@ -337,6 +346,7 @@
     // Create a match.
     LambdaDescriptor match =
         new LambdaDescriptor(
+            appView,
             appInfo,
             context,
             callSite,
@@ -409,9 +419,9 @@
   }
 
   public static List<DexType> getInterfaces(
-      DexCallSite callSite, AppInfoWithClassHierarchy appInfo) {
+      DexCallSite callSite, AppView<? extends AppInfoWithClassHierarchy> appView) {
     // No need for the invocationContext to figure out only the interfaces.
-    LambdaDescriptor descriptor = infer(callSite, appInfo, null);
+    LambdaDescriptor descriptor = infer(callSite, appView, appView.appInfo(), null);
     if (descriptor == LambdaDescriptor.MATCH_FAILED) {
       return null;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicClass.java b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicClass.java
index d260a73..63a6e08 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicClass.java
@@ -157,7 +157,7 @@
       // Unconditionally throw as the RI.
       behaviour =
           resolution.isNoSuchMethodErrorResult(
-                  context.getContextClass(), appView.appInfoForDesugaring())
+                  context.getContextClass(), appView, appView.appInfoForDesugaring())
               ? THROW_NSME
               : THROW_ICCE;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
index 292a3b3..f3e4457 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfInvoke;
 import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
@@ -124,10 +125,11 @@
   private DexClassAndMethod getMethodForDesugaring(CfInvoke invoke, ProgramMethod context) {
     DexMethod invokedMethod = invoke.getMethod();
     // TODO(b/191656218): Use lookupInvokeSpecial instead when this is all to Cf.
+    AppInfoWithClassHierarchy appInfoForDesugaring = appView.appInfoForDesugaring();
     return invoke.isInvokeSuper(context.getHolderType())
-        ? appView.appInfoForDesugaring().lookupSuperTarget(invokedMethod, context)
-        : appView
-            .appInfoForDesugaring()
+        ? appInfoForDesugaring.lookupSuperTarget(
+            invokedMethod, context, appView, appInfoForDesugaring)
+        : appInfoForDesugaring
             .resolveMethodLegacy(invokedMethod, invoke.isInterface())
             .getResolutionPair();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
index b165a93..cb24e59 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.androidapi.ComputedApiLevel;
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.dex.Constants;
-import com.android.tools.r8.experimental.startup.StartupOrder;
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.DexApplication;
@@ -148,8 +147,7 @@
               dexApplication,
               ClassToFeatureSplitMap.createEmptyClassToFeatureSplitMap(),
               MainDexInfo.none(),
-              GlobalSyntheticsStrategy.forNonSynthesizing(),
-              StartupOrder.empty());
+              GlobalSyntheticsStrategy.forNonSynthesizing());
 
       List<DexMethod> backports =
           BackportedMethodRewriter.generateListOfBackportedMethods(dexApplication, options);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
index fd30618..85154ce 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
@@ -92,7 +92,8 @@
       return DesugarDescription.nothing();
     }
     if (cfInvoke.isInvokeSuper(context.getHolderType())) {
-      DexClassAndMethod superTarget = appInfo.lookupSuperTarget(invokedMethod, context);
+      DexClassAndMethod superTarget =
+          appInfo.lookupSuperTarget(invokedMethod, context, appView, appInfo);
       if (superTarget != null) {
         assert !superTarget.getDefinition().isStatic();
         return computeNonStaticRetarget(superTarget.getReference(), true);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
index ff3989a..ccf096e 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
@@ -189,9 +189,11 @@
     } else if (resolutionResult.isFailedResolution()) {
       FailedResolutionResult failedResolutionResult = resolutionResult.asFailedResolution();
       AppInfoWithClassHierarchy appInfo = appView.appInfoForDesugaring();
-      if (failedResolutionResult.isIllegalAccessErrorResult(context.getHolder(), appInfo)) {
+      if (failedResolutionResult.isIllegalAccessErrorResult(
+          context.getHolder(), appView, appInfo)) {
         return UtilityMethodsForCodeOptimizations::synthesizeThrowIllegalAccessErrorMethod;
-      } else if (failedResolutionResult.isNoSuchMethodErrorResult(context.getHolder(), appInfo)) {
+      } else if (failedResolutionResult.isNoSuchMethodErrorResult(
+          context.getHolder(), appView, appInfo)) {
         return UtilityMethodsForCodeOptimizations::synthesizeThrowNoSuchMethodErrorMethod;
       } else if (failedResolutionResult.isIncompatibleClassChangeErrorResult()) {
         return UtilityMethodsForCodeOptimizations
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
index 85b530e..922fd4d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
@@ -850,11 +850,11 @@
           addICCEThrowingMethod(method, clazz, resolutionResult.asFailedResolution());
           return;
         }
-        if (resolutionResult.isNoSuchMethodErrorResult(clazz, appInfo)) {
+        if (resolutionResult.isNoSuchMethodErrorResult(clazz, appView, appInfo)) {
           addNoSuchMethodErrorThrowingMethod(method, clazz, resolutionResult.asFailedResolution());
           return;
         }
-        assert resolutionResult.isIllegalAccessErrorResult(clazz, appInfo);
+        assert resolutionResult.isIllegalAccessErrorResult(clazz, appView, appInfo);
         addIllegalAccessErrorThrowingMethod(method, clazz, resolutionResult.asFailedResolution());
         return;
       }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index 6bc5e1d..15e9f06 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -329,7 +329,7 @@
               .asSingleResolution();
       if (resolution != null
           && resolution.getResolvedMethod().isPrivate()
-          && resolution.isAccessibleFrom(context, appInfoForDesugaring).isTrue()) {
+          && resolution.isAccessibleFrom(context, appView, appInfoForDesugaring).isTrue()) {
         return DesugarDescription.nothing();
       }
       if (resolution != null && resolution.getResolvedMethod().isStatic()) {
@@ -503,7 +503,7 @@
             .asSingleResolution();
     if (resolution != null
         && resolution.getResolvedMethod().isPrivate()
-        && resolution.isAccessibleFrom(context, appInfoForDesugaring).isTrue()) {
+        && resolution.isAccessibleFrom(context, appView, appInfoForDesugaring).isTrue()) {
       // TODO(b/198267586): What about the private in-accessible case?
       return computeInvokeDirect(holder, invoke, context);
     }
@@ -724,7 +724,9 @@
       // WARNING: This may result in incorrect code on older platforms!
       // Retarget call to an appropriate method of companion class.
       if (resolutionResult.getResolvedMethod().isPrivateMethod()) {
-        if (resolutionResult.isAccessibleFrom(context, appView.appInfoForDesugaring()).isFalse()) {
+        if (resolutionResult
+            .isAccessibleFrom(context, appView, appView.appInfoForDesugaring())
+            .isFalse()) {
           // TODO(b/145775365): This should throw IAE.
           return computeInvokeAsThrowRewrite(invoke, null, context);
         }
@@ -803,8 +805,11 @@
 
   private DesugarDescription computeEmulatedInterfaceInvokeSpecial(
       DexClass clazz, DexMethod invokedMethod, ProgramMethod context) {
+    AppInfoWithClassHierarchy appInfoForDesugaring = appView.appInfoForDesugaring();
     DexClassAndMethod superTarget =
-        appView.appInfoForDesugaring().lookupSuperTarget(invokedMethod, context);
+        appView
+            .appInfoForDesugaring()
+            .lookupSuperTarget(invokedMethod, context, appView, appInfoForDesugaring);
     if (clazz.isInterface()
         && clazz.isLibraryClass()
         && helper.isInDesugaredLibrary(clazz)
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
index c33361a..aea4f4b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
@@ -163,7 +163,8 @@
       MethodProcessingContext methodProcessingContext,
       DesugarInvoke desugarInvoke) {
     LambdaDescriptor descriptor =
-        LambdaDescriptor.tryInfer(invoke.getCallSite(), appView.appInfoForDesugaring(), context);
+        LambdaDescriptor.tryInfer(
+            invoke.getCallSite(), appView, appView.appInfoForDesugaring(), context);
     if (descriptor == null) {
       return null;
     }
@@ -191,6 +192,7 @@
     return instruction.isInvokeDynamic()
         && LambdaDescriptor.tryInfer(
                 instruction.asInvokeDynamic().getCallSite(),
+                appView,
                 appView.appInfoForDesugaring(),
                 context)
             != null;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
index c7e64b08..efac97b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
@@ -143,7 +143,7 @@
 
     NestBasedAccessDesugaringUseRegistry(
         ClasspathMethod context, NestBasedAccessDesugaringEventConsumer eventConsumer) {
-      super(appView, context);
+      super(D8NestBasedAccessDesugaring.this.appView, context);
       this.eventConsumer = eventConsumer;
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
index 91b7639..03304e5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -168,7 +168,10 @@
                 CfInvokeDynamic cfInvokeDynamic = instruction.asInvokeDynamic();
                 LambdaDescriptor lambdaDescriptor =
                     LambdaDescriptor.tryInfer(
-                        cfInvokeDynamic.getCallSite(), appView.appInfoForDesugaring(), method);
+                        cfInvokeDynamic.getCallSite(),
+                        appView,
+                        appView.appInfoForDesugaring(),
+                        method);
                 if (lambdaDescriptor != null) {
                   DexMember<?, ?> member = lambdaDescriptor.implHandle.member;
                   if (needsDesugaring(member, method)) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index 0db211d..a2572eb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -180,7 +180,7 @@
     }
 
     // Abort inlining attempt if method -> target access is not right.
-    if (resolutionResult.isAccessibleFrom(method, appView.appInfo()).isPossiblyFalse()) {
+    if (resolutionResult.isAccessibleFrom(method, appView).isPossiblyFalse()) {
       whyAreYouNotInliningReporter.reportInaccessible();
       return false;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java b/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
index 08f3912..f95b59e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
@@ -320,7 +320,7 @@
 
   /** This rebinds invoke-super instructions to their most specific target. */
   private DexClass rebindSuperInvokeToMostSpecific(DexMethod target, ProgramMethod context) {
-    DexClassAndMethod method = appView.appInfo().lookupSuperTarget(target, context);
+    DexClassAndMethod method = appView.appInfo().lookupSuperTarget(target, context, appView);
     if (method == null) {
       return null;
     }
@@ -375,7 +375,7 @@
             .asSingleResolution();
     if (resolutionResult == null
         || resolutionResult
-            .isAccessibleForVirtualDispatchFrom(context, appView.appInfo())
+            .isAccessibleForVirtualDispatchFrom(context, appView)
             .isPossiblyFalse()) {
       // Method does not resolve or is not accessible.
       return target;
@@ -391,7 +391,7 @@
         appView.appInfo().resolveMethodOnClassLegacy(receiverType, target).asSingleResolution();
     if (newResolutionResult == null
         || newResolutionResult
-            .isAccessibleForVirtualDispatchFrom(context, appView.appInfo())
+            .isAccessibleForVirtualDispatchFrom(context, appView)
             .isPossiblyFalse()
         || !newResolutionResult
             .getResolvedMethod()
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java b/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java
index 900065d..7aae8a5 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java
@@ -115,7 +115,7 @@
                   .asSingleResolution();
           if (resolutionResult == null
               || resolutionResult
-                  .isAccessibleFrom(context, appInfoWithLiveness)
+                  .isAccessibleFrom(context, appViewWithLiveness)
                   .isPossiblyFalse()) {
             continue;
           }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
index 59c066f..3452d98 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -227,13 +227,16 @@
       MethodResolutionResult resolutionResult,
       ProgramMethod context,
       TriFunction<
-              MethodResolutionResult, DexProgramClass, AppInfoWithClassHierarchy, DexEncodedMethod>
+              MethodResolutionResult,
+              DexProgramClass,
+              AppView<? extends AppInfoWithClassHierarchy>,
+              DexEncodedMethod>
           lookup) {
     if (!resolutionResult.isSingleResolution()) {
       return null;
     }
     DexEncodedMethod dexEncodedMethod =
-        lookup.apply(resolutionResult, context.getHolder(), appView.appInfo());
+        lookup.apply(resolutionResult, context.getHolder(), appView);
     if (!isVerticalClassMerging() || dexEncodedMethod != null) {
       return dexEncodedMethod;
     }
@@ -245,7 +248,7 @@
       return null;
     }
     DexEncodedMethod alternativeDexEncodedMethod =
-        lookup.apply(resolutionResult, superContext, appView.appInfo());
+        lookup.apply(resolutionResult, superContext, appView);
     if (alternativeDexEncodedMethod != null
         && alternativeDexEncodedMethod.getHolderType() == superContext.type) {
       return alternativeDexEncodedMethod;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
index 0f7e4bb..1767d8b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
@@ -332,7 +332,7 @@
       InvokeCustom invoke, Set<DexType> eligibleEnums, ProgramMethod context) {
     invoke.getCallSite().getMethodProto().forEachType(t -> markEnumEligible(t, eligibleEnums));
     LambdaDescriptor lambdaDescriptor =
-        LambdaDescriptor.tryInfer(invoke.getCallSite(), appView.appInfo(), context);
+        LambdaDescriptor.tryInfer(invoke.getCallSite(), appView, appView.appInfo(), context);
     if (lambdaDescriptor == null) {
       // Based on lambda we can see that enums cannot be unboxed if used in call site bootstrap
       // arguments, since there might be expectations on overrides. Enums used directly in the
diff --git a/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java b/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
index 14f7711..d607d71 100644
--- a/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
@@ -457,7 +457,7 @@
           // Don't report errors, as the set of call sites is a conservative estimate, and can
           // refer to interfaces which has been removed.
           Set<DexEncodedMethod> implementedMethods =
-              appView.appInfo().lookupLambdaImplementedMethods(callSite);
+              appView.appInfo().lookupLambdaImplementedMethods(callSite, appView);
           for (DexEncodedMethod method : implementedMethods) {
             Wrapper<DexEncodedMethod> wrapped = definitionEquivalence.wrap(method);
             InterfaceMethodGroupState groupState = globalStateMap.get(wrapped);
@@ -470,8 +470,7 @@
           }
           // For intersection types, we have to iterate all the multiple interfaces to look for
           // methods with the same signature.
-          List<DexType> implementedInterfaces =
-              LambdaDescriptor.getInterfaces(callSite, appView.appInfo());
+          List<DexType> implementedInterfaces = LambdaDescriptor.getInterfaces(callSite, appView);
           if (implementedInterfaces != null) {
             for (int i = 1; i < implementedInterfaces.size(); i++) {
               // Add the merging state for all additional implemented interfaces into the state
diff --git a/src/main/java/com/android/tools/r8/naming/NamingLens.java b/src/main/java/com/android/tools/r8/naming/NamingLens.java
index 5b24eb9..ca69f67 100644
--- a/src/main/java/com/android/tools/r8/naming/NamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/NamingLens.java
@@ -17,6 +17,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.InnerClassAttribute;
 import com.android.tools.r8.optimize.MemberRebindingAnalysis;
+import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.Sets;
@@ -55,8 +56,9 @@
     if (!appView.appInfo().hasLiveness()) {
       return callSite.methodName;
     }
+    AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
     Set<DexEncodedMethod> lambdaImplementedMethods =
-        appView.appInfo().withLiveness().lookupLambdaImplementedMethods(callSite);
+        appViewWithLiveness.appInfo().lookupLambdaImplementedMethods(callSite, appViewWithLiveness);
     if (lambdaImplementedMethods.isEmpty()) {
       return callSite.methodName;
     }
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index 87af2b2..d860861 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -64,6 +64,10 @@
     this.lensBuilder = MemberRebindingLens.builder(appView);
   }
 
+  private AppView<AppInfoWithLiveness> appView() {
+    return appView;
+  }
+
   private DexMethod validMemberRebindingTargetForNonProgramMethod(
       DexClassAndMethod resolvedMethod,
       SingleResolutionResult<?> resolutionResult,
@@ -167,7 +171,7 @@
     }
     return Iterables.all(
         contexts,
-        context -> resolutionResult.isAccessibleFrom(context, appView.appInfo()).isTrue());
+        context -> resolutionResult.isAccessibleFrom(context, appView, appView.appInfo()).isTrue());
   }
 
   private boolean isInvokeSuperToInterfaceMethod(DexClassAndMethod method, InvokeType invokeType) {
@@ -578,7 +582,7 @@
                   }
 
                   private void registerFieldReference(DexField field) {
-                    appView
+                    appView()
                         .appInfo()
                         .resolveField(field)
                         .forEachSuccessfulFieldResolutionResult(
diff --git a/src/main/java/com/android/tools/r8/optimize/RedundantBridgeRemover.java b/src/main/java/com/android/tools/r8/optimize/RedundantBridgeRemover.java
index 5cbb1b6..815a807 100644
--- a/src/main/java/com/android/tools/r8/optimize/RedundantBridgeRemover.java
+++ b/src/main/java/com/android/tools/r8/optimize/RedundantBridgeRemover.java
@@ -205,7 +205,7 @@
     // Only check for interfaces if resolving the method on super type causes NoSuchMethodError.
     FailedResolutionResult failedResolutionResult = superTypeResolution.asFailedResolution();
     if (failedResolutionResult == null
-        || !failedResolutionResult.isNoSuchMethodErrorResult(holder, appView.appInfo())
+        || !failedResolutionResult.isNoSuchMethodErrorResult(holder, appView, appView.appInfo())
         || holder.getInterfaces().isEmpty()) {
       return false;
     }
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java
index 9023c00..c42b054 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java
@@ -205,7 +205,7 @@
       // Use the super target instead of the resolved method to ensure that we propagate the
       // argument information to the targeted method.
       DexClassAndMethod target =
-          resolutionResult.lookupInvokeSuperTarget(context.getHolder(), appView.appInfo());
+          resolutionResult.lookupInvokeSuperTarget(context.getHolder(), appView);
       if (target == null) {
         // Nothing to propagate; the invoke instruction fails.
         return;
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
index 40ee16e..16bef88 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
@@ -146,7 +146,8 @@
       MethodResolutionResult methodResult = resolutionResult.asMethodResolutionResult();
       if (methodResult.isClassNotFoundResult()
           || methodResult.isArrayCloneMethodResult()
-          || methodResult.isNoSuchMethodErrorResult(getContext().getContextClass(), appInfo)) {
+          || methodResult.isNoSuchMethodErrorResult(
+              getContext().getContextClass(), appView, appInfo)) {
         return;
       }
       node.addNeighbor(missingTypeNode);
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 811ddc9..bd42c6a 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -9,7 +9,6 @@
 import static com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult.isOverriding;
 
 import com.android.tools.r8.cf.CfVersion;
-import com.android.tools.r8.experimental.startup.StartupOrder;
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
@@ -202,7 +201,6 @@
       ClassToFeatureSplitMap classToFeatureSplitMap,
       MainDexInfo mainDexInfo,
       MissingClasses missingClasses,
-      StartupOrder startupOrder,
       Set<DexType> deadProtoTypes,
       Set<DexType> liveTypes,
       Set<DexMethod> targetedMethods,
@@ -234,12 +232,7 @@
       Set<DexType> lockCandidates,
       Map<DexType, Visibility> initClassReferences,
       Set<DexMethod> recordFieldValuesReferences) {
-    super(
-        committedItems,
-        classToFeatureSplitMap,
-        mainDexInfo,
-        missingClasses,
-        startupOrder);
+    super(committedItems, classToFeatureSplitMap, mainDexInfo, missingClasses);
     this.deadProtoTypes = deadProtoTypes;
     this.liveTypes = liveTypes;
     this.targetedMethods = targetedMethods;
@@ -280,7 +273,6 @@
         previous.getClassToFeatureSplitMap(),
         previous.getMainDexInfo(),
         previous.getMissingClasses(),
-        previous.getStartupOrder(),
         previous.deadProtoTypes,
         CollectionUtils.addAll(previous.liveTypes, committedItems.getCommittedProgramTypes()),
         previous.targetedMethods,
@@ -324,7 +316,6 @@
         previous.getClassToFeatureSplitMap().withoutPrunedItems(prunedItems),
         previous.getMainDexInfo().withoutPrunedItems(prunedItems),
         previous.getMissingClasses(),
-        previous.getStartupOrder().withoutPrunedItems(prunedItems, previous.getSyntheticItems()),
         previous.deadProtoTypes,
         pruneClasses(previous.liveTypes, prunedItems, executorService, futures),
         pruneMethods(previous.targetedMethods, prunedItems, executorService, futures),
@@ -489,7 +480,6 @@
         getClassToFeatureSplitMap(),
         mainDexInfo,
         getMissingClasses(),
-        getStartupOrder(),
         deadProtoTypes,
         liveTypes,
         targetedMethods,
@@ -566,8 +556,7 @@
         previous.getSyntheticItems().commit(previous.app()),
         previous.getClassToFeatureSplitMap(),
         previous.getMainDexInfo(),
-        previous.getMissingClasses(),
-        previous.getStartupOrder());
+        previous.getMissingClasses());
     this.deadProtoTypes = previous.deadProtoTypes;
     this.liveTypes = previous.liveTypes;
     this.targetedMethods = previous.targetedMethods;
@@ -767,9 +756,10 @@
    * @param callSite Call site to resolve.
    * @return Methods implemented by the lambda expression that created the {@code callSite}.
    */
-  public Set<DexEncodedMethod> lookupLambdaImplementedMethods(DexCallSite callSite) {
+  public Set<DexEncodedMethod> lookupLambdaImplementedMethods(
+      DexCallSite callSite, AppView<AppInfoWithLiveness> appView) {
     assert checkIfObsolete();
-    List<DexType> callSiteInterfaces = LambdaDescriptor.getInterfaces(callSite, this);
+    List<DexType> callSiteInterfaces = LambdaDescriptor.getInterfaces(callSite, appView);
     if (callSiteInterfaces == null || callSiteInterfaces.isEmpty()) {
       return Collections.emptySet();
     }
@@ -1159,7 +1149,6 @@
         getClassToFeatureSplitMap().rewrittenWithLens(lens),
         getMainDexInfo().rewrittenWithLens(getSyntheticItems(), lens),
         getMissingClasses(),
-        getStartupOrder().rewrittenWithLens(lens),
         deadProtoTypes,
         lens.rewriteReferences(liveTypes),
         lens.rewriteReferences(targetedMethods),
@@ -1229,7 +1218,7 @@
   }
 
   public DexEncodedMethod lookupSingleTarget(
-      AppView<? extends AppInfoWithClassHierarchy> appView,
+      AppView<AppInfoWithLiveness> appView,
       InvokeType type,
       DexMethod target,
       ProgramMethod context,
@@ -1245,18 +1234,18 @@
       case INTERFACE:
         return lookupSingleVirtualTarget(appView, target, context, true, modeledPredicate);
       case DIRECT:
-        return lookupDirectTarget(target, context);
+        return lookupDirectTarget(target, context, appView);
       case STATIC:
-        return lookupStaticTarget(target, context);
+        return lookupStaticTarget(target, context, appView);
       case SUPER:
-        return toMethodDefinitionOrNull(lookupSuperTarget(target, context));
+        return toMethodDefinitionOrNull(lookupSuperTarget(target, context, appView));
       default:
         return null;
     }
   }
 
   public ProgramMethod lookupSingleProgramTarget(
-      AppView<? extends AppInfoWithClassHierarchy> appView,
+      AppView<AppInfoWithLiveness> appView,
       InvokeType type,
       DexMethod target,
       ProgramMethod context,
@@ -1267,7 +1256,7 @@
 
   /** For mapping invoke virtual instruction to single target method. */
   public DexEncodedMethod lookupSingleVirtualTarget(
-      AppView<? extends AppInfoWithClassHierarchy> appView,
+      AppView<AppInfoWithLiveness> appView,
       DexMethod method,
       ProgramMethod context,
       boolean isInterface) {
@@ -1277,7 +1266,7 @@
 
   /** For mapping invoke virtual instruction to single target method. */
   public DexEncodedMethod lookupSingleVirtualTarget(
-      AppView<? extends AppInfoWithClassHierarchy> appView,
+      AppView<AppInfoWithLiveness> appView,
       DexMethod method,
       ProgramMethod context,
       boolean isInterface,
@@ -1288,7 +1277,7 @@
   }
 
   public DexEncodedMethod lookupSingleVirtualTarget(
-      AppView<? extends AppInfoWithClassHierarchy> appView,
+      AppView<AppInfoWithLiveness> appView,
       DexMethod method,
       ProgramMethod context,
       boolean isInterface,
@@ -1325,7 +1314,7 @@
     SingleResolutionResult<?> resolution =
         resolveMethodOnLegacy(initialResolutionHolder, method).asSingleResolution();
     if (resolution == null
-        || resolution.isAccessibleForVirtualDispatchFrom(context.getHolder(), this).isFalse()) {
+        || resolution.isAccessibleForVirtualDispatchFrom(context.getHolder(), appView).isFalse()) {
       return null;
     }
     // If the method is modeled, return the resolution.
@@ -1378,7 +1367,10 @@
     LookupResultSuccess lookupResult =
         resolution
             .lookupVirtualDispatchTargets(
-                context.getHolder(), this, refinedReceiverClass.asProgramClass(), refinedLowerBound)
+                context.getHolder(),
+                appView,
+                refinedReceiverClass.asProgramClass(),
+                refinedLowerBound)
             .asLookupResultSuccess();
     if (lookupResult != null && !lookupResult.isIncomplete()) {
       LookupTarget singleTarget = lookupResult.getSingleLookupTarget();
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index a30bcf4..6ef9e7b 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -1155,7 +1155,7 @@
       }
     }
 
-    LambdaDescriptor descriptor = LambdaDescriptor.tryInfer(callSite, appInfo(), context);
+    LambdaDescriptor descriptor = LambdaDescriptor.tryInfer(callSite, appView, appInfo(), context);
     if (descriptor == null) {
       for (DexValue bootstrapArgument : callSite.getBootstrapArgs()) {
         if (bootstrapArgument.isDexValueMethodHandle()) {
@@ -2877,7 +2877,7 @@
                               LookupResult lookupResult =
                                   singleResolution.lookupVirtualDispatchTargets(
                                       contextHolder,
-                                      appInfo,
+                                      appView,
                                       (type, subTypeConsumer, lambdaConsumer) -> {
                                         assert appInfo.isSubtype(currentClass.type, type);
                                         instantiation.apply(subTypeConsumer, lambdaConsumer);
@@ -3364,7 +3364,7 @@
               DexProgramClass resolvedHolder = resolution.getResolvedHolder().asProgramClass();
               DexEncodedMethod resolvedMethod = resolution.getResolvedMethod();
               markMethodAsTargeted(new ProgramMethod(resolvedHolder, resolvedMethod), reason);
-              if (resolution.isAccessibleForVirtualDispatchFrom(contextHolder, appInfo).isFalse()) {
+              if (resolution.isAccessibleForVirtualDispatchFrom(contextHolder, appView).isFalse()) {
                 // Not accessible from this context, so this call will cause a runtime exception.
                 return;
               }
@@ -3378,7 +3378,7 @@
               resolution
                   .lookupVirtualDispatchTargets(
                       contextHolder,
-                      appInfo,
+                      appView,
                       (type, subTypeConsumer, lambdaConsumer) ->
                           objectAllocationInfoCollection.forEachInstantiatedSubType(
                               type, subTypeConsumer, lambdaConsumer, appInfo),
@@ -3500,7 +3500,7 @@
               // If invoke target is invalid (inaccessible or not an instance-method) record it and
               // stop.
               DexClassAndMethod target =
-                  resolution.lookupInvokeSuperTarget(from.getHolder(), appInfo);
+                  resolution.lookupInvokeSuperTarget(from.getHolder(), appView);
               if (target == null) {
                 failedMethodResolutionTargets.add(resolution.getResolvedMethod().getReference());
                 analyses.forEach(
@@ -4216,7 +4216,6 @@
                 ? missingClassesBuilder.reportMissingClasses(
                     appView, lambdaSynthesizingContextOracle)
                 : missingClassesBuilder.assertNoMissingClasses(appView),
-            appInfo.getStartupOrder(),
             deadProtoTypes,
             SetUtils.mapIdentityHashSet(liveTypes.getItems(), DexProgramClass::getType),
             Enqueuer.toDescriptorSet(targetedMethods.getItems()),
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
index 8baf037..89c25ae 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
@@ -43,6 +43,10 @@
     this.consumer = consumer;
   }
 
+  private AppView<? extends AppInfoWithClassHierarchy> appView() {
+    return appView;
+  }
+
   public void run(Set<DexType> roots) {
     SyntheticItems syntheticItems = appView.getSyntheticItems();
     DexItemFactory factory = appView.dexItemFactory();
@@ -113,7 +117,7 @@
   private class DirectReferencesCollector extends UseRegistry<ProgramMethod> {
 
     private DirectReferencesCollector(ProgramMethod context) {
-      super(appView, context);
+      super(appView(), context);
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 1049259..488b3c3 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -761,7 +761,7 @@
         LookupResultSuccess lookupResult =
             appInfo
                 .resolveMethodOnInterfaceLegacy(method.getHolderType(), method.getReference())
-                .lookupVirtualDispatchTargets(target, appInfo)
+                .lookupVirtualDispatchTargets(target, appView)
                 .asLookupResultSuccess();
         assert lookupResult != null;
         if (lookupResult == null) {
@@ -1356,7 +1356,7 @@
           // Only rewrite the invoke-super call if it does not lead to a NoSuchMethodError.
           boolean resolutionSucceeds =
               holder.lookupVirtualMethod(signatureInHolder) != null
-                  || appInfo.lookupSuperTarget(signatureInHolder, holder) != null;
+                  || appInfo.lookupSuperTarget(signatureInHolder, holder, appView) != null;
           if (resolutionSucceeds) {
             deferredRenamings.mapVirtualMethodToDirectInType(
                 signatureInHolder,
@@ -1381,7 +1381,7 @@
             // its super classes declared the method.
             boolean resolutionSucceededBeforeMerge =
                 lensBuilder.hasMappingForSignatureInContext(holder, signatureInType)
-                    || appInfo.lookupSuperTarget(signatureInHolder, holder) != null;
+                    || appInfo.lookupSuperTarget(signatureInHolder, holder, appView) != null;
             if (resolutionSucceededBeforeMerge) {
               deferredRenamings.mapVirtualMethodToDirectInType(
                   signatureInType,
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index 3bbb9ae..4b0c8ea 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -626,7 +626,7 @@
     if (appView.hasClassHierarchy()) {
       AppInfoWithClassHierarchy appInfo = appView.appInfoWithClassHierarchy();
       return getSynthesizingContext(
-          context, appInfo.getClassToFeatureSplitMap(), options, appInfo.getStartupOrder());
+          context, appInfo.getClassToFeatureSplitMap(), options, appView.getStartupOrder());
     }
     return getSynthesizingContext(
         context,
diff --git a/src/main/java/com/android/tools/r8/tracereferences/TraceReferences.java b/src/main/java/com/android/tools/r8/tracereferences/TraceReferences.java
index e1000f6..ad30e62 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/TraceReferences.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/TraceReferences.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.ResourceException;
 import com.android.tools.r8.Version;
 import com.android.tools.r8.dex.ApplicationReader;
-import com.android.tools.r8.experimental.startup.StartupOrder;
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
@@ -87,8 +86,7 @@
                 new ApplicationReader(builder.build(), options, Timing.empty()).read().toDirect(),
                 ClassToFeatureSplitMap.createEmptyClassToFeatureSplitMap(),
                 MainDexInfo.none(),
-                GlobalSyntheticsStrategy.forSingleOutputMode(),
-                StartupOrder.empty()));
+                GlobalSyntheticsStrategy.forSingleOutputMode()));
     modelLibraryMethodsWithCovariantReturnTypes(appView);
     Tracer tracer =
         new Tracer(
diff --git a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
index f182a0b..b430854 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
@@ -109,6 +109,10 @@
       this.targetPredicate = targetPredicate;
     }
 
+    AppView<? extends AppInfoWithClassHierarchy> appView() {
+      return appView;
+    }
+
     AppInfoWithClassHierarchy appInfo() {
       return appView.appInfo();
     }
@@ -228,7 +232,7 @@
               ? appInfo().resolveMethodOnInterface(method.getHolder(), method.getReference())
               : appInfo().resolveMethodOnClass(method.getHolder(), method.getReference());
       DexClassAndMethod superTarget =
-          methodResolutionResult.lookupInvokeSpecialTarget(method.getHolder(), appInfo());
+          methodResolutionResult.lookupInvokeSpecialTarget(method.getHolder(), appView);
       if (superTarget != null
           && !superTarget.isProgramMethod()
           && isTargetType(superTarget.getHolderType())) {
@@ -263,7 +267,7 @@
       private final DefinitionContext referencedFrom;
 
       public MethodUseCollector(ProgramMethod context) {
-        super(appView, context);
+        super(appView(), context);
         this.referencedFrom = DefinitionContextUtils.create(context);
       }
 
@@ -316,7 +320,7 @@
         handleRewrittenMethodResolution(
             method,
             appInfo().unsafeResolveMethodDueToDexFormat(rewrittenMethod),
-            result -> result.lookupInvokeSuperTarget(getContext().getHolder(), appInfo()));
+            result -> result.lookupInvokeSuperTarget(getContext().getHolder(), appView, appInfo()));
       }
 
       @Override
@@ -486,7 +490,8 @@
 
         // For lambdas that implement an interface, also keep the interface method by simulating an
         // invoke to it from the current context.
-        LambdaDescriptor descriptor = LambdaDescriptor.tryInfer(callSite, appInfo(), getContext());
+        LambdaDescriptor descriptor =
+            LambdaDescriptor.tryInfer(callSite, appView(), appInfo(), getContext());
         if (descriptor != null) {
           for (DexType interfaceType : descriptor.interfaces) {
             ClassResolutionResult classResolutionResult =
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index a2f3ebc..23e5449 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -26,7 +26,6 @@
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.experimental.startup.StartupOrder;
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
@@ -777,8 +776,7 @@
         readApplicationForDexOutput(app, new InternalOptions()),
         ClassToFeatureSplitMap.createEmptyClassToFeatureSplitMap(),
         MainDexInfo.none(),
-        GlobalSyntheticsStrategy.forSingleOutputMode(),
-        StartupOrder.empty());
+        GlobalSyntheticsStrategy.forSingleOutputMode());
   }
 
   protected static AppView<AppInfoWithClassHierarchy> computeAppViewWithClassHierarchy(
diff --git a/src/test/java/com/android/tools/r8/classmerging/KeptTargetsIncompleteDiamondTest.java b/src/test/java/com/android/tools/r8/classmerging/KeptTargetsIncompleteDiamondTest.java
index 57aaddc..cc9170b 100644
--- a/src/test/java/com/android/tools/r8/classmerging/KeptTargetsIncompleteDiamondTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/KeptTargetsIncompleteDiamondTest.java
@@ -87,7 +87,7 @@
     DexProgramClass classL = appView.definitionForProgramType(typeL);
     DexProgramClass classA = appView.definitionForProgramType(typeA);
     LookupResult lookupResult =
-        resolutionResult.lookupVirtualDispatchTargets(classI, appView.appInfo(), classL, classA);
+        resolutionResult.lookupVirtualDispatchTargets(classI, appView, classL, classA);
     assertTrue(lookupResult.isLookupResultSuccess());
     LookupResultSuccess lookupResultSuccess = lookupResult.asLookupResultSuccess();
     Set<String> targets = new HashSet<>();
@@ -128,7 +128,7 @@
     DexProgramClass classI = appView.definitionForProgramType(typeI);
     DexProgramClass classA = appView.definitionForProgramType(typeA);
     LookupResult lookupResult =
-        resolutionResult.lookupVirtualDispatchTargets(classI, appView.appInfo(), classI, classA);
+        resolutionResult.lookupVirtualDispatchTargets(classI, appView, classI, classA);
     assertTrue(lookupResult.isLookupResultSuccess());
     LookupResultSuccess lookupResultSuccess = lookupResult.asLookupResultSuccess();
     Set<String> targets = new HashSet<>();
@@ -168,7 +168,7 @@
     DexProgramClass classI = appView.definitionForProgramType(typeI);
     DexProgramClass classA = appView.definitionForProgramType(typeB);
     LookupResult lookupResult =
-        resolutionResult.lookupVirtualDispatchTargets(classI, appView.appInfo(), classA, classA);
+        resolutionResult.lookupVirtualDispatchTargets(classI, appView, classA, classA);
     assertTrue(lookupResult.isLookupResultSuccess());
     LookupResultSuccess lookupResultSuccess = lookupResult.asLookupResultSuccess();
     Set<String> targets = new HashSet<>();
@@ -206,7 +206,7 @@
     DexProgramClass classI = appView.definitionForProgramType(typeI);
     DexProgramClass classA = appView.definitionForProgramType(typeB);
     LookupResult lookupResult =
-        resolutionResult.lookupVirtualDispatchTargets(classI, appView.appInfo(), classA, classA);
+        resolutionResult.lookupVirtualDispatchTargets(classI, appView, classA, classA);
     assertTrue(lookupResult.isLookupResultSuccess());
     LookupResultSuccess lookupResultSuccess = lookupResult.asLookupResultSuccess();
     Set<String> targets = new HashSet<>();
@@ -246,7 +246,7 @@
     DexProgramClass classI = appView.definitionForProgramType(typeI);
     DexProgramClass classA = appView.definitionForProgramType(typeB);
     LookupResult lookupResult =
-        resolutionResult.lookupVirtualDispatchTargets(classI, appView.appInfo(), classA, classA);
+        resolutionResult.lookupVirtualDispatchTargets(classI, appView, classA, classA);
     assertTrue(lookupResult.isLookupResultSuccess());
     LookupResultSuccess lookupResultSuccess = lookupResult.asLookupResultSuccess();
     Set<String> targets = new HashSet<>();
diff --git a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
index ced7e4f..84a1bf3 100644
--- a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
@@ -92,7 +92,8 @@
     );
 
     AndroidApp application = buildApplication(builder);
-    AppInfoWithClassHierarchy appInfo = computeAppInfoWithClassHierarchy(application);
+    AppView<AppInfoWithClassHierarchy> appView = computeAppViewWithClassHierarchy(application);
+    AppInfoWithClassHierarchy appInfo = appView.appInfo();
     CodeInspector inspector = new CodeInspector(appInfo.app());
     ProgramMethod method = getMethod(inspector, DEFAULT_CLASS_NAME, "int", "x", ImmutableList.of());
     assertFalse(
@@ -100,8 +101,8 @@
             .resolveMethodOnClassHolderLegacy(method.getReference())
             .getSingleTarget()
             .isVirtualMethod());
-    assertNull(appInfo.lookupDirectTarget(method.getReference(), method));
-    assertNotNull(appInfo.lookupStaticTarget(method.getReference(), method));
+    assertNull(appInfo.lookupDirectTarget(method.getReference(), method, appView));
+    assertNotNull(appInfo.lookupStaticTarget(method.getReference(), method, appView));
 
     if (ToolHelper.getDexVm().getVersion().isOlderThanOrEqual(DexVm.Version.V4_4_4)) {
       // Dalvik rejects at verification time instead of producing the
@@ -165,7 +166,8 @@
     );
 
     AndroidApp application = buildApplication(builder);
-    AppInfoWithClassHierarchy appInfo = computeAppInfoWithClassHierarchy(application);
+    AppView<AppInfoWithClassHierarchy> appView = computeAppViewWithClassHierarchy(application);
+    AppInfoWithClassHierarchy appInfo = appView.appInfo();
     CodeInspector inspector = new CodeInspector(appInfo.app());
 
     ProgramMethod methodXOnTestSuper =
@@ -191,13 +193,14 @@
     assertNull(
         appInfo.resolveMethodOnClassLegacy(classTest, methodXOnTestReference).getSingleTarget());
 
-    assertNull(appInfo.lookupDirectTarget(methodXOnTestSuper.getReference(), methodXOnTestSuper));
-    assertNull(appInfo.lookupDirectTarget(methodXOnTestReference, methodYOnTest));
+    assertNull(
+        appInfo.lookupDirectTarget(methodXOnTestSuper.getReference(), methodXOnTestSuper, appView));
+    assertNull(appInfo.lookupDirectTarget(methodXOnTestReference, methodYOnTest, appView));
 
     assertNotNull(
-        appInfo.lookupStaticTarget(methodXOnTestSuper.getReference(), methodXOnTestSuper));
+        appInfo.lookupStaticTarget(methodXOnTestSuper.getReference(), methodXOnTestSuper, appView));
     // Accessing a private target on a different type will fail resolution outright.
-    assertNull(appInfo.lookupStaticTarget(methodXOnTestReference, methodYOnTest));
+    assertNull(appInfo.lookupStaticTarget(methodXOnTestReference, methodYOnTest, appView));
 
     assertEquals("OK", runArt(application));
   }
@@ -254,7 +257,8 @@
       builder.addLibraryFiles(ToolHelper.getDefaultAndroidJar());
     }
     AndroidApp application = builder.build();
-    AppInfoWithClassHierarchy appInfo = computeAppInfoWithClassHierarchy(application);
+    AppView<AppInfoWithClassHierarchy> appView = computeAppViewWithClassHierarchy(application);
+    AppInfoWithClassHierarchy appInfo = appView.appInfo();
     DexItemFactory factory = appInfo.dexItemFactory();
 
     DexType i0 = factory.createType("L" + pkg + "/I0;");
@@ -276,13 +280,13 @@
     DexMethod mOnI3 = factory.createMethod(i3, mProto, m);
     DexMethod mOnI4 = factory.createMethod(i4, mProto, m);
 
-    assertEquals(mOnI0, appInfo.lookupSuperTarget(mOnC0, c1).getReference());
-    assertEquals(mOnI1, appInfo.lookupSuperTarget(mOnI1, c1).getReference());
-    assertEquals(mOnI2, appInfo.lookupSuperTarget(mOnI2, c1).getReference());
+    assertEquals(mOnI0, appInfo.lookupSuperTarget(mOnC0, c1, appView).getReference());
+    assertEquals(mOnI1, appInfo.lookupSuperTarget(mOnI1, c1, appView).getReference());
+    assertEquals(mOnI2, appInfo.lookupSuperTarget(mOnI2, c1, appView).getReference());
 
-    assertNull(appInfo.lookupSuperTarget(mOnC1, c2)); // C2 is not a subclass of C1.
-    assertEquals(mOnI1, appInfo.lookupSuperTarget(mOnI3, c2).getReference());
-    assertEquals(mOnI2, appInfo.lookupSuperTarget(mOnI4, c2).getReference());
+    assertNull(appInfo.lookupSuperTarget(mOnC1, c2, appView)); // C2 is not a subclass of C1.
+    assertEquals(mOnI1, appInfo.lookupSuperTarget(mOnI3, c2, appView).getReference());
+    assertEquals(mOnI2, appInfo.lookupSuperTarget(mOnI4, c2, appView).getReference());
 
     // Copy classes to run on the Java VM.
     Path out = temp.newFolder().toPath();
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
index b8078ae..440e8f8 100644
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
+++ b/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
@@ -81,7 +81,7 @@
     AppInfoWithLiveness appInfo = null; // TODO(b/154881041): Remove or compute liveness.
     LookupResult lookupResult =
         resolutionResult.lookupVirtualDispatchTargets(
-            clazz, appInfo(), appInfo, dexReference -> false);
+            clazz, appView, appInfo, dexReference -> false);
     assertTrue(lookupResult.isLookupResultSuccess());
     assertTrue(lookupResult.asLookupResultSuccess().contains(method));
   }
@@ -99,7 +99,7 @@
     LookupResultSuccess lookupResult =
         appInfo()
             .resolveMethodOnInterfaceLegacy(clazz, method.getReference())
-            .lookupVirtualDispatchTargets(clazz, appInfo(), appInfo, dexReference -> false)
+            .lookupVirtualDispatchTargets(clazz, appView, appInfo, dexReference -> false)
             .asLookupResultSuccess();
     assertNotNull(lookupResult);
     assertFalse(lookupResult.hasLambdaTargets());
diff --git a/src/test/java/com/android/tools/r8/resolution/InvokeSuperCallInStaticTest.java b/src/test/java/com/android/tools/r8/resolution/InvokeSuperCallInStaticTest.java
index 1b62946..028675a 100644
--- a/src/test/java/com/android/tools/r8/resolution/InvokeSuperCallInStaticTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/InvokeSuperCallInStaticTest.java
@@ -63,8 +63,7 @@
     assertTrue(resolutionResult.isSingleResolution());
     DexProgramClass context =
         appView.definitionForProgramType(buildType(A.class, appInfo.dexItemFactory()));
-    DexClassAndMethod lookedUpMethod =
-        resolutionResult.lookupInvokeSuperTarget(context, appView.appInfo());
+    DexClassAndMethod lookedUpMethod = resolutionResult.lookupInvokeSuperTarget(context, appView);
     assertNotNull(lookedUpMethod);
     assertEquals(lookedUpMethod.getReference(), method);
   }
diff --git a/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java b/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
index 4c668d0..e010bfe 100644
--- a/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
@@ -215,7 +215,7 @@
       LookupResult lookupResult =
           resolutionResult.lookupVirtualDispatchTargets(
               appView.definitionForProgramType(buildType(Main.class, appView.dexItemFactory())),
-              appInfo);
+              appView);
       assertTrue(lookupResult.isLookupResultSuccess());
       assertFalse(lookupResult.asLookupResultSuccess().hasLambdaTargets());
       Set<DexType> targetHolders = Sets.newIdentityHashSet();
diff --git a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfPrivateStaticMethodTest.java b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfPrivateStaticMethodTest.java
index 86a0415..a2bf03a 100644
--- a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfPrivateStaticMethodTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfPrivateStaticMethodTest.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.MethodResolutionResult;
@@ -59,14 +60,15 @@
   public static List<Class<?>> CLASSES =
       ImmutableList.of(A.class, B.class, C.class, I.class, Main.class);
 
+  private static AppView<AppInfoWithLiveness> appView;
   private static AppInfoWithLiveness appInfo;
 
   @BeforeClass
   public static void computeAppInfo() throws Exception {
-    appInfo =
+    appView =
         computeAppViewWithLiveness(
-                buildClasses(CLASSES).addLibraryFile(getMostRecentAndroidJar()).build(), Main.class)
-            .appInfo();
+            buildClasses(CLASSES).addLibraryFile(getMostRecentAndroidJar()).build(), Main.class);
+    appInfo = appView.appInfo();
   }
 
   private static DexMethod buildMethod(Class<?> clazz, String name) {
@@ -92,7 +94,7 @@
     MethodResolutionResult resolutionResult =
         appInfo.resolveMethodOnClassLegacy(methodOnB.holder, methodOnB);
     DexClass context = appInfo.definitionFor(methodOnB.holder);
-    assertTrue(resolutionResult.isIllegalAccessErrorResult(context, appInfo));
+    assertTrue(resolutionResult.isIllegalAccessErrorResult(context, appView));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessTest.java
index 2c0e590..8a540f7 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessTest.java
@@ -132,11 +132,11 @@
 
     assertEquals(
         OptionalBool.of(inSameNest),
-        resolutionResult.isAccessibleFrom(callerClassDefinition, appInfo));
+        resolutionResult.isAccessibleFrom(callerClassDefinition, appView));
     DexClassAndMethod targetSpecial =
-        resolutionResult.lookupInvokeSpecialTarget(callerClassDefinition, appInfo);
+        resolutionResult.lookupInvokeSpecialTarget(callerClassDefinition, appView);
     DexClassAndMethod targetSuper =
-        resolutionResult.lookupInvokeSuperTarget(callerClassDefinition, appInfo);
+        resolutionResult.lookupInvokeSuperTarget(callerClassDefinition, appView);
     if (inSameNest) {
       assertEquals(definingClassDefinition.getType(), targetSpecial.getHolderType());
       assertEquals(targetSpecial.getReference(), targetSuper.getReference());
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessTest.java
index 61712f9..a165e20 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessTest.java
@@ -105,13 +105,13 @@
     // Verify that the resolved method is accessible if in the same nest.
     assertEquals(
         OptionalBool.of(inSameNest),
-        resolutionResult.isAccessibleFrom(callerClassDefinition, appInfo));
+        resolutionResult.isAccessibleFrom(callerClassDefinition, appView));
 
     // Verify that looking up the dispatch target returns the defining method.
     DexClassAndMethod targetSpecial =
-        resolutionResult.lookupInvokeSpecialTarget(callerClassDefinition, appInfo);
+        resolutionResult.lookupInvokeSpecialTarget(callerClassDefinition, appView);
     DexClassAndMethod targetSuper =
-        resolutionResult.lookupInvokeSuperTarget(callerClassDefinition, appInfo);
+        resolutionResult.lookupInvokeSuperTarget(callerClassDefinition, appView);
     if (inSameNest) {
       assertEquals(definingClassDefinition.type, targetSpecial.getHolderType());
       assertEquals(targetSpecial.getReference(), targetSuper.getReference());
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessWithIntermediateTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessWithIntermediateTest.java
index 465b11e..5609ff3 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessWithIntermediateTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessWithIntermediateTest.java
@@ -126,9 +126,11 @@
     // Resolution fails when there is a mismatch between the symbolic reference and the definition.
     if (!symbolicReferenceIsDefiningType) {
       if (inSameNest) {
-        assertTrue(resolutionResult.isNoSuchMethodErrorResult(callerClassDefinition, appInfo));
+        assertTrue(
+            resolutionResult.isNoSuchMethodErrorResult(callerClassDefinition, appView, appInfo));
       } else {
-        assertTrue(resolutionResult.isIllegalAccessErrorResult(callerClassDefinition, appInfo));
+        assertTrue(
+            resolutionResult.isIllegalAccessErrorResult(callerClassDefinition, appView, appInfo));
       }
       return;
     }
@@ -140,14 +142,14 @@
     // Verify that the resolved method is accessible only when in the same nest.
     assertEquals(
         OptionalBool.of(inSameNest),
-        resolutionResult.isAccessibleFrom(callerClassDefinition, appInfo));
+        resolutionResult.isAccessibleFrom(callerClassDefinition, appView));
 
     // Verify that looking up the dispatch target returns a valid target
     // iff in the same nest and declaredHolder == definingHolder.
     DexClassAndMethod targetSpecial =
-        resolutionResult.lookupInvokeSpecialTarget(callerClassDefinition, appInfo);
+        resolutionResult.lookupInvokeSpecialTarget(callerClassDefinition, appView);
     DexClassAndMethod targetSuper =
-        resolutionResult.lookupInvokeSuperTarget(callerClassDefinition, appInfo);
+        resolutionResult.lookupInvokeSuperTarget(callerClassDefinition, appView);
     if (inSameNest) {
       assertEquals(definingClassDefinition.type, targetSpecial.getHolderType());
       assertEquals(targetSpecial.getReference(), targetSuper.getReference());
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodPublicAccessWithIntermediateTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodPublicAccessWithIntermediateTest.java
index 0a20eab..1a72976 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodPublicAccessWithIntermediateTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodPublicAccessWithIntermediateTest.java
@@ -106,15 +106,15 @@
 
     // Verify that the resolved method is accessible (it is public).
     assertEquals(
-        OptionalBool.TRUE, resolutionResult.isAccessibleFrom(callerClassDefinition, appInfo));
+        OptionalBool.TRUE, resolutionResult.isAccessibleFrom(callerClassDefinition, appView));
 
     // Verify that looking up the dispatch target returns the defining method.
     DexClassAndMethod targetSpecial =
-        resolutionResult.lookupInvokeSpecialTarget(callerClassDefinition, appInfo);
+        resolutionResult.lookupInvokeSpecialTarget(callerClassDefinition, appView);
     assertEquals(definingClassDefinition.type, targetSpecial.getHolderType());
 
     DexClassAndMethod targetSuper =
-        resolutionResult.lookupInvokeSuperTarget(callerClassDefinition, appInfo);
+        resolutionResult.lookupInvokeSuperTarget(callerClassDefinition, appView);
     assertEquals(targetSpecial.getReference(), targetSuper.getReference());
   }
 
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestStaticMethodAccessTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestStaticMethodAccessTest.java
index 9216e56..d0b2806 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestStaticMethodAccessTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestStaticMethodAccessTest.java
@@ -75,7 +75,7 @@
         appInfo.definitionFor(buildType(B.class, appInfo.dexItemFactory())).asProgramClass();
     DexMethod bar = buildMethod(A.class.getDeclaredMethod("bar"), appInfo.dexItemFactory());
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(bar);
-    assertEquals(OptionalBool.of(inSameNest), resolutionResult.isAccessibleFrom(bClass, appInfo));
+    assertEquals(OptionalBool.of(inSameNest), resolutionResult.isAccessibleFrom(bClass, appView));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestStaticMethodAccessWithIntermediateClassTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestStaticMethodAccessWithIntermediateClassTest.java
index 235b3d1..3d09c38 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestStaticMethodAccessWithIntermediateClassTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestStaticMethodAccessWithIntermediateClassTest.java
@@ -74,7 +74,7 @@
         appInfo.definitionFor(buildType(B.class, appInfo.dexItemFactory())).asProgramClass();
     DexMethod bar = buildMethod(A.class.getDeclaredMethod("bar"), appInfo.dexItemFactory());
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(bar);
-    assertEquals(OptionalBool.of(inSameNest), resolutionResult.isAccessibleFrom(bClass, appInfo));
+    assertEquals(OptionalBool.of(inSameNest), resolutionResult.isAccessibleFrom(bClass, appView));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestVirtualMethodAccessTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestVirtualMethodAccessTest.java
index d86d67d..b2f74fb 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestVirtualMethodAccessTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestVirtualMethodAccessTest.java
@@ -77,7 +77,7 @@
         appInfo.definitionFor(buildType(B.class, appInfo.dexItemFactory())).asProgramClass();
     DexMethod bar = buildMethod(A.class.getDeclaredMethod("bar"), appInfo.dexItemFactory());
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(bar);
-    assertEquals(OptionalBool.of(inSameNest), resolutionResult.isAccessibleFrom(bClass, appInfo));
+    assertEquals(OptionalBool.of(inSameNest), resolutionResult.isAccessibleFrom(bClass, appView));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestVirtualMethodAccessWithIntermediateClassTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestVirtualMethodAccessWithIntermediateClassTest.java
index 6c3e040..96fe463 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestVirtualMethodAccessWithIntermediateClassTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestVirtualMethodAccessWithIntermediateClassTest.java
@@ -73,7 +73,7 @@
         appInfo.definitionFor(buildType(B.class, appInfo.dexItemFactory())).asProgramClass();
     DexMethod bar = buildMethod(A.class.getDeclaredMethod("bar"), appInfo.dexItemFactory());
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(bar);
-    assertEquals(OptionalBool.of(inSameNest), resolutionResult.isAccessibleFrom(bClass, appInfo));
+    assertEquals(OptionalBool.of(inSameNest), resolutionResult.isAccessibleFrom(bClass, appView));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/access/SelfVirtualMethodAccessTest.java b/src/test/java/com/android/tools/r8/resolution/access/SelfVirtualMethodAccessTest.java
index aff8d60..d6f4618 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/SelfVirtualMethodAccessTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/SelfVirtualMethodAccessTest.java
@@ -60,7 +60,7 @@
         appInfo.definitionFor(buildType(A.class, appInfo.dexItemFactory())).asProgramClass();
     DexMethod bar = buildMethod(A.class.getDeclaredMethod("bar"), appInfo.dexItemFactory());
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(bar);
-    assertEquals(OptionalBool.TRUE, resolutionResult.isAccessibleFrom(aClass, appInfo));
+    assertEquals(OptionalBool.TRUE, resolutionResult.isAccessibleFrom(aClass, appView));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/access/indirectfield/IndirectFieldAccessTest.java b/src/test/java/com/android/tools/r8/resolution/access/indirectfield/IndirectFieldAccessTest.java
index 99b02c3..f2b60f2 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/indirectfield/IndirectFieldAccessTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/indirectfield/IndirectFieldAccessTest.java
@@ -67,7 +67,7 @@
             appInfo.dexItemFactory());
     FieldResolutionResult resolutionResult = appInfo.resolveField(f);
     assertTrue(resolutionResult.isSingleFieldResolutionResult());
-    assertEquals(OptionalBool.TRUE, resolutionResult.isAccessibleFrom(barMethod, appInfo));
+    assertEquals(OptionalBool.TRUE, resolutionResult.isAccessibleFrom(barMethod, appView));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/access/indirectmethod/IndirectMethodAccessTest.java b/src/test/java/com/android/tools/r8/resolution/access/indirectmethod/IndirectMethodAccessTest.java
index 528b8aa..0599233 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/indirectmethod/IndirectMethodAccessTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/indirectmethod/IndirectMethodAccessTest.java
@@ -67,7 +67,7 @@
     DexMethod bar = buildMethod(B.class.getMethod("foo"), appInfo.dexItemFactory());
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(bar);
     assertEquals(
-        OptionalBool.TRUE, resolutionResult.isAccessibleForVirtualDispatchFrom(cClass, appInfo));
+        OptionalBool.TRUE, resolutionResult.isAccessibleForVirtualDispatchFrom(cClass, appView));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/duplicatedefinitions/MaximallySpecificSingleLibraryPartialTest.java b/src/test/java/com/android/tools/r8/resolution/duplicatedefinitions/MaximallySpecificSingleLibraryPartialTest.java
index e2fd96f..0aac67a 100644
--- a/src/test/java/com/android/tools/r8/resolution/duplicatedefinitions/MaximallySpecificSingleLibraryPartialTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/duplicatedefinitions/MaximallySpecificSingleLibraryPartialTest.java
@@ -95,7 +95,7 @@
                 (resolution.getResolvedHolder().isProgramClass() ? "Program: " : "Library: ")
                     + resolution.getResolvedMethod().getReference().toString());
           } else {
-            assertTrue(result.isNoSuchMethodErrorResult(mainClass, appInfo));
+            assertTrue(result.isNoSuchMethodErrorResult(mainClass, appView));
             methodResults.add(typeName(NoSuchMethodError.class));
             result
                 .asFailedResolution()
diff --git a/src/test/java/com/android/tools/r8/resolution/duplicatedefinitions/MaximallySpecificSingleProgramPartialTest.java b/src/test/java/com/android/tools/r8/resolution/duplicatedefinitions/MaximallySpecificSingleProgramPartialTest.java
index 3d22646..ca57c2f 100644
--- a/src/test/java/com/android/tools/r8/resolution/duplicatedefinitions/MaximallySpecificSingleProgramPartialTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/duplicatedefinitions/MaximallySpecificSingleProgramPartialTest.java
@@ -93,7 +93,7 @@
                 (resolution.getResolvedHolder().isProgramClass() ? "Program: " : "Library: ")
                     + resolution.getResolvedMethod().getReference().toString());
           } else {
-            assertTrue(result.isNoSuchMethodErrorResult(mainClass, appInfo));
+            assertTrue(result.isNoSuchMethodErrorResult(mainClass, appView));
             methodResults.add(typeName(NoSuchMethodError.class));
             result
                 .asFailedResolution()
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodAsOverrideWithLambdaTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodAsOverrideWithLambdaTest.java
index 200a3ad..91562c7 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodAsOverrideWithLambdaTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodAsOverrideWithLambdaTest.java
@@ -67,7 +67,7 @@
         appInfo.resolveMethodOnInterfaceLegacy(method.holder, method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodLambdaTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodLambdaTest.java
index 3f9476e..cf0e5f4 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodLambdaTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodLambdaTest.java
@@ -66,7 +66,7 @@
         appInfo.resolveMethodOnInterfaceLegacy(method.holder, method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultWithoutTopTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultWithoutTopTest.java
index 1579e3f..49ec9ea 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultWithoutTopTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultWithoutTopTest.java
@@ -66,7 +66,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnInterfaceHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
@@ -115,7 +115,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnInterfaceHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DuplicateImportsTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DuplicateImportsTest.java
index 56e1a51..62c0d0c 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DuplicateImportsTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DuplicateImportsTest.java
@@ -66,7 +66,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnInterfaceHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/InvokeInterfaceWithStaticTargetTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/InvokeInterfaceWithStaticTargetTest.java
index 667b6c7..3c6d716 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/InvokeInterfaceWithStaticTargetTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/InvokeInterfaceWithStaticTargetTest.java
@@ -57,7 +57,7 @@
         () ->
             appInfo
                 .resolveMethodOnInterfaceHolderLegacy(method)
-                .lookupVirtualDispatchTargets(context, appInfo));
+                .lookupVirtualDispatchTargets(context, appView));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/LambdaMultipleInterfacesTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/LambdaMultipleInterfacesTest.java
index c01dc38..ba0ffb3 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/LambdaMultipleInterfacesTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/LambdaMultipleInterfacesTest.java
@@ -66,7 +66,7 @@
         appInfo.resolveMethodOnInterfaceLegacy(method.holder, method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/MultipleImplementsTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/MultipleImplementsTest.java
index 5dad4b6..455c14d 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/MultipleImplementsTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/MultipleImplementsTest.java
@@ -64,7 +64,7 @@
         appInfo.resolveMethodOnInterfaceLegacy(method.holder, method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SimpleInterfaceInvokeTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SimpleInterfaceInvokeTest.java
index fab0e87..75af94a 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SimpleInterfaceInvokeTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SimpleInterfaceInvokeTest.java
@@ -64,7 +64,7 @@
         appInfo.resolveMethodOnInterfaceLegacy(method.holder, method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     assertFalse(lookupResult.asLookupResultSuccess().hasLambdaTargets());
     Set<String> targets = new HashSet<>();
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubInterfaceOverridesTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubInterfaceOverridesTest.java
index 4fb6ea3..c2727e5 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubInterfaceOverridesTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubInterfaceOverridesTest.java
@@ -66,7 +66,7 @@
         appInfo.resolveMethodOnInterfaceLegacy(method.holder, method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     assertFalse(lookupResult.asLookupResultSuccess().hasLambdaTargets());
     Set<String> targets = new HashSet<>();
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeMissingOverridesTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeMissingOverridesTest.java
index 5563d1c..a0c812a 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeMissingOverridesTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeMissingOverridesTest.java
@@ -63,7 +63,7 @@
         appInfo.resolveMethodOnInterfaceLegacy(method.holder, method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     assertFalse(lookupResult.asLookupResultSuccess().hasLambdaTargets());
     Set<String> targets = new HashSet<>();
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeOverridesTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeOverridesTest.java
index edc31a9..b5d846d 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeOverridesTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeOverridesTest.java
@@ -63,7 +63,7 @@
         appInfo.resolveMethodOnInterfaceLegacy(method.holder, method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     assertFalse(lookupResult.asLookupResultSuccess().hasLambdaTargets());
     Set<String> targets = new HashSet<>();
diff --git a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateClasspathWidenTest.java b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateClasspathWidenTest.java
index 8a36359..5da6e09 100644
--- a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateClasspathWidenTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateClasspathWidenTest.java
@@ -77,7 +77,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Abstract.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateInitialResolutionHolderTest.java b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateInitialResolutionHolderTest.java
index ae99bf7..68bcc86 100644
--- a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateInitialResolutionHolderTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateInitialResolutionHolderTest.java
@@ -66,7 +66,7 @@
         appInfo.definitionForProgramType(
             buildType(
                 Reference.classFromDescriptor(descriptor(Main.class)), appInfo.dexItemFactory()));
-    assertEquals(OptionalBool.FALSE, resolutionResult.isAccessibleFrom(programClass, appInfo));
+    assertEquals(OptionalBool.FALSE, resolutionResult.isAccessibleFrom(programClass, appView));
     DexType cType =
         buildType(Reference.classFromDescriptor(newCDescriptor), appInfo.dexItemFactory());
     DexProgramClass cClass = appView.definitionForProgramType(cType);
diff --git a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryTest.java b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryTest.java
index d6c548d..7513d4d 100644
--- a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryTest.java
@@ -62,7 +62,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(A.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryWithNarrowingTest.java b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryWithNarrowingTest.java
index 7cbbb62..e4da615 100644
--- a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryWithNarrowingTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryWithNarrowingTest.java
@@ -66,7 +66,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(A.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateWithDefaultMethod2Test.java b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateWithDefaultMethod2Test.java
index 4bf6dc7..10e3530 100644
--- a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateWithDefaultMethod2Test.java
+++ b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateWithDefaultMethod2Test.java
@@ -76,7 +76,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(A.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateWithDefaultMethodTest.java b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateWithDefaultMethodTest.java
index 9984687..ead6a82 100644
--- a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateWithDefaultMethodTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateWithDefaultMethodTest.java
@@ -71,7 +71,7 @@
     DexProgramClass context =
         appView.definitionForProgramType(buildType(A.class, appInfo.dexItemFactory()));
     assertTrue(resolutionResult.isAccessibleFrom(context, appView).isFalse());
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultFailure());
   }
 
diff --git a/src/test/java/com/android/tools/r8/resolution/packageprivate/WidenAccessOutsidePackageTest.java b/src/test/java/com/android/tools/r8/resolution/packageprivate/WidenAccessOutsidePackageTest.java
index 8745ee1..21c346c 100644
--- a/src/test/java/com/android/tools/r8/resolution/packageprivate/WidenAccessOutsidePackageTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/packageprivate/WidenAccessOutsidePackageTest.java
@@ -63,7 +63,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(A.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertFalse(lookupResult.asLookupResultSuccess().hasLambdaTargets());
     Set<String> targets = new HashSet<>();
     lookupResult
diff --git a/src/test/java/com/android/tools/r8/resolution/singletarget/InstantiatedLowerBoundTest.java b/src/test/java/com/android/tools/r8/resolution/singletarget/InstantiatedLowerBoundTest.java
index 42733a1..788e55b 100644
--- a/src/test/java/com/android/tools/r8/resolution/singletarget/InstantiatedLowerBoundTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/singletarget/InstantiatedLowerBoundTest.java
@@ -136,7 +136,7 @@
     DexProgramClass upperBound = appView.definitionForProgramType(typeA);
     DexProgramClass lowerBound = appView.definitionForProgramType(typeC);
     LookupResult lookupResult =
-        resolution.lookupVirtualDispatchTargets(context, appInfo, upperBound, lowerBound);
+        resolution.lookupVirtualDispatchTargets(context, appView, upperBound, lowerBound);
     Set<DexMethod> expected = Sets.newIdentityHashSet();
     expected.add(fooA);
     expected.add(fooB);
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/AbstractInMiddleTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/AbstractInMiddleTest.java
index ac915f2..f9c5927 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/AbstractInMiddleTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/AbstractInMiddleTest.java
@@ -62,7 +62,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceSubTypeTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceSubTypeTest.java
index efed293..a64145e 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceSubTypeTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceSubTypeTest.java
@@ -65,7 +65,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceTest.java
index bfe1d1b..c227f79 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceTest.java
@@ -65,7 +65,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultWithoutTopTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultWithoutTopTest.java
index 57b31a1..d9f121b 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultWithoutTopTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultWithoutTopTest.java
@@ -66,7 +66,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/InvokeVirtualToInterfaceDefinitionTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/InvokeVirtualToInterfaceDefinitionTest.java
index 64e046a..edb66c9 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/InvokeVirtualToInterfaceDefinitionTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/InvokeVirtualToInterfaceDefinitionTest.java
@@ -65,7 +65,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/KeptTargetsIncompleteLookupTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/KeptTargetsIncompleteLookupTest.java
index a96b487..d2dae9b 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/KeptTargetsIncompleteLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/KeptTargetsIncompleteLookupTest.java
@@ -94,7 +94,7 @@
                 .appInfo()
                 .definitionForWithoutExistenceAssert(
                     buildType(Unrelated.class, appInfo.dexItemFactory())));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     LookupResultSuccess lookupResultSuccess = lookupResult.asLookupResultSuccess();
     Set<String> targets = new HashSet<>();
@@ -245,7 +245,7 @@
     LookupResult lookupResult =
         resolutionResult.lookupVirtualDispatchTargets(
             classB,
-            appInfo,
+            appView,
             (type, subTypeConsumer, callSiteConsumer) -> {
               if (type == typeB) {
                 subTypeConsumer.accept(classB);
@@ -276,7 +276,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Unrelated.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     LookupResultSuccess lookupResultSuccess = lookupResult.asLookupResultSuccess();
     Set<String> targets = new HashSet<>();
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/PackagePrivateChainTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/PackagePrivateChainTest.java
index e1dad43..e1b4be1 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/PackagePrivateChainTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/PackagePrivateChainTest.java
@@ -65,7 +65,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(TopRunner.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/PackagePrivateFinalOverrideTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/PackagePrivateFinalOverrideTest.java
index ad30339..4b5f8d2 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/PackagePrivateFinalOverrideTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/PackagePrivateFinalOverrideTest.java
@@ -72,7 +72,7 @@
     DexProgramClass context =
         appView.definitionForProgramType(
             buildType(ViewModelRunner.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
@@ -122,7 +122,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultFailure());
   }
 
@@ -175,7 +175,7 @@
     DexProgramClass context =
         appView.definitionForProgramType(
             buildType(ViewModelRunnerWithCast.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/PrivateOverrideOfVirtualTargetTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/PrivateOverrideOfVirtualTargetTest.java
index 536e845..a076a58 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/PrivateOverrideOfVirtualTargetTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/PrivateOverrideOfVirtualTargetTest.java
@@ -64,7 +64,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(B.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     Set<String> targets = new HashSet<>();
     lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/ProtectedDifferentPackageLookupTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/ProtectedDifferentPackageLookupTest.java
index f7bff16..4ec5810 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/ProtectedDifferentPackageLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/ProtectedDifferentPackageLookupTest.java
@@ -57,7 +57,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     // TODO(b/173363527): Should be an error.
     assertTrue(lookupResult.isLookupResultSuccess());
   }
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/ProtectedSamePackageLookupTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/ProtectedSamePackageLookupTest.java
index fcfd723..cc72a23 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/ProtectedSamePackageLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/ProtectedSamePackageLookupTest.java
@@ -53,7 +53,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnClassHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
   }
 
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/TargetInDefaultMethodTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/TargetInDefaultMethodTest.java
index 56fa675..8aef8bb 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/TargetInDefaultMethodTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/TargetInDefaultMethodTest.java
@@ -66,7 +66,7 @@
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOnInterfaceHolderLegacy(method);
     DexProgramClass context =
         appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
-    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appInfo);
+    LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
     assertTrue(lookupResult.isLookupResultSuccess());
     assertFalse(lookupResult.asLookupResultSuccess().hasLambdaTargets());
     Set<String> targets = new HashSet<>();