Revert "Use optInfo to find dead fields in enum unboxer"
This reverts commit 56695d8ed9fa19b81c55ab19af0d20cf691e80ca.
Reason for revert: Internal bot failures
Change-Id: I3a568580b036b7c05b76806a9ed894b15e6c1945
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 6c1f24f..0621d6f 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 44e1a21..cf0ecb5 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 (staticField.getOptimizationInfo().isDead()) {
- // We don't care about unused field data.
+ if (!isFinalFieldInitialized(staticField, enumClass)) {
continue;
}
- // We could not track the content of that field. We bail out.
+ // Tracking the content of the field yielded either an empty object state, or something
+ // incoherent. We bail out.
return null;
}
OptionalInt optionalOrdinal = getOrdinal(enumState);
@@ -513,8 +513,7 @@
ObjectState valuesState =
enumStaticFieldValues.getObjectStateForPossiblyPinnedField(staticField.field);
if (valuesState == null) {
- if (staticField.getOptimizationInfo().isDead()) {
- // We don't care about unused field data.
+ if (!isFinalFieldInitialized(staticField, enumClass)) {
continue;
}
// We could not track the content of that field, and the field could be a values field.
@@ -567,6 +566,13 @@
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,