Cleanup PostMethodProcessor
Change-Id: I54ad855df571eba3b6cae04cbafb6bab5e8f9270
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 c444a80..5799d59 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
@@ -680,8 +680,7 @@
GraphLens initialGraphLensForIR = appView.graphLens();
GraphLens graphLensForIR = initialGraphLensForIR;
OptimizationFeedbackDelayed feedback = delayedOptimizationFeedback;
- PostMethodProcessor.Builder postMethodProcessorBuilder =
- new PostMethodProcessor.Builder(getOptimizationsForPostIRProcessing());
+ PostMethodProcessor.Builder postMethodProcessorBuilder = new PostMethodProcessor.Builder();
{
timing.begin("Build primary method processor");
PrimaryMethodProcessor primaryMethodProcessor =
@@ -747,7 +746,12 @@
postMethodProcessorBuilder.build(appView, executorService, timing);
if (postMethodProcessor != null) {
assert !options.debug;
- postMethodProcessor.forEachWaveWithExtension(feedback, executorService);
+ postMethodProcessor.forEachMethod(
+ (method, methodProcessingContext) ->
+ processDesugaredMethod(
+ method, feedback, postMethodProcessor, methodProcessingContext),
+ feedback,
+ executorService);
feedback.updateVisibleOptimizationInfo();
assert graphLensForIR == appView.graphLens();
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
index 44896ea..9d9b9f1 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
@@ -6,6 +6,7 @@
import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
+import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.contexts.CompilationContext.ProcessorContext;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
@@ -13,9 +14,6 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.ir.code.IRCode;
-import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
-import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
import com.android.tools.r8.logging.Log;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -25,33 +23,22 @@
import com.android.tools.r8.utils.collections.ProgramMethodSet;
import com.android.tools.r8.utils.collections.SortedProgramMethodSet;
import java.util.ArrayDeque;
-import java.util.Collection;
import java.util.Deque;
-import java.util.IdentityHashMap;
-import java.util.LinkedHashSet;
-import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
+import java.util.function.BiConsumer;
public class PostMethodProcessor extends MethodProcessorWithWave {
private final ProcessorContext processorContext;
- private final AppView<AppInfoWithLiveness> appView;
- private final Collection<CodeOptimization> defaultCodeOptimizations;
- private final Map<DexMethod, Collection<CodeOptimization>> methodsMap;
private final Deque<SortedProgramMethodSet> waves;
private final ProgramMethodSet processed = ProgramMethodSet.create();
private PostMethodProcessor(
AppView<AppInfoWithLiveness> appView,
- Collection<CodeOptimization> defaultCodeOptimizations,
- Map<DexMethod, Collection<CodeOptimization>> methodsMap,
CallGraph callGraph) {
this.processorContext = appView.createProcessorContext();
- this.appView = appView;
- this.defaultCodeOptimizations = defaultCodeOptimizations;
- this.methodsMap = methodsMap;
this.waves = createWaves(callGraph);
}
@@ -63,24 +50,13 @@
public static class Builder {
- private final Collection<CodeOptimization> defaultCodeOptimizations;
- private final LongLivedProgramMethodSetBuilder<?> methodsToReprocess =
+ private final LongLivedProgramMethodSetBuilder<?> methodsToReprocessBuilder =
LongLivedProgramMethodSetBuilder.createForIdentitySet();
- private final Map<DexMethod, Collection<CodeOptimization>> optimizationsMap =
- new IdentityHashMap<>();
- Builder(Collection<CodeOptimization> defaultCodeOptimizations) {
- this.defaultCodeOptimizations = defaultCodeOptimizations;
- }
+ Builder() {}
public void add(ProgramMethod method) {
- methodsToReprocess.add(method);
- optimizationsMap
- .computeIfAbsent(
- method.getReference(),
- // Optimization order might matter, hence a collection that preserves orderings.
- k -> new LinkedHashSet<>())
- .addAll(defaultCodeOptimizations);
+ methodsToReprocessBuilder.add(method);
}
public void put(ProgramMethodSet methodsToRevisit) {
@@ -95,14 +71,7 @@
// new signature. The compiler needs to update the set of methods that must be reprocessed
// according to the graph lens.
public void rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens applied) {
- methodsToReprocess.rewrittenWithLens(appView, applied);
- Map<DexMethod, Collection<CodeOptimization>> newOptimizationsMap = new IdentityHashMap<>();
- optimizationsMap.forEach(
- (method, optimizations) ->
- newOptimizationsMap.put(
- appView.graphLens().getRenamedMethodSignature(method, applied), optimizations));
- optimizationsMap.clear();
- optimizationsMap.putAll(newOptimizationsMap);
+ methodsToReprocessBuilder.rewrittenWithLens(appView, applied);
}
PostMethodProcessor build(
@@ -121,16 +90,15 @@
});
put(set);
}
- if (methodsToReprocess.isEmpty()) {
+ if (methodsToReprocessBuilder.isEmpty()) {
// Nothing to revisit.
return null;
}
+ ProgramMethodSet methodsToReprocess =
+ methodsToReprocessBuilder.build(appView, appView.graphLens());
CallGraph callGraph =
- new PartialCallGraphBuilder(
- appView, methodsToReprocess.build(appView, appView.graphLens()))
- .build(executorService, timing);
- return new PostMethodProcessor(
- appView, defaultCodeOptimizations, optimizationsMap, callGraph);
+ new PartialCallGraphBuilder(appView, methodsToReprocess).build(executorService, timing);
+ return new PostMethodProcessor(appView, callGraph);
}
}
@@ -147,18 +115,10 @@
return waves;
}
- @Override
- protected void prepareForWaveExtensionProcessing() {
- waveExtension.forEach(
- method -> {
- assert !methodsMap.containsKey(method.getReference());
- methodsMap.put(method.getReference(), defaultCodeOptimizations);
- });
- super.prepareForWaveExtensionProcessing();
- }
-
- void forEachWaveWithExtension(
- OptimizationFeedbackDelayed feedback, ExecutorService executorService)
+ void forEachMethod(
+ BiConsumer<ProgramMethod, MethodProcessingContext> consumer,
+ OptimizationFeedbackDelayed feedback,
+ ExecutorService executorService)
throws ExecutionException {
while (!waves.isEmpty()) {
wave = waves.removeFirst();
@@ -168,12 +128,8 @@
assert feedback.noUpdatesLeft();
ThreadUtils.processItems(
wave,
- method -> {
- Collection<CodeOptimization> codeOptimizations =
- methodsMap.get(method.getReference());
- assert codeOptimizations != null && !codeOptimizations.isEmpty();
- forEachMethod(method, codeOptimizations, feedback);
- },
+ method ->
+ consumer.accept(method, processorContext.createMethodProcessingContext(method)),
executorService);
feedback.updateVisibleOptimizationInfo();
processed.addAll(wave);
@@ -181,26 +137,4 @@
} while (!wave.isEmpty());
}
}
-
- private void forEachMethod(
- ProgramMethod method,
- Collection<CodeOptimization> codeOptimizations,
- OptimizationFeedback feedback) {
- // TODO(b/140766440): Make IRConverter#process receive a list of CodeOptimization to conduct.
- // Then, we can share IRCode creation there.
- if (appView.options().skipIR) {
- feedback.markProcessed(method.getDefinition(), ConstraintWithTarget.NEVER);
- return;
- }
- IRCode code = method.buildIR(appView);
- if (code == null) {
- feedback.markProcessed(method.getDefinition(), ConstraintWithTarget.NEVER);
- return;
- }
- // TODO(b/140768815): Reprocessing may trigger more methods to revisit. Update waves on-the-fly.
- for (CodeOptimization codeOptimization : codeOptimizations) {
- codeOptimization.optimize(
- code, feedback, this, processorContext.createMethodProcessingContext(method));
- }
- }
}