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) {