Prune dead code after instanceof workaround
Bug: b/288273207
Change-Id: I909bd45697ecdf5af21425c993785fe71f17a915
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java b/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java
index 2d502a9..8daabb4 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java
@@ -37,18 +37,24 @@
IRCode code, BytecodeMetadataProvider bytecodeMetadataProvider, Timing timing) {
DexEncodedMethod method = code.method();
code.traceBlocks();
+ workaroundBugs(code, timing);
+ // Perform register allocation.
+ RegisterAllocator registerAllocator = performRegisterAllocation(code, method, timing);
+ return new DexBuilder(code, bytecodeMetadataProvider, registerAllocator, options).build();
+ }
+
+ private void workaroundBugs(IRCode code, Timing timing) {
RuntimeWorkaroundCodeRewriter.workaroundNumberConversionRegisterAllocationBug(code, options);
// Workaround massive dex2oat memory use for self-recursive methods.
RuntimeWorkaroundCodeRewriter.workaroundDex2OatInliningIssue(appView, code);
- RuntimeWorkaroundCodeRewriter.workaroundInstanceOfTypeWeakeningInVerifier(appView, code);
+ if (RuntimeWorkaroundCodeRewriter.workaroundInstanceOfTypeWeakeningInVerifier(appView, code)) {
+ deadCodeRemover.run(code, timing);
+ }
// Workaround MAX_INT switch issue.
RuntimeWorkaroundCodeRewriter.workaroundSwitchMaxIntBug(code, codeRewriter, options);
RuntimeWorkaroundCodeRewriter.workaroundDex2OatLinkedListBug(code, options);
RuntimeWorkaroundCodeRewriter.workaroundForwardingInitializerBug(code, options);
RuntimeWorkaroundCodeRewriter.workaroundExceptionTargetingLoopHeaderBug(code, options);
- // Perform register allocation.
- RegisterAllocator registerAllocator = performRegisterAllocation(code, method, timing);
- return new DexBuilder(code, bytecodeMetadataProvider, registerAllocator, options).build();
}
private RegisterAllocator performRegisterAllocation(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java
index e7d2e5c..23c16f0 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java
@@ -69,17 +69,21 @@
}
}
- public static void workaroundInstanceOfTypeWeakeningInVerifier(AppView<?> appView, IRCode code) {
+ public static boolean workaroundInstanceOfTypeWeakeningInVerifier(
+ AppView<?> appView, IRCode code) {
+ boolean didReplaceInstructions = false;
for (BasicBlock block : code.getBlocks()) {
InstructionListIterator instructionIterator = block.listIterator(code);
while (instructionIterator.hasNext()) {
InstanceOf instanceOf = instructionIterator.nextUntil(Instruction::isInstanceOf);
if (instanceOf != null && instanceOf.value().getType().isNullType()) {
instructionIterator.replaceCurrentInstructionWithConstFalse(code);
+ didReplaceInstructions = true;
}
}
}
assert code.isConsistentSSA(appView);
+ return didReplaceInstructions;
}
/**