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