Remove old data structures used to determine if field is only written in clinit

Change-Id: I648fc94e89576ac99fc49ad68040a3066d245b51
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index 1669365..f5b0de8 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -4,7 +4,6 @@
 package com.android.tools.r8.shaking;
 
 import static com.android.tools.r8.graph.GraphLense.rewriteReferenceKeys;
-import static com.google.common.base.Predicates.not;
 
 import com.android.tools.r8.graph.AppInfoWithSubtyping;
 import com.android.tools.r8.graph.DexApplication;
@@ -103,16 +102,6 @@
    * each field. The latter is used, for example, during member rebinding.
    */
   private final FieldAccessInfoCollectionImpl fieldAccessInfoCollection;
-  /**
-   * Set of all instance fields that are only written inside the <init>() methods of their enclosing
-   * class.
-   */
-  private Set<DexField> instanceFieldsWrittenOnlyInEnclosingInstanceInitializers;
-  /**
-   * Set of all static fields that are only written inside the <clinit>() method of their enclosing
-   * class.
-   */
-  private Set<DexField> staticFieldsWrittenOnlyInEnclosingStaticInitializer;
   /** Set of all methods referenced in virtual invokes, along with calling context. */
   public final SortedMap<DexMethod, Set<DexEncodedMethod>> virtualInvokes;
   /** Set of all methods referenced in interface invokes, along with calling context. */
@@ -204,8 +193,6 @@
       SortedSet<DexMethod> virtualMethodsTargetedByInvokeDirect,
       SortedSet<DexMethod> liveMethods,
       FieldAccessInfoCollectionImpl fieldAccessInfoCollection,
-      Set<DexField> instanceFieldsWrittenOnlyInEnclosingInstanceInitializers,
-      Set<DexField> staticFieldsWrittenOnlyInEnclosingStaticInitializer,
       SortedMap<DexMethod, Set<DexEncodedMethod>> virtualInvokes,
       SortedMap<DexMethod, Set<DexEncodedMethod>> interfaceInvokes,
       SortedMap<DexMethod, Set<DexEncodedMethod>> superInvokes,
@@ -244,10 +231,6 @@
     this.virtualMethodsTargetedByInvokeDirect = virtualMethodsTargetedByInvokeDirect;
     this.liveMethods = liveMethods;
     this.fieldAccessInfoCollection = fieldAccessInfoCollection;
-    this.instanceFieldsWrittenOnlyInEnclosingInstanceInitializers =
-        instanceFieldsWrittenOnlyInEnclosingInstanceInitializers;
-    this.staticFieldsWrittenOnlyInEnclosingStaticInitializer =
-        staticFieldsWrittenOnlyInEnclosingStaticInitializer;
     this.pinnedItems = pinnedItems;
     this.mayHaveSideEffects = mayHaveSideEffects;
     this.noSideEffects = noSideEffects;
@@ -289,8 +272,6 @@
       SortedSet<DexMethod> virtualMethodsTargetedByInvokeDirect,
       SortedSet<DexMethod> liveMethods,
       FieldAccessInfoCollectionImpl fieldAccessInfoCollection,
-      Set<DexField> instanceFieldsWrittenOnlyInEnclosingInstanceInitializers,
-      Set<DexField> staticFieldsWrittenOnlyInEnclosingStaticInitializer,
       SortedMap<DexMethod, Set<DexEncodedMethod>> virtualInvokes,
       SortedMap<DexMethod, Set<DexEncodedMethod>> interfaceInvokes,
       SortedMap<DexMethod, Set<DexEncodedMethod>> superInvokes,
@@ -329,10 +310,6 @@
     this.virtualMethodsTargetedByInvokeDirect = virtualMethodsTargetedByInvokeDirect;
     this.liveMethods = liveMethods;
     this.fieldAccessInfoCollection = fieldAccessInfoCollection;
-    this.instanceFieldsWrittenOnlyInEnclosingInstanceInitializers =
-        instanceFieldsWrittenOnlyInEnclosingInstanceInitializers;
-    this.staticFieldsWrittenOnlyInEnclosingStaticInitializer =
-        staticFieldsWrittenOnlyInEnclosingStaticInitializer;
     this.pinnedItems = pinnedItems;
     this.mayHaveSideEffects = mayHaveSideEffects;
     this.noSideEffects = noSideEffects;
