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;
     }