Build call graph in a helper method to ensure it is not kept alive
Change-Id: I98e0fbf17b927d8413f83cd7b0631a6d99fd041c
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CallGraph.java b/src/main/java/com/android/tools/r8/ir/conversion/CallGraph.java
index d4ed94b..5f3ffdb 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CallGraph.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CallGraph.java
@@ -9,8 +9,11 @@
import com.android.tools.r8.ir.conversion.CallGraphBuilder.CycleEliminator;
import com.android.tools.r8.ir.conversion.CallSiteInformation.CallGraphBasedCallSiteInformation;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
+import com.android.tools.r8.utils.Timing;
import java.util.Set;
import java.util.TreeSet;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
/**
* Call graph representation.
@@ -142,17 +145,10 @@
this.nodes = nodes;
}
- public static CallGraphBuilder builder(AppView<AppInfoWithLiveness> appView) {
+ static CallGraphBuilder builder(AppView<AppInfoWithLiveness> appView) {
return new CallGraphBuilder(appView);
}
- CallSiteInformation createCallSiteInformation(AppView<AppInfoWithLiveness> appView) {
- // Don't leverage single/dual call site information when we are not tree shaking.
- return appView.options().isShrinking()
- ? new CallGraphBasedCallSiteInformation(appView, this)
- : CallSiteInformation.empty();
- }
-
/**
* Extract the next set of leaves (nodes with an call (outgoing) degree of 0) if any.
*
@@ -161,7 +157,17 @@
*
* <p>
*/
- MethodProcessingOrder createMethodProcessingOrder(AppView<?> appView) {
- return new MethodProcessingOrder(appView, this);
+ static MethodProcessor createMethodProcessor(
+ AppView<AppInfoWithLiveness> appView, ExecutorService executorService, Timing timing)
+ throws ExecutionException {
+ CallGraph callGraph = CallGraph.builder(appView).build(executorService, timing);
+ return new MethodProcessor(appView, callGraph);
+ }
+
+ CallSiteInformation createCallSiteInformation(AppView<AppInfoWithLiveness> appView) {
+ // Don't leverage single/dual call site information when we are not tree shaking.
+ return appView.options().isShrinking()
+ ? new CallGraphBasedCallSiteInformation(appView, this)
+ : CallSiteInformation.empty();
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 2f24d3f..d5c65ec 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -526,19 +526,20 @@
OptimizationFeedbackDelayed feedback = delayedOptimizationFeedback;
{
timing.begin("Build call graph");
- CallGraph callGraph =
- CallGraph.builder(appView.withLiveness()).build(executorService, timing);
- CallSiteInformation callSiteInformation =
- callGraph.createCallSiteInformation(appViewWithLiveness);
- MethodProcessingOrder methodProcessingOrder = callGraph.createMethodProcessingOrder(appView);
+ MethodProcessor methodProcessor =
+ CallGraph.createMethodProcessor(appView.withLiveness(), executorService, timing);
timing.end();
timing.begin("IR conversion phase 1");
BiConsumer<IRCode, DexEncodedMethod> outlineHandler =
outliner == null ? Outliner::noProcessing : outliner.identifyCandidateMethods();
- methodProcessingOrder.forEachMethod(
+ methodProcessor.forEachMethod(
(method, isProcessedConcurrently) ->
processMethod(
- method, feedback, isProcessedConcurrently, callSiteInformation, outlineHandler),
+ method,
+ feedback,
+ isProcessedConcurrently,
+ methodProcessor.getCallSiteInformation(),
+ outlineHandler),
this::waveStart,
this::waveDone,
executorService);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessingOrder.java b/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java
similarity index 88%
rename from src/main/java/com/android/tools/r8/ir/conversion/MethodProcessingOrder.java
rename to src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java
index 6d84aba..4cea267 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessingOrder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.ir.conversion.CallGraph.Node;
+import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.Action;
import com.android.tools.r8.utils.IROrdering;
import com.android.tools.r8.utils.ThreadUtils;
@@ -24,14 +25,20 @@
import java.util.concurrent.Future;
import java.util.function.Predicate;
-public class MethodProcessingOrder {
+public class MethodProcessor {
+ private final CallSiteInformation callSiteInformation;
private final Deque<Collection<DexEncodedMethod>> waves;
- MethodProcessingOrder(AppView<?> appView, CallGraph callGraph) {
+ MethodProcessor(AppView<AppInfoWithLiveness> appView, CallGraph callGraph) {
+ this.callSiteInformation = callGraph.createCallSiteInformation(appView);
this.waves = createWaves(appView, callGraph);
}
+ public CallSiteInformation getCallSiteInformation() {
+ return callSiteInformation;
+ }
+
public static Deque<Collection<DexEncodedMethod>> createWaves(
AppView<?> appView, CallGraph callGraph) {
IROrdering shuffle = appView.options().testing.irOrdering;