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;