Fix illegal switch case to default rewriting

Bug: 205205666
Change-Id: I03bf0e478f43cf56d04ca63e15f53145913a3799
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/equivalence/BasicBlockBehavioralSubsumption.java b/src/main/java/com/android/tools/r8/ir/analysis/equivalence/BasicBlockBehavioralSubsumption.java
index 2fb3ef7..e901e23 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/equivalence/BasicBlockBehavioralSubsumption.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/equivalence/BasicBlockBehavioralSubsumption.java
@@ -18,6 +18,7 @@
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InstructionIterator;
+import com.android.tools.r8.ir.code.InvokeDirect;
 import com.android.tools.r8.ir.code.Phi;
 import com.android.tools.r8.ir.code.Return;
 import com.android.tools.r8.ir.code.Value;
@@ -134,6 +135,26 @@
       }
     }
 
+    if (instruction.isInvokeConstructor(appView.dexItemFactory())) {
+      InvokeDirect invoke = instruction.asInvokeDirect();
+      if (otherInstruction.isInvokeConstructor(appView.dexItemFactory())) {
+        InvokeDirect otherInvoke = otherInstruction.asInvokeDirect();
+        // If neither has side effects, then continue.
+        DexClassAndMethod singleTarget = invoke.lookupSingleTarget(appView, context);
+        if (singleTarget == null
+            || singleTarget.getDefinition().getOptimizationInfo().mayHaveSideEffects()) {
+          return false;
+        }
+        DexClassAndMethod otherSingleTarget = otherInvoke.lookupSingleTarget(appView, context);
+        if (otherSingleTarget == null
+            || otherSingleTarget.getDefinition().getOptimizationInfo().mayHaveSideEffects()) {
+          return false;
+        }
+        return isSubsumedBy(iterator, otherIterator, visited);
+      }
+      return false;
+    }
+
     if (instruction.isReturn()) {
       Return returnInstruction = instruction.asReturn();
       if (otherInstruction.isReturn()) {
@@ -152,20 +173,7 @@
   }
 
   private boolean isBlockLocalInstructionWithoutSideEffects(Instruction instruction) {
-    if (!definesBlockLocalValue(instruction)) {
-      return false;
-    }
-    if (instruction.instructionMayHaveSideEffects(appView, context)) {
-      return false;
-    }
-    // For constructor calls include field initialization side effects.
-    if (instruction.isInvokeConstructor(appView.dexItemFactory())) {
-      DexClassAndMethod singleTarget =
-          instruction.asInvokeDirect().lookupSingleTarget(appView, context);
-      return singleTarget != null
-          && !singleTarget.getDefinition().getOptimizationInfo().mayHaveSideEffects();
-    }
-    return true;
+    return definesBlockLocalValue(instruction) && !instructionMayHaveSideEffects(instruction);
   }
 
   private boolean definesBlockLocalValue(Instruction instruction) {
@@ -188,7 +196,8 @@
   }
 
   private boolean instructionMayHaveSideEffects(Instruction instruction) {
-    return instruction.instructionMayHaveSideEffects(appView, context);
+    return instruction.isInvokeConstructor(appView.dexItemFactory())
+        || instruction.instructionMayHaveSideEffects(appView, context);
   }
 
   private boolean valuesAreIdentical(Value value, Value other) {