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 =