Run stringbuilder optimization on CF code
Bug: b/114002137
Change-Id: I8ef81ec8288879576a719a90efd1aeec00260b56
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 2a97c16..05824a0 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
@@ -1316,10 +1316,7 @@
timing.begin("Rewrite move result");
codeRewriter.rewriteMoveResult(code);
timing.end();
- // TODO(b/114002137): Also run for CF
- if (options.enableStringConcatenationOptimization
- && !isDebugMode
- && options.isGeneratingDex()) {
+ if (options.enableStringConcatenationOptimization && !isDebugMode) {
timing.begin("Rewrite string concat");
StringBuilderAppendOptimizer.run(appView, code);
timing.end();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/primitivetypes/PrimitiveTypesTest.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/primitivetypes/PrimitiveTypesTest.java
index 8cc3b8c..0e8b0ad 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/primitivetypes/PrimitiveTypesTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/primitivetypes/PrimitiveTypesTest.java
@@ -46,7 +46,6 @@
private void validateOutlining(CodeInspector inspector, Class<?> testClass, String argumentType) {
boolean isStringBuilderOptimized =
enableArgumentPropagation
- && parameters.isDexRuntime()
&& (argumentType.equals("char") || argumentType.equals("boolean"));
if (isStringBuilderOptimized) {
assertEquals(1, inspector.allClasses().size());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderFullyInDoWhileLoopTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderFullyInDoWhileLoopTest.java
index 0074f01..5cc664d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderFullyInDoWhileLoopTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderFullyInDoWhileLoopTest.java
@@ -5,7 +5,7 @@
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
@@ -45,11 +45,10 @@
private void inspect(CodeInspector inspector) {
MethodSubject mainMethodSubject = inspector.clazz(TestClass.class).mainMethod();
assertThat(mainMethodSubject, isPresent());
- assertEquals(
- parameters.isCfRuntime(),
+ assertTrue(
mainMethodSubject
.streamInstructions()
- .anyMatch(instruction -> instruction.isNewInstance("java.lang.StringBuilder")));
+ .noneMatch(instruction -> instruction.isNewInstance("java.lang.StringBuilder")));
}
static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderTests.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderTests.java
index 365ced3..e7c5301 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderTests.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderTests.java
@@ -37,7 +37,7 @@
@Parameters(name = "{0}, configuration: {1}")
public static List<Object[]> data() {
return buildParameters(
- getTestParameters().withDexRuntimes().withAllApiLevels().build(), getTestExpectations());
+ getTestParameters().withAllRuntimesAndApiLevels().build(), getTestExpectations());
}
private static class StringBuilderResult {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderWithIndirectMutationThroughPhiTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderWithIndirectMutationThroughPhiTest.java
index 88f0cf8..92a4f9a 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderWithIndirectMutationThroughPhiTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderWithIndirectMutationThroughPhiTest.java
@@ -42,7 +42,7 @@
inspector -> {
MethodSubject mainMethodSubject = inspector.clazz(Main.class).mainMethod();
assertEquals(
- parameters.isCfRuntime() ? 4 : 3,
+ 3,
mainMethodSubject
.streamInstructions()
.filter(isInvokeStringBuilderAppendWithString())
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderWithIndirectPhiMutationThroughPhiOperandTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderWithIndirectPhiMutationThroughPhiOperandTest.java
index 81fa83b..14abc82 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderWithIndirectPhiMutationThroughPhiOperandTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderWithIndirectPhiMutationThroughPhiOperandTest.java
@@ -41,9 +41,8 @@
.inspect(
inspector -> {
MethodSubject mainMethodSubject = inspector.clazz(Main.class).mainMethod();
- // TODO(b/114002137): Also run for CF
assertEquals(
- parameters.isCfRuntime() ? 4 : 3,
+ 3,
mainMethodSubject
.streamInstructions()
.filter(isInvokeStringBuilderAppendWithString())
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderWithObjectsToStringTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderWithObjectsToStringTest.java
index 4013021..c89ae2e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderWithObjectsToStringTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderWithObjectsToStringTest.java
@@ -6,7 +6,7 @@
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
@@ -42,12 +42,10 @@
inspector -> {
MethodSubject mainMethodSubject = inspector.clazz(Main.class).mainMethod();
assertThat(mainMethodSubject, isPresent());
- // TODO(b/114002137): Also run for CF
- assertEquals(
- parameters.isCfRuntime(),
+ assertTrue(
mainMethodSubject
.streamInstructions()
- .anyMatch(InstructionSubject::isNewInstance));
+ .noneMatch(InstructionSubject::isNewInstance));
})
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("foo");
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
index b7fe293..31740b7 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
@@ -37,6 +37,7 @@
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
+import org.hamcrest.CoreMatchers;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -161,7 +162,7 @@
} else {
assertThat(
inspector.clazz("class_inliner_lambda_j_style.MainKt$testStateless$1"),
- notIf(isPresent(), testParameters.isDexRuntime()));
+ CoreMatchers.not(isPresent()));
}
// TODO(b/173337498): MainKt$testStateful$1 should be class inlined.
diff --git a/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java b/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
index 997bfd8..0cf3e9e 100644
--- a/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
@@ -78,13 +78,8 @@
if (enableOptimization) {
assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("simple"), 1);
assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("local"), 1);
- // String concatenation optimization is enabled for DEX output.
// Even replaced ordinal is concatenated (and gone).
- if (parameters.isDexRuntime()) {
- assertOrdinalReplacedAndGone(clazz.uniqueMethodWithName("multipleUsages"));
- } else {
- assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("multipleUsages"), 1);
- }
+ assertOrdinalReplacedAndGone(clazz.uniqueMethodWithName("multipleUsages"));
assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("inlined"), 1);
assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("inSwitch"), 11);
assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("differentTypeStaticField"), 1);
@@ -131,9 +126,7 @@
if (enableOptimization) {
assertNameReplacedWithConst(clazz.uniqueMethodWithName("simple"), "TWO");
assertNameReplacedWithConst(clazz.uniqueMethodWithName("local"), "TWO");
- // String concatenation optimization is enabled for DEX output.
- String expectedConst = parameters.isDexRuntime() ? "1TWO" : "TWO";
- assertNameReplacedWithConst(clazz.uniqueMethodWithName("multipleUsages"), expectedConst);
+ assertNameReplacedWithConst(clazz.uniqueMethodWithName("multipleUsages"), "1TWO");
assertNameReplacedWithConst(clazz.uniqueMethodWithName("inlined"), "TWO");
assertNameReplacedWithConst(clazz.uniqueMethodWithName("differentTypeStaticField"), "DOWN");
assertNameReplacedWithConst(clazz.uniqueMethodWithName("nonStaticGet"), "TWO");