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