Ensure trivial goto removal for consistent SSA
Change-Id: I45e11cd0fe5223044e88e4822bceb37c4c837c4c
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 84dbfb0..20ba9f1 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
@@ -50,7 +50,7 @@
}
private void workaroundBugs(IRCode code, Timing timing) {
- RuntimeWorkaroundCodeRewriter.workaroundNumberConversionRegisterAllocationBug(code, options);
+ RuntimeWorkaroundCodeRewriter.workaroundNumberConversionRegisterAllocationBug(appView, code);
RuntimeWorkaroundCodeRewriter.workaroundDex2OatInliningIssue(appView, code);
if (RuntimeWorkaroundCodeRewriter.workaroundInstanceOfTypeWeakeningInVerifier(appView, code)) {
deadCodeRemover.run(code, timing);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/KotlinInlineMarkerRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/KotlinInlineMarkerRewriter.java
index 34c0451..909b114 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/KotlinInlineMarkerRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/KotlinInlineMarkerRewriter.java
@@ -51,6 +51,9 @@
}
}
}
+ if (changed) {
+ code.removeRedundantBlocks();
+ }
return CodeRewriterResult.hasChanged(changed);
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
index 23a66a3..4e6eb88 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
@@ -361,7 +361,9 @@
}
if (hasUnlinkedCatchHandlers) {
code.removeUnreachableBlocks();
+ code.removeRedundantBlocks();
}
+ assert code.isConsistentSSA(appView);
}
private boolean isSingleHandlerTrivial(BasicBlock firstBlock, IRCode code) {
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 3438304..9629859 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
@@ -180,6 +180,7 @@
}
}
}
+ code.removeRedundantBlocks();
assert code.isConsistentSSA(appView);
}
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 2262154..0756ee0 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
@@ -294,12 +294,12 @@
// See comment for InternalOptions.canHaveNumberConversionRegisterAllocationBug().
public static void workaroundNumberConversionRegisterAllocationBug(
- IRCode code, InternalOptions options) {
- if (!options.canHaveNumberConversionRegisterAllocationBug()) {
+ AppView<?> appView, IRCode code) {
+ if (!appView.options().canHaveNumberConversionRegisterAllocationBug()) {
return;
}
- DexItemFactory dexItemFactory = options.dexItemFactory();
+ DexItemFactory dexItemFactory = appView.dexItemFactory();
ListIterator<BasicBlock> blocks = code.listIterator();
while (blocks.hasNext()) {
BasicBlock block = blocks.next();
@@ -345,6 +345,8 @@
}
}
}
+ code.removeRedundantBlocks();
+ assert code.isConsistentSSA(appView);
}
private static void ensureInstructionBefore(
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
index 4417b2a..ac6868b 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
@@ -155,6 +155,9 @@
}
}
}
+ if (result.hasChanged().isPossiblyTrue()) {
+ code.removeRedundantBlocks();
+ }
return result;
}