Add extra timing information to argument propagator

Change-Id: I23fd64c639c65c669128d7fc0ad9235687bc2514
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagator.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagator.java
index 227851f..36719be 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagator.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagator.java
@@ -128,10 +128,12 @@
     timing.begin("Argument propagator");
 
     // Compute the strongly connected program components for parallel execution.
+    timing.begin("Compute components");
     ImmediateProgramSubtypingInfo immediateSubtypingInfo =
         ImmediateProgramSubtypingInfo.create(appView);
     List<Set<DexProgramClass>> stronglyConnectedProgramComponents =
         computeStronglyConnectedProgramClasses(appView, immediateSubtypingInfo);
+    timing.end();
 
     // Set the optimization info on each method.
     populateParameterOptimizationInfo(
@@ -142,16 +144,17 @@
     Set<DexProgramClass> affectedClasses = Sets.newConcurrentHashSet();
     ArgumentPropagatorGraphLens graphLens =
         new ArgumentPropagatorProgramOptimizer(appView, immediateSubtypingInfo)
-            .run(stronglyConnectedProgramComponents, affectedClasses::add, executorService);
+            .run(stronglyConnectedProgramComponents, affectedClasses::add, executorService, timing);
 
     // Find all the code objects that need reprocessing.
     new ArgumentPropagatorMethodReprocessingEnqueuer(appView)
-        .enqueueMethodForReprocessing(graphLens, postMethodProcessorBuilder, executorService);
+        .enqueueMethodForReprocessing(
+            graphLens, postMethodProcessorBuilder, executorService, timing);
 
     // Finally, apply the graph lens to the program (i.e., remove constant parameters from method
     // definitions).
     new ArgumentPropagatorApplicationFixer(appView, graphLens)
-        .fixupApplication(affectedClasses, executorService);
+        .fixupApplication(affectedClasses, executorService, timing);
 
     timing.end();
   }
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
index ff551ca..beb3003 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.graph.RewrittenPrototypeDescription.ArgumentInfoCollection;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.ThreadUtils;
+import com.android.tools.r8.utils.Timing;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -31,7 +32,7 @@
   }
 
   public void fixupApplication(
-      Set<DexProgramClass> affectedClasses, ExecutorService executorService)
+      Set<DexProgramClass> affectedClasses, ExecutorService executorService, Timing timing)
       throws ExecutionException {
     // If the graph lens is null, argument propagation did not lead to any parameter removals. In
     // this case there is no needed to fixup the program.
@@ -42,8 +43,13 @@
 
     assert !affectedClasses.isEmpty();
 
+    timing.begin("Fixup application");
     ThreadUtils.processItems(affectedClasses, this::fixupClass, executorService);
+    timing.end();
+
+    timing.begin("Rewrite AppView");
     appView.rewriteWithLens(graphLens);
+    timing.end();
   }
 
   private void fixupClass(DexProgramClass clazz) {
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java
index 37adcfa..68c7d12 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java
@@ -19,6 +19,7 @@
 import com.android.tools.r8.ir.optimize.info.CallSiteOptimizationInfo;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.ThreadUtils;
+import com.android.tools.r8.utils.Timing;
 import com.android.tools.r8.utils.collections.LongLivedProgramMethodSetBuilder;
 import com.android.tools.r8.utils.collections.ProgramMethodSet;
 import java.util.ArrayList;
@@ -43,18 +44,31 @@
   public void enqueueMethodForReprocessing(
       ArgumentPropagatorGraphLens graphLens,
       PostMethodProcessor.Builder postMethodProcessorBuilder,
-      ExecutorService executorService)
+      ExecutorService executorService,
+      Timing timing)
       throws ExecutionException {
+    timing.begin("Enqueue methods for reprocessing");
+
     // Bring the methods to reprocess set up-to-date with the current graph lens (i.e., the one
     // prior to the argument propagator lens, which has not yet been installed!).
+    timing.begin("Rewrite methods to reprocess");
     LongLivedProgramMethodSetBuilder<ProgramMethodSet> methodsToReprocessBuilder =
         postMethodProcessorBuilder
             .getMethodsToReprocessBuilder()
             .rewrittenWithLens(appView.graphLens());
+    timing.end();
+
+    timing.begin("Enqueue methods with non-trivial info");
     enqueueMethodsWithNonTrivialOptimizationInfo(methodsToReprocessBuilder);
+    timing.end();
+
+    timing.begin("Enqueue affected methods");
     if (graphLens != null) {
       enqueueAffectedCallers(graphLens, methodsToReprocessBuilder, executorService);
     }
+    timing.end();
+
+    timing.end();
   }
 
   private void enqueueMethodsWithNonTrivialOptimizationInfo(
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
index 41e2e9c..76845cc 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
@@ -27,6 +27,7 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Pair;
 import com.android.tools.r8.utils.ThreadUtils;
+import com.android.tools.r8.utils.Timing;
 import com.android.tools.r8.utils.collections.DexMethodSignatureSet;
 import com.android.tools.r8.utils.collections.ProgramMethodSet;
 import com.google.common.collect.Iterables;
@@ -64,20 +65,27 @@
   public ArgumentPropagatorGraphLens run(
       List<Set<DexProgramClass>> stronglyConnectedProgramComponents,
       Consumer<DexProgramClass> affectedClassConsumer,
-      ExecutorService executorService)
+      ExecutorService executorService,
+      Timing timing)
       throws ExecutionException {
+    timing.begin("Optimize components");
     Collection<Builder> partialGraphLensBuilders =
         ThreadUtils.processItemsWithResults(
             stronglyConnectedProgramComponents,
             classes ->
                 new StronglyConnectedComponentOptimizer().optimize(classes, affectedClassConsumer),
             executorService);
+    timing.end();
 
     // Merge all the partial, disjoint graph lens builders into a single graph lens.
+    timing.begin("Build graph lens");
     ArgumentPropagatorGraphLens.Builder graphLensBuilder =
         ArgumentPropagatorGraphLens.builder(appView);
     partialGraphLensBuilders.forEach(graphLensBuilder::mergeDisjoint);
-    return graphLensBuilder.build();
+    ArgumentPropagatorGraphLens graphLens = graphLensBuilder.build();
+    timing.end();
+
+    return graphLens;
   }
 
   private DexMethodSignatureSet getOrComputeLibraryMethods(DexClass clazz) {