Also apply the rewriting for JDK-8272564 Andorid O and O_MR1

Art had a bug in handing j.l.CharSequence.equals.

Fixes: b/231450655
Change-Id: Ia36cf8910bfaa2a1b5feb30936dec765dde372bd
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index ade884b..28b4e7e 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -2231,10 +2231,14 @@
   // interface invoke. In these cases rewrite to a virtual invoke with
   // the symbolic reference java.lang.Object.
   //
-  // javac started generating code like this with the fix for JDK-8272564.
+  // The support was added in Android O, however at least for j.l.CharSequence.equals the handling
+  // in Art was incorrect (b/231450655).
+  //
+  // javac started generating code like this with the fix for JDK-8272564, which will be part of
+  // JDK 18.
   //
   // See b/218298666.
   public boolean canHaveInvokeInterfaceToObjectMethodBug() {
-    return isGeneratingDex() && getMinApiLevel().isLessThan(AndroidApiLevel.O);
+    return isGeneratingDex() && getMinApiLevel().isLessThan(AndroidApiLevel.P);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/InvokeInterfaceToStringEqualsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/InvokeInterfaceToStringEqualsTest.java
index e13ca1b..2507e66 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/InvokeInterfaceToStringEqualsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/InvokeInterfaceToStringEqualsTest.java
@@ -4,11 +4,11 @@
 
 package com.android.tools.r8.ir.optimize.string;
 
+import static org.junit.Assume.assumeTrue;
+
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import java.io.IOException;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -17,7 +17,7 @@
 import org.junit.runners.Parameterized.Parameters;
 import org.objectweb.asm.Opcodes;
 
-/** Reproduction for b/230821936. */
+/** Reproduction for b/230821936. Also see b/231450655 for Art 8.1 issue. */
 @RunWith(Parameterized.class)
 public class InvokeInterfaceToStringEqualsTest extends TestBase {
 
@@ -30,23 +30,28 @@
   }
 
   @Test
-  public void test() throws Exception {
-    testForR8(parameters.getBackend())
-        .addProgramClassFileData(getTransformedMain())
-        .addKeepMainRule(Main.class)
-        .addDontOptimize()
+  public void testD8() throws Exception {
+    assumeTrue(parameters.isDexRuntime());
+    testForD8(parameters.getBackend())
+        .addProgramClassFileData(getTransformedMain(MainD8.class))
         .setMinApi(parameters.getApiLevel())
-        .run(parameters.getRuntime(), Main.class)
-        .applyIf(
-            parameters.isDexRuntimeVersion(Version.V8_1_0)
-                && parameters.getApiLevel().isGreaterThan(AndroidApiLevel.B),
-            // TODO(b/231450655): Should evaluate to "false".
-            runResult -> runResult.assertSuccessWithOutputLines("true"),
-            runResult -> runResult.assertSuccessWithOutputLines("false"));
+        .run(parameters.getRuntime(), MainD8.class)
+        .assertSuccessWithOutputLines("false");
   }
 
-  private static byte[] getTransformedMain() throws IOException {
-    return transformer(Main.class)
+  @Test
+  public void test() throws Exception {
+    testForR8(parameters.getBackend())
+        .addProgramClassFileData(getTransformedMain(MainR8.class))
+        .addKeepMainRule(MainR8.class)
+        .addDontOptimize()
+        .setMinApi(parameters.getApiLevel())
+        .run(parameters.getRuntime(), MainR8.class)
+        .assertSuccessWithOutputLines("false");
+  }
+
+  private static byte[] getTransformedMain(Class<?> clazz) throws IOException {
+    return transformer(clazz)
         .transformMethodInsnInMethod(
             "main",
             (opcode, owner, name, descriptor, isInterface, continuation) -> {
@@ -64,11 +69,18 @@
         .transform();
   }
 
-  static class Main {
+  static class MainR8 {
 
     public static void main(String[] args) {
       String s = System.currentTimeMillis() > 0 ? "foo" : "bar";
       System.out.println(s.equals("baz"));
     }
   }
+
+  static class MainD8 {
+
+    public static void main(String[] args) {
+      System.out.println("foo".equals("baz"));
+    }
+  }
 }