Strengthen enum unboxing bail-out for invokes with null receiver
Change-Id: Ib81dca220175514a7c23277507ef9194ba8633de
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
index 3875ddf..d35c7b7 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
@@ -247,7 +247,7 @@
}
}
if (outValue.getType().isNullType()) {
- addNullDependencies(code, outValue.uniqueUsers(), eligibleEnums);
+ addNullDependencies(code, outValue, eligibleEnums);
}
} else {
if (instruction.isInvokeMethod()) {
@@ -290,7 +290,7 @@
}
}
if (phi.getType().isNullType()) {
- addNullDependencies(code, phi.uniqueUsers(), eligibleEnums);
+ addNullDependencies(code, phi, eligibleEnums);
}
}
}
@@ -520,8 +520,8 @@
|| method == factory.classMethods.getSimpleName;
}
- private void addNullDependencies(IRCode code, Set<Instruction> uses, Set<DexType> eligibleEnums) {
- for (Instruction use : uses) {
+ private void addNullDependencies(IRCode code, Value nullValue, Set<DexType> eligibleEnums) {
+ for (Instruction use : nullValue.uniqueUsers()) {
if (use.isInvokeMethod()) {
InvokeMethod invokeMethod = use.asInvokeMethod();
DexMethod invokedMethod = invokeMethod.getInvokedMethod();
@@ -530,7 +530,8 @@
eligibleEnums.add(paramType);
}
}
- if (invokeMethod.isInvokeMethodWithReceiver()) {
+ if (invokeMethod.isInvokeMethodWithReceiver()
+ && invokeMethod.asInvokeMethodWithReceiver().getReceiver() == nullValue) {
DexProgramClass enumClass = getEnumUnboxingCandidateOrNull(invokedMethod.holder);
if (enumClass != null) {
markEnumAsUnboxable(Reason.ENUM_METHOD_CALLED_WITH_NULL_RECEIVER, enumClass);