Unset field access analysis after primary optimization pass
Change-Id: Ib2884dce725ecbe3873cce30ea3be44625ac4a06
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 83f6884..51df4fc 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
@@ -109,7 +109,7 @@
private final CodeRewriterPassCollection rewriterPassCollection;
private final ClassInitializerDefaultsOptimization classInitializerDefaultsOptimization;
protected final CfInstructionDesugaringCollection instructionDesugaring;
- protected final FieldAccessAnalysis fieldAccessAnalysis;
+ protected FieldAccessAnalysis fieldAccessAnalysis;
protected final LibraryMethodOverrideAnalysis libraryMethodOverrideAnalysis;
protected final IdempotentFunctionCallCanonicalizer idempotentFunctionCallCanonicalizer;
private final ClassInliner classInliner;
@@ -288,6 +288,10 @@
enumUnboxer = EnumUnboxer.empty();
}
+ public void unsetFieldAccessAnalysis() {
+ fieldAccessAnalysis = null;
+ }
+
private boolean needsIRConversion(ProgramMethod method) {
if (method.getDefinition().getCode().isThrowNullCode()) {
return false;
@@ -1136,7 +1140,9 @@
assert method.getHolder().lookupMethod(method.getReference()) == null;
appView.withArgumentPropagator(argumentPropagator -> argumentPropagator.onMethodPruned(method));
enumUnboxer.onMethodPruned(method);
- fieldAccessAnalysis.fieldAssignmentTracker().onMethodPruned(method);
+ if (fieldAccessAnalysis != null) {
+ fieldAccessAnalysis.fieldAssignmentTracker().onMethodPruned(method);
+ }
numberUnboxer.onMethodPruned(method);
outliner.onMethodPruned(method);
if (inliner != null) {
@@ -1154,7 +1160,9 @@
appView.withArgumentPropagator(
argumentPropagator -> argumentPropagator.onMethodCodePruned(method));
enumUnboxer.onMethodCodePruned(method);
- fieldAccessAnalysis.fieldAssignmentTracker().onMethodCodePruned(method);
+ if (fieldAccessAnalysis != null) {
+ fieldAccessAnalysis.fieldAssignmentTracker().onMethodCodePruned(method);
+ }
numberUnboxer.onMethodCodePruned(method);
outliner.onMethodCodePruned(method);
if (inliner != null) {
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 1277429..59a9a0e 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
@@ -256,7 +256,7 @@
public void waveDone(ProgramMethodSet wave, ExecutorService executorService) {
delayedOptimizationFeedback.refineAppInfoWithLiveness(appView.appInfo().withLiveness());
delayedOptimizationFeedback.updateVisibleOptimizationInfo();
- if (fieldAccessAnalysis.fieldAssignmentTracker() != null) {
+ if (fieldAccessAnalysis != null && fieldAccessAnalysis.fieldAssignmentTracker() != null) {
fieldAccessAnalysis.fieldAssignmentTracker().waveDone(wave, delayedOptimizationFeedback);
}
appView.withArgumentPropagator(ArgumentPropagator::publishDelayedReprocessingCriteria);
@@ -275,6 +275,7 @@
PostMethodProcessor.Builder postMethodProcessorBuilder, ExecutorService executorService)
throws ExecutionException {
pruneItems(executorService);
+ unsetFieldAccessAnalysis();
if (inliner != null) {
inliner.onLastWaveDone(postMethodProcessorBuilder, executorService, timing);
}