Allow unboxing empty/unused enums
Bug: 185182242
Change-Id: Ie6263bf8651c5049241d2e84dc29c2eefacd860c
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 b637199..cc7c72d 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
@@ -522,6 +522,10 @@
}
private EnumData buildData(DexProgramClass enumClass, Set<DexField> fields) {
+ if (!enumClass.hasStaticFields()) {
+ return new EnumData(ImmutableMap.of(), ImmutableMap.of(), ImmutableSet.of(), -1);
+ }
+
// This map holds all the accessible fields to their unboxed value, so we can remap the field
// read to the unboxed value.
ImmutableMap.Builder<DexField, Integer> unboxedValues = ImmutableMap.builder();
@@ -904,10 +908,8 @@
private void analyzeInitializers() {
enumUnboxingCandidatesInfo.forEachCandidate(
enumClass -> {
- boolean hasInstanceInitializer = false;
for (DexEncodedMethod directMethod : enumClass.directMethods()) {
if (directMethod.isInstanceInitializer()) {
- hasInstanceInitializer = true;
if (directMethod
.getOptimizationInfo()
.getContextInsensitiveInstanceInitializerInfo()
@@ -918,15 +920,6 @@
}
}
}
- if (!hasInstanceInitializer) {
- // This case typically happens when a programmer uses EnumSet/EnumMap without using the
- // enum keep rules. The code is incorrect in this case (EnumSet/EnumMap won't work).
- // We bail out.
- if (markEnumAsUnboxable(Reason.NO_INIT, enumClass)) {
- return;
- }
- }
-
if (enumClass.classInitializationMayHaveSideEffects(appView)) {
markEnumAsUnboxable(Reason.INVALID_CLINIT, enumClass);
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/eligibility/Reason.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/eligibility/Reason.java
index 2cd2098..b564fac 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/eligibility/Reason.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/eligibility/Reason.java
@@ -18,7 +18,6 @@
public static final Reason UNRESOLVABLE_FIELD = new Reason("UNRESOLVABLE_FIELD");
public static final Reason CONST_CLASS = new Reason("CONST_CLASS");
public static final Reason INVALID_PHI = new Reason("INVALID_PHI");
- public static final Reason NO_INIT = new Reason("NO_INIT");
public static final Reason INVALID_INIT = new Reason("INVALID_INIT");
public static final Reason INVALID_CLINIT = new Reason("INVALID_CLINIT");
public static final Reason INVALID_INVOKE = new Reason("INVALID_INVOKE");
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingArrayTest.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingArrayTest.java
index b28b0b1..2d5ddc0 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingArrayTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingArrayTest.java
@@ -55,12 +55,11 @@
inspector ->
inspector
.assertUnboxed(
+ EnumArrayNullRead.MyEnum.class,
EnumArrayReadWrite.MyEnum.class,
EnumArrayReadWriteNoEscape.MyEnum.class,
EnumVarArgs.MyEnum.class)
// TODO(b/185182242): Should always be unboxed.
- .assertUnboxedIf(enumKeepRules.isStudio(), EnumArrayNullRead.MyEnum.class)
- // TODO(b/185182242): Should always be unboxed.
.assertNotUnboxed(Enum2DimArrayReadWrite.MyEnum.class))
.setMinApi(parameters.getApiLevel())
.compile();