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();