Version 1.6.78
Cherry pick: Do not create EnumSwitchInfo in presence of unexpected switch key
CL: https://r8-review.googlesource.com/c/r8/+/49201/
Change-Id: I9a46b21b4197c775a1c93eaa64c83811fa4c4d60
Bug: 149554602, 150330356
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 81a04f2..90d43ae0 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
// This field is accessed from release scripts using simple pattern matching.
// Therefore, changing this field could break our release scripts.
- public static final String LABEL = "1.6.77";
+ public static final String LABEL = "1.6.78";
private Version() {
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 63540a2..00cb046 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -1072,8 +1072,9 @@
Int2IntMap targetMap = new Int2IntArrayMap();
for (int i = 0; i < switchInsn.numberOfKeys(); i++) {
assert switchInsn.targetBlockIndices()[i] != switchInsn.getFallthroughBlockIndex();
- EnumValueInfo valueInfo =
- info.valueInfoMap.get(info.indexMap.get(switchInsn.getKey(i)));
+ int key = switchInsn.getKey(i);
+ DexField field = info.indexMap.get(key);
+ EnumValueInfo valueInfo = info.valueInfoMap.get(field);
targetMap.put(valueInfo.ordinal, switchInsn.targetBlockIndices()[i]);
}
int[] keys = targetMap.keySet().toIntArray();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/SwitchUtils.java b/src/main/java/com/android/tools/r8/ir/optimize/SwitchUtils.java
index 0dd0bcf..99573ca 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/SwitchUtils.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/SwitchUtils.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.code.ArrayGet;
import com.android.tools.r8.ir.code.Instruction;
+import com.android.tools.r8.ir.code.IntSwitch;
import com.android.tools.r8.ir.code.InvokeVirtual;
import com.android.tools.r8.ir.code.StaticGet;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -59,8 +60,7 @@
* and {@link SwitchMapCollector} for details.
*/
public static EnumSwitchInfo analyzeSwitchOverEnum(
- Instruction switchInsn, AppView<AppInfoWithLiveness> appView) {
- AppInfoWithLiveness appInfo = appView.appInfo();
+ IntSwitch switchInsn, AppView<AppInfoWithLiveness> appView) {
Instruction input = switchInsn.inValues().get(0).definition;
if (input == null || !input.isArrayGet()) {
return null;
@@ -72,8 +72,8 @@
}
InvokeVirtual ordinalInvoke = index.asInvokeVirtual();
DexMethod ordinalMethod = ordinalInvoke.getInvokedMethod();
- DexClass enumClass = appInfo.definitionFor(ordinalMethod.holder);
- DexItemFactory dexItemFactory = appInfo.dexItemFactory();
+ DexClass enumClass = appView.definitionFor(ordinalMethod.holder);
+ DexItemFactory dexItemFactory = appView.dexItemFactory();
// After member rebinding, enumClass will be the actual java.lang.Enum class.
if (enumClass == null
|| (!enumClass.accessFlags.isEnum() && enumClass.type != dexItemFactory.enumType)
@@ -87,14 +87,19 @@
return null;
}
StaticGet staticGet = array.asStaticGet();
- Int2ReferenceMap<DexField> indexMap = appInfo.getSwitchMapFor(staticGet.getField());
+ Int2ReferenceMap<DexField> indexMap = appView.appInfo().getSwitchMapFor(staticGet.getField());
if (indexMap == null || indexMap.isEmpty()) {
return null;
}
+ for (int key : switchInsn.getKeys()) {
+ if (!indexMap.containsKey(key)) {
+ return null;
+ }
+ }
// Due to member rebinding, only the fields are certain to provide the actual enums
// class.
DexType enumType = indexMap.values().iterator().next().holder;
- Map<DexField, EnumValueInfo> valueInfoMap = appInfo.getEnumValueInfoMapFor(enumType);
+ Map<DexField, EnumValueInfo> valueInfoMap = appView.appInfo().getEnumValueInfoMapFor(enumType);
if (valueInfoMap == null) {
return null;
}