Enable read-only field optimizations when deferred tracing is disabled
Fixes: b/464478054
Change-Id: I901c177b7569b86bddb57c31e16cfae6976ac7c9
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingImpl.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingImpl.java
index 1ed222b..759878b 100644
--- a/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingImpl.java
+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingImpl.java
@@ -92,11 +92,6 @@
ProgramMethod context,
FieldAccessKind accessKind,
FieldAccessMetadata metadata) {
- if (!fieldReference.getType().isPrimitiveType()
- && !options.getTestingOptions().enableEnqueuerDeferredTracingForReferenceFields) {
- return false;
- }
-
ProgramField field = resolutionResult.getSingleProgramField();
if (field == null) {
return false;
@@ -196,6 +191,13 @@
}
if (info.isWritten()) {
+ // Bail-out if the optimization has been limited in order to preserve strong references to
+ // objects that may have a weak ref or non-trivial finalizer.
+ if (options.getTestingOptions().disableEnqueuerDeferredTracingForWrittenReferenceFields
+ && !field.getType().isPrimitiveType()) {
+ return false;
+ }
+
// If the assigned value may have an override of Object#finalize() then give up.
// Note that this check depends on the set of instantiated types, and must therefore be rerun
// when the enqueuer's fixpoint is reached.
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 7d55335..d3b8357 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -2426,8 +2426,8 @@
public boolean enableBridgeHoistingToSharedSyntheticSuperclass = false;
public boolean enableCheckCastAndInstanceOfRemoval = true;
public boolean enableDeadSwitchCaseElimination = true;
- public boolean enableEnqueuerDeferredTracingForReferenceFields =
- System.getProperty("com.android.tools.r8.disableEnqueuerDeferredTracing") == null;
+ public boolean disableEnqueuerDeferredTracingForWrittenReferenceFields =
+ System.getProperty("com.android.tools.r8.disableEnqueuerDeferredTracing") != null;
public boolean enableInvokeSuperToInvokeVirtualRewriting = true;
public boolean enableLegacyClassDefOrdering =
System.getProperty("com.android.tools.r8.enableLegacyClassDefOrdering") != null;