Revert "Do not optimize append indexing into char[] or CharSequence"

This reverts commit c70826e97c186f41e12d63a14ff5120b346a06d9.

Reason for revert: Test failure in com.android.tools.r8.examples.stringbuilding.StringBuildingTestRunner

Change-Id: I4bb735f7f2124bba4504d85cb951828fb6d2fa91
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index d1b86f0..8f6be1b 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -2475,7 +2475,7 @@
     }
 
     @SuppressWarnings("ReferenceEquality")
-    public boolean isAppendSubArrayOrSubCharSequenceMethod(DexMethod method) {
+    public boolean isAppendSubArrayMethod(DexMethod method) {
       return appendSubCharArray == method || appendSubCharSequence == method;
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOracle.java
index d8569d7..2c43b60 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOracle.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InvokeDirect;
+import com.android.tools.r8.ir.code.InvokeMethodWithReceiver;
 import com.android.tools.r8.ir.code.InvokeVirtual;
 import com.android.tools.r8.ir.code.Value;
 import java.util.List;
@@ -120,8 +121,7 @@
         return null;
       }
       if (isAppend(instruction)
-          && !isAppendWithSubArrayOrSubCharSequence(
-              instruction.asInvokeMethodWithReceiver().getInvokedMethod())) {
+          && !isAppendWithSubArray(instruction.asInvokeMethodWithReceiver())) {
         return getConstantStringForAppend(instruction.asInvokeVirtual());
       } else if (isInit(instruction)) {
         return getConstantStringForInit(instruction.asInvokeDirect());
@@ -178,18 +178,14 @@
         return false;
       }
       DexMethod invokedMethod = instruction.asInvokeMethod().getInvokedMethod();
-      if (isAppendWithSubArrayOrSubCharSequence(invokedMethod)) {
-        // Do not optimize append indexing into char[] or CharSequence. These might throw without
-        // additional analysis on the arguments. See b/369739224 and b/369971265 for details.
-        return false;
-      }
       return factory.stringBuilderMethods.isAppendMethod(invokedMethod)
           || factory.stringBufferMethods.isAppendMethod(invokedMethod);
     }
 
-    public boolean isAppendWithSubArrayOrSubCharSequence(DexMethod invokedMethod) {
-      return factory.stringBuilderMethods.isAppendSubArrayOrSubCharSequenceMethod(invokedMethod)
-          || factory.stringBufferMethods.isAppendSubArrayOrSubCharSequenceMethod(invokedMethod);
+    public boolean isAppendWithSubArray(InvokeMethodWithReceiver instruction) {
+      DexMethod invokedMethod = instruction.asInvokeMethod().getInvokedMethod();
+      return factory.stringBuilderMethods.isAppendSubArrayMethod(invokedMethod)
+          || factory.stringBufferMethods.isAppendSubArrayMethod(invokedMethod);
     }
 
     @Override
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/B369739224Test.java b/src/test/java/com/android/tools/r8/ir/optimize/string/B369739224Test.java
index 463e20b..615ba60 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/B369739224Test.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/B369739224Test.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.utils.StringUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -16,9 +15,6 @@
 @RunWith(Parameterized.class)
 public class B369739224Test extends TestBase {
 
-  private final String EXPECTED_OUTPUT =
-      StringUtils.lines("Caught!", "Caught!", "Caught!", "Caught!");
-
   @Parameter(0)
   public TestParameters parameters;
 
@@ -33,7 +29,7 @@
     testForJvm(parameters)
         .addInnerClasses(getClass())
         .run(parameters.getRuntime(), TestClass.class)
-        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+        .assertFailureWithErrorThatThrows(IndexOutOfBoundsException.class);
   }
 
   @Test
@@ -41,9 +37,9 @@
     parameters.assumeDexRuntime();
     testForD8(parameters.getBackend())
         .addInnerClasses(getClass())
-        .setMinApi(parameters)
+        .setMinApi(parameters.getApiLevel())
         .run(parameters.getRuntime(), TestClass.class)
-        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+        .assertFailureWithErrorThatThrows(IndexOutOfBoundsException.class);
   }
 
   @Test
@@ -53,35 +49,17 @@
         .addKeepMainRule(TestClass.class)
         .setMinApi(parameters)
         .run(parameters.getRuntime(), TestClass.class)
-        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+        // TODO(b/369739224): Should throw IndexOutOfBoundsException.
+        .assertSuccessWithOutputLines("46");
   }
 
   static class TestClass {
 
     public static void main(String[] args) {
-      String s = "";
-      char[] a = new char[0];
+      String f = "";
       int c = '.';
-      try {
-        new StringBuilder().append(s, 0, c);
-      } catch (IndexOutOfBoundsException e) {
-        System.out.println("Caught!");
-      }
-      try {
-        new StringBuffer().append(s, 0, c);
-      } catch (IndexOutOfBoundsException e) {
-        System.out.println("Caught!");
-      }
-      try {
-        new StringBuilder().append(a, 0, c);
-      } catch (IndexOutOfBoundsException e) {
-        System.out.println("Caught!");
-      }
-      try {
-        new StringBuffer().append(a, 0, c);
-      } catch (IndexOutOfBoundsException e) {
-        System.out.println("Caught!");
-      }
+      new StringBuilder().append(f, 0, c);
+      System.out.println(c);
     }
   }
 }