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 {