@@ -375,8 +352,6 @@
         previous.virtualMethodsTargetedByInvokeDirect,
         previous.liveMethods,
         previous.fieldAccessInfoCollection,
-        previous.instanceFieldsWrittenOnlyInEnclosingInstanceInitializers,
-        previous.staticFieldsWrittenOnlyInEnclosingStaticInitializer,
         previous.virtualInvokes,
         previous.interfaceInvokes,
         previous.superInvokes,
@@ -424,8 +399,6 @@
         previous.virtualMethodsTargetedByInvokeDirect,
         previous.liveMethods,
         previous.fieldAccessInfoCollection,
-        previous.instanceFieldsWrittenOnlyInEnclosingInstanceInitializers,
-        previous.staticFieldsWrittenOnlyInEnclosingStaticInitializer,
         previous.virtualInvokes,
         previous.interfaceInvokes,
         previous.superInvokes,
@@ -481,12 +454,6 @@
     this.liveMethods = lense.rewriteMethodsConservatively(previous.liveMethods);
     this.fieldAccessInfoCollection =
         previous.fieldAccessInfoCollection.rewrittenWithLens(application, lense);
-    this.instanceFieldsWrittenOnlyInEnclosingInstanceInitializers =
-        rewriteItems(
-            previous.instanceFieldsWrittenOnlyInEnclosingInstanceInitializers, lense::lookupField);
-    this.staticFieldsWrittenOnlyInEnclosingStaticInitializer =
-        rewriteItems(
-            previous.staticFieldsWrittenOnlyInEnclosingStaticInitializer, lense::lookupField);
     this.pinnedItems = lense.rewriteReferencesConservatively(previous.pinnedItems);
     this.virtualInvokes =
         rewriteKeysConservativelyWhileMergingValues(
@@ -566,10 +533,6 @@
     this.virtualMethodsTargetedByInvokeDirect = previous.virtualMethodsTargetedByInvokeDirect;
     this.liveMethods = previous.liveMethods;
     this.fieldAccessInfoCollection = previous.fieldAccessInfoCollection;
-    this.instanceFieldsWrittenOnlyInEnclosingInstanceInitializers =
-        previous.instanceFieldsWrittenOnlyInEnclosingInstanceInitializers;
-    this.staticFieldsWrittenOnlyInEnclosingStaticInitializer =
-        previous.staticFieldsWrittenOnlyInEnclosingStaticInitializer;
     this.pinnedItems = previous.pinnedItems;
     this.mayHaveSideEffects = previous.mayHaveSideEffects;
     this.noSideEffects = previous.noSideEffects;
@@ -682,10 +645,6 @@
             info.clearWrites();
           }
         });
-    result.staticFieldsWrittenOnlyInEnclosingStaticInitializer =
-        filter(
-            staticFieldsWrittenOnlyInEnclosingStaticInitializer,
-            not(noLongerWrittenFields::contains));
     return result;
   }
 
@@ -799,13 +758,7 @@
     return false;
   }
 
-  public boolean isInstanceFieldWrittenOnlyInEnclosingInstanceInitializers(DexEncodedField field) {
-    assert checkIfObsolete();
-    assert isFieldWritten(field) : "Expected field `" + field.toSourceString() + "` to be written";
-    return instanceFieldsWrittenOnlyInEnclosingInstanceInitializers.contains(field.field);
-  }
-
-  public boolean isStaticFieldWrittenOnlyInEnclosingStaticInitializerNew(DexEncodedField field) {
+  public boolean isStaticFieldWrittenOnlyInEnclosingStaticInitializer(DexEncodedField field) {
     assert checkIfObsolete();
     assert isFieldWritten(field) : "Expected field `" + field.toSourceString() + "` to be written";
     if (!isPinned(field.field)) {
@@ -821,14 +774,6 @@
     return false;
   }
 
-  public boolean isStaticFieldWrittenOnlyInEnclosingStaticInitializer(DexEncodedField field) {
-    assert checkIfObsolete();
-    assert isFieldWritten(field) : "Expected field `" + field.toSourceString() + "` to be written";
-    boolean result = staticFieldsWrittenOnlyInEnclosingStaticInitializer.contains(field.field);
-    assert result == isStaticFieldWrittenOnlyInEnclosingStaticInitializerNew(field);
-    return result;
-  }
-
   public boolean mayPropagateValueFor(DexReference reference) {
     assert checkIfObsolete();
     return !isPinned(reference) && !neverPropagateValue.contains(reference);
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 0322227..0df6328 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -146,10 +146,6 @@
   private final Map<DexMethod, Set<DexEncodedMethod>> staticInvokes = new IdentityHashMap<>();
   private final FieldAccessInfoCollectionImpl fieldAccessInfoCollection =
       new FieldAccessInfoCollectionImpl();
-  private final Set<DexField> instanceFieldsWrittenOutsideEnclosingInstanceInitializers =
-      Sets.newIdentityHashSet();
-  private final Set<DexField> staticFieldsWrittenOutsideEnclosingStaticInitializer =
-      Sets.newIdentityHashSet();
   private final Set<DexCallSite> callSites = Sets.newIdentityHashSet();
 
   private final Set<DexReference> identifierNameStrings = Sets.newIdentityHashSet();
@@ -383,18 +379,6 @@
     }
   }
 
-  private Set<DexField> instanceFieldsWrittenOnlyInEnclosingInstanceInitializers() {
-    Set<DexField> result = getNonPinnedWrittenFields(not(DexEncodedField::isStatic));
-    result.removeAll(instanceFieldsWrittenOutsideEnclosingInstanceInitializers);
-    return result;
-  }
-
-  private Set<DexField> staticFieldsWrittenOnlyInEnclosingStaticInitializer() {
-    Set<DexField> result = getNonPinnedWrittenFields(DexEncodedField::isStatic);
-    result.removeAll(staticFieldsWrittenOutsideEnclosingStaticInitializer);
-    return result;
-  }
-
   private Set<DexField> getNonPinnedWrittenFields(Predicate<DexEncodedField> predicate) {
     Set<DexField> result = Sets.newIdentityHashSet();
     fieldAccessInfoCollection.forEach(
@@ -968,14 +952,6 @@
       Log.verbose(getClass(), "Register Iput `%s`.", field);
     }
 
-    // If it is written outside of the <init>s of its enclosing class, record it.
-    boolean isWrittenOutsideEnclosingInstanceInitializers =
-        currentMethod.method.holder != encodedField.field.holder
-            || !currentMethod.isInstanceInitializer();
-    if (isWrittenOutsideEnclosingInstanceInitializers) {
-      instanceFieldsWrittenOutsideEnclosingInstanceInitializers.add(encodedField.field);
-    }
-
     // If unused interface removal is enabled, then we won't necessarily mark the actual holder of
     // the field as live, if the holder is an interface.
     if (appView.options().enableUnusedInterfaceRemoval) {
@@ -1070,14 +1046,6 @@
       }
     }
 
-    // If it is written outside of the <clinit> of its enclosing class, record it.
-    boolean isWrittenOutsideEnclosingStaticInitializer =
-        currentMethod.method.holder != encodedField.field.holder
-            || !currentMethod.isClassInitializer();
-    if (isWrittenOutsideEnclosingStaticInitializer) {
-      staticFieldsWrittenOutsideEnclosingStaticInitializer.add(encodedField.field);
-    }
-
     if (encodedField.field != field) {
       // Mark the non-rebound field access as targeted. Note that this should only be done if the
       // field is not a dead proto field (in which case we bail-out above).
@@ -2230,8 +2198,6 @@
             toSortedDescriptorSet(liveMethods.getItems()),
             // Filter out library fields and pinned fields, because these are read by default.
             fieldAccessInfoCollection,
-            instanceFieldsWrittenOnlyInEnclosingInstanceInitializers(),
-            staticFieldsWrittenOnlyInEnclosingStaticInitializer(),
             // TODO(b/132593519): Do we require these sets to be sorted for determinism?
             toImmutableSortedMap(virtualInvokes, PresortedComparable::slowCompare),
             toImmutableSortedMap(interfaceInvokes, PresortedComparable::slowCompare),