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) {