Use optInfo to find dead fields in enum unboxer
Bug:160535629
Change-Id: Ie3afb26ca7dfcea0ce2d60aedf56e850b4899f94
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 0621d6f..6c1f24f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -757,15 +757,15 @@
if (inliner != null) {
postMethodProcessorBuilder.put(inliner);
}
+ if (!options.debug) {
+ new TrivialFieldAccessReprocessor(appView.withLiveness(), postMethodProcessorBuilder)
+ .run(executorService, feedback, timing);
+ }
if (enumUnboxer != null) {
enumUnboxer.unboxEnums(postMethodProcessorBuilder, executorService, feedback);
} else {
appView.setUnboxedEnums(EnumDataMap.empty());
}
- if (!options.debug) {
- new TrivialFieldAccessReprocessor(appView.withLiveness(), postMethodProcessorBuilder)
- .run(executorService, feedback, timing);
- }
timing.begin("IR conversion phase 2");
graphLensForIR = appView.graphLens();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
index cf0ecb5..44e1a21 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
@@ -495,11 +495,11 @@
ObjectState enumState =
enumStaticFieldValues.getObjectStateForPossiblyPinnedField(staticField.field);
if (enumState == null) {
- if (!isFinalFieldInitialized(staticField, enumClass)) {
+ if (staticField.getOptimizationInfo().isDead()) {
+ // We don't care about unused field data.
continue;
}
- // Tracking the content of the field yielded either an empty object state, or something
- // incoherent. We bail out.
+ // We could not track the content of that field. We bail out.
return null;
}
OptionalInt optionalOrdinal = getOrdinal(enumState);
@@ -513,7 +513,8 @@
ObjectState valuesState =
enumStaticFieldValues.getObjectStateForPossiblyPinnedField(staticField.field);
if (valuesState == null) {
- if (!isFinalFieldInitialized(staticField, enumClass)) {
+ if (staticField.getOptimizationInfo().isDead()) {
+ // We don't care about unused field data.
continue;
}
// We could not track the content of that field, and the field could be a values field.
@@ -566,13 +567,6 @@
valuesContents == null ? EnumData.INVALID_VALUES_SIZE : valuesContents.getEnumValuesSize());
}
- private boolean isFinalFieldInitialized(DexEncodedField staticField, DexProgramClass enumClass) {
- assert staticField.isFinal();
- return appView
- .appInfo()
- .isFieldOnlyWrittenInMethodIgnoringPinning(staticField, enumClass.getClassInitializer());
- }
-
private EnumInstanceFieldData computeEnumFieldData(
DexField instanceField,
DexProgramClass enumClass,