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;