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