Enqueue synthesized methods for processing in second optimization pass

Fixes: b/286207150
Change-Id: I48e09b56baa600cb35643d11160921876baac0ab
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 55c6a06..aa7b371 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
@@ -120,7 +120,7 @@
   public final CodeRewriter codeRewriter;
   public final CommonSubexpressionElimination commonSubexpressionElimination;
   private final SplitBranch splitBranch;
-  public final AssertionErrorTwoArgsConstructorRewriter assertionErrorTwoArgsConstructorRewriter;
+  public AssertionErrorTwoArgsConstructorRewriter assertionErrorTwoArgsConstructorRewriter;
   private final NaturalIntLoopRemover naturalIntLoopRemover = new NaturalIntLoopRemover();
   public final MemberValuePropagation<?> memberValuePropagation;
   private final LensCodeRewriter lensCodeRewriter;
@@ -130,11 +130,11 @@
   protected final CovariantReturnTypeAnnotationTransformer covariantReturnTypeAnnotationTransformer;
   private final StringSwitchRemover stringSwitchRemover;
   private final TypeChecker typeChecker;
-  protected final ServiceLoaderRewriter serviceLoaderRewriter;
+  protected ServiceLoaderRewriter serviceLoaderRewriter;
   private final EnumValueOptimizer enumValueOptimizer;
   private final BinopRewriter binopRewriter;
   protected final EnumUnboxer enumUnboxer;
-  protected final InstanceInitializerOutliner instanceInitializerOutliner;
+  protected InstanceInitializerOutliner instanceInitializerOutliner;
   protected final RemoveVerificationErrorForUnknownReturnedValues
       removeVerificationErrorForUnknownReturnedValues;
 
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
index bc94785..2840c77 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
@@ -195,20 +195,6 @@
     Builder<?> builder = appView.appInfo().app().builder();
     builder.setHighestSortingString(highestSortingString);
 
-    if (serviceLoaderRewriter != null) {
-      processSimpleSynthesizeMethods(
-          serviceLoaderRewriter.getSynthesizedServiceLoadMethods(), executorService);
-    }
-
-    if (instanceInitializerOutliner != null) {
-      processSimpleSynthesizeMethods(
-          instanceInitializerOutliner.getSynthesizedMethods(), executorService);
-    }
-    if (assertionErrorTwoArgsConstructorRewriter != null) {
-      processSimpleSynthesizeMethods(
-          assertionErrorTwoArgsConstructorRewriter.getSynthesizedMethods(), executorService);
-    }
-
     // Update optimization info for all synthesized methods at once.
     feedback.updateVisibleOptimizationInfo();
 
@@ -275,9 +261,21 @@
   private void lastWaveDone(
       PostMethodProcessor.Builder postMethodProcessorBuilder, ExecutorService executorService)
       throws ExecutionException {
+    if (assertionErrorTwoArgsConstructorRewriter != null) {
+      assertionErrorTwoArgsConstructorRewriter.onLastWaveDone(postMethodProcessorBuilder);
+      assertionErrorTwoArgsConstructorRewriter = null;
+    }
     if (inliner != null) {
       inliner.onLastWaveDone(postMethodProcessorBuilder, executorService, timing);
     }
+    if (instanceInitializerOutliner != null) {
+      instanceInitializerOutliner.onLastWaveDone(postMethodProcessorBuilder);
+      instanceInitializerOutliner = null;
+    }
+    if (serviceLoaderRewriter != null) {
+      serviceLoaderRewriter.onLastWaveDone(postMethodProcessorBuilder);
+      serviceLoaderRewriter = null;
+    }
 
     // Ensure determinism of method-to-reprocess set.
     appView.testing().checkDeterminism(postMethodProcessorBuilder::dump);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriter.java
index e464f9c..ca2babb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriter.java
@@ -22,6 +22,7 @@
 import com.android.tools.r8.ir.code.NewInstance;
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.conversion.MethodProcessor;
+import com.android.tools.r8.ir.conversion.PostMethodProcessor;
 import com.android.tools.r8.ir.desugar.backports.BackportedMethods;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
 import com.android.tools.r8.utils.InternalOptions;
@@ -47,6 +48,7 @@
       IRCode code,
       MethodProcessor methodProcessor,
       MethodProcessingContext methodProcessingContext) {
+    assert !methodProcessor.isPostMethodProcessor();
     if (options.canUseAssertionErrorTwoArgumentConstructor()) {
       return;
     }
@@ -137,4 +139,8 @@
         .acceptAssertionErrorCreateMethod(method, methodProcessingContext.getMethodContext());
     return method;
   }
+
+  public void onLastWaveDone(PostMethodProcessor.Builder postMethodProcessorBuilder) {
+    postMethodProcessorBuilder.addAll(synthesizedMethods, appView.graphLens());
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
index 86d1998..9a75fc0 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
@@ -24,6 +24,7 @@
 import com.android.tools.r8.ir.code.InvokeVirtual;
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.conversion.MethodProcessor;
+import com.android.tools.r8.ir.conversion.PostMethodProcessor;
 import com.android.tools.r8.ir.desugar.ServiceLoaderSourceCode;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -86,14 +87,11 @@
         || appInfo.isWhyAreYouNotInliningMethod(serviceLoaderMethods.loadWithClassLoader);
   }
 
-  public List<ProgramMethod> getSynthesizedServiceLoadMethods() {
-    return synthesizedServiceLoadMethods;
-  }
-
   public void rewrite(
       IRCode code,
       MethodProcessor methodProcessor,
       MethodProcessingContext methodProcessingContext) {
+    assert !methodProcessor.isPostMethodProcessor();
     InstructionListIterator instructionIterator = code.instructionListIterator();
     // Create a map from service type to loader methods local to this context since two
     // service loader calls to the same type in different methods and in the same wave can race.
@@ -243,6 +241,10 @@
     }
   }
 
+  public void onLastWaveDone(PostMethodProcessor.Builder postMethodProcessorBuilder) {
+    postMethodProcessorBuilder.addAll(synthesizedServiceLoadMethods, appView.graphLens());
+  }
+
   private void report(Origin origin, DexType serviceLoaderType, String message) {
     if (reporter != null) {
       reporter.info(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/api/InstanceInitializerOutliner.java b/src/main/java/com/android/tools/r8/ir/optimize/api/InstanceInitializerOutliner.java
index 06c0f92..1a594fc 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/api/InstanceInitializerOutliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/api/InstanceInitializerOutliner.java
@@ -29,6 +29,7 @@
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.conversion.MethodProcessor;
+import com.android.tools.r8.ir.conversion.PostMethodProcessor;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
 import com.android.tools.r8.ir.synthetic.ForwardMethodBuilder;
 import com.android.tools.r8.ir.synthetic.NewInstanceSourceCode;
@@ -66,6 +67,7 @@
       ProgramMethod context,
       MethodProcessor methodProcessor,
       MethodProcessingContext methodProcessingContext) {
+    assert !methodProcessor.isPostMethodProcessor();
     // Do not outline from already synthesized methods.
     if (context.getDefinition().isD8R8Synthesized()) {
       return;
@@ -175,6 +177,10 @@
     }
   }
 
+  public void onLastWaveDone(PostMethodProcessor.Builder postMethodProcessorBuilder) {
+    postMethodProcessorBuilder.addAll(synthesizedMethods, appView.graphLens());
+  }
+
   private boolean canSkipClInit(
       InstructionListIterator iterator, NewInstance newInstance, Value newInstanceOutValue) {
     InvokeStatic definition = newInstanceOutValue.getDefinition().asInvokeStatic();