Ensure accessibility in field access optimizer

Fixes: 181837660
Change-Id: I67723a24eb399e26edf1497b453c8af53ca83003
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
index d642723..05259ca 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
@@ -295,6 +295,13 @@
       DexClassAndField field = resolutionResult.getResolutionPair();
       DexEncodedField definition = field.getDefinition();
 
+      if (definition.isStatic() != isStatic
+          || appView.isCfByteCodePassThrough(method.getDefinition())
+          || resolutionResult.isAccessibleFrom(method, appView).isPossiblyFalse()) {
+        recordAccessThatCannotBeOptimized(field, definition);
+        return;
+      }
+
       // Record access.
       if (field.isProgramField() && appView.appInfo().mayPropagateValueFor(field)) {
         if (field.getAccessFlags().isStatic() == isStatic) {
@@ -308,20 +315,17 @@
         }
       }
 
-      // We cannot remove references from pass through functions.
-      if (appView.isCfByteCodePassThrough(method.getDefinition())) {
-        constantFields.remove(definition);
-        return;
+      if (constantFields.contains(definition)
+          || (!isWrite && nonConstantFields.contains(definition))) {
+        methodsToReprocess.add(method);
       }
+    }
 
-      if (definition.isStatic() == isStatic) {
-        if (constantFields.contains(definition)
-            || (!isWrite && nonConstantFields.contains(definition))) {
-          methodsToReprocess.add(method);
-        }
-      } else {
-        // Should generally not happen.
-        constantFields.remove(definition);
+    private void recordAccessThatCannotBeOptimized(
+        DexClassAndField field, DexEncodedField definition) {
+      constantFields.remove(definition);
+      if (field.isProgramField() && appView.appInfo().mayPropagateValueFor(field)) {
+        destroyFieldAccessContexts(definition);
       }
     }