Move workaround for JDK-8272564 into RuntimeWorkaroundCodeRewriter
Change-Id: I25e00be18d5a6797500a8172b10d2f048a8ee571
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 71f0772..6a4995b 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -597,12 +597,6 @@
timing.end();
}
- if (options.canHaveInvokeInterfaceToObjectMethodBug()) {
- timing.begin("JDK-8272564 fix rewrite");
- CodeRewriter.rewriteJdk8272564Fix(code, context, appView);
- timing.end();
- }
-
if (isDebugMode) {
codeRewriter.simplifyDebugLocals(code);
}
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 0798942..de23a76 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
@@ -49,16 +49,15 @@
private void workaroundBugs(IRCode code, Timing timing) {
RuntimeWorkaroundCodeRewriter.workaroundNumberConversionRegisterAllocationBug(code, options);
- // Workaround massive dex2oat memory use for self-recursive methods.
RuntimeWorkaroundCodeRewriter.workaroundDex2OatInliningIssue(appView, code);
if (RuntimeWorkaroundCodeRewriter.workaroundInstanceOfTypeWeakeningInVerifier(appView, code)) {
deadCodeRemover.run(code, timing);
}
- // Workaround MAX_INT switch issue.
RuntimeWorkaroundCodeRewriter.workaroundSwitchMaxIntBug(code, appView);
RuntimeWorkaroundCodeRewriter.workaroundDex2OatLinkedListBug(code, options);
RuntimeWorkaroundCodeRewriter.workaroundForwardingInitializerBug(code, options);
RuntimeWorkaroundCodeRewriter.workaroundExceptionTargetingLoopHeaderBug(code, options);
+ RuntimeWorkaroundCodeRewriter.rewriteJdk8272564Fix(code, options, appView);
assert code.isConsistentSSA(appView);
}
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 8be752c..c0b5245 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
@@ -454,30 +454,4 @@
iterator.add(new InvokeVirtual(printLn, null, ImmutableList.of(out, empty)));
assert code.isConsistentSSA(appView);
}
-
- // The javac fix for JDK-8272564 has to be rewritten back to invoke-virtual on Object if the
- // method with an Object signature is not defined on the interface. See
- // https://bugs.openjdk.java.net/browse/JDK-8272564
- public static void rewriteJdk8272564Fix(IRCode code, ProgramMethod context, AppView<?> appView) {
- DexItemFactory dexItemFactory = appView.dexItemFactory();
- InstructionListIterator it = code.instructionListIterator();
- while (it.hasNext()) {
- Instruction instruction = it.next();
- if (instruction.isInvokeInterface()) {
- InvokeInterface invoke = instruction.asInvokeInterface();
- DexMethod method = invoke.getInvokedMethod();
- DexClass clazz = appView.definitionFor(method.getHolderType(), context);
- if (clazz == null || clazz.isInterface()) {
- DexMethod objectMember = dexItemFactory.objectMembers.matchingPublicObjectMember(method);
- // javac before JDK-8272564 would still use invoke interface if the method is defined
- // directly on the interface reference, so mimic that by not rewriting.
- if (objectMember != null && appView.definitionFor(method) == null) {
- it.replaceCurrentInstruction(
- new InvokeVirtual(objectMember, invoke.outValue(), invoke.arguments()));
- }
- }
- }
- }
- 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 f8caa1b..662b4cd 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
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.optimize;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexString;
@@ -20,7 +21,9 @@
import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.InstructionListIterator;
import com.android.tools.r8.ir.code.IntSwitch;
+import com.android.tools.r8.ir.code.InvokeInterface;
import com.android.tools.r8.ir.code.InvokeStatic;
+import com.android.tools.r8.ir.code.InvokeVirtual;
import com.android.tools.r8.ir.code.NumericType;
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.conversion.passes.BranchSimplifier;
@@ -394,4 +397,34 @@
}
return false;
}
+
+ // The javac fix for JDK-8272564 has to be rewritten back to invoke-virtual on Object if the
+ // method with an Object signature is not defined on the interface. See
+ // https://bugs.openjdk.java.net/browse/JDK-8272564
+ public static void rewriteJdk8272564Fix(
+ IRCode code, InternalOptions options, AppView<?> appView) {
+ if (!options.canHaveInvokeInterfaceToObjectMethodBug()) {
+ return;
+ }
+ DexItemFactory dexItemFactory = appView.dexItemFactory();
+ InstructionListIterator it = code.instructionListIterator();
+ while (it.hasNext()) {
+ Instruction instruction = it.next();
+ if (instruction.isInvokeInterface()) {
+ InvokeInterface invoke = instruction.asInvokeInterface();
+ DexMethod method = invoke.getInvokedMethod();
+ DexClass clazz = appView.definitionFor(method.getHolderType(), code.context());
+ if (clazz == null || clazz.isInterface()) {
+ DexMethod objectMember = dexItemFactory.objectMembers.matchingPublicObjectMember(method);
+ // javac before JDK-8272564 would still use invoke interface if the method is defined
+ // directly on the interface reference, so mimic that by not rewriting.
+ if (objectMember != null && appView.definitionFor(method) == null) {
+ it.replaceCurrentInstruction(
+ new InvokeVirtual(objectMember, invoke.outValue(), invoke.arguments()));
+ }
+ }
+ }
+ }
+ assert code.isConsistentSSA(appView);
+ }
}