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