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),