Enum unboxing: move enumValueInfoMap check ahead

Bug: 147860220
Change-Id: Ieeb223c66e2b36589d2e348218398c29afed2c97
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 5e8b552..f440fd3 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
@@ -18,7 +18,6 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DexValue.DexValueInt;
 import com.android.tools.r8.graph.DexValue.DexValueNull;
-import com.android.tools.r8.graph.EnumValueInfoMapCollection.EnumValueInfoMap;
 import com.android.tools.r8.graph.GraphLense;
 import com.android.tools.r8.graph.GraphLense.NestedGraphLense;
 import com.android.tools.r8.graph.RewrittenPrototypeDescription;
@@ -292,6 +291,8 @@
       DexProgramClass enumClass = appView.definitionForProgramType(toUnbox);
       assert enumClass != null;
 
+      // Enum candidates have necessarily only one constructor matching enumMethods.constructor
+      // signature.
       DexEncodedMethod initializer = enumClass.lookupDirectMethod(factory.enumMethods.constructor);
       if (initializer == null) {
         // This case typically happens when a programmer uses EnumSet/EnumMap without using the
@@ -307,17 +308,6 @@
 
       if (enumClass.classInitializationMayHaveSideEffects(appView)) {
         markEnumAsUnboxable(Reason.INVALID_CLINIT, enumClass);
-        continue;
-      }
-
-      EnumValueInfoMap enumValueInfoMap =
-          appView.appInfo().withLiveness().getEnumValueInfoMap(enumClass.type);
-      if (enumValueInfoMap == null) {
-        markEnumAsUnboxable(Reason.MISSING_INFO_MAP, enumClass);
-        continue;
-      }
-      if (enumValueInfoMap.size() != enumClass.staticFields().size() - 1) {
-        markEnumAsUnboxable(Reason.UNEXPECTED_STATIC_FIELD, enumClass);
       }
     }
     if (debugLogEnabled) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java
index 3d18f6a..0b39506 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java
@@ -15,6 +15,7 @@
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.EnumValueInfoMapCollection.EnumValueInfoMap;
 import com.android.tools.r8.ir.optimize.enums.EnumUnboxer.Reason;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.google.common.collect.Sets;
@@ -71,6 +72,12 @@
       enumUnboxer.reportFailure(clazz.type, Reason.VIRTUAL_METHOD);
       return false;
     }
+    EnumValueInfoMap enumValueInfoMap =
+        appView.appInfo().withLiveness().getEnumValueInfoMap(clazz.type);
+    if (enumValueInfoMap == null) {
+      enumUnboxer.reportFailure(clazz.type, Reason.MISSING_INFO_MAP);
+      return false;
+    }
     // Methods values, valueOf, init, clinit are present on each enum.
     // Methods init and clinit are required if the enum is used.
     // Methods valueOf and values are normally kept by the commonly used/recommended enum keep rule