Fix nondeterminism in post method processor
Change-Id: I27fe7dc92522e46a37647304d22692871cda69d8
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 0621d6f..e33867d 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
@@ -762,6 +762,7 @@
} else {
appView.setUnboxedEnums(EnumDataMap.empty());
}
+
if (!options.debug) {
new TrivialFieldAccessReprocessor(appView.withLiveness(), postMethodProcessorBuilder)
.run(executorService, feedback, timing);
@@ -770,7 +771,7 @@
timing.begin("IR conversion phase 2");
graphLensForIR = appView.graphLens();
PostMethodProcessor postMethodProcessor =
- postMethodProcessorBuilder.build(appView.withLiveness(), executorService, timing);
+ postMethodProcessorBuilder.build(appView, executorService, timing);
if (postMethodProcessor != null) {
assert !options.debug;
postMethodProcessor.forEachWaveWithExtension(feedback, executorService);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java
index 86ff63f..6706aa5 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java
@@ -41,7 +41,7 @@
waveExtension.add(method);
}
- protected final void prepareForWaveExtensionProcessing() {
+ protected void prepareForWaveExtensionProcessing() {
if (waveExtension.isEmpty()) {
wave = SortedProgramMethodSet.empty();
} else {
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 3d86936..a3cccb4 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
@@ -37,14 +37,14 @@
private final AppView<AppInfoWithLiveness> appView;
private final Collection<CodeOptimization> defaultCodeOptimizations;
- private final Map<DexEncodedMethod, Collection<CodeOptimization>> methodsMap;
+ 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<DexEncodedMethod, Collection<CodeOptimization>> methodsMap,
+ Map<DexMethod, Collection<CodeOptimization>> methodsMap,
CallGraph callGraph) {
this.appView = appView;
this.defaultCodeOptimizations = defaultCodeOptimizations;
@@ -68,7 +68,7 @@
private final Collection<CodeOptimization> defaultCodeOptimizations;
private final LongLivedProgramMethodSetBuilder<?> methodsToReprocess =
LongLivedProgramMethodSetBuilder.createForIdentitySet();
- private final Map<DexEncodedMethod, Collection<CodeOptimization>> optimizationsMap =
+ private final Map<DexMethod, Collection<CodeOptimization>> optimizationsMap =
new IdentityHashMap<>();
Builder(Collection<CodeOptimization> defaultCodeOptimizations) {
@@ -85,7 +85,7 @@
methodsToReprocess.add(method);
optimizationsMap
.computeIfAbsent(
- method.getDefinition(),
+ method.getReference(),
// Optimization order might matter, hence a collection that preserves orderings.
k -> new LinkedHashSet<>())
.addAll(codeOptimizations);
@@ -110,13 +110,11 @@
// according to the graph lens.
public void rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens applied) {
methodsToReprocess.rewrittenWithLens(appView, applied);
- Map<DexEncodedMethod, Collection<CodeOptimization>> newOptimizationsMap =
- new IdentityHashMap<>();
+ Map<DexMethod, Collection<CodeOptimization>> newOptimizationsMap = new IdentityHashMap<>();
optimizationsMap.forEach(
(method, optimizations) ->
newOptimizationsMap.put(
- appView.graphLens().mapDexEncodedMethod(method, appView, applied),
- optimizations));
+ appView.graphLens().getRenamedMethodSignature(method, applied), optimizations));
optimizationsMap.clear();
optimizationsMap.putAll(newOptimizationsMap);
}
@@ -164,9 +162,13 @@
}
@Override
- public void scheduleMethodForProcessingAfterCurrentWave(ProgramMethod method) {
- super.scheduleMethodForProcessingAfterCurrentWave(method);
- methodsMap.put(method.getDefinition(), defaultCodeOptimizations);
+ protected void prepareForWaveExtensionProcessing() {
+ waveExtension.forEach(
+ method -> {
+ assert !methodsMap.containsKey(method.getReference());
+ methodsMap.put(method.getReference(), defaultCodeOptimizations);
+ });
+ super.prepareForWaveExtensionProcessing();
}
void forEachWaveWithExtension(OptimizationFeedback feedback, ExecutorService executorService)
@@ -182,7 +184,7 @@
wave,
(method, index) -> {
Collection<CodeOptimization> codeOptimizations =
- methodsMap.get(method.getDefinition());
+ methodsMap.get(method.getReference());
assert codeOptimizations != null && !codeOptimizations.isEmpty();
forEachMethod(
method, codeOptimizations, feedback, methodProcessingIds.get(method, index));