Version 2.0.49 Cherry pick: Do not create EnumSwitchInfo in presence of unexpected switch key CL: https://r8-review.googlesource.com/c/r8/+/49201 (Partial) Cherry pick: Desugared lib: fix minification CL: https://r8-review.googlesource.com/c/r8/+/48306 (Partial) Cherry pick: Desugared lib: more R8 tests CL: https://r8-review.googlesource.com/c/r8/+/48388 Change-Id: I5cc5550e6e3a8087ed21da854b89fdb573616c6d Bug: 149554602, 150927764
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java index 6a23a85..b78cf12 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 = "2.0.48"; + public static final String LABEL = "2.0.49"; 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 65e86b7..7f439de 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
@@ -1070,8 +1070,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; }