Fix unboxed enum ordinal retrieval during <clinit> rewriting
Change-Id: I165a2e056c73937fc183008c3e7949deaf208152
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index 3ce42b6..fe45c93 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -172,14 +172,24 @@
.getInstanceInitializerInfo(constructorInvoke)
.fieldInitializationInfos()
.get(ordinalField);
- assert ordinalInitializationInfo.isArgumentInitializationInfo();
- Value ordinalValue =
- constructorInvoke
- .getArgument(
- ordinalInitializationInfo.asArgumentInitializationInfo().getArgumentIndex())
- .getAliasedValue();
- assert ordinalValue.isDefinedByInstructionSatisfying(Instruction::isConstNumber);
+ int ordinal;
+ if (ordinalInitializationInfo.isArgumentInitializationInfo()) {
+ Value ordinalValue =
+ constructorInvoke
+ .getArgument(
+ ordinalInitializationInfo
+ .asArgumentInitializationInfo()
+ .getArgumentIndex())
+ .getAliasedValue();
+ assert ordinalValue.isDefinedByInstructionSatisfying(Instruction::isConstNumber);
+ ordinal = ordinalValue.getDefinition().asConstNumber().getIntValue();
+ } else {
+ assert ordinalInitializationInfo.isSingleValue();
+ assert ordinalInitializationInfo.asSingleValue().isSingleNumberValue();
+ ordinal =
+ ordinalInitializationInfo.asSingleValue().asSingleNumberValue().getIntValue();
+ }
// Replace by an instruction that produces a value of class type UnboxedEnum (for the
// code to type check), which can easily be rewritten to a const-number instruction in
@@ -187,7 +197,7 @@
instructionIterator.replaceCurrentInstruction(
new NewUnboxedEnumInstance(
unboxedEnum.getType(),
- ordinalValue.getDefinition().asConstNumber().getIntValue(),
+ ordinal,
code.createValue(
ClassTypeElement.create(
unboxedEnum.getType(), definitelyNotNull(), appView))));