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);
+  }
 }