Fix char conversion in StringBuilder optimizer
Fixes: b/384844007
Change-Id: Ie2e55568e68a3a39724a82ad901b8caeff0b7dab
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderHelper.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderHelper.java
index 4a7af31..d341de9 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderHelper.java
@@ -113,7 +113,10 @@
} else if (conversionType == factory.shortType) {
return temp.shortValue();
} else if (conversionType == factory.charType) {
- return temp.intValue();
+ // Description of i2c from the JVM specification: "The value on the top of the operand
+ // stack must be of type int. It is popped from the operand stack, truncated to char,
+ // then zero-extended to an int result. The result is pushed onto the operand stack.".
+ return temp.intValue() & 0xFFFF;
} else if (conversionType == factory.intType) {
return temp.intValue();
} else if (conversionType == factory.longType) {
diff --git a/src/test/java/com/android/tools/r8/B384844007Test.java b/src/test/java/com/android/tools/r8/ir/optimize/string/B384844007Test.java
similarity index 88%
rename from src/test/java/com/android/tools/r8/B384844007Test.java
rename to src/test/java/com/android/tools/r8/ir/optimize/string/B384844007Test.java
index b8bd4dd..748e0c2 100644
--- a/src/test/java/com/android/tools/r8/B384844007Test.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/B384844007Test.java
@@ -2,8 +2,11 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8;
+package com.android.tools.r8.ir.optimize.string;
+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;
@@ -23,7 +26,6 @@
}
private static final String EXPECTED_OUTPUT = StringUtils.lines("i = 65523");
- private static final String UNEXPECTED_OUTPUT = StringUtils.lines("i = -13");
@Test
public void testJvm() throws Exception {
@@ -51,7 +53,7 @@
.addKeepMainRule(TestClass.class)
.setMinApi(parameters)
.run(parameters.getRuntime(), TestClass.class)
- .assertSuccessWithOutput(UNEXPECTED_OUTPUT);
+ .assertSuccessWithOutput(EXPECTED_OUTPUT);
}
static class TestClass {