Account for partial MethodAccessInfoCollection in bridge hoisting

This does not fix any existing errors, but allow bridge hoisting to be run in other places during the R8 pipeline.

Change-Id: I37500a7b34b4db14b3660321305f8167d46ee899
diff --git a/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java b/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java
index 99cd8d2..beb2fb3 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java
@@ -119,6 +119,10 @@
     virtualInvokes.getOrDefault(method, ProgramMethodSet.empty()).forEach(consumer);
   }
 
+  public boolean isVirtualInvokesDestroyed() {
+    return isThrowingMap(virtualInvokes);
+  }
+
   public MethodAccessInfoCollection rewrittenWithLens(
       DexDefinitionSupplier definitions, GraphLens lens, Timing timing) {
     timing.begin("Rewrite MethodAccessInfoCollection");
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/MethodOptimizationFeedback.java b/src/main/java/com/android/tools/r8/ir/conversion/MethodOptimizationFeedback.java
index e5a0728..8f4c441 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/MethodOptimizationFeedback.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/MethodOptimizationFeedback.java
@@ -54,7 +54,7 @@
 
   void markAsPropagated(DexEncodedMethod method);
 
-  void setBridgeInfo(DexEncodedMethod method, BridgeInfo bridgeInfo);
+  void setBridgeInfo(ProgramMethod method, BridgeInfo bridgeInfo);
 
   void setClassInlinerMethodConstraint(
       ProgramMethod method, ClassInlinerMethodConstraint classInlinerConstraint);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
index 73e2edd..47f2e03 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
@@ -140,7 +140,7 @@
       MethodProcessor methodProcessor,
       Timing timing) {
     DexEncodedMethod definition = method.getDefinition();
-    identifyBridgeInfo(definition, code, feedback, timing);
+    identifyBridgeInfo(method, code, feedback, timing);
     analyzeReturns(code, feedback, methodProcessor, timing);
     if (options.enableClassInlining) {
       computeClassInlinerMethodConstraint(method, code, feedback, timing);
@@ -162,9 +162,9 @@
   }
 
   private void identifyBridgeInfo(
-      DexEncodedMethod method, IRCode code, OptimizationFeedback feedback, Timing timing) {
+      ProgramMethod method, IRCode code, OptimizationFeedback feedback, Timing timing) {
     timing.begin("Identify bridge info");
-    feedback.setBridgeInfo(method, BridgeAnalyzer.analyzeMethod(method, code));
+    feedback.setBridgeInfo(method, BridgeAnalyzer.analyzeMethod(method.getDefinition(), code));
     timing.end();
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
index 8a071b8..f4de742 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
@@ -228,7 +228,7 @@
   }
 
   @Override
-  public synchronized void setBridgeInfo(DexEncodedMethod method, BridgeInfo bridgeInfo) {
+  public synchronized void setBridgeInfo(ProgramMethod method, BridgeInfo bridgeInfo) {
     getMethodOptimizationInfoForUpdating(method).setBridgeInfo(bridgeInfo);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java
index c3ff56a..05a1cdc 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java
@@ -94,7 +94,7 @@
   public void markProcessed(DexEncodedMethod method, ConstraintWithTarget state) {}
 
   @Override
-  public void setBridgeInfo(DexEncodedMethod method, BridgeInfo bridgeInfo) {}
+  public void setBridgeInfo(ProgramMethod method, BridgeInfo bridgeInfo) {}
 
   @Override
   public void setClassInlinerMethodConstraint(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
index a440900..339d9eb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
@@ -151,8 +151,8 @@
   }
 
   @Override
-  public void setBridgeInfo(DexEncodedMethod method, BridgeInfo bridgeInfo) {
-    method.getMutableOptimizationInfo().setBridgeInfo(bridgeInfo);
+  public void setBridgeInfo(ProgramMethod method, BridgeInfo bridgeInfo) {
+    method.getDefinition().getMutableOptimizationInfo().setBridgeInfo(bridgeInfo);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
index 387d67d..5a8e0de 100644
--- a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
+++ b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
@@ -99,17 +99,22 @@
 
       // Record the invokes from the newly synthesized bridge methods in the method access info
       // collection.
-      MethodAccessInfoCollection.Modifier methodAccessInfoCollectionModifier =
-          appView.appInfo().getMethodAccessInfoCollection().modifier();
-      result.forEachHoistedBridge(
-          (bridge, bridgeInfo) -> {
-            if (bridgeInfo.isVirtualBridgeInfo()) {
-              DexMethod reference = bridgeInfo.asVirtualBridgeInfo().getInvokedMethod();
-              methodAccessInfoCollectionModifier.registerInvokeVirtualInContext(reference, bridge);
-            } else {
-              assert false;
-            }
-          });
+      MethodAccessInfoCollection methodAccessInfoCollection =
+          appView.appInfo().getMethodAccessInfoCollection();
+      if (!methodAccessInfoCollection.isVirtualInvokesDestroyed()) {
+        MethodAccessInfoCollection.Modifier methodAccessInfoCollectionModifier =
+            methodAccessInfoCollection.modifier();
+        result.forEachHoistedBridge(
+            (bridge, bridgeInfo) -> {
+              if (bridgeInfo.isVirtualBridgeInfo()) {
+                DexMethod reference = bridgeInfo.asVirtualBridgeInfo().getInvokedMethod();
+                methodAccessInfoCollectionModifier.registerInvokeVirtualInContext(
+                    reference, bridge);
+              } else {
+                assert false;
+              }
+            });
+      }
     }
 
     appView.notifyOptimizationFinishedForTesting();
@@ -257,7 +262,7 @@
     // Now update the code of the bridge method chosen as representative.
     representative
         .setCode(createCodeForVirtualBridge(representative, methodToInvoke), appView);
-    feedback.setBridgeInfo(representative.getDefinition(), new VirtualBridgeInfo(methodToInvoke));
+    feedback.setBridgeInfo(representative, new VirtualBridgeInfo(methodToInvoke));
 
     // Move the bridge method to the super class, and record this in the graph lens.
     DexMethod newMethodReference =