Analyze all field accesses for limited horizontal class merging

Bug: b/347676160
Change-Id: If1dc4510124582233df02d6b4c2595f34eee2fd5
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index ef0e11e..abee4a2 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -3356,18 +3356,6 @@
       getKeepInfo().keepField(field);
     }
 
-    if (mode.isFinalTreeShaking() && options.isOptimizing() && !field.getAccessFlags().isStatic()) {
-      DexType fieldBaseType = field.getType().toBaseType(appView.dexItemFactory());
-      if (fieldBaseType.isClassType()) {
-        DexClass clazz = definitionFor(fieldBaseType, context);
-        if (clazz != null
-            && AccessControl.isClassAccessible(clazz, context, appView).isPossiblyFalse()) {
-          applyMinimumKeepInfoWhenLive(
-              field.getHolder(), KeepClassInfo.newEmptyJoiner().disallowHorizontalClassMerging());
-        }
-      }
-    }
-
     // Notify analyses.
     analyses.forEach(analysis -> analysis.processNewlyLiveField(field, context, worklist));
   }
@@ -3384,6 +3372,8 @@
       markFieldAsLive(field, context, reason);
     }
 
+    handleFieldAccessWithInaccessibleFieldType(field, context);
+
     if (liveFields.contains(field)
         || !reachableInstanceFields
             .computeIfAbsent(field.getHolder(), ignore -> ProgramFieldSet.create())
@@ -3398,6 +3388,21 @@
     analyses.forEach(analysis -> analysis.notifyMarkFieldAsReachable(field, worklist));
   }
 
+  private void handleFieldAccessWithInaccessibleFieldType(
+      ProgramField field, ProgramDefinition context) {
+    if (mode.isFinalTreeShaking() && options.isOptimizing() && !field.getAccessFlags().isStatic()) {
+      DexType fieldBaseType = field.getType().toBaseType(appView.dexItemFactory());
+      if (fieldBaseType.isClassType()) {
+        DexClass clazz = definitionFor(fieldBaseType, context);
+        if (clazz != null
+            && AccessControl.isClassAccessible(clazz, context, appView).isPossiblyFalse()) {
+          applyMinimumKeepInfoWhenLive(
+              field.getHolder(), KeepClassInfo.newEmptyJoiner().disallowHorizontalClassMerging());
+        }
+      }
+    }
+  }
+
   private void traceFieldDefinition(ProgramField field) {
     markTypeAsLive(field.getHolder(), field);
     markTypeAsLive(field.getType(), field